Changes in src/GenPoly/Specialize.cc [3100754:07de76b]
- File:
-
- 1 edited
-
src/GenPoly/Specialize.cc (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Specialize.cc
r3100754 r07de76b 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Thr Jul 2 17:42:00 202013 // Update Count : 3 311 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Dec 13 23:40:49 2019 13 // Update Count : 32 14 14 // 15 15 … … 42 42 43 43 namespace GenPoly { 44 struct Specialize final : public WithConstTypeSubstitution, 45 public WithDeclsToAdd, public WithVisitorRef<Specialize> { 44 struct Specialize final : public WithConstTypeSubstitution, public WithStmtsToAdd, public WithVisitorRef<Specialize> { 46 45 Expression * postmutate( ApplicationExpr *applicationExpr ); 47 46 Expression * postmutate( CastExpr *castExpr ); … … 218 217 thunkFunc->get_attributes().push_back( new Attribute( "unused" ) ); 219 218 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 224 219 // thread thunk parameters into call to actual function, naming thunk parameters as we go 225 220 UniqueName paramNamer( paramPrefix ); … … 253 248 } // if 254 249 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 ); 271 262 272 263 // add return (or valueless expression) to the thunk … … 279 270 thunkFunc->statements->kids.push_back( appStmt ); 280 271 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 ) ); 283 274 // return address of thunk function as replacement expression 284 275 return new AddressExpr( new VariableExpr( thunkFunc ) );
Note:
See TracChangeset
for help on using the changeset viewer.