- File:
-
- 1 edited
-
src/ResolvExpr/AlternativeFinder.cc (modified) (20 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AlternativeFinder.cc
r906e24d rb6fe7e6 101 101 PruneStruct current( candidate ); 102 102 std::string mangleName; 103 {104 Type * newType = candidate->expr->get_result()->clone();103 for ( std::list< Type* >::const_iterator retType = candidate->expr->get_results().begin(); retType != candidate->expr->get_results().end(); ++retType ) { 104 Type *newType = (*retType)->clone(); 105 105 candidate->env.apply( newType ); 106 mangleName = SymTab::Mangler::mangle( newType );106 mangleName += SymTab::Mangler::mangle( newType ); 107 107 delete newType; 108 108 } … … 133 133 if ( ! target->second.isAmbiguous ) { 134 134 Alternative &alt = *target->second.candidate; 135 alt.env.applyFree( alt.expr->get_result() ); 135 for ( std::list< Type* >::iterator result = alt.expr->get_results().begin(); result != alt.expr->get_results().end(); ++result ) { 136 alt.env.applyFree( *result ); 137 } 136 138 *out++ = alt; 137 139 } 138 140 } 141 139 142 } 140 143 … … 167 170 168 171 void renameTypes( Expression *expr ) { 169 expr->get_result()->accept( global_renamer ); 172 for ( std::list< Type* >::iterator i = expr->get_results().begin(); i != expr->get_results().end(); ++i ) { 173 (*i)->accept( global_renamer ); 174 } 170 175 } 171 176 } … … 199 204 for ( AltList::iterator i = alternatives.begin(); i != alternatives.end(); ++i ) { 200 205 if ( adjust ) { 201 adjustExprType ( i->expr->get_result(), i->env, indexer );206 adjustExprTypeList( i->expr->get_results().begin(), i->expr->get_results().end(), i->env, indexer ); 202 207 } 203 208 } … … 254 259 255 260 Cost computeConversionCost( Alternative &alt, const SymTab::Indexer &indexer ) { 256 ApplicationExpr *appExpr = safe_dynamic_cast< ApplicationExpr* >( alt.expr ); 257 PointerType *pointer = safe_dynamic_cast< PointerType* >( appExpr->get_function()->get_result() ); 258 FunctionType *function = safe_dynamic_cast< FunctionType* >( pointer->get_base() ); 261 ApplicationExpr *appExpr = dynamic_cast< ApplicationExpr* >( alt.expr ); 262 assert( appExpr ); 263 PointerType *pointer = dynamic_cast< PointerType* >( appExpr->get_function()->get_results().front() ); 264 assert( pointer ); 265 FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ); 266 assert( function ); 259 267 260 268 Cost convCost( 0, 0, 0 ); … … 267 275 (*actualExpr)->print( std::cerr, 8 ); 268 276 std::cerr << "--- results are" << std::endl; 269 (*actualExpr)->get_result()->print(std::cerr, 8 );277 printAll( (*actualExpr)->get_results(), std::cerr, 8 ); 270 278 ) 271 279 std::list< DeclarationWithType* >::iterator startFormal = formal; 272 280 Cost actualCost; 273 // xxx - tuple type matching 274 std::list< Type * > flatActualTypes; 275 flatten( (*actualExpr)->get_result(), back_inserter( flatActualTypes ) ); 276 for ( std::list< Type* >::iterator actual = flatActualTypes.begin(); actual != flatActualTypes.end(); ++actual ) { 281 for ( std::list< Type* >::iterator actual = (*actualExpr)->get_results().begin(); actual != (*actualExpr)->get_results().end(); ++actual ) { 277 282 if ( formal == formals.end() ) { 278 283 if ( function->get_isVarArgs() ) { … … 378 383 std::list< DeclarationWithType* >::iterator formal = formals.begin(); 379 384 for ( AltList::const_iterator actualExpr = actuals.begin(); actualExpr != actuals.end(); ++actualExpr ) { 380 std::list< Type * > flatActualTypes; 381 flatten( actualExpr->expr->get_result(), back_inserter( flatActualTypes ) ); 382 for ( std::list< Type* >::iterator actual = flatActualTypes.begin(); actual != flatActualTypes.end(); ++actual ) { 385 for ( std::list< Type* >::iterator actual = actualExpr->expr->get_results().begin(); actual != actualExpr->expr->get_results().end(); ++actual ) { 383 386 if ( formal == formals.end() ) { 384 387 return isVarArgs; … … 497 500 //if ( newNeedParents[ curDecl->get_uniqueId() ][ candDecl->get_uniqueId() ]++ > recursionParentLimit ) continue; 498 501 Expression *varExpr = new VariableExpr( candDecl ); 499 delete varExpr->get_result(); 500 varExpr->set_result( adjType->clone() ); 502 deleteAll( varExpr->get_results() ); 503 varExpr->get_results().clear(); 504 varExpr->get_results().push_front( adjType->clone() ); 501 505 PRINT( 502 506 std::cerr << "satisfying assertion " << curDecl->get_uniqueId() << " "; … … 570 574 PointerType pt( Type::Qualifiers(), v.clone() ); 571 575 UntypedExpr *vexpr = untypedExpr->clone(); 572 vexpr-> set_result( pt.clone() );576 vexpr->get_results().push_front( pt.clone() ); 573 577 alternatives.push_back( Alternative( vexpr, env, Cost()) ); 574 578 return; … … 600 604 // check if the type is pointer to function 601 605 PointerType *pointer; 602 if ( ( pointer = dynamic_cast< PointerType* >( func->expr->get_result() ) ) ) {606 if ( func->expr->get_results().size() == 1 && ( pointer = dynamic_cast< PointerType* >( func->expr->get_results().front() ) ) ) { 603 607 if ( FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ) ) { 604 608 for ( std::list< AltList >::iterator actualAlt = possibilities.begin(); actualAlt != possibilities.end(); ++actualAlt ) { … … 636 640 // check if the type is pointer to function 637 641 PointerType *pointer; 638 if ( ( pointer = dynamic_cast< PointerType* >( funcOp->expr->get_result() ) ) ) { 642 if ( funcOp->expr->get_results().size() == 1 643 && ( pointer = dynamic_cast< PointerType* >( funcOp->expr->get_results().front() ) ) ) { 639 644 if ( FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ) ) { 640 645 for ( std::list< AltList >::iterator actualAlt = possibilities.begin(); actualAlt != possibilities.end(); ++actualAlt ) { … … 660 665 661 666 PRINT( 662 ApplicationExpr *appExpr = safe_dynamic_cast< ApplicationExpr* >( withFunc->expr ); 663 PointerType *pointer = safe_dynamic_cast< PointerType* >( appExpr->get_function()->get_result() ); 664 FunctionType *function = safe_dynamic_cast< FunctionType* >( pointer->get_base() ); 667 ApplicationExpr *appExpr = dynamic_cast< ApplicationExpr* >( withFunc->expr ); 668 assert( appExpr ); 669 PointerType *pointer = dynamic_cast< PointerType* >( appExpr->get_function()->get_results().front() ); 670 assert( pointer ); 671 FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ); 672 assert( function ); 665 673 std::cerr << "Case +++++++++++++" << std::endl; 666 674 std::cerr << "formals are:" << std::endl; … … 684 692 685 693 bool isLvalue( Expression *expr ) { 686 // xxx - recurse into tuples? 687 return expr->has_result() && expr->get_result()->get_isLvalue(); 694 for ( std::list< Type* >::const_iterator i = expr->get_results().begin(); i != expr->get_results().end(); ++i ) { 695 if ( !(*i)->get_isLvalue() ) return false; 696 } // for 697 return true; 688 698 } 689 699 … … 699 709 700 710 void AlternativeFinder::visit( CastExpr *castExpr ) { 701 Type *& toType = castExpr->get_result(); 702 toType = resolveTypeof( toType, indexer ); 703 SymTab::validateType( toType, &indexer ); 704 adjustExprType( toType, env, indexer ); 711 for ( std::list< Type* >::iterator i = castExpr->get_results().begin(); i != castExpr->get_results().end(); ++i ) { 712 *i = resolveTypeof( *i, indexer ); 713 SymTab::validateType( *i, &indexer ); 714 adjustExprType( *i, env, indexer ); 715 } // for 705 716 706 717 AlternativeFinder finder( indexer, env ); … … 716 727 // that are cast directly. The candidate is invalid if it has fewer results than there are types to cast 717 728 // to. 718 int discardedValues = (*i).expr->get_result ()->size() - castExpr->get_result()->size();729 int discardedValues = (*i).expr->get_results().size() - castExpr->get_results().size(); 719 730 if ( discardedValues < 0 ) continue; 720 // xxx - may need to go into tuple types and extract relavent types and use unifyList 731 std::list< Type* >::iterator candidate_end = (*i).expr->get_results().begin(); 732 std::advance( candidate_end, castExpr->get_results().size() ); 721 733 // unification run for side-effects 722 unify( castExpr->get_result(), (*i).expr->get_result(), i->env, needAssertions, haveAssertions, openVars, indexer ); 723 Cost thisCost = castCost( (*i).expr->get_result(), castExpr->get_result(), indexer, i->env ); 734 unifyList( castExpr->get_results().begin(), castExpr->get_results().end(), 735 (*i).expr->get_results().begin(), candidate_end, 736 i->env, needAssertions, haveAssertions, openVars, indexer ); 737 Cost thisCost = castCostList( (*i).expr->get_results().begin(), candidate_end, 738 castExpr->get_results().begin(), castExpr->get_results().end(), 739 indexer, i->env ); 724 740 if ( thisCost != Cost::infinity ) { 725 741 // count one safe conversion for each value that is thrown away … … 744 760 745 761 for ( AltList::const_iterator agg = funcFinder.alternatives.begin(); agg != funcFinder.alternatives.end(); ++agg ) { 746 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( agg->expr->get_result() ) ) { 747 addAggMembers( structInst, agg->expr, agg->cost, agg->env, memberExpr->get_member() ); 748 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( agg->expr->get_result() ) ) { 749 addAggMembers( unionInst, agg->expr, agg->cost, agg->env, memberExpr->get_member() ); 762 if ( agg->expr->get_results().size() == 1 ) { 763 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( agg->expr->get_results().front() ) ) { 764 addAggMembers( structInst, agg->expr, agg->cost, agg->env, memberExpr->get_member() ); 765 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( agg->expr->get_results().front() ) ) { 766 addAggMembers( unionInst, agg->expr, agg->cost, agg->env, memberExpr->get_member() ); 767 } // if 750 768 } // if 751 769 } // for … … 876 894 alternatives.push_back( Alternative( new AttrExpr( new VariableExpr( funcDecl ), argType->clone() ), env, Cost::zero ) ); 877 895 for ( std::list< DeclarationWithType* >::iterator i = function->get_returnVals().begin(); i != function->get_returnVals().end(); ++i ) { 878 alternatives.back().expr-> set_result( (*i)->get_type()->clone() );896 alternatives.back().expr->get_results().push_back( (*i)->get_type()->clone() ); 879 897 } // for 880 898 } // if … … 899 917 finder.find( attrExpr->get_expr() ); 900 918 for ( AltList::iterator choice = finder.alternatives.begin(); choice != finder.alternatives.end(); ++choice ) { 901 if ( choice->expr->get_result ()->size() == 1 ) {902 resolveAttr(*i, function, choice->expr->get_result (), choice->env );919 if ( choice->expr->get_results().size() == 1 ) { 920 resolveAttr(*i, function, choice->expr->get_results().front(), choice->env ); 903 921 } // fi 904 922 } // for … … 942 960 AssertionSet needAssertions, haveAssertions; 943 961 Alternative newAlt( 0, third->env, first->cost + second->cost + third->cost ); 944 Type* commonType;945 if ( unify ( second->expr->get_result(), third->expr->get_result(), newAlt.env, needAssertions, haveAssertions, openVars, indexer, commonType) ) {962 std::list< Type* > commonTypes; 963 if ( unifyList( second->expr->get_results().begin(), second->expr->get_results().end(), third->expr->get_results().begin(), third->expr->get_results().end(), newAlt.env, needAssertions, haveAssertions, openVars, indexer, commonTypes ) ) { 946 964 ConditionalExpr *newExpr = new ConditionalExpr( first->expr->clone(), second->expr->clone(), third->expr->clone() ); 947 newExpr->set_result( commonType ? commonType : second->expr->get_result()->clone() ); 965 std::list< Type* >::const_iterator original = second->expr->get_results().begin(); 966 std::list< Type* >::const_iterator commonType = commonTypes.begin(); 967 for ( ; original != second->expr->get_results().end() && commonType != commonTypes.end(); ++original, ++commonType ) { 968 if ( *commonType ) { 969 newExpr->get_results().push_back( *commonType ); 970 } else { 971 newExpr->get_results().push_back( (*original)->clone() ); 972 } // if 973 } // for 948 974 newAlt.expr = newExpr; 949 975 inferParameters( needAssertions, haveAssertions, newAlt, openVars, back_inserter( alternatives ) ); … … 973 999 TupleExpr *newExpr = new TupleExpr; 974 1000 makeExprList( *i, newExpr->get_exprs() ); 975 for ( Expression * resultExpr : newExpr->get_exprs() ) { 976 newExpr->set_result( resultExpr->get_result()->clone() ); 1001 for ( std::list< Expression* >::const_iterator resultExpr = newExpr->get_exprs().begin(); resultExpr != newExpr->get_exprs().end(); ++resultExpr ) { 1002 for ( std::list< Type* >::const_iterator resultType = (*resultExpr)->get_results().begin(); resultType != (*resultExpr)->get_results().end(); ++resultType ) { 1003 newExpr->get_results().push_back( (*resultType)->clone() ); 1004 } // for 977 1005 } // for 978 1006
Note:
See TracChangeset
for help on using the changeset viewer.