Changeset bf32bb8
- Timestamp:
- Oct 18, 2016, 4:23:04 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, resolv-new, with_gc
- Children:
- f0121d7
- Parents:
- 848ce71
- Location:
- src
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/parser.cc
r848ce71 rbf32bb8 1023 1023 static const yytype_uint16 yyrline[] = 1024 1024 { 1025 0, 30 2, 302, 306, 313, 314, 315, 319, 320, 321,1026 32 5, 326, 330, 331, 335, 336, 340, 344, 345, 356,1027 35 8, 360, 362, 367, 368, 374, 378, 380, 382, 384,1028 38 6, 388, 390, 392, 394, 403, 404, 410, 411, 415,1029 41 6, 420, 424, 426, 428, 430, 435, 436, 440, 443,1025 0, 301, 301, 305, 312, 313, 314, 318, 319, 320, 1026 324, 325, 329, 330, 334, 335, 339, 343, 344, 355, 1027 357, 359, 361, 366, 367, 373, 377, 379, 381, 383, 1028 385, 387, 389, 391, 393, 402, 403, 409, 410, 414, 1029 415, 419, 422, 424, 426, 428, 433, 435, 440, 443, 1030 1030 445, 447, 452, 465, 467, 469, 471, 473, 475, 477, 1031 1031 479, 481, 483, 485, 492, 493, 499, 500, 501, 502, … … 4977 4977 4978 4978 /* Line 1806 of yacc.c */ 4979 #line 30 2"parser.yy"4979 #line 301 "parser.yy" 4980 4980 { typedefTable.enterScope(); } 4981 4981 break; … … 4984 4984 4985 4985 /* Line 1806 of yacc.c */ 4986 #line 30 6"parser.yy"4986 #line 305 "parser.yy" 4987 4987 { typedefTable.leaveScope(); } 4988 4988 break; … … 4991 4991 4992 4992 /* Line 1806 of yacc.c */ 4993 #line 312 "parser.yy" 4994 { (yyval.en) = new ExpressionNode( build_constantInteger( *(yyvsp[(1) - (1)].tok) ) ); } 4995 break; 4996 4997 case 5: 4998 4999 /* Line 1806 of yacc.c */ 4993 5000 #line 313 "parser.yy" 4994 { (yyval.en) = new ExpressionNode( build_constant Integer( *(yyvsp[(1) - (1)].tok) ) ); }4995 break; 4996 4997 case 5:5001 { (yyval.en) = new ExpressionNode( build_constantFloat( *(yyvsp[(1) - (1)].tok) ) ); } 5002 break; 5003 5004 case 6: 4998 5005 4999 5006 /* Line 1806 of yacc.c */ 5000 5007 #line 314 "parser.yy" 5001 { (yyval.en) = new ExpressionNode( build_constantFloat( *(yyvsp[(1) - (1)].tok) ) ); }5002 break;5003 5004 case 6:5005 5006 /* Line 1806 of yacc.c */5007 #line 315 "parser.yy"5008 5008 { (yyval.en) = new ExpressionNode( build_constantChar( *(yyvsp[(1) - (1)].tok) ) ); } 5009 5009 break; … … 5012 5012 5013 5013 /* Line 1806 of yacc.c */ 5014 #line 3 40"parser.yy"5014 #line 339 "parser.yy" 5015 5015 { (yyval.constant) = build_constantStr( *(yyvsp[(1) - (1)].str) ); } 5016 5016 break; … … 5019 5019 5020 5020 /* Line 1806 of yacc.c */ 5021 #line 34 4"parser.yy"5021 #line 343 "parser.yy" 5022 5022 { (yyval.str) = (yyvsp[(1) - (1)].tok); } 5023 5023 break; … … 5026 5026 5027 5027 /* Line 1806 of yacc.c */ 5028 #line 34 6"parser.yy"5028 #line 345 "parser.yy" 5029 5029 { 5030 5030 appendStr( (yyvsp[(1) - (2)].str), (yyvsp[(2) - (2)].tok) ); // append 2nd juxtaposed string to 1st … … 5037 5037 5038 5038 /* Line 1806 of yacc.c */ 5039 #line 35 7"parser.yy"5039 #line 356 "parser.yy" 5040 5040 { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (1)].tok) ) ); } 5041 5041 break; … … 5044 5044 5045 5045 /* Line 1806 of yacc.c */ 5046 #line 35 9"parser.yy"5046 #line 358 "parser.yy" 5047 5047 { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (1)].tok) ) ); } 5048 5048 break; … … 5051 5051 5052 5052 /* Line 1806 of yacc.c */ 5053 #line 36 1"parser.yy"5053 #line 360 "parser.yy" 5054 5054 { (yyval.en) = (yyvsp[(2) - (3)].en); } 5055 5055 break; … … 5058 5058 5059 5059 /* Line 1806 of yacc.c */ 5060 #line 36 3"parser.yy"5060 #line 362 "parser.yy" 5061 5061 { (yyval.en) = new ExpressionNode( build_valexpr( (yyvsp[(2) - (3)].sn) ) ); } 5062 5062 break; … … 5065 5065 5066 5066 /* Line 1806 of yacc.c */ 5067 #line 37 3"parser.yy"5067 #line 372 "parser.yy" 5068 5068 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Index, (yyvsp[(1) - (6)].en), (yyvsp[(4) - (6)].en) ) ); } 5069 5069 break; … … 5072 5072 5073 5073 /* Line 1806 of yacc.c */ 5074 #line 37 5"parser.yy"5074 #line 374 "parser.yy" 5075 5075 { (yyval.en) = new ExpressionNode( build_func( (yyvsp[(1) - (4)].en), (yyvsp[(3) - (4)].en) ) ); } 5076 5076 break; … … 5079 5079 5080 5080 /* Line 1806 of yacc.c */ 5081 #line 37 9"parser.yy"5081 #line 378 "parser.yy" 5082 5082 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(1) - (3)].en), build_varref( (yyvsp[(3) - (3)].tok) ) ) ); } 5083 5083 break; … … 5086 5086 5087 5087 /* Line 1806 of yacc.c */ 5088 #line 38 1"parser.yy"5088 #line 380 "parser.yy" 5089 5089 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(1) - (7)].en), build_tuple( (yyvsp[(5) - (7)].en) ) ) ); } 5090 5090 break; … … 5093 5093 5094 5094 /* Line 1806 of yacc.c */ 5095 #line 38 3"parser.yy"5095 #line 382 "parser.yy" 5096 5096 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(1) - (3)].en), build_constantInteger( *(yyvsp[(3) - (3)].tok) ) ) ); } 5097 5097 break; … … 5100 5100 5101 5101 /* Line 1806 of yacc.c */ 5102 #line 38 5"parser.yy"5102 #line 384 "parser.yy" 5103 5103 { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(1) - (3)].en), build_varref( (yyvsp[(3) - (3)].tok) ) ) ); } 5104 5104 break; … … 5107 5107 5108 5108 /* Line 1806 of yacc.c */ 5109 #line 38 7"parser.yy"5109 #line 386 "parser.yy" 5110 5110 { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(1) - (7)].en), build_tuple( (yyvsp[(5) - (7)].en) ) ) ); } 5111 5111 break; … … 5114 5114 5115 5115 /* Line 1806 of yacc.c */ 5116 #line 38 9"parser.yy"5116 #line 388 "parser.yy" 5117 5117 { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::IncrPost, (yyvsp[(1) - (2)].en) ) ); } 5118 5118 break; … … 5121 5121 5122 5122 /* Line 1806 of yacc.c */ 5123 #line 39 1"parser.yy"5123 #line 390 "parser.yy" 5124 5124 { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::DecrPost, (yyvsp[(1) - (2)].en) ) ); } 5125 5125 break; … … 5128 5128 5129 5129 /* Line 1806 of yacc.c */ 5130 #line 39 3"parser.yy"5130 #line 392 "parser.yy" 5131 5131 { (yyval.en) = new ExpressionNode( build_compoundLiteral( (yyvsp[(2) - (7)].decl), new InitializerNode( (yyvsp[(5) - (7)].in), true ) ) ); } 5132 5132 break; … … 5135 5135 5136 5136 /* Line 1806 of yacc.c */ 5137 #line 39 5"parser.yy"5137 #line 394 "parser.yy" 5138 5138 { 5139 5139 Token fn; … … 5146 5146 5147 5147 /* Line 1806 of yacc.c */ 5148 #line 40 5"parser.yy"5148 #line 404 "parser.yy" 5149 5149 { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) )); } 5150 5150 break; … … 5153 5153 5154 5154 /* Line 1806 of yacc.c */ 5155 #line 4 10"parser.yy"5155 #line 409 "parser.yy" 5156 5156 { (yyval.en) = 0; } 5157 5157 break; … … 5160 5160 5161 5161 /* Line 1806 of yacc.c */ 5162 #line 41 6"parser.yy"5162 #line 415 "parser.yy" 5163 5163 { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) ); } 5164 5164 break; 5165 5165 5166 case 4 1:5166 case 42: 5167 5167 5168 5168 /* Line 1806 of yacc.c */ 5169 5169 #line 423 "parser.yy" 5170 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(1) - (3)].en), maybeMoveBuild<Expression>( (yyvsp[(3) - (3)].en) ) ) ); } 5171 break; 5172 5173 case 43: 5174 5175 /* Line 1806 of yacc.c */ 5176 #line 425 "parser.yy" 5177 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(1) - (7)].en), build_tuple( (yyvsp[(5) - (7)].en) ) ) ); } 5178 break; 5179 5180 case 44: 5181 5182 /* Line 1806 of yacc.c */ 5183 #line 427 "parser.yy" 5184 { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(1) - (3)].en), maybeMoveBuild<Expression>( (yyvsp[(3) - (3)].en) ) ) ); } 5185 break; 5186 5187 case 45: 5188 5189 /* Line 1806 of yacc.c */ 5190 #line 429 "parser.yy" 5191 { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(1) - (7)].en), build_tuple( (yyvsp[(5) - (7)].en) ) ) ); } 5192 break; 5193 5194 case 46: 5195 5196 /* Line 1806 of yacc.c */ 5197 #line 434 "parser.yy" 5170 5198 { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (1)].tok) ) ); } 5171 5199 break; 5172 5200 5173 case 42: 5174 5175 /* Line 1806 of yacc.c */ 5176 #line 425 "parser.yy" 5177 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(3) - (3)].en), build_varref( (yyvsp[(1) - (3)].tok) ) ) ); } 5178 break; 5179 5180 case 43: 5181 5182 /* Line 1806 of yacc.c */ 5183 #line 427 "parser.yy" 5184 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(5) - (7)].en), build_varref( (yyvsp[(1) - (7)].tok) ) ) ); } 5185 break; 5186 5187 case 44: 5188 5189 /* Line 1806 of yacc.c */ 5190 #line 429 "parser.yy" 5191 { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(3) - (3)].en), build_varref( (yyvsp[(1) - (3)].tok) ) ) ); } 5192 break; 5193 5194 case 45: 5195 5196 /* Line 1806 of yacc.c */ 5197 #line 431 "parser.yy" 5198 { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(5) - (7)].en), build_varref( (yyvsp[(1) - (7)].tok) ) ) ); } 5201 case 47: 5202 5203 /* Line 1806 of yacc.c */ 5204 #line 436 "parser.yy" 5205 { (yyval.en) = new ExpressionNode( build_constantInteger( *(yyvsp[(1) - (1)].tok) ) ); } 5199 5206 break; 5200 5207 … … 9208 9215 9209 9216 /* Line 1806 of yacc.c */ 9210 #line 921 1"Parser/parser.cc"9217 #line 9218 "Parser/parser.cc" 9211 9218 default: break; 9212 9219 } -
src/Parser/parser.yy
r848ce71 rbf32bb8 195 195 196 196 %type<decl> field_declaration field_declaration_list field_declarator field_declaring_list 197 %type<en> field field_list 198 %type<tok> field_name 197 %type<en> field field_list field_name 199 198 200 199 %type<decl> external_function_definition function_definition function_array function_declarator function_no_ptr function_ptr … … 421 420 // ambiguity with .0 so space required after field-selection, e.g. 422 421 // struct S { int 0, 1; } s; s. 0 = 0; s. 1 = 1; 423 { $$ = new ExpressionNode( build_varref( $1 ) ); }424 422 | field_name '.' field 425 { $$ = new ExpressionNode( build_fieldSel( $ 3, build_varref( $1) ) ); }423 { $$ = new ExpressionNode( build_fieldSel( $1, maybeMoveBuild<Expression>( $3 ) ) ); } 426 424 | field_name '.' '[' push field_list pop ']' 427 { $$ = new ExpressionNode( build_fieldSel( $ 5, build_varref( $1) ) ); }425 { $$ = new ExpressionNode( build_fieldSel( $1, build_tuple( $5 ) ) ); } 428 426 | field_name ARROW field 429 { $$ = new ExpressionNode( build_pfieldSel( $ 3, build_varref( $1) ) ); }427 { $$ = new ExpressionNode( build_pfieldSel( $1, maybeMoveBuild<Expression>( $3 ) ) ); } 430 428 | field_name ARROW '[' push field_list pop ']' 431 { $$ = new ExpressionNode( build_pfieldSel( $ 5, build_varref( $1) ) ); }429 { $$ = new ExpressionNode( build_pfieldSel( $1, build_tuple( $5 ) ) ); } 432 430 ; 433 431 434 432 field_name: 435 433 no_attr_identifier 434 { $$ = new ExpressionNode( build_varref( $1 ) ); } 436 435 | INTEGERconstant 436 { $$ = new ExpressionNode( build_constantInteger( *$1 ) ); } 437 437 ; 438 438 -
src/ResolvExpr/AlternativeFinder.cc
r848ce71 rbf32bb8 209 209 template< typename StructOrUnionType > 210 210 void AlternativeFinder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member ) { 211 // member must be either a tuple expression or a name expr 212 if ( NameExpr * nameExpr = dynamic_cast< NameExpr * >( member ) ) { 213 const std::string & name = nameExpr->get_name(); 214 std::list< Declaration* > members; 215 aggInst->lookup( name, members ); 216 for ( std::list< Declaration* >::const_iterator i = members.begin(); i != members.end(); ++i ) { 217 if ( DeclarationWithType *dwt = dynamic_cast< DeclarationWithType* >( *i ) ) { 218 alternatives.push_back( Alternative( new MemberExpr( dwt, expr->clone() ), env, newCost ) ); 219 renameTypes( alternatives.back().expr ); 220 } else { 221 assert( false ); 222 } 223 } 224 } else if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * >( member ) ) { 225 assert( false ); 226 } else { 227 // xxx - temporary 228 std::cerr << member << std::endl; 229 assertf( false, "reached unexpected case of addAggMembers" ); 211 212 // by this point, member must be a name expr 213 NameExpr * nameExpr = safe_dynamic_cast< NameExpr * >( member ); 214 const std::string & name = nameExpr->get_name(); 215 std::list< Declaration* > members; 216 aggInst->lookup( name, members ); 217 for ( std::list< Declaration* >::const_iterator i = members.begin(); i != members.end(); ++i ) { 218 if ( DeclarationWithType *dwt = dynamic_cast< DeclarationWithType* >( *i ) ) { 219 alternatives.push_back( Alternative( new MemberExpr( dwt, expr->clone() ), env, newCost ) ); 220 renameTypes( alternatives.back().expr ); 221 } else { 222 assert( false ); 223 } 230 224 } 231 225 } … … 1059 1053 alternatives.push_back( Alternative( tupleAssignExpr->clone(), env, Cost::zero ) ); 1060 1054 } 1055 1056 void AlternativeFinder::visit( UniqueExpr *unqExpr ) { 1057 AlternativeFinder finder( indexer, env ); 1058 finder.findWithAdjustment( unqExpr->get_expr() ); 1059 for ( Alternative & alt : finder.alternatives ) { 1060 // xxx - it's possible that this won't always do the right thing, i.e. two UniqueExprs 1061 // with the same ID may resolve to different expressions. If this ever happens, it might be necessary 1062 // to try to select an alternative here (i.e. error is there is not a unique min-cost expression). 1063 // One other thought is to to resolve each ID once and map the IDs to resolved expressions, 1064 // but this isn't as simple as it sounds since the alternative is not selected here, meaning it might 1065 // require complicated tracking throughout the system. 1066 1067 // brand the new UniqueExprs with the same id so that they are recognized as the same expression by the expansion pass 1068 alternatives.push_back( Alternative( new UniqueExpr( alt.expr->clone(), unqExpr->get_id() ), env, Cost::zero ) ); 1069 } 1070 } 1071 1061 1072 } // namespace ResolvExpr 1062 1073 -
src/ResolvExpr/AlternativeFinder.h
r848ce71 rbf32bb8 69 69 virtual void visit( TupleIndexExpr *tupleExpr ); 70 70 virtual void visit( TupleAssignExpr *tupleExpr ); 71 virtual void visit( UniqueExpr *unqExpr ); 71 72 /// Runs a new alternative finder on each element in [begin, end) 72 73 /// and writes each alternative finder to out. -
src/SynTree/Expression.cc
r848ce71 rbf32bb8 580 580 581 581 582 UniqueExpr::UniqueExpr( Expression *expr ) : expr( new Expression* ) { 582 long long UniqueExpr::count = 0; 583 UniqueExpr::UniqueExpr( Expression *expr, long long idVal ) : expr( new Expression* ), id( idVal ) { 584 assert( count != -1 ); 585 if ( id == -1 ) id = count++; 583 586 set_expr( expr ); 584 587 assert( expr ); 585 assert( expr->has_result() ); 586 set_result( expr->get_result()->clone() ); 587 } 588 UniqueExpr::UniqueExpr( const UniqueExpr &other ) : Expression( other ), expr( other.expr ) { 588 if ( expr->get_result() ) { 589 set_result( expr->get_result()->clone() ); 590 } 591 } 592 UniqueExpr::UniqueExpr( const UniqueExpr &other ) : Expression( other ), expr( other.expr ), id( other.id ) { 589 593 } 590 594 UniqueExpr::~UniqueExpr() { … … 594 598 } 595 599 void UniqueExpr::print( std::ostream &os, int indent ) const { 596 os << "Unique Expression : "<< std::endl << std::string( indent+2, ' ' );600 os << "Unique Expression with id:" << id << std::endl << std::string( indent+2, ' ' ); 597 601 get_expr()->print( os, indent+2 ); 598 602 } -
src/SynTree/Expression.h
r848ce71 rbf32bb8 735 735 class UniqueExpr : public Expression { 736 736 public: 737 UniqueExpr( Expression * expr );737 UniqueExpr( Expression * expr, long long idVal = -1 ); 738 738 UniqueExpr( const UniqueExpr & other ); 739 739 ~UniqueExpr(); … … 742 742 UniqueExpr * set_expr( Expression * newValue ) { *expr = newValue; return this; } 743 743 744 int get_id() const { return id; } 745 744 746 virtual UniqueExpr *clone() const { return new UniqueExpr( *this ); } 745 747 virtual void accept( Visitor &v ) { v.visit( this ); } … … 748 750 private: 749 751 std::shared_ptr< Expression * > expr; 752 int id; 753 static long long count; 750 754 }; 751 755 -
src/Tuples/TupleExpansion.cc
r848ce71 rbf32bb8 31 31 namespace Tuples { 32 32 namespace { 33 class MemberTupleExpander : public Mutator { 34 public: 35 typedef Mutator Parent; 36 virtual Expression * mutate( UntypedMemberExpr * memberExpr ); 37 }; 38 33 39 class UniqueExprExpander : public GenPoly::DeclMutator { 34 40 public: 35 41 typedef GenPoly::DeclMutator Parent; 36 42 virtual Expression * mutate( UniqueExpr * unqExpr ); 37 std::map< Expression *, ObjectDecl * > decls;43 std::map< int, ObjectDecl * > decls; // not vector, because order added may not be increasing order 38 44 }; 39 45 … … 73 79 } 74 80 81 void expandMemberTuples( std::list< Declaration * > & translationUnit ) { 82 MemberTupleExpander expander; 83 mutateAll( translationUnit, expander ); 84 } 85 75 86 void expandUniqueExpr( std::list< Declaration * > & translationUnit ) { 76 87 UniqueExprExpander unqExpander; … … 92 103 } 93 104 105 namespace { 106 /// given a expression representing the member and an expression representing the aggregate, 107 /// reconstructs a flattened UntypedMemberExpr with the right precedence 108 Expression * reconstructMemberExpr( Expression * member, UniqueExpr * aggr ) { 109 if ( UntypedMemberExpr * memberExpr = dynamic_cast< UntypedMemberExpr * >( member ) ) { 110 // construct a new UntypedMemberExpr with the correct structure , and recursively 111 // expand that member expression. 112 MemberTupleExpander expander; 113 UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( memberExpr->get_member(), new UntypedMemberExpr( memberExpr->get_aggregate(), aggr->clone() ) ); 114 115 memberExpr->set_member(nullptr); 116 memberExpr->set_aggregate(nullptr); 117 delete memberExpr; 118 return newMemberExpr->acceptMutator( expander ); 119 } else { 120 // not a member expression, so there is nothing to do but attach and return 121 return new UntypedMemberExpr( member, aggr->clone() ); 122 } 123 } 124 } 125 126 Expression * MemberTupleExpander::mutate( UntypedMemberExpr * memberExpr ) { 127 if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * > ( memberExpr->get_member() ) ) { 128 UniqueExpr * unqExpr = new UniqueExpr( memberExpr->get_aggregate()->clone() ); 129 for ( Expression *& expr : tupleExpr->get_exprs() ) { 130 expr = reconstructMemberExpr( expr, unqExpr ); 131 } 132 delete unqExpr; 133 return tupleExpr; 134 } else { 135 return memberExpr; 136 } 137 } 138 94 139 Expression * UniqueExprExpander::mutate( UniqueExpr * unqExpr ) { 95 140 static UniqueName tempNamer( "_unq_expr_" ); 96 141 unqExpr = safe_dynamic_cast< UniqueExpr * > ( Parent::mutate( unqExpr ) ); 97 if ( ! decls.count( unqExpr->get_ expr() ) ) {142 if ( ! decls.count( unqExpr->get_id() ) ) { 98 143 // xxx - it's possible (likely?) that expressions can appear in the wrong order because of this. Need to ensure they're placed in the correct location. 144 // xxx - is it possible to make the decl's type const? 99 145 ObjectDecl * decl = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, unqExpr->get_result()->clone(), new SingleInit( unqExpr->get_expr()->clone() ) ); 100 decls[unqExpr->get_ expr()] = decl;146 decls[unqExpr->get_id()] = decl; 101 147 addDeclaration( decl ); 102 148 } 103 return new VariableExpr( decls[unqExpr->get_ expr()] );149 return new VariableExpr( decls[unqExpr->get_id()] ); 104 150 } 105 151 … … 176 222 177 223 Expression * TupleExprExpander::mutate( TupleExpr * tupleExpr ) { 224 // recursively expand sub-tuple-expressions 225 tupleExpr = safe_dynamic_cast<TupleExpr *>(Parent::mutate(tupleExpr)); 178 226 Type * result = tupleExpr->get_result(); 179 227 std::list< Expression * > exprs = tupleExpr->get_exprs(); 180 228 assert( result ); 181 229 230 // remove data from shell and delete it 182 231 tupleExpr->set_result( nullptr ); 183 232 tupleExpr->get_exprs().clear(); -
src/Tuples/Tuples.h
r848ce71 rbf32bb8 30 30 31 31 // TupleExpansion.cc 32 /// expands z.[a, b.[x, y], c] into [z.a, z.b.x, z.b.y, z.c], inserting UniqueExprs as appropriate 33 void expandMemberTuples( std::list< Declaration * > & translationUnit ); 34 35 /// replaces tuple-related elements, such as TupleType, TupleExpr, TupleAssignExpr, etc. 32 36 void expandTuples( std::list< Declaration * > & translationUnit ); 33 37 34 void expandUniqueExpr( std::list< Declaration * > & translationUnit ); 38 /// replaces UniqueExprs with a temporary variable and one call 39 void expandUniqueExpr( std::list< Declaration * > & translationUnit ); 35 40 36 37 41 /// returns VoidType if any of the expressions have Voidtype, otherwise TupleType of the Expression result types 42 Type * makeTupleType( const std::list< Expression * > & exprs ); 38 43 39 bool maybeImpure( Expression * expr ); 44 /// returns true if the expression may contain side-effects. 45 bool maybeImpure( Expression * expr ); 40 46 41 47 -
src/main.cc
r848ce71 rbf32bb8 232 232 OPTPRINT( "tweakInit" ) 233 233 InitTweak::genInit( translationUnit ); 234 234 OPTPRINT( "expandMemberTuples" ); 235 Tuples::expandMemberTuples( translationUnit ); 235 236 if ( libcfap ) { 236 237 // generate the bodies of cfa library functions
Note: See TracChangeset
for help on using the changeset viewer.