Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/InitTweak/GenInit.cc

    rac74057 re3e16bc  
    2626#include "Common/UniqueName.h"     // for UniqueName
    2727#include "Common/utility.h"        // for ValueGuard, maybeClone
     28#include "GenPoly/DeclMutator.h"   // for DeclMutator
    2829#include "GenPoly/GenPoly.h"       // for getFunctionType, isPolyType
    2930#include "GenPoly/ScopedSet.h"     // for ScopedSet, ScopedSet<>::const_iter...
     
    6162        };
    6263
    63         struct CtorDtor : public WithGuards, public WithShortCircuiting, public WithVisitorRef<CtorDtor>  {
     64        struct CtorDtor : public WithGuards, public WithShortCircuiting  {
    6465                /// create constructor and destructor statements for object declarations.
    6566                /// the actual call statements will be added in after the resolver has run
     
    7475                // that need to be constructed or destructed
    7576                void previsit( StructDecl *aggregateDecl );
    76                 void previsit( AggregateDecl * ) { visit_children = false; }
    77                 void previsit( NamedTypeDecl * ) { visit_children = false; }
    78                 void previsit( FunctionType * ) { visit_children = false; }
     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; }
    7983
    8084                void previsit( CompoundStmt * compoundStmt );
     
    9296        };
    9397
    94         struct HoistArrayDimension final : public WithDeclsToAdd, public WithShortCircuiting, public WithGuards {
     98        class HoistArrayDimension final : public GenPoly::DeclMutator {
     99          public:
     100                typedef GenPoly::DeclMutator Parent;
     101
    95102                /// hoist dimension from array types in object declaration so that it uses a single
    96103                /// const variable of type size_t, so that side effecting array dimensions are only
     
    98105                static void hoistArrayDimension( std::list< Declaration * > & translationUnit );
    99106
    100                 void premutate( ObjectDecl * objectDecl );
    101                 DeclarationWithType * postmutate( ObjectDecl * objectDecl );
    102                 void premutate( FunctionDecl *functionDecl );
     107          private:
     108                using Parent::mutate;
     109
     110                virtual DeclarationWithType * mutate( ObjectDecl * objectDecl ) override;
     111                virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ) override;
    103112                // should not traverse into any of these declarations to find objects
    104113                // that need to be constructed or destructed
    105                 void premutate( AggregateDecl * ) { visit_children = false; }
    106                 void premutate( NamedTypeDecl * ) { visit_children = false; }
    107                 void premutate( FunctionType * ) { visit_children = false; }
     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; }
    108122
    109123                void hoist( Type * type );
     
    114128
    115129        void genInit( std::list< Declaration * > & translationUnit ) {
    116                 fixReturnStatements( translationUnit );
     130                ReturnFixer::makeReturnTemp( translationUnit );
    117131                HoistArrayDimension::hoistArrayDimension( translationUnit );
    118132                CtorDtor::generateCtorDtor( translationUnit );
    119133        }
    120134
    121         void fixReturnStatements( std::list< Declaration * > & translationUnit ) {
     135        void ReturnFixer::makeReturnTemp( std::list< Declaration * > & translationUnit ) {
    122136                PassVisitor<ReturnFixer> fixer;
    123137                mutateAll( translationUnit, fixer );
     
    129143                // hands off if the function returns a reference - we don't want to allocate a temporary if a variable's address
    130144                // is being returned
    131                 if ( returnStmt->get_expr() && returnVals.size() == 1 && isConstructable( returnVals.front()->get_type() ) ) {
     145                if ( returnStmt->get_expr() && returnVals.size() == 1 && ! dynamic_cast< ReferenceType * >( returnVals.front()->get_type() ) ) {
    132146                        // explicitly construct the return value using the return expression and the retVal object
    133147                        assertf( returnVals.front()->get_name() != "", "Function %s has unnamed return value\n", funcName.c_str() );
     
    144158                GuardValue( funcName );
    145159
    146                 ftype = functionDecl->type;
    147                 funcName = functionDecl->name;
     160                ftype = functionDecl->get_functionType();
     161                funcName = functionDecl->get_name();
    148162        }
    149163
     
    151165        // which would be incorrect if it is a side-effecting computation.
    152166        void HoistArrayDimension::hoistArrayDimension( std::list< Declaration * > & translationUnit ) {
    153                 PassVisitor<HoistArrayDimension> hoister;
    154                 mutateAll( translationUnit, hoister );
    155         }
    156 
    157         void HoistArrayDimension::premutate( ObjectDecl * objectDecl ) {
    158                 GuardValue( storageClasses );
     167                HoistArrayDimension hoister;
     168                hoister.mutateDeclarationList( translationUnit );
     169        }
     170
     171        DeclarationWithType * HoistArrayDimension::mutate( ObjectDecl * objectDecl ) {
    159172                storageClasses = objectDecl->get_storageClasses();
    160         }
    161 
    162         DeclarationWithType * HoistArrayDimension::postmutate( ObjectDecl * objectDecl ) {
     173                DeclarationWithType * temp = Parent::mutate( objectDecl );
    163174                hoist( objectDecl->get_type() );
    164                 return objectDecl;
     175                return temp;
    165176        }
    166177
     
    183194
    184195                        arrayType->set_dimension( new VariableExpr( arrayDimension ) );
    185                         declsToAddBefore.push_back( arrayDimension );
     196                        addDeclaration( arrayDimension );
    186197
    187198                        hoist( arrayType->get_base() );
     
    190201        }
    191202
    192         void HoistArrayDimension::premutate( FunctionDecl * ) {
    193                 GuardValue( inFunction );
     203        DeclarationWithType * HoistArrayDimension::mutate( FunctionDecl *functionDecl ) {
     204                ValueGuard< bool > oldInFunc( inFunction );
     205                inFunction = true;
     206                DeclarationWithType * decl = Parent::mutate( functionDecl );
     207                return decl;
    194208        }
    195209
     
    200214
    201215        bool CtorDtor::isManaged( Type * type ) const {
    202                 // references are never constructed
     216                // at least for now, references are never constructed
    203217                if ( dynamic_cast< ReferenceType * >( type ) ) return false;
    204218                // need to clear and reset qualifiers when determining if a type is managed
     
    207221                if ( TupleType * tupleType = dynamic_cast< TupleType * > ( type ) ) {
    208222                        // tuple is also managed if any of its components are managed
    209                         if ( std::any_of( tupleType->types.begin(), tupleType->types.end(), [&](Type * type) { return isManaged( type ); }) ) {
     223                        if ( std::any_of( tupleType->get_types().begin(), tupleType->get_types().end(), [&](Type * type) { return isManaged( type ); }) ) {
    210224                                return true;
    211225                        }
     
    291305
    292306        void CtorDtor::previsit( FunctionDecl *functionDecl ) {
    293                 visit_children = false;  // do not try and construct parameters or forall parameters
    294307                GuardValue( inFunction );
    295308                inFunction = true;
     
    305318                }
    306319
    307                 maybeAccept( functionDecl->get_statements(), *visitor );
     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
    308324        }
    309325
     
    324340        }
    325341
    326         void CtorDtor::previsit( CompoundStmt * ) {
     342        void CtorDtor::previsit( __attribute__((unused)) CompoundStmt * compoundStmt ) {
    327343                GuardScope( managedTypes );
    328344        }
Note: See TracChangeset for help on using the changeset viewer.