Ignore:
Timestamp:
Mar 30, 2016, 3:48:55 PM (9 years ago)
Author:
Rob Schluntz <rschlunt@…>
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
Message:

choose destructor at at object declaration (CtorInit), overhaul and simplification of resolver code for CtorInit

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/InitTweak/RemoveInit.cc

    r4cc4286 r5b2f5bb  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Tue Feb 09 15:12:29 2016
     12// Last Modified On : Wed Mar 30 15:45:12 2016
    1313// Update Count     : 166
    1414//
     
    7272                virtual Declaration* mutate( TypedefDecl *typeDecl );
    7373
    74                 virtual CompoundStmt * mutate( CompoundStmt * compoundStmt );
    75 
    7674          protected:
    7775                bool inFunction;
    78 
    79                 // to be added before block ends - use push_front so order is correct
    80                 std::list< Statement * > destructorStmts;
    8176        };
    8277
     
    199194                                        // call into makeArrayFunction from validate.cc to generate calls to ctor/dtor for each element of array
    200195                                        // 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() ) );
    203214                                } else {
    204215                                        // it's sufficient to attempt to call the ctor/dtor for the given object and its initializer
     
    209220                                        // if ctor does exist, want to use ctor expression instead of init
    210221                                        // 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() ) );
    213225                                }
    214226                        } else {
     
    234246        }
    235247
    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 block
    239                 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, since
    246                         // return/break/goto should trigger destructor when block is left.
    247                         statements.splice( statements.end(), destructorStmts );
    248                 } // if
    249 
    250                 destructorStmts = oldDestructorStmts;
    251                 return ret;
    252         }
    253 
    254248        // should not traverse into any of these declarations to find objects
    255249        // that need to be constructed or destructed
Note: See TracChangeset for help on using the changeset viewer.