- Timestamp:
- May 12, 2022, 4:21:46 PM (3 years ago)
- Branches:
- ADT, ast-experimental, master, pthread-emulation, qualifiedEnum
- Children:
- c0af102
- Parents:
- e5628db
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/InitTweak/FixInitNew.cpp
re5628db r8060b2b 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
Note: See TracChangeset
for help on using the changeset viewer.