Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Specialize.cc

    r07de76b r3100754  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 23:40:49 2019
    13 // Update Count     : 32
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Thr Jul  2 17:42:00 2020
     13// Update Count     : 33
    1414//
    1515
     
    4242
    4343namespace GenPoly {
    44         struct Specialize final : public WithConstTypeSubstitution, public WithStmtsToAdd, public WithVisitorRef<Specialize> {
     44        struct Specialize final : public WithConstTypeSubstitution,
     45                        public WithDeclsToAdd, public WithVisitorRef<Specialize> {
    4546                Expression * postmutate( ApplicationExpr *applicationExpr );
    4647                Expression * postmutate( CastExpr *castExpr );
     
    217218                thunkFunc->get_attributes().push_back( new Attribute( "unused" ) );
    218219
     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
    219224                // thread thunk parameters into call to actual function, naming thunk parameters as we go
    220225                UniqueName paramNamer( paramPrefix );
     
    248253                } // if
    249254
    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 );
     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                }
    262271
    263272                // add return (or valueless expression) to the thunk
     
    270279                thunkFunc->statements->kids.push_back( appStmt );
    271280
    272                 // add thunk definition to queue of statements to add
    273                 stmtsToAddBefore.push_back( new DeclStmt( thunkFunc ) );
     281                // Add the thunk definition (converted to DeclStmt if appproprate).
     282                declsToAddBefore.push_back( thunkFunc );
    274283                // return address of thunk function as replacement expression
    275284                return new AddressExpr( new VariableExpr( thunkFunc ) );
Note: See TracChangeset for help on using the changeset viewer.