Changeset d551d0a
- Timestamp:
- Oct 20, 2017, 4:48:05 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:
- 76a395a
- Parents:
- 1fdfc23
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AlternativeFinder.cc
r1fdfc23 rd551d0a 579 579 expls(), nextExpl(0), tupleEls() {} 580 580 581 ArgPack(const ArgPack& old, Expression* actual, TypeEnvironment&& env,582 OpenVarSet&& openVars, const Cost& cost = Cost::zero)583 : actuals(old.actuals), env(std::move(env)), need(old.need), have(old.have),584 openVars(std::move(openVars)), nextArg(old.nextArg + 1), tupleEls(old.tupleEls) {585 // add new actual586 actuals.emplace_back( actual, this->env, cost );587 // count tuple elements, if applicable588 if ( ! tupleEls.empty() ) ++tupleEls.back();589 }590 591 ArgPack(const ArgPack& old, Expression* actual, TypeEnvironment&& env, AssertionSet&& need,592 AssertionSet&& have, OpenVarSet&& openVars, const Cost& cost = Cost::zero)593 : actuals(old.actuals), env(std::move(env)), need(std::move(need)),594 have(std::move(have)), openVars(std::move(openVars)), nextArg(old.nextArg + 1),595 tupleEls(old.tupleEls) {596 // add new actual597 actuals.emplace_back( actual, this->env, cost );598 // count tuple elements, if applicable599 if ( ! tupleEls.empty() ) ++tupleEls.back();600 }601 602 581 /// Starts a new tuple expression 603 582 void beginTuple() { … … 676 655 if ( unify( ttype, argType, result.env, result.need, result.have, 677 656 result.openVars, indexer ) ) { 678 finalResults. emplace_back( std::move(result) );657 finalResults.push_back( std::move(result) ); 679 658 } 680 659 continue; … … 766 745 // consider only first exploded actual 767 746 const Alternative& aActual = exploded.front(); 768 Type* actualType = aActual.expr->get_result() ;747 Type* actualType = aActual.expr->get_result()->clone(); 769 748 770 749 PRINT( … … 840 819 // keep if used all arguments 841 820 if ( result.nextArg >= args.size() ) { 842 finalResults. emplace_back( std::move(result) );821 finalResults.push_back( std::move(result) ); 843 822 continue; 844 823 } … … 846 825 // add each possible next argument 847 826 for ( const Alternative& actual : args[result.nextArg] ) { 848 TypeEnvironment env{ result.env }; 849 OpenVarSet openVars{ result.openVars }; 850 env.addActual( actual.env, openVars ); 851 nextResults.emplace_back( result, actual.expr->clone(), std::move(env), 852 std::move(openVars), actual.cost ); 827 ArgPack aResult = result; // copy to clone everything 828 // add details of actual to result 829 aResult.env.addActual( actual.env, aResult.openVars ); 830 Cost cost = actual.cost; 831 832 // explode argument 833 std::vector<Alternative> exploded; 834 Tuples::explode( actual, indexer, back_inserter( exploded ) ); 835 836 // add exploded argument to arg list 837 for ( Alternative& aActual : exploded ) { 838 aResult.withArg( aActual.expr, cost ); 839 cost = Cost::zero; 840 } 841 ++aResult.nextArg; 842 nextResults.push_back( std::move(aResult) ); 853 843 } 854 844 } … … 862 852 for ( ArgPack& result : results ) { 863 853 if ( result.nextArg >= args.size() ) { 864 finalResults. emplace_back( std::move(result) );854 finalResults.push_back( std::move(result) ); 865 855 } 866 856 }
Note: See TracChangeset
for help on using the changeset viewer.