Changeset d5baf0c for src/GenPoly
- Timestamp:
- Jul 2, 2020, 6:05:10 PM (4 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 74cfafb2
- Parents:
- 5877b3e
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Specialize.cc
r5877b3e rd5baf0c 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Dec 13 23:40:49 201913 // Update Count : 3 211 // Last Modified By : Andrew Beach 12 // Last Modified On : Thr Jul 2 17:42:00 2020 13 // Update Count : 33 14 14 // 15 15 … … 42 42 43 43 namespace GenPoly { 44 struct Specialize final : public WithConstTypeSubstitution, public WithStmtsToAdd, public WithVisitorRef<Specialize> { 44 struct Specialize final : public WithConstTypeSubstitution, 45 public WithDeclsToAdd, public WithVisitorRef<Specialize> { 45 46 Expression * postmutate( ApplicationExpr *applicationExpr ); 46 47 Expression * postmutate( CastExpr *castExpr ); … … 248 249 } // if 249 250 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 ); 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 } 262 267 263 268 // add return (or valueless expression) to the thunk … … 270 275 thunkFunc->statements->kids.push_back( appStmt ); 271 276 272 // add thunk definition to queue of statements to add273 stmtsToAddBefore.push_back( new DeclStmt( thunkFunc ));277 // Add the thunk definition (converted to DeclStmt if appproprate). 278 declsToAddBefore.push_back( thunkFunc ); 274 279 // return address of thunk function as replacement expression 275 280 return new AddressExpr( new VariableExpr( thunkFunc ) );
Note: See TracChangeset
for help on using the changeset viewer.