Changeset aff3af4


Ignore:
Timestamp:
Jun 1, 2017, 7:26:04 PM (4 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
aaron-thesis, arm-eh, cleanup-dtors, deferred_resn, demangler, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, resolv-new, with_gc
Children:
b1d4d60
Parents:
676cc8c
Message:

convert FixInit? to PassVisitor?

Location:
src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/Common/PassVisitor.h

    r676cc8c raff3af4  
    2626
    2727        template< typename... Args >
    28         PassVisitor(Args &&... args) 
     28        PassVisitor(Args &&... args)
    2929                : pass( std::forward<Args>( args )... )
    3030        {}
    3131
    3232        virtual ~PassVisitor() = default;
    33 private:
     33
    3434        pass_type pass;
    35 
    36 public:
    3735
    3836        virtual void visit( ObjectDecl *objectDecl ) override final;
  • src/InitTweak/FixInit.cc

    r676cc8c raff3af4  
    192192                };
    193193
    194                 class FixInit final : public GenPoly::PolyMutator {
     194                class FixInit {
    195195                  public:
    196196                        /// expand each object declaration to use its constructor after it is declared.
    197197                        static void fixInitializers( std::list< Declaration * > &translationUnit );
    198198
    199                         typedef GenPoly::PolyMutator Parent;
    200                         using Parent::mutate;
    201                         virtual DeclarationWithType * mutate( ObjectDecl *objDecl ) override;
     199                        DeclarationWithType * postmutate( ObjectDecl *objDecl );
    202200
    203201                        std::list< Declaration * > staticDtorDecls;
     202                        std::list< Statement * > stmtsToAddAfter; // found by PassVisitor
    204203                };
    205204
     
    312311
    313312                void FixInit::fixInitializers( std::list< Declaration * > & translationUnit ) {
    314                         FixInit fixer;
     313                        PassVisitor<FixInit> fixer;
    315314
    316315                        // can't use mutateAll, because need to insert declarations at top-level
     
    320319                                try {
    321320                                        *i = maybeMutate( *i, fixer );
    322                                         translationUnit.splice( i, fixer.staticDtorDecls );
     321                                        translationUnit.splice( i, fixer.pass.staticDtorDecls );
    323322                                } catch( SemanticError &e ) {
    324323                                        e.set_location( (*i)->location );
     
    696695                }
    697696
    698                 DeclarationWithType *FixInit::mutate( ObjectDecl *objDecl ) {
    699                         // first recursively handle pieces of ObjectDecl so that they aren't missed by other visitors when the init
    700                         // is removed from the ObjectDecl
    701                         objDecl = dynamic_cast< ObjectDecl * >( Parent::mutate( objDecl ) );
     697                DeclarationWithType *FixInit::postmutate( ObjectDecl *objDecl ) {
     698                        // since this removes the init field from objDecl, it must occur after children are mutated (i.e. postmutate)
    702699                        if ( ConstructorInit * ctorInit = dynamic_cast< ConstructorInit * >( objDecl->get_init() ) ) {
    703700                                // a decision should have been made by the resolver, so ctor and init are not both non-NULL
Note: See TracChangeset for help on using the changeset viewer.