Ignore:
Timestamp:
Sep 21, 2017, 3:23:33 PM (7 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
05807e9, 29bc63e
Parents:
e4d6335
git-author:
Rob Schluntz <rschlunt@…> (09/21/17 15:19:47)
git-committer:
Rob Schluntz <rschlunt@…> (09/21/17 15:23:33)
Message:

Convert HoistArrayDimension? to PassVisitor?, cleanup in InitTweak? and CodeGen?

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/InitTweak/GenInit.cc

    re4d6335 r22bc276  
    6262        };
    6363
    64         struct CtorDtor : public WithGuards, public WithShortCircuiting  {
     64        struct CtorDtor : public WithGuards, public WithShortCircuiting, public WithVisitorRef<CtorDtor>  {
    6565                /// create constructor and destructor statements for object declarations.
    6666                /// the actual call statements will be added in after the resolver has run
     
    7575                // that need to be constructed or destructed
    7676                void previsit( StructDecl *aggregateDecl );
    77                 void previsit( __attribute__((unused)) UnionDecl    * aggregateDecl ) { visit_children = false; }
    78                 void previsit( __attribute__((unused)) EnumDecl     * aggregateDecl ) { visit_children = false; }
    79                 void previsit( __attribute__((unused)) TraitDecl    * aggregateDecl ) { visit_children = false; }
    80                 void previsit( __attribute__((unused)) TypeDecl     * typeDecl )      { visit_children = false; }
    81                 void previsit( __attribute__((unused)) TypedefDecl  * typeDecl )      { visit_children = false; }
    82                 void previsit( __attribute__((unused)) FunctionType * funcType )      { visit_children = false; }
     77                void premutate( AggregateDecl * ) { visit_children = false; }
     78                void premutate( NamedTypeDecl * ) { visit_children = false; }
     79                void previsit( FunctionType * ) { visit_children = false; }
    8380
    8481                void previsit( CompoundStmt * compoundStmt );
     
    9693        };
    9794
    98         class HoistArrayDimension final : public GenPoly::DeclMutator {
    99           public:
    100                 typedef GenPoly::DeclMutator Parent;
    101 
     95        struct HoistArrayDimension final : public WithDeclsToAdd, public WithShortCircuiting, public WithGuards {
    10296                /// hoist dimension from array types in object declaration so that it uses a single
    10397                /// const variable of type size_t, so that side effecting array dimensions are only
     
    10599                static void hoistArrayDimension( std::list< Declaration * > & translationUnit );
    106100
    107           private:
    108                 using Parent::mutate;
    109 
    110                 virtual DeclarationWithType * mutate( ObjectDecl * objectDecl ) override;
    111                 virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ) override;
     101                void premutate( ObjectDecl * objectDecl );
     102                DeclarationWithType * postmutate( ObjectDecl * objectDecl );
     103                void premutate( FunctionDecl *functionDecl );
    112104                // should not traverse into any of these declarations to find objects
    113105                // that need to be constructed or destructed
    114                 virtual Declaration* mutate( StructDecl *aggregateDecl ) override { return aggregateDecl; }
    115                 virtual Declaration* mutate( UnionDecl *aggregateDecl ) override { return aggregateDecl; }
    116                 virtual Declaration* mutate( EnumDecl *aggregateDecl ) override { return aggregateDecl; }
    117                 virtual Declaration* mutate( TraitDecl *aggregateDecl ) override { return aggregateDecl; }
    118                 virtual TypeDecl* mutate( TypeDecl *typeDecl ) override { return typeDecl; }
    119                 virtual Declaration* mutate( TypedefDecl *typeDecl ) override { return typeDecl; }
    120 
    121                 virtual Type* mutate( FunctionType *funcType ) override { return funcType; }
     106                void premutate( AggregateDecl * ) { visit_children = false; }
     107                void premutate( NamedTypeDecl * ) { visit_children = false; }
     108                void premutate( FunctionType * ) { visit_children = false; }
    122109
    123110                void hoist( Type * type );
     
    143130                // hands off if the function returns a reference - we don't want to allocate a temporary if a variable's address
    144131                // is being returned
    145                 if ( returnStmt->get_expr() && returnVals.size() == 1 && ! dynamic_cast< ReferenceType * >( returnVals.front()->get_type() ) ) {
     132                if ( returnStmt->get_expr() && returnVals.size() == 1 && tryConstruct( returnVals.front() ) ) {
    146133                        // explicitly construct the return value using the return expression and the retVal object
    147134                        assertf( returnVals.front()->get_name() != "", "Function %s has unnamed return value\n", funcName.c_str() );
     
    158145                GuardValue( funcName );
    159146
    160                 ftype = functionDecl->get_functionType();
    161                 funcName = functionDecl->get_name();
     147                ftype = functionDecl->type;
     148                funcName = functionDecl->name;
    162149        }
    163150
     
    165152        // which would be incorrect if it is a side-effecting computation.
    166153        void HoistArrayDimension::hoistArrayDimension( std::list< Declaration * > & translationUnit ) {
    167                 HoistArrayDimension hoister;
    168                 hoister.mutateDeclarationList( translationUnit );
    169         }
    170 
    171         DeclarationWithType * HoistArrayDimension::mutate( ObjectDecl * objectDecl ) {
     154                PassVisitor<HoistArrayDimension> hoister;
     155                mutateAll( translationUnit, hoister );
     156        }
     157
     158        void HoistArrayDimension::premutate( ObjectDecl * objectDecl ) {
     159                GuardValue( storageClasses );
    172160                storageClasses = objectDecl->get_storageClasses();
    173                 DeclarationWithType * temp = Parent::mutate( objectDecl );
     161        }
     162
     163        DeclarationWithType * HoistArrayDimension::postmutate( ObjectDecl * objectDecl ) {
    174164                hoist( objectDecl->get_type() );
    175                 return temp;
     165                return objectDecl;
    176166        }
    177167
     
    194184
    195185                        arrayType->set_dimension( new VariableExpr( arrayDimension ) );
    196                         addDeclaration( arrayDimension );
     186                        declsToAddBefore.push_back( arrayDimension );
    197187
    198188                        hoist( arrayType->get_base() );
     
    201191        }
    202192
    203         DeclarationWithType * HoistArrayDimension::mutate( FunctionDecl *functionDecl ) {
    204                 ValueGuard< bool > oldInFunc( inFunction );
    205                 inFunction = true;
    206                 DeclarationWithType * decl = Parent::mutate( functionDecl );
    207                 return decl;
     193        void HoistArrayDimension::premutate( FunctionDecl * ) {
     194                GuardValue( inFunction );
    208195        }
    209196
     
    214201
    215202        bool CtorDtor::isManaged( Type * type ) const {
    216                 // at least for now, references are never constructed
     203                // references are never constructed
    217204                if ( dynamic_cast< ReferenceType * >( type ) ) return false;
    218205                // need to clear and reset qualifiers when determining if a type is managed
     
    221208                if ( TupleType * tupleType = dynamic_cast< TupleType * > ( type ) ) {
    222209                        // tuple is also managed if any of its components are managed
    223                         if ( std::any_of( tupleType->get_types().begin(), tupleType->get_types().end(), [&](Type * type) { return isManaged( type ); }) ) {
     210                        if ( std::any_of( tupleType->types.begin(), tupleType->types.end(), [&](Type * type) { return isManaged( type ); }) ) {
    224211                                return true;
    225212                        }
     
    305292
    306293        void CtorDtor::previsit( FunctionDecl *functionDecl ) {
     294                visit_children = false;  // do not try and construct parameters or forall parameters
    307295                GuardValue( inFunction );
    308296                inFunction = true;
     
    318306                }
    319307
    320                 PassVisitor<CtorDtor> newCtorDtor;
    321                 newCtorDtor.pass = *this;
    322                 maybeAccept( functionDecl->get_statements(), newCtorDtor );
    323                 visit_children = false;  // do not try and construct parameters or forall parameters - must happen after maybeAccept
     308                maybeAccept( functionDecl->get_statements(), *visitor );
    324309        }
    325310
     
    340325        }
    341326
    342         void CtorDtor::previsit( __attribute__((unused)) CompoundStmt * compoundStmt ) {
     327        void CtorDtor::previsit( CompoundStmt * ) {
    343328                GuardScope( managedTypes );
    344329        }
Note: See TracChangeset for help on using the changeset viewer.