Changes in src/InitTweak/GenInit.cc [8ca3a72:4eb31f2b]
- File:
-
- 1 edited
-
src/InitTweak/GenInit.cc (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/InitTweak/GenInit.cc
r8ca3a72 r4eb31f2b 21 21 22 22 #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"29 23 30 24 #include "SynTree/Declaration.h" … … 38 32 #include "SymTab/Mangler.h" 39 33 34 #include "GenPoly/DeclMutator.h" 35 #include "GenPoly/PolyMutator.h" 36 #include "GenPoly/ScopedSet.h" 37 38 #include "ResolvExpr/typeops.h" 39 40 40 namespace 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 { 42 47 public: 43 48 /// consistently allocates a temporary variable for the return value … … 46 51 static void makeReturnTemp( std::list< Declaration * > &translationUnit ); 47 52 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 ); 52 55 53 56 protected: … … 131 134 132 135 void ReturnFixer::makeReturnTemp( std::list< Declaration * > & translationUnit ) { 133 ReturnFixerfixer;136 PassVisitor<ReturnFixer> fixer; 134 137 mutateAll( translationUnit, fixer ); 135 138 } 136 139 137 Statement *ReturnFixer::mutate( ReturnStmt *returnStmt ) {140 void ReturnFixer::premutate( ReturnStmt *returnStmt ) { 138 141 std::list< DeclarationWithType * > & returnVals = ftype->get_returnVals(); 139 142 assert( returnVals.size() == 0 || returnVals.size() == 1 ); … … 146 149 construct->get_args().push_back( new AddressExpr( new VariableExpr( returnVals.front() ) ) ); 147 150 construct->get_args().push_back( returnStmt->get_expr() ); 148 stmtsToAdd .push_back(new ExprStmt(noLabels, construct));151 stmtsToAddBefore.push_back(new ExprStmt(noLabels, construct)); 149 152 150 153 // return the retVal object 151 154 returnStmt->set_expr( new VariableExpr( returnVals.front() ) ); 152 155 } // 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 ); 159 161 160 162 ftype = functionDecl->get_functionType(); 161 163 funcName = functionDecl->get_name(); 162 return Parent::mutate( functionDecl );163 164 } 164 165
Note:
See TracChangeset
for help on using the changeset viewer.