Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/InitTweak/GenInit.cc

    r9ff56e7 r4eb31f2b  
    2121
    2222#include "Common/PassVisitor.h"
    23 
    24 #include "GenPoly/DeclMutator.h"
    25 #include "GenPoly/PolyMutator.h"
    26 #include "GenPoly/ScopedSet.h"
    27 
    28 #include "ResolvExpr/typeops.h"
    2923
    3024#include "SynTree/Declaration.h"
     
    3832#include "SymTab/Mangler.h"
    3933
     34#include "GenPoly/DeclMutator.h"
     35#include "GenPoly/PolyMutator.h"
     36#include "GenPoly/ScopedSet.h"
     37
     38#include "ResolvExpr/typeops.h"
     39
    4040namespace InitTweak {
    4141        namespace {
     
    4444        }
    4545
    46         struct ReturnFixer : public WithStmtsToAdd, public WithGuards {
     46        class ReturnFixer : public WithStmtsToAdd, public WithScopes {
     47          public:
    4748                /// consistently allocates a temporary variable for the return value
    4849                /// of a function so that anything which the resolver decides can be constructed
     
    5859        };
    5960
    60         struct CtorDtor : public WithGuards, public WithShortCircuiting  {
     61        class CtorDtor final : public GenPoly::PolyMutator {
     62          public:
     63                typedef GenPoly::PolyMutator Parent;
     64                using Parent::mutate;
    6165                /// create constructor and destructor statements for object declarations.
    6266                /// the actual call statements will be added in after the resolver has run
     
    6569                static void generateCtorDtor( std::list< Declaration * > &translationUnit );
    6670
    67                 void previsit( ObjectDecl * );
    68                 void previsit( FunctionDecl *functionDecl );
    69 
     71                virtual DeclarationWithType * mutate( ObjectDecl * ) override;
     72                virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ) override;
    7073                // should not traverse into any of these declarations to find objects
    7174                // that need to be constructed or destructed
    72                 void previsit( StructDecl *aggregateDecl );
    73                 void previsit( __attribute__((unused)) UnionDecl    * aggregateDecl ) { visit_children = false; }
    74                 void previsit( __attribute__((unused)) EnumDecl     * aggregateDecl ) { visit_children = false; }
    75                 void previsit( __attribute__((unused)) TraitDecl    * aggregateDecl ) { visit_children = false; }
    76                 void previsit( __attribute__((unused)) TypeDecl     * typeDecl )      { visit_children = false; }
    77                 void previsit( __attribute__((unused)) TypedefDecl  * typeDecl )      { visit_children = false; }
    78                 void previsit( __attribute__((unused)) FunctionType * funcType )      { visit_children = false; }
    79 
    80                 void previsit( CompoundStmt * compoundStmt );
     75                virtual Declaration* mutate( StructDecl *aggregateDecl ) override;
     76                virtual Declaration* mutate( UnionDecl *aggregateDecl ) override { return aggregateDecl; }
     77                virtual Declaration* mutate( EnumDecl *aggregateDecl ) override { return aggregateDecl; }
     78                virtual Declaration* mutate( TraitDecl *aggregateDecl ) override { return aggregateDecl; }
     79                virtual TypeDecl* mutate( TypeDecl *typeDecl ) override { return typeDecl; }
     80                virtual Declaration* mutate( TypedefDecl *typeDecl ) override { return typeDecl; }
     81
     82                virtual Type * mutate( FunctionType *funcType ) override { return funcType; }
     83
     84                virtual CompoundStmt * mutate( CompoundStmt * compoundStmt ) override;
    8185
    8286          private:
     
    207211
    208212        void CtorDtor::generateCtorDtor( std::list< Declaration * > & translationUnit ) {
    209                 PassVisitor<CtorDtor> ctordtor;
    210                 acceptAll( translationUnit, ctordtor );
     213                CtorDtor ctordtor;
     214                mutateAll( translationUnit, ctordtor );
    211215        }
    212216
     
    285289        }
    286290
    287         void CtorDtor::previsit( ObjectDecl * objDecl ) {
     291        DeclarationWithType * CtorDtor::mutate( ObjectDecl * objDecl ) {
    288292                handleDWT( objDecl );
    289293                // hands off if @=, extern, builtin, etc.
     
    297301                        objDecl->set_init( genCtorInit( objDecl ) );
    298302                }
    299         }
    300 
    301         void CtorDtor::previsit( FunctionDecl *functionDecl ) {
    302                 GuardValue( inFunction );
     303                return Parent::mutate( objDecl );
     304        }
     305
     306        DeclarationWithType * CtorDtor::mutate( FunctionDecl *functionDecl ) {
     307                ValueGuard< bool > oldInFunc = inFunction;
    303308                inFunction = true;
    304309
    305310                handleDWT( functionDecl );
    306311
    307                 GuardScope( managedTypes );
     312                managedTypes.beginScope();
    308313                // go through assertions and recursively add seen ctor/dtors
    309314                for ( auto & tyDecl : functionDecl->get_functionType()->get_forall() ) {
     
    312317                        }
    313318                }
    314 
    315                 PassVisitor<CtorDtor> newCtorDtor;
    316                 newCtorDtor.pass = *this;
    317                 maybeAccept( functionDecl->get_statements(), newCtorDtor );
    318                 visit_children = false;  // do not try and construct parameters or forall parameters - must happen after maybeAccept
    319         }
    320 
    321         void CtorDtor::previsit( StructDecl *aggregateDecl ) {
    322                 visit_children = false; // do not try to construct and destruct aggregate members
    323 
     319                // parameters should not be constructed and destructed, so don't mutate FunctionType
     320                functionDecl->set_statements( maybeMutate( functionDecl->get_statements(), *this ) );
     321
     322                managedTypes.endScope();
     323                return functionDecl;
     324        }
     325
     326        Declaration* CtorDtor::mutate( StructDecl *aggregateDecl ) {
    324327                // don't construct members, but need to take note if there is a managed member,
    325328                // because that means that this type is also managed
     
    333336                        }
    334337                }
    335         }
    336 
    337         void CtorDtor::previsit( __attribute__((unused)) CompoundStmt * compoundStmt ) {
    338                 GuardScope( managedTypes );
    339         }
     338                return aggregateDecl;
     339        }
     340
     341        CompoundStmt * CtorDtor::mutate( CompoundStmt * compoundStmt ) {
     342                managedTypes.beginScope();
     343                CompoundStmt * stmt = Parent::mutate( compoundStmt );
     344                managedTypes.endScope();
     345                return stmt;
     346        }
     347
    340348} // namespace InitTweak
    341349
Note: See TracChangeset for help on using the changeset viewer.