Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Specialize.cc

    rd5baf0c r07de76b  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Thr Jul  2 17:42:00 2020
    13 // Update Count     : 33
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Dec 13 23:40:49 2019
     13// Update Count     : 32
    1414//
    1515
     
    4242
    4343namespace GenPoly {
    44         struct Specialize final : public WithConstTypeSubstitution,
    45                         public WithDeclsToAdd, public WithVisitorRef<Specialize> {
     44        struct Specialize final : public WithConstTypeSubstitution, public WithStmtsToAdd, public WithVisitorRef<Specialize> {
    4645                Expression * postmutate( ApplicationExpr *applicationExpr );
    4746                Expression * postmutate( CastExpr *castExpr );
     
    249248                } // if
    250249
    251                 // Handle any specializations that may still be present.
    252                 {
    253                         std::string oldParamPrefix = paramPrefix;
    254                         paramPrefix += "p";
    255                         std::list< Declaration * > oldDecls;
    256                         oldDecls.splice( oldDecls.end(), declsToAddBefore );
    257 
    258                         appExpr->acceptMutator( *visitor );
    259                         // Write recursive specializations into the thunk body.
    260                         for ( Declaration * decl : declsToAddBefore ) {
    261                                 thunkFunc->statements->kids.push_back( new DeclStmt( decl ) );
    262                         }
    263 
    264                         declsToAddBefore = std::move( oldDecls );
    265                         paramPrefix = oldParamPrefix;
    266                 }
     250                // handle any specializations that may still be present
     251                std::string oldParamPrefix = paramPrefix;
     252                paramPrefix += "p";
     253                // save stmtsToAddBefore in oldStmts
     254                std::list< Statement* > oldStmts;
     255                oldStmts.splice( oldStmts.end(), stmtsToAddBefore );
     256                appExpr->acceptMutator( *visitor );
     257                paramPrefix = oldParamPrefix;
     258                // write any statements added for recursive specializations into the thunk body
     259                thunkFunc->statements->kids.splice( thunkFunc->statements->kids.end(), stmtsToAddBefore );
     260                // restore oldStmts into stmtsToAddBefore
     261                stmtsToAddBefore.splice( stmtsToAddBefore.end(), oldStmts );
    267262
    268263                // add return (or valueless expression) to the thunk
     
    275270                thunkFunc->statements->kids.push_back( appStmt );
    276271
    277                 // Add the thunk definition (converted to DeclStmt if appproprate).
    278                 declsToAddBefore.push_back( thunkFunc );
     272                // add thunk definition to queue of statements to add
     273                stmtsToAddBefore.push_back( new DeclStmt( thunkFunc ) );
    279274                // return address of thunk function as replacement expression
    280275                return new AddressExpr( new VariableExpr( thunkFunc ) );
Note: See TracChangeset for help on using the changeset viewer.