Changeset 65660bd for src/InitTweak
- Timestamp:
- Sep 22, 2016, 8:14:56 AM (9 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:
- ac9ca96
- Parents:
- 1132b62
- git-author:
- Rob Schluntz <rschlunt@…> (09/21/16 23:43:37)
- git-committer:
- Rob Schluntz <rschlunt@…> (09/22/16 08:14:56)
- Location:
- src/InitTweak
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified src/InitTweak/FixInit.cc ¶
r1132b62 r65660bd 69 69 70 70 /// create and resolve ctor/dtor expression: fname(var, [cpArg]) 71 ApplicationExpr* makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg = NULL );72 ApplicationExpr* makeCtorDtor( const std::string & fname, Expression * thisArg, Expression * cpArg = NULL );71 Expression * makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg = NULL ); 72 Expression * makeCtorDtor( const std::string & fname, Expression * thisArg, Expression * cpArg = NULL ); 73 73 /// true if type does not need to be copy constructed to ensure correctness 74 74 bool skipCopyConstruct( Type * type ); … … 360 360 } 361 361 362 ApplicationExpr* ResolveCopyCtors::makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg ) {362 Expression * ResolveCopyCtors::makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg ) { 363 363 assert( var ); 364 364 return makeCtorDtor( fname, new AddressExpr( new VariableExpr( var ) ), cpArg ); 365 365 } 366 366 367 ApplicationExpr* ResolveCopyCtors::makeCtorDtor( const std::string & fname, Expression * thisArg, Expression * cpArg ) {367 Expression * ResolveCopyCtors::makeCtorDtor( const std::string & fname, Expression * thisArg, Expression * cpArg ) { 368 368 assert( thisArg ); 369 369 UntypedExpr * untyped = new UntypedExpr( new NameExpr( fname ) ); … … 375 375 // (VariableExpr and already resolved expression) 376 376 CP_CTOR_PRINT( std::cerr << "ResolvingCtorDtor " << untyped << std::endl; ) 377 ApplicationExpr * resolved = dynamic_cast< ApplicationExpr * >( ResolvExpr::findVoidExpression( untyped, *this ) ); 377 Expression * resolved = ResolvExpr::findVoidExpression( untyped, *this ); 378 assert( resolved ); 378 379 if ( resolved->get_env() ) { 379 380 env->add( *resolved->get_env() ); 380 381 } // if 381 382 382 assert( resolved );383 383 delete untyped; 384 384 return resolved; … … 392 392 if ( skipCopyConstruct( result ) ) return; // skip certain non-copyable types 393 393 394 if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * >( arg ) ) {395 for ( Expression * & expr : tupleExpr->get_exprs() ) {396 copyConstructArg( expr, impCpCtorExpr );397 }398 return;399 }400 401 394 // type may involve type variables, so apply type substitution to get temporary variable's actual type 402 395 result = result->clone(); … … 407 400 // create and resolve copy constructor 408 401 CP_CTOR_PRINT( std::cerr << "makeCtorDtor for an argument" << std::endl; ) 409 ApplicationExpr * cpCtor = makeCtorDtor( "?{}", tmp, arg ); 410 411 // if the chosen constructor is intrinsic, the copy is unnecessary, so 412 // don't create the temporary and don't call the copy constructor 413 VariableExpr * function = dynamic_cast< VariableExpr * >( cpCtor->get_function() ); 414 assert( function ); 415 if ( function->get_var()->get_linkage() != LinkageSpec::Intrinsic ) { 416 // replace argument to function call with temporary 417 arg = new CommaExpr( cpCtor, new VariableExpr( tmp ) ); 418 impCpCtorExpr->get_tempDecls().push_back( tmp ); 419 impCpCtorExpr->get_dtors().push_front( makeCtorDtor( "^?{}", tmp ) ); 420 } // if 402 Expression * cpCtor = makeCtorDtor( "?{}", tmp, arg ); 403 404 if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( cpCtor ) ) { 405 // if the chosen constructor is intrinsic, the copy is unnecessary, so 406 // don't create the temporary and don't call the copy constructor 407 VariableExpr * function = dynamic_cast< VariableExpr * >( appExpr->get_function() ); 408 assert( function ); 409 if ( function->get_var()->get_linkage() == LinkageSpec::Intrinsic ) return; 410 } 411 412 // replace argument to function call with temporary 413 arg = new CommaExpr( cpCtor, new VariableExpr( tmp ) ); 414 impCpCtorExpr->get_tempDecls().push_back( tmp ); 415 impCpCtorExpr->get_dtors().push_front( makeCtorDtor( "^?{}", tmp ) ); 421 416 } 422 417 423 418 void ResolveCopyCtors::destructRet( Expression * ret, ImplicitCopyCtorExpr * impCpCtorExpr ) { 424 if ( TupleType * tupleType = dynamic_cast< TupleType * > ( ret->get_result() ) ) {425 int idx = 0;426 for ( Type *& t : tupleType->get_types() ) {427 (void)t;428 destructRet( new TupleIndexExpr( ret->clone(), idx++ ), impCpCtorExpr );429 }430 return;431 }432 419 impCpCtorExpr->get_dtors().push_front( makeCtorDtor( "^?{}", new AddressExpr( ret ) ) ); 433 420 } -
TabularUnified src/InitTweak/GenInit.cc ¶
r1132b62 r65660bd 29 29 #include "GenPoly/DeclMutator.h" 30 30 #include "GenPoly/ScopedSet.h" 31 #include "ResolvExpr/typeops.h" 31 32 32 33 namespace InitTweak { … … 50 51 51 52 protected: 52 std::list<DeclarationWithType*> returnVals;53 FunctionType * ftype; 53 54 UniqueName tempNamer; 54 55 std::string funcName; … … 86 87 87 88 bool isManaged( ObjectDecl * objDecl ) const ; // determine if object is managed 89 bool isManaged( Type * type ) const; // determine if type is managed 88 90 void handleDWT( DeclarationWithType * dwt ); // add type to managed if ctor/dtor 89 91 GenPoly::ScopedSet< std::string > managedTypes; … … 134 136 135 137 Statement *ReturnFixer::mutate( ReturnStmt *returnStmt ) { 136 // update for multiple return values138 std::list< DeclarationWithType * > & returnVals = ftype->get_returnVals(); 137 139 assert( returnVals.size() == 0 || returnVals.size() == 1 ); 138 140 // hands off if the function returns an lvalue - we don't want to allocate a temporary if a variable's address … … 156 158 157 159 DeclarationWithType* ReturnFixer::mutate( FunctionDecl *functionDecl ) { 158 ValueGuard< std::list<DeclarationWithType*> > oldReturnVals( returnVals ); 160 // xxx - need to handle named return values - this pass may need to happen 161 // after resolution? the ordering is tricky because return statements must be 162 // constructed - the simplest way to do that (while also handling multiple 163 // returns) is to structure the returnVals into a tuple, as done here. 164 // however, if the tuple return value is structured before resolution, 165 // it's difficult to resolve named return values, since the name is lost 166 // in conversion to a tuple. this might be easiest to deal with 167 // after reference types are added, as it may then be possible to 168 // uniformly move named return values to the parameter list directly 169 ValueGuard< FunctionType * > oldFtype( ftype ); 159 170 ValueGuard< std::string > oldFuncName( funcName ); 160 171 161 FunctionType * type = functionDecl->get_functionType(); 162 returnVals = type->get_returnVals(); 172 ftype = functionDecl->get_functionType(); 173 std::list< DeclarationWithType * > & retVals = ftype->get_returnVals(); 174 if ( retVals.size() > 1 ) { 175 TupleType * tupleType = safe_dynamic_cast< TupleType * >( ResolvExpr::extractResultType( ftype ) ); 176 ObjectDecl * newRet = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, tupleType, new ListInit( std::list<Initializer*>(), noDesignators, false ) ); 177 retVals.clear(); 178 retVals.push_back( newRet ); 179 } 163 180 funcName = functionDecl->get_name(); 164 181 DeclarationWithType * decl = Mutator::mutate( functionDecl ); … … 220 237 } 221 238 239 bool CtorDtor::isManaged( Type * type ) const { 240 return managedTypes.find( SymTab::Mangler::mangle( type ) ) != managedTypes.end(); 241 } 242 222 243 bool CtorDtor::isManaged( ObjectDecl * objDecl ) const { 223 244 Type * type = objDecl->get_type(); … … 225 246 type = at->get_base(); 226 247 } 227 return managedTypes.find( SymTab::Mangler::mangle( type ) ) != managedTypes.end(); 248 if ( TupleType * tupleType = dynamic_cast< TupleType * > ( type ) ) { 249 return std::any_of( tupleType->get_types().begin(), tupleType->get_types().end(), [&](Type * type) { return isManaged( type ); }); 250 } 251 return isManaged( type ); 228 252 } 229 253
Note: See TracChangeset
for help on using the changeset viewer.