Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/InitTweak/GenInit.cc

    r4eb31f2b r8ca3a72  
    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"
    2329
    2430#include "SynTree/Declaration.h"
     
    3238#include "SymTab/Mangler.h"
    3339
    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         namespace {
    42                 const std::list<Label> noLabels;
    43                 const std::list<Expression *> noDesignators;
    44         }
    45 
    46         class ReturnFixer : public WithStmtsToAdd, public WithScopes {
     41        class ReturnFixer final : public GenPoly::PolyMutator {
    4742          public:
    4843                /// consistently allocates a temporary variable for the return value
     
    5146                static void makeReturnTemp( std::list< Declaration * > &translationUnit );
    5247
    53                 void premutate( FunctionDecl *functionDecl );
    54                 void premutate( ReturnStmt * returnStmt );
     48                typedef GenPoly::PolyMutator Parent;
     49                using Parent::mutate;
     50                virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ) override;
     51                virtual Statement * mutate( ReturnStmt * returnStmt ) override;
    5552
    5653          protected:
     
    134131
    135132        void ReturnFixer::makeReturnTemp( std::list< Declaration * > & translationUnit ) {
    136                 PassVisitor<ReturnFixer> fixer;
     133                ReturnFixer fixer;
    137134                mutateAll( translationUnit, fixer );
    138135        }
    139136
    140         void ReturnFixer::premutate( ReturnStmt *returnStmt ) {
     137        Statement *ReturnFixer::mutate( ReturnStmt *returnStmt ) {
    141138                std::list< DeclarationWithType * > & returnVals = ftype->get_returnVals();
    142139                assert( returnVals.size() == 0 || returnVals.size() == 1 );
     
    149146                        construct->get_args().push_back( new AddressExpr( new VariableExpr( returnVals.front() ) ) );
    150147                        construct->get_args().push_back( returnStmt->get_expr() );
    151                         stmtsToAddBefore.push_back(new ExprStmt(noLabels, construct));
     148                        stmtsToAdd.push_back(new ExprStmt(noLabels, construct));
    152149
    153150                        // return the retVal object
    154151                        returnStmt->set_expr( new VariableExpr( returnVals.front() ) );
    155152                } // if
    156         }
    157 
    158         void ReturnFixer::premutate( FunctionDecl *functionDecl ) {
    159                 GuardValue( ftype );
    160                 GuardValue( funcName );
     153                return returnStmt;
     154        }
     155
     156        DeclarationWithType* ReturnFixer::mutate( FunctionDecl *functionDecl ) {
     157                ValueGuard< FunctionType * > oldFtype( ftype );
     158                ValueGuard< std::string > oldFuncName( funcName );
    161159
    162160                ftype = functionDecl->get_functionType();
    163161                funcName = functionDecl->get_name();
     162                return Parent::mutate( functionDecl );
    164163        }
    165164
Note: See TracChangeset for help on using the changeset viewer.