- File:
-
- 1 edited
-
src/ControlStruct/HoistControlDecls.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ControlStruct/HoistControlDecls.cpp
r45040b61 ra488783 9 9 // Author : Andrew Beach 10 10 // Created On : Fri Dec 3 15:34:00 2021 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Mon Jan 31 18:52:35 202213 // Update Count : 2311 // Last Modified By : Andrew Beach 12 // Last Modified On : Fri Dec 3 15:34:00 2021 13 // Update Count : 0 14 14 // 15 15 … … 19 19 #include "AST/Pass.hpp" 20 20 #include "AST/TranslationUnit.hpp" 21 using namespace ast;22 21 23 22 namespace ControlStruct { 24 23 24 namespace { 25 25 26 template<typename StmtT> 26 const Stmt * hoist( const StmtT * stmt ) {27 const ast::Stmt * hoist( const StmtT * stmt ) { 27 28 // If no hoisting is needed, then make no changes. 29 if ( 0 == stmt->inits.size() ) { 30 return stmt; 31 } 28 32 29 if ( stmt->inits.size() == 0 ) { // no declarations ? 30 // if ( /* no conditional declarations */ ... ) ... 31 return stmt; 32 } // if 33 34 // Put hoist declarations and modified statement in a compound statement. 35 36 CompoundStmt * block = new CompoundStmt( stmt->location ); // create empty compound statement 37 // { 38 // } 39 40 for ( const Stmt * next : stmt->inits ) { // link conditional declarations into compound 33 // Put initializers and the old statement in the compound statement. 34 ast::CompoundStmt * block = new ast::CompoundStmt( stmt->location ); 35 StmtT * mutStmt = ast::mutate( stmt ); 36 for ( const ast::Stmt * next : mutStmt->inits ) { 41 37 block->kids.push_back( next ); 42 38 } 43 // if ( int x = f(), y = g(); ... ) ... 44 // link declarations into compound statement 45 // { 46 // int x = f(); 47 // int y = g(); 48 // } 49 50 StmtT * mutStmt = mutate( stmt ); // create mutate handle to change statement 51 mutStmt->inits.clear(); // remove declarations 52 // if ( ... ) ... 53 54 block->kids.push_back( mutStmt ); // link modified statement into compound 55 // { 56 // int x = f(); 57 // int y = g(); 58 // if ( ... ) ... 59 // } 39 mutStmt->inits.clear(); 40 block->kids.push_back( mutStmt ); 60 41 return block; 61 42 } 62 43 63 struct hoistControlDeclsCore { 64 // Statements with declarations in conditional. 65 const Stmt * postvisit( const IfStmt * stmt ) { 66 return hoist<IfStmt>( stmt ); 44 struct HoistControlCore { 45 const ast::Stmt * postvisit( const ast::IfStmt * stmt ) { 46 return hoist<ast::IfStmt>( stmt ); 67 47 } 68 const Stmt * postvisit( constForStmt * stmt ) {69 return hoist< ForStmt>( stmt );48 const ast::Stmt * postvisit( const ast::ForStmt * stmt ) { 49 return hoist<ast::ForStmt>( stmt ); 70 50 } 71 const Stmt * postvisit( constWhileStmt * stmt ) {72 return hoist< WhileStmt>( stmt );51 const ast::Stmt * postvisit( const ast::WhileStmt * stmt ) { 52 return hoist<ast::WhileStmt>( stmt ); 73 53 } 74 54 }; 75 55 76 // Hoist initialization out of for statements. 77 void hoistControlDecls( TranslationUnit & translationUnit ) { 78 Pass<hoistControlDeclsCore>::run( translationUnit ); 56 } // namespace 57 58 /// Hoist initialization out of for statements. 59 void hoistControlDecls( ast::TranslationUnit & translationUnit ) { 60 ast::Pass<HoistControlCore>::run( translationUnit ); 79 61 } 80 62
Note:
See TracChangeset
for help on using the changeset viewer.