Changeset ee3c93d
- Timestamp:
- Jun 4, 2018, 12:40:46 PM (7 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, with_gc
- Children:
- 2ad4b49
- Parents:
- b429026
- git-author:
- Rob Schluntz <rschlunt@…> (06/04/18 12:40:38)
- git-committer:
- Rob Schluntz <rschlunt@…> (06/04/18 12:40:46)
- Location:
- src
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Common/PassVisitor.impl.h
rb429026 ree3c93d 828 828 VISIT_START( node ); 829 829 830 visitExpression( node->condition ); 831 node->body = visitStatement( node->body ); 830 { 831 // while statements introduce a level of scope (for the initialization) 832 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 833 maybeAccept_impl( node->initialization, *this ); 834 visitExpression ( node->condition ); 835 node->body = visitStatement( node->body ); 836 } 832 837 833 838 VISIT_END( node ); … … 838 843 MUTATE_START( node ); 839 844 840 node->condition = mutateExpression( node->condition ); 841 node->body = mutateStatement ( node->body ); 845 { 846 // while statements introduce a level of scope (for the initialization) 847 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 848 maybeMutate_impl( node->initialization, *this ); 849 node->condition = mutateExpression( node->condition ); 850 node->body = mutateStatement ( node->body ); 851 } 852 842 853 843 854 MUTATE_END( Statement, node ); -
src/ControlStruct/ForExprMutator.cc
rb429026 ree3c93d 45 45 return hoist( forStmt, forStmt->initialization ); 46 46 } 47 Statement *ForExprMutator::postmutate( WhileStmt *whileStmt ) { 48 return hoist( whileStmt, whileStmt->initialization ); 49 } 47 50 } // namespace ControlStruct 48 51 -
src/ControlStruct/ForExprMutator.h
rb429026 ree3c93d 18 18 class IfStmt; 19 19 class ForStmt; 20 class WhileStmt; 20 21 class Statement; 21 22 … … 25 26 Statement *postmutate( IfStmt * ); 26 27 Statement *postmutate( ForStmt * ); 28 Statement *postmutate( WhileStmt * ); 27 29 }; 28 30 } // namespace ControlStruct -
src/Parser/ParseNode.h
rb429026 ree3c93d 403 403 }; 404 404 405 Expression * build_if_control( IfCtl * ctl, std::list< Statement * > & init ); 405 406 Statement * build_if( IfCtl * ctl, StatementNode * then_stmt, StatementNode * else_stmt ); 406 407 Statement * build_switch( bool isSwitch, ExpressionNode * ctl, StatementNode * stmt ); -
src/Parser/StatementNode.cc
rb429026 ree3c93d 80 80 } 81 81 82 Statement * build_if( IfCtl * ctl, StatementNode * then_stmt, StatementNode * else_stmt ) { 83 Statement * thenb, * elseb = 0; 84 std::list< Statement * > branches; 85 buildMoveList< Statement, StatementNode >( then_stmt, branches ); 86 assert( branches.size() == 1 ); 87 thenb = branches.front(); 88 89 if ( else_stmt ) { 90 std::list< Statement * > branches; 91 buildMoveList< Statement, StatementNode >( else_stmt, branches ); 92 assert( branches.size() == 1 ); 93 elseb = branches.front(); 94 } // if 95 96 std::list< Statement * > init; 82 Expression * build_if_control( IfCtl * ctl, std::list< Statement * > & init ) { 97 83 if ( ctl->init != 0 ) { 98 84 buildMoveList( ctl->init, init ); … … 102 88 if ( ctl->condition ) { 103 89 // compare the provided condition against 0 104 cond = 90 cond = notZeroExpr( maybeMoveBuild< Expression >(ctl->condition) ); 105 91 } else { 106 92 for ( Statement * stmt : init ) { … … 113 99 } 114 100 delete ctl; 101 return cond; 102 } 103 104 Statement * build_if( IfCtl * ctl, StatementNode * then_stmt, StatementNode * else_stmt ) { 105 Statement * thenb, * elseb = 0; 106 std::list< Statement * > branches; 107 buildMoveList< Statement, StatementNode >( then_stmt, branches ); 108 assert( branches.size() == 1 ); 109 thenb = branches.front(); 110 111 if ( else_stmt ) { 112 std::list< Statement * > branches; 113 buildMoveList< Statement, StatementNode >( else_stmt, branches ); 114 assert( branches.size() == 1 ); 115 elseb = branches.front(); 116 } // if 117 118 std::list< Statement * > init; 119 Expression * cond = build_if_control( ctl, init ); 115 120 return new IfStmt( cond, thenb, elseb, init ); 116 121 } … … 144 149 buildMoveList< Statement, StatementNode >( stmt, branches ); 145 150 assert( branches.size() == 1 ); 146 return new WhileStmt( notZeroExpr( maybeMoveBuild< Expression >(ctl) ), branches.front(), kind ); 151 152 std::list< Statement * > init; 153 return new WhileStmt( notZeroExpr( maybeMoveBuild< Expression >(ctl) ), branches.front(), init, kind ); 147 154 } 148 155 -
src/SynTree/Statement.cc
rb429026 ree3c93d 243 243 } 244 244 245 WhileStmt::WhileStmt( Expression *condition, Statement *body, bool isDoWhile ):246 Statement(), condition( condition), body( body), i sDoWhile( isDoWhile) {245 WhileStmt::WhileStmt( Expression *condition, Statement *body, std::list< Statement * > & initialization, bool isDoWhile ): 246 Statement(), condition( condition), body( body), initialization( initialization ), isDoWhile( isDoWhile) { 247 247 } 248 248 -
src/SynTree/Statement.h
rb429026 ree3c93d 220 220 Expression *condition; 221 221 Statement *body; 222 std::list<Statement *> initialization; 222 223 bool isDoWhile; 223 224 224 225 WhileStmt( Expression *condition, 225 Statement *body, bool isDoWhile = false );226 Statement *body, std::list<Statement *> & initialization, bool isDoWhile = false ); 226 227 WhileStmt( const WhileStmt &other ); 227 228 virtual ~WhileStmt();
Note: See TracChangeset
for help on using the changeset viewer.