Changeset e5d9274 for src/InitTweak
- Timestamp:
- Jun 2, 2022, 3:11:21 PM (3 years ago)
- Branches:
- ADT, ast-experimental, master, pthread-emulation, qualifiedEnum
- Children:
- ced5e2a
- Parents:
- 015925a (diff), fc134a48 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- src/InitTweak
- Files:
-
- 3 edited
-
FixInitNew.cpp (modified) (4 diffs)
-
GenInit.cc (modified) (2 diffs)
-
module.mk (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/InitTweak/FixInitNew.cpp
r015925a re5d9274 454 454 455 455 auto expr = new ast::ImplicitCopyCtorExpr( appExpr->location, mutExpr ); 456 // Move the type substitution to the new top-level, if it is attached to the appExpr. 457 // Ensure it is not deleted with the ImplicitCopyCtorExpr by removing it before deletion. 458 // The substitution is needed to obtain the type of temporary variables so that copy constructor 459 // calls can be resolved. 456 // Move the type substitution to the new top-level. The substitution 457 // is needed to obtain the type of temporary variables so that copy 458 // constructor calls can be resolved. 460 459 assert( typeSubs ); 461 // assert (mutExpr->env);462 460 expr->env = tmp; 463 // mutExpr->env = nullptr;464 //std::swap( expr->env, appExpr->env );465 461 return expr; 466 462 } 467 463 468 464 void ResolveCopyCtors::previsit(const ast::Expr * expr) { 469 if (expr->env) { 470 GuardValue(env); 471 GuardValue(envModified); 472 env = expr->env->clone(); 473 envModified = false; 474 } 465 if ( nullptr == expr->env ) { 466 return; 467 } 468 GuardValue( env ) = expr->env->clone(); 469 GuardValue( envModified ) = false; 475 470 } 476 471 477 472 const ast::Expr * ResolveCopyCtors::postvisit(const ast::Expr * expr) { 478 if (expr->env) { 479 if (envModified) { 480 auto mutExpr = mutate(expr); 481 mutExpr->env = env; 482 return mutExpr; 483 } 484 else { 485 // env was not mutated, skip and delete the shallow copy 486 delete env; 487 return expr; 488 } 489 } 490 else { 473 // No local environment, skip. 474 if ( nullptr == expr->env ) { 475 return expr; 476 // Environment was modified, mutate and replace. 477 } else if ( envModified ) { 478 auto mutExpr = mutate(expr); 479 mutExpr->env = env; 480 return mutExpr; 481 // Environment was not mutated, delete the shallow copy before guard. 482 } else { 483 delete env; 491 484 return expr; 492 485 } … … 497 490 const ast::Expr * ResolveCopyCtors::makeCtorDtor( const std::string & fname, const ast::ObjectDecl * var, const ast::Expr * cpArg ) { 498 491 assert( var ); 499 assert (var->isManaged());500 assert (!cpArg || cpArg->isManaged());492 assert( var->isManaged() ); 493 assert( !cpArg || cpArg->isManaged() ); 501 494 // arrays are not copy constructed, so this should always be an ExprStmt 502 495 ast::ptr< ast::Stmt > stmt = genCtorDtor(var->location, fname, var, cpArg ); … … 504 497 auto exprStmt = stmt.strict_as<ast::ImplicitCtorDtorStmt>()->callStmt.strict_as<ast::ExprStmt>(); 505 498 ast::ptr<ast::Expr> untyped = exprStmt->expr; // take ownership of expr 506 // exprStmt->expr = nullptr;507 499 508 500 // resolve copy constructor … … 516 508 env->add( *resolved->env ); 517 509 envModified = true; 518 // delete resolved->env;519 510 auto mut = mutate(resolved.get()); 520 511 assertf(mut == resolved.get(), "newly resolved expression must be unique"); 521 512 mut->env = nullptr; 522 513 } // if 523 // delete stmt;524 514 if ( auto assign = resolved.as<ast::TupleAssignExpr>() ) { 525 515 // fix newly generated StmtExpr -
src/InitTweak/GenInit.cc
r015925a re5d9274 368 368 369 369 struct ReturnFixer_New final : 370 public ast::WithStmtsToAdd<>, ast::WithGuards {370 public ast::WithStmtsToAdd<>, ast::WithGuards, ast::WithShortCircuiting { 371 371 void previsit( const ast::FunctionDecl * decl ); 372 372 const ast::ReturnStmt * previsit( const ast::ReturnStmt * stmt ); … … 376 376 377 377 void ReturnFixer_New::previsit( const ast::FunctionDecl * decl ) { 378 if (decl->linkage == ast::Linkage::Intrinsic) visit_children = false; 378 379 GuardValue( funcDecl ) = decl; 379 380 } -
src/InitTweak/module.mk
r015925a re5d9274 10 10 ## Author : Richard C. Bilson 11 11 ## Created On : Mon Jun 1 17:49:17 2015 12 ## Last Modified By : Rob Schluntz13 ## Last Modified On : Fri May 13 11:36:24 201614 ## Update Count : 312 ## Last Modified By : Andrew Beach 13 ## Last Modified On : Tue May 17 14:31:00 2022 14 ## Update Count : 4 15 15 ############################################################################### 16 16 17 SRC += \ 18 InitTweak/FixGlobalInit.cc \ 19 InitTweak/FixGlobalInit.h \ 20 InitTweak/FixInit.cc \ 21 InitTweak/FixInit.h \ 22 InitTweak/GenInit.cc \ 23 InitTweak/GenInit.h \ 24 InitTweak/InitTweak.cc \ 25 InitTweak/InitTweak.h \ 26 InitTweak/FixInitNew.cpp 27 28 SRCDEMANGLE += \ 17 SRC_INITTWEAK = \ 29 18 InitTweak/GenInit.cc \ 30 19 InitTweak/GenInit.h \ … … 32 21 InitTweak/InitTweak.h 33 22 23 SRC += $(SRC_INITTWEAK) \ 24 InitTweak/FixGlobalInit.cc \ 25 InitTweak/FixGlobalInit.h \ 26 InitTweak/FixInit.cc \ 27 InitTweak/FixInit.h \ 28 InitTweak/FixInitNew.cpp 29 30 SRCDEMANGLE += $(SRC_INITTWEAK)
Note:
See TracChangeset
for help on using the changeset viewer.