Changeset 092528b for src/InitTweak
- Timestamp:
- Jan 23, 2017, 2:36:49 PM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 0bfaf80
- Parents:
- 207c7e1d
- Location:
- src/InitTweak
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/InitTweak/FixInit.cc
r207c7e1d r092528b 21 21 #include <unordered_set> 22 22 #include "InitTweak.h" 23 #include "GenInit.h" 23 24 #include "FixInit.h" 24 25 #include "FixGlobalInit.h" … … 86 87 /// create and resolve ctor/dtor expression: fname(var, [cpArg]) 87 88 Expression * makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg = NULL ); 88 Expression * makeCtorDtor( const std::string & fname, Expression * thisArg, Expression * cpArg = NULL );89 89 /// true if type does not need to be copy constructed to ensure correctness 90 90 bool skipCopyConstruct( Type * type ); 91 91 void copyConstructArg( Expression *& arg, ImplicitCopyCtorExpr * impCpCtorExpr ); 92 void destructRet( Expression* ret, ImplicitCopyCtorExpr * impCpCtorExpr );92 void destructRet( ObjectDecl * ret, ImplicitCopyCtorExpr * impCpCtorExpr ); 93 93 94 94 TypeSubstitution * env; … … 398 398 Expression * ResolveCopyCtors::makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg ) { 399 399 assert( var ); 400 return makeCtorDtor( fname, new AddressExpr( new VariableExpr( var ) ), cpArg ); 401 } 402 403 Expression * ResolveCopyCtors::makeCtorDtor( const std::string & fname, Expression * thisArg, Expression * cpArg ) { 404 assert( thisArg ); 405 UntypedExpr * untyped = new UntypedExpr( new NameExpr( fname ) ); 406 untyped->get_args().push_back( thisArg ); 407 if (cpArg) untyped->get_args().push_back( cpArg->clone() ); 400 // arrays are not copy constructed, so this should always be an ExprStmt 401 ImplicitCtorDtorStmt * stmt = genCtorDtor( fname, var, cpArg ); 402 ExprStmt * exprStmt = safe_dynamic_cast< ExprStmt * >( stmt->get_callStmt() ); 403 Expression * untyped = exprStmt->get_expr(); 408 404 409 405 // resolve copy constructor … … 420 416 } // if 421 417 422 delete untyped;418 delete stmt; 423 419 return resolved; 424 420 } … … 456 452 } 457 453 458 void ResolveCopyCtors::destructRet( Expression* ret, ImplicitCopyCtorExpr * impCpCtorExpr ) {459 impCpCtorExpr->get_dtors().push_front( makeCtorDtor( "^?{}", new AddressExpr( ret )) );454 void ResolveCopyCtors::destructRet( ObjectDecl * ret, ImplicitCopyCtorExpr * impCpCtorExpr ) { 455 impCpCtorExpr->get_dtors().push_front( makeCtorDtor( "^?{}", ret ) ); 460 456 } 461 457 … … 487 483 if ( ! result->get_isLvalue() ) { 488 484 // destructing lvalue returns is bad because it can cause multiple destructor calls to the same object - the returned object is not a temporary 489 destructRet( new VariableExpr( ret ), impCpCtorExpr );485 destructRet( ret, impCpCtorExpr ); 490 486 } 491 487 } // for … … 515 511 last->set_expr( makeCtorDtor( "?{}", ret, last->get_expr() ) ); 516 512 517 stmtExpr->get_dtors().push_front( makeCtorDtor( "^?{}", new AddressExpr( new VariableExpr( ret ) )) );513 stmtExpr->get_dtors().push_front( makeCtorDtor( "^?{}", ret ) ); 518 514 } // if 519 515 -
src/InitTweak/GenInit.cc
r207c7e1d r092528b 247 247 managedTypes.insert( SymTab::Mangler::mangle( type->get_base() ) ); 248 248 } 249 } 250 251 ImplicitCtorDtorStmt * genCtorDtor( const std::string & fname, ObjectDecl * objDecl, Expression * arg ) { 252 // call into genImplicitCall from Autogen.h to generate calls to ctor/dtor 253 assertf( objDecl, "genCtorDtor passed null objDecl" ); 254 std::list< Statement * > stmts; 255 InitExpander srcParam( maybeClone( arg ) ); 256 SymTab::genImplicitCall( srcParam, new VariableExpr( objDecl ), fname, back_inserter( stmts ), objDecl ); 257 assert( stmts.size() <= 1 ); 258 return stmts.size() == 1 ? safe_dynamic_cast< ImplicitCtorDtorStmt * >( stmts.front() ) : nullptr; 249 259 } 250 260 -
src/InitTweak/GenInit.h
r207c7e1d r092528b 28 28 void genInit( std::list< Declaration * > & translationUnit ); 29 29 30 /// generates a single ctor/dtor statement using objDecl as the 'this' parameter and arg as the optional argument 31 ImplicitCtorDtorStmt * genCtorDtor( const std::string & fname, ObjectDecl * objDecl, Expression * arg = nullptr ); 32 30 33 /// creates an appropriate ConstructorInit node which contains a constructor, destructor, and C-initializer 31 34 ConstructorInit * genCtorInit( ObjectDecl * objDecl );
Note: See TracChangeset
for help on using the changeset viewer.