Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/InitTweak/GenInit.cc

    rd24d4e1 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( UnionDecl *aggregateDecl ) { visit_children = false; }
    74                 void previsit( EnumDecl *aggregateDecl ) { visit_children = false; }
    75                 void previsit( TraitDecl *aggregateDecl ) { visit_children = false; }
    76                 void previsit( TypeDecl *typeDecl ) { visit_children = false; }
    77                 void previsit( TypedefDecl *typeDecl ) { visit_children = false; }
    78 
    79                 void previsit( FunctionType *funcType ) { visit_children = false; }
    80 
    81                 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;
    8285
    8386          private:
     
    208211
    209212        void CtorDtor::generateCtorDtor( std::list< Declaration * > & translationUnit ) {
    210                 PassVisitor<CtorDtor> ctordtor;
    211                 acceptAll( translationUnit, ctordtor );
     213                CtorDtor ctordtor;
     214                mutateAll( translationUnit, ctordtor );
    212215        }
    213216
     
    286289        }
    287290
    288         void CtorDtor::previsit( ObjectDecl * objDecl ) {
     291        DeclarationWithType * CtorDtor::mutate( ObjectDecl * objDecl ) {
    289292                handleDWT( objDecl );
    290293                // hands off if @=, extern, builtin, etc.
     
    298301                        objDecl->set_init( genCtorInit( objDecl ) );
    299302                }
    300         }
    301 
    302         void CtorDtor::previsit( FunctionDecl *functionDecl ) {
    303                 GuardValue( inFunction );
     303                return Parent::mutate( objDecl );
     304        }
     305
     306        DeclarationWithType * CtorDtor::mutate( FunctionDecl *functionDecl ) {
     307                ValueGuard< bool > oldInFunc = inFunction;
    304308                inFunction = true;
    305309
    306310                handleDWT( functionDecl );
    307311
    308                 GuardScope( managedTypes );
     312                managedTypes.beginScope();
    309313                // go through assertions and recursively add seen ctor/dtors
    310314                for ( auto & tyDecl : functionDecl->get_functionType()->get_forall() ) {
     
    313317                        }
    314318                }
    315 
    316                 PassVisitor<CtorDtor> newCtorDtor;
    317                 newCtorDtor.pass = *this;
    318                 maybeAccept( functionDecl->get_statements(), newCtorDtor );
    319                 visit_children = false;  // do not try and construct parameters or forall parameters - must happen after maybeAccept
    320         }
    321 
    322         void CtorDtor::previsit( StructDecl *aggregateDecl ) {
    323                 visit_children = false; // do not try to construct and destruct aggregate members
    324 
     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 ) {
    325327                // don't construct members, but need to take note if there is a managed member,
    326328                // because that means that this type is also managed
     
    334336                        }
    335337                }
    336         }
    337 
    338         void CtorDtor::previsit( CompoundStmt * compoundStmt ) {
    339                 GuardScope( managedTypes );
    340         }
     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
    341348} // namespace InitTweak
    342349
Note: See TracChangeset for help on using the changeset viewer.