Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Specialize.cc

    r3100754 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 );
     
    218217                thunkFunc->get_attributes().push_back( new Attribute( "unused" ) );
    219218
    220                 // Thunks at the global level must be static to avoid collisions between files.
    221                 // (Conversly thunks inside a function must be unique and not static.)
    222                 thunkFunc->storageClasses.is_static = !isInFunction();
    223 
    224219                // thread thunk parameters into call to actual function, naming thunk parameters as we go
    225220                UniqueName paramNamer( paramPrefix );
     
    253248                } // if
    254249
    255                 // Handle any specializations that may still be present.
    256                 {
    257                         std::string oldParamPrefix = paramPrefix;
    258                         paramPrefix += "p";
    259                         std::list< Declaration * > oldDecls;
    260                         oldDecls.splice( oldDecls.end(), declsToAddBefore );
    261 
    262                         appExpr->acceptMutator( *visitor );
    263                         // Write recursive specializations into the thunk body.
    264                         for ( Declaration * decl : declsToAddBefore ) {
    265                                 thunkFunc->statements->kids.push_back( new DeclStmt( decl ) );
    266                         }
    267 
    268                         declsToAddBefore = std::move( oldDecls );
    269                         paramPrefix = oldParamPrefix;
    270                 }
     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 );
    271262
    272263                // add return (or valueless expression) to the thunk
     
    279270                thunkFunc->statements->kids.push_back( appStmt );
    280271
    281                 // Add the thunk definition (converted to DeclStmt if appproprate).
    282                 declsToAddBefore.push_back( thunkFunc );
     272                // add thunk definition to queue of statements to add
     273                stmtsToAddBefore.push_back( new DeclStmt( thunkFunc ) );
    283274                // return address of thunk function as replacement expression
    284275                return new AddressExpr( new VariableExpr( thunkFunc ) );
Note: See TracChangeset for help on using the changeset viewer.