Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/InitTweak/GenInit.cc

    r8ca3a72 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 {
    41         class ReturnFixer final : public GenPoly::PolyMutator {
     41        namespace {
     42                const std::list<Label> noLabels;
     43                const std::list<Expression *> noDesignators;
     44        }
     45
     46        class ReturnFixer : public WithStmtsToAdd, public WithScopes {
    4247          public:
    4348                /// consistently allocates a temporary variable for the return value
     
    4651                static void makeReturnTemp( std::list< Declaration * > &translationUnit );
    4752
    48                 typedef GenPoly::PolyMutator Parent;
    49                 using Parent::mutate;
    50                 virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ) override;
    51                 virtual Statement * mutate( ReturnStmt * returnStmt ) override;
     53                void premutate( FunctionDecl *functionDecl );
     54                void premutate( ReturnStmt * returnStmt );
    5255
    5356          protected:
     
    131134
    132135        void ReturnFixer::makeReturnTemp( std::list< Declaration * > & translationUnit ) {
    133                 ReturnFixer fixer;
     136                PassVisitor<ReturnFixer> fixer;
    134137                mutateAll( translationUnit, fixer );
    135138        }
    136139
    137         Statement *ReturnFixer::mutate( ReturnStmt *returnStmt ) {
     140        void ReturnFixer::premutate( ReturnStmt *returnStmt ) {
    138141                std::list< DeclarationWithType * > & returnVals = ftype->get_returnVals();
    139142                assert( returnVals.size() == 0 || returnVals.size() == 1 );
     
    146149                        construct->get_args().push_back( new AddressExpr( new VariableExpr( returnVals.front() ) ) );
    147150                        construct->get_args().push_back( returnStmt->get_expr() );
    148                         stmtsToAdd.push_back(new ExprStmt(noLabels, construct));
     151                        stmtsToAddBefore.push_back(new ExprStmt(noLabels, construct));
    149152
    150153                        // return the retVal object
    151154                        returnStmt->set_expr( new VariableExpr( returnVals.front() ) );
    152155                } // if
    153                 return returnStmt;
    154         }
    155 
    156         DeclarationWithType* ReturnFixer::mutate( FunctionDecl *functionDecl ) {
    157                 ValueGuard< FunctionType * > oldFtype( ftype );
    158                 ValueGuard< std::string > oldFuncName( funcName );
     156        }
     157
     158        void ReturnFixer::premutate( FunctionDecl *functionDecl ) {
     159                GuardValue( ftype );
     160                GuardValue( funcName );
    159161
    160162                ftype = functionDecl->get_functionType();
    161163                funcName = functionDecl->get_name();
    162                 return Parent::mutate( functionDecl );
    163164        }
    164165
Note: See TracChangeset for help on using the changeset viewer.