Changeset 906e24d for src/ResolvExpr/AlternativeFinder.cc
- Timestamp:
- Sep 15, 2016, 10:17:16 AM (8 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:
- aa8f9df
- Parents:
- 96a10cd
- git-author:
- Rob Schluntz <rschlunt@…> (09/14/16 22:32:34)
- git-committer:
- Rob Schluntz <rschlunt@…> (09/15/16 10:17:16)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AlternativeFinder.cc
r96a10cd r906e24d 101 101 PruneStruct current( candidate ); 102 102 std::string mangleName; 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();103 { 104 Type * newType = candidate->expr->get_result()->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 for ( std::list< Type* >::iterator result = alt.expr->get_results().begin(); result != alt.expr->get_results().end(); ++result ) { 136 alt.env.applyFree( *result ); 137 } 135 alt.env.applyFree( alt.expr->get_result() ); 138 136 *out++ = alt; 139 137 } 140 138 } 141 142 139 } 143 140 … … 170 167 171 168 void renameTypes( Expression *expr ) { 172 for ( std::list< Type* >::iterator i = expr->get_results().begin(); i != expr->get_results().end(); ++i ) { 173 (*i)->accept( global_renamer ); 174 } 169 expr->get_result()->accept( global_renamer ); 175 170 } 176 171 } … … 204 199 for ( AltList::iterator i = alternatives.begin(); i != alternatives.end(); ++i ) { 205 200 if ( adjust ) { 206 adjustExprType List( i->expr->get_results().begin(), i->expr->get_results().end(), i->env, indexer );201 adjustExprType( i->expr->get_result(), i->env, indexer ); 207 202 } 208 203 } … … 259 254 260 255 Cost computeConversionCost( Alternative &alt, const SymTab::Indexer &indexer ) { 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 ); 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() ); 267 259 268 260 Cost convCost( 0, 0, 0 ); … … 275 267 (*actualExpr)->print( std::cerr, 8 ); 276 268 std::cerr << "--- results are" << std::endl; 277 printAll( (*actualExpr)->get_results(),std::cerr, 8 );269 (*actualExpr)->get_result()->print( std::cerr, 8 ); 278 270 ) 279 271 std::list< DeclarationWithType* >::iterator startFormal = formal; 280 272 Cost actualCost; 281 for ( std::list< Type* >::iterator actual = (*actualExpr)->get_results().begin(); actual != (*actualExpr)->get_results().end(); ++actual ) { 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 ) { 282 277 if ( formal == formals.end() ) { 283 278 if ( function->get_isVarArgs() ) { … … 383 378 std::list< DeclarationWithType* >::iterator formal = formals.begin(); 384 379 for ( AltList::const_iterator actualExpr = actuals.begin(); actualExpr != actuals.end(); ++actualExpr ) { 385 for ( std::list< Type* >::iterator actual = actualExpr->expr->get_results().begin(); actual != actualExpr->expr->get_results().end(); ++actual ) { 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 ) { 386 383 if ( formal == formals.end() ) { 387 384 return isVarArgs; … … 500 497 //if ( newNeedParents[ curDecl->get_uniqueId() ][ candDecl->get_uniqueId() ]++ > recursionParentLimit ) continue; 501 498 Expression *varExpr = new VariableExpr( candDecl ); 502 deleteAll( varExpr->get_results() ); 503 varExpr->get_results().clear(); 504 varExpr->get_results().push_front( adjType->clone() ); 499 delete varExpr->get_result(); 500 varExpr->set_result( adjType->clone() ); 505 501 PRINT( 506 502 std::cerr << "satisfying assertion " << curDecl->get_uniqueId() << " "; … … 574 570 PointerType pt( Type::Qualifiers(), v.clone() ); 575 571 UntypedExpr *vexpr = untypedExpr->clone(); 576 vexpr-> get_results().push_front( pt.clone() );572 vexpr->set_result( pt.clone() ); 577 573 alternatives.push_back( Alternative( vexpr, env, Cost()) ); 578 574 return; … … 604 600 // check if the type is pointer to function 605 601 PointerType *pointer; 606 if ( func->expr->get_results().size() == 1 && ( pointer = dynamic_cast< PointerType* >( func->expr->get_results().front() ) ) ) {602 if ( ( pointer = dynamic_cast< PointerType* >( func->expr->get_result() ) ) ) { 607 603 if ( FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ) ) { 608 604 for ( std::list< AltList >::iterator actualAlt = possibilities.begin(); actualAlt != possibilities.end(); ++actualAlt ) { … … 640 636 // check if the type is pointer to function 641 637 PointerType *pointer; 642 if ( funcOp->expr->get_results().size() == 1 643 && ( pointer = dynamic_cast< PointerType* >( funcOp->expr->get_results().front() ) ) ) { 638 if ( ( pointer = dynamic_cast< PointerType* >( funcOp->expr->get_result() ) ) ) { 644 639 if ( FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ) ) { 645 640 for ( std::list< AltList >::iterator actualAlt = possibilities.begin(); actualAlt != possibilities.end(); ++actualAlt ) { … … 665 660 666 661 PRINT( 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 ); 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() ); 673 665 std::cerr << "Case +++++++++++++" << std::endl; 674 666 std::cerr << "formals are:" << std::endl; … … 692 684 693 685 bool isLvalue( Expression *expr ) { 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; 686 // xxx - recurse into tuples? 687 return expr->has_result() && expr->get_result()->get_isLvalue(); 698 688 } 699 689 … … 709 699 710 700 void AlternativeFinder::visit( CastExpr *castExpr ) { 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 701 Type *& toType = castExpr->get_result(); 702 toType = resolveTypeof( toType, indexer ); 703 SymTab::validateType( toType, &indexer ); 704 adjustExprType( toType, env, indexer ); 716 705 717 706 AlternativeFinder finder( indexer, env ); … … 727 716 // that are cast directly. The candidate is invalid if it has fewer results than there are types to cast 728 717 // to. 729 int discardedValues = (*i).expr->get_result s().size() - castExpr->get_results().size();718 int discardedValues = (*i).expr->get_result()->size() - castExpr->get_result()->size(); 730 719 if ( discardedValues < 0 ) continue; 731 std::list< Type* >::iterator candidate_end = (*i).expr->get_results().begin(); 732 std::advance( candidate_end, castExpr->get_results().size() ); 720 // xxx - may need to go into tuple types and extract relavent types and use unifyList 733 721 // unification run for side-effects 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 ); 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 ); 740 724 if ( thisCost != Cost::infinity ) { 741 725 // count one safe conversion for each value that is thrown away … … 760 744 761 745 for ( AltList::const_iterator agg = funcFinder.alternatives.begin(); agg != funcFinder.alternatives.end(); ++agg ) { 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 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() ); 768 750 } // if 769 751 } // for … … 894 876 alternatives.push_back( Alternative( new AttrExpr( new VariableExpr( funcDecl ), argType->clone() ), env, Cost::zero ) ); 895 877 for ( std::list< DeclarationWithType* >::iterator i = function->get_returnVals().begin(); i != function->get_returnVals().end(); ++i ) { 896 alternatives.back().expr-> get_results().push_back( (*i)->get_type()->clone() );878 alternatives.back().expr->set_result( (*i)->get_type()->clone() ); 897 879 } // for 898 880 } // if … … 917 899 finder.find( attrExpr->get_expr() ); 918 900 for ( AltList::iterator choice = finder.alternatives.begin(); choice != finder.alternatives.end(); ++choice ) { 919 if ( choice->expr->get_result s().size() == 1 ) {920 resolveAttr(*i, function, choice->expr->get_result s().front(), choice->env );901 if ( choice->expr->get_result()->size() == 1 ) { 902 resolveAttr(*i, function, choice->expr->get_result(), choice->env ); 921 903 } // fi 922 904 } // for … … 960 942 AssertionSet needAssertions, haveAssertions; 961 943 Alternative newAlt( 0, third->env, first->cost + second->cost + third->cost ); 962 std::list< Type* > commonTypes;963 if ( unify List( 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) ) {944 Type* commonType; 945 if ( unify( second->expr->get_result(), third->expr->get_result(), newAlt.env, needAssertions, haveAssertions, openVars, indexer, commonType ) ) { 964 946 ConditionalExpr *newExpr = new ConditionalExpr( first->expr->clone(), second->expr->clone(), third->expr->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 947 newExpr->set_result( commonType ? commonType : second->expr->get_result()->clone() ); 974 948 newAlt.expr = newExpr; 975 949 inferParameters( needAssertions, haveAssertions, newAlt, openVars, back_inserter( alternatives ) ); … … 999 973 TupleExpr *newExpr = new TupleExpr; 1000 974 makeExprList( *i, newExpr->get_exprs() ); 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 975 for ( Expression * resultExpr : newExpr->get_exprs() ) { 976 newExpr->set_result( resultExpr->get_result()->clone() ); 1005 977 } // for 1006 978
Note: See TracChangeset
for help on using the changeset viewer.