- Timestamp:
- Jan 31, 2022, 10:26:13 PM (3 years ago)
- Branches:
- ADT, ast-experimental, enum, forall-pointer-decay, master, pthread-emulation, qualifiedEnum
- Children:
- 51ec1ab
- Parents:
- 3a4732f
- Location:
- src/ControlStruct
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ControlStruct/HoistControlDecls.cpp
r3a4732f r45040b61 9 9 // Author : Andrew Beach 10 10 // Created On : Fri Dec 3 15:34:00 2021 11 // Last Modified By : Andrew Beach12 // Last Modified On : Fri Dec 3 15:34:00 202113 // Update Count : 011 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jan 31 18:52:35 2022 13 // Update Count : 23 14 14 // 15 15 … … 19 19 #include "AST/Pass.hpp" 20 20 #include "AST/TranslationUnit.hpp" 21 using namespace ast; 21 22 22 23 namespace ControlStruct { 23 24 24 namespace { 25 template<typename StmtT> 26 const Stmt * hoist( const StmtT * stmt ) { 27 // If no hoisting is needed, then make no changes. 25 28 26 template<typename StmtT> 27 const ast::Stmt * hoist( const StmtT * stmt ) { 28 // If no hoisting is needed, then make no changes. 29 if ( 0 == stmt->inits.size() ) { 29 if ( stmt->inits.size() == 0 ) { // no declarations ? 30 // if ( /* no conditional declarations */ ... ) ... 30 31 return stmt; 31 } 32 } // if 32 33 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 ) { 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 37 41 block->kids.push_back( next ); 38 42 } 39 mutStmt->inits.clear(); 40 block->kids.push_back( mutStmt ); 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 // } 41 60 return block; 42 61 } 43 62 44 struct HoistControlCore { 45 const ast::Stmt * postvisit( const ast::IfStmt * stmt ) { 46 return hoist<ast::IfStmt>( stmt ); 63 struct hoistControlDeclsCore { 64 // Statements with declarations in conditional. 65 const Stmt * postvisit( const IfStmt * stmt ) { 66 return hoist<IfStmt>( stmt ); 47 67 } 48 const ast::Stmt * postvisit( const ast::ForStmt * stmt ) {49 return hoist< ast::ForStmt>( stmt );68 const Stmt * postvisit( const ForStmt * stmt ) { 69 return hoist<ForStmt>( stmt ); 50 70 } 51 const ast::Stmt * postvisit( const ast::WhileStmt * stmt ) {52 return hoist< ast::WhileStmt>( stmt );71 const Stmt * postvisit( const WhileStmt * stmt ) { 72 return hoist<WhileStmt>( stmt ); 53 73 } 54 74 }; 55 75 56 } // namespace 57 58 /// Hoist initialization out of for statements. 59 void hoistControlDecls( ast::TranslationUnit & translationUnit ) { 60 ast::Pass<HoistControlCore>::run( translationUnit ); 76 // Hoist initialization out of for statements. 77 void hoistControlDecls( TranslationUnit & translationUnit ) { 78 Pass<hoistControlDeclsCore>::run( translationUnit ); 61 79 } 62 80 -
src/ControlStruct/HoistControlDecls.hpp
r3a4732f r45040b61 9 9 // Author : Andrew Beach 10 10 // Created On : Fri Dec 3 15:31:00 2021 11 // Last Modified By : Andrew Beach12 // Last Modified On : Fri Dec 3 15:31:00 202113 // Update Count : 011 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jan 31 22:25:07 2022 13 // Update Count : 3 14 14 // 15 15 … … 17 17 18 18 namespace ast { 19 19 class TranslationUnit; 20 20 } 21 21 22 22 namespace ControlStruct { 23 24 /// Hoist initialization out of control flow statements. 23 // Hoist declarations out of control flow statements into compound statement. 25 24 void hoistControlDecls( ast::TranslationUnit & translationUnit ); 26 27 25 } // namespace ControlStruct 28 26
Note: See TracChangeset
for help on using the changeset viewer.