Changeset 5b2f5bb for src/InitTweak/RemoveInit.cc
- Timestamp:
- Mar 30, 2016, 3:48:55 PM (9 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- e0323a2
- Parents:
- 4cc4286
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/InitTweak/RemoveInit.cc
r4cc4286 r5b2f5bb 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Feb 09 15:12:29201612 // Last Modified On : Wed Mar 30 15:45:12 2016 13 13 // Update Count : 166 14 14 // … … 72 72 virtual Declaration* mutate( TypedefDecl *typeDecl ); 73 73 74 virtual CompoundStmt * mutate( CompoundStmt * compoundStmt );75 76 74 protected: 77 75 bool inFunction; 78 79 // to be added before block ends - use push_front so order is correct80 std::list< Statement * > destructorStmts;81 76 }; 82 77 … … 199 194 // call into makeArrayFunction from validate.cc to generate calls to ctor/dtor for each element of array 200 195 // TODO: walk initializer and generate appropriate copy ctor if element has initializer 201 SymTab::makeArrayFunction( NULL, new VariableExpr( objDecl ), at, "?{}", back_inserter( stmtsToAddAfter ) ); 202 SymTab::makeArrayFunction( NULL, new VariableExpr( objDecl ), at, "^?{}", front_inserter( destructorStmts ), false ); 196 std::list< Statement * > ctor; 197 std::list< Statement * > dtor; 198 199 SymTab::makeArrayFunction( NULL, new VariableExpr( objDecl ), at, "?{}", back_inserter( ctor ) ); 200 SymTab::makeArrayFunction( NULL, new VariableExpr( objDecl ), at, "^?{}", front_inserter( dtor ), false ); 201 202 // Currently makeArrayFunction produces a single Statement - a CompoundStmt 203 // which wraps everything that needs to happen. As such, it's technically 204 // possible to use a Statement ** in the above calls, but this is inherently 205 // unsafe, so instead we take the slightly less efficient route, but will be 206 // immediately informed if somehow the above assumption is broken. In this case, 207 // we could always wrap the list of statements at this point with a CompoundStmt, 208 // but it seems reasonable at the moment for this to be done by makeArrayFunction 209 // itself 210 assert( ctor.size() == 1 ); 211 assert( dtor.size() == 1 ); 212 213 objDecl->set_init( new ConstructorInit( ctor.front(), dtor.front(), objDecl->get_init() ) ); 203 214 } else { 204 215 // it's sufficient to attempt to call the ctor/dtor for the given object and its initializer … … 209 220 // if ctor does exist, want to use ctor expression instead of init 210 221 // push this decision to the resolver 211 objDecl->set_init( new ConstructorInit( ctor, objDecl->get_init() ) ); 212 destructorStmts.push_front( new ExprStmt( noLabels, dtor ) ); 222 ExprStmt * ctorStmt = new ExprStmt( noLabels, ctor ); 223 ExprStmt * dtorStmt = new ExprStmt( noLabels, dtor ); 224 objDecl->set_init( new ConstructorInit( ctorStmt, dtorStmt, objDecl->get_init() ) ); 213 225 } 214 226 } else { … … 234 246 } 235 247 236 CompoundStmt * CtorDtor::mutate( CompoundStmt * compoundStmt ) {237 // don't want to dump all destructors when block is left,238 // just the destructors associated with variables defined in this block239 std::list< Statement * > oldDestructorStmts = destructorStmts;240 destructorStmts = std::list<Statement *>();241 242 CompoundStmt * ret = PolyMutator::mutate( compoundStmt );243 std::list< Statement * > &statements = ret->get_kids();244 if ( ! destructorStmts.empty() ) {245 // TODO: adding to the end of a block isn't sufficient, since246 // return/break/goto should trigger destructor when block is left.247 statements.splice( statements.end(), destructorStmts );248 } // if249 250 destructorStmts = oldDestructorStmts;251 return ret;252 }253 254 248 // should not traverse into any of these declarations to find objects 255 249 // that need to be constructed or destructed
Note:
See TracChangeset
for help on using the changeset viewer.