- File:
-
- 1 edited
-
src/ResolvExpr/AlternativeFinder.cc (modified) (25 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AlternativeFinder.cc
r0f19d763 rde62360d 10 10 // Created On : Sat May 16 23:52:08 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat May 16 23:55:30201513 // Update Count : 312 // Last Modified On : Mon Jun 22 17:19:54 2015 13 // Update Count : 17 14 14 // 15 15 … … 89 89 }; 90 90 91 /// Prunes a list of alternatives down to those that have the minimum conversion cost for a given return type; skips ambiguous interpretations92 91 template< typename InputIterator, typename OutputIterator > 93 92 void pruneAlternatives( InputIterator begin, InputIterator end, OutputIterator out, const SymTab::Indexer &indexer ) { … … 108 107 PRINT( 109 108 std::cout << "cost " << candidate->cost << " beats " << mapPlace->second.candidate->cost << std::endl; 110 )109 ) 111 110 selected[ mangleName ] = current; 112 111 } else if ( candidate->cost == mapPlace->second.candidate->cost ) { 113 112 PRINT( 114 113 std::cout << "marking ambiguous" << std::endl; 115 )114 ) 116 115 mapPlace->second.isAmbiguous = true; 117 116 } … … 123 122 PRINT( 124 123 std::cout << "there are " << selected.size() << " alternatives before elimination" << std::endl; 125 )124 ) 126 125 127 126 // accept the alternatives that were unambiguous … … 184 183 std::cout << "findSubExprs" << std::endl; 185 184 printAlts( finder.alternatives, std::cout ); 186 )185 ) 187 186 *out++ = finder; 188 187 } … … 206 205 std::cout << "alternatives before prune:" << std::endl; 207 206 printAlts( alternatives, std::cout ); 208 )207 ) 209 208 AltList::iterator oldBegin = alternatives.begin(); 210 209 pruneAlternatives( alternatives.begin(), alternatives.end(), front_inserter( alternatives ), indexer ); 211 210 if ( alternatives.begin() == oldBegin ) { 212 std::ostr stream stream;211 std::ostringstream stream; 213 212 stream << "Can't choose between alternatives for expression "; 214 213 expr->print( stream ); … … 217 216 findMinCost( alternatives.begin(), alternatives.end(), back_inserter( winners ) ); 218 217 printAlts( winners, stream, 8 ); 219 throw SemanticError( st d::string( stream.str(), stream.pcount()) );218 throw SemanticError( stream.str() ); 220 219 } 221 220 alternatives.erase( oldBegin, alternatives.end() ); 222 221 PRINT( 223 222 std::cout << "there are " << alternatives.size() << " alternatives after elimination" << std::endl; 224 )223 ) 225 224 } 226 225 … … 265 264 std::cout << "--- results are" << std::endl; 266 265 printAll( (*actualExpr)->get_results(), std::cout, 8 ); 267 )268 std::list< DeclarationWithType* >::iterator startFormal = formal;266 ) 267 std::list< DeclarationWithType* >::iterator startFormal = formal; 269 268 Cost actualCost; 270 269 for ( std::list< Type* >::iterator actual = (*actualExpr)->get_results().begin(); actual != (*actualExpr)->get_results().end(); ++actual ) { … … 282 281 std::cout << std::endl << " to "; 283 282 (*formal)->get_type()->print( std::cout, 8 ); 284 )285 Cost newCost = conversionCost( *actual, (*formal)->get_type(), indexer, alt.env );283 ) 284 Cost newCost = conversionCost( *actual, (*formal)->get_type(), indexer, alt.env ); 286 285 PRINT( 287 286 std::cout << std::endl << "cost is" << newCost << std::endl; 288 )289 290 if ( newCost == Cost::infinity ) {291 return newCost;292 }287 ) 288 289 if ( newCost == Cost::infinity ) { 290 return newCost; 291 } 293 292 convCost += newCost; 294 293 actualCost += newCost; … … 354 353 355 354 bool AlternativeFinder::instantiateFunction( std::list< DeclarationWithType* >& formals, /*const*/ AltList &actuals, bool isVarArgs, OpenVarSet& openVars, TypeEnvironment &resultEnv, AssertionSet &resultNeed, AssertionSet &resultHave ) { 355 std::list< TypeEnvironment > toBeDone; 356 356 simpleCombineEnvironments( actuals.begin(), actuals.end(), resultEnv ); 357 357 // make sure we don't widen any existing bindings … … 381 381 (*actual)->print( std::cerr ); 382 382 std::cerr << std::endl; 383 )383 ) 384 384 if ( ! unify( (*formal)->get_type(), *actual, resultEnv, resultNeed, resultHave, openVars, indexer ) ) { 385 385 return false; … … 429 429 std::cerr << "recursing with new set:" << std::endl; 430 430 printAssertionSet( newNeed, std::cerr, 8 ); 431 )431 ) 432 432 inferRecursive( newNeed.begin(), newNeed.end(), newAlt, openVars, decls, newerNeed, level+1, indexer, out ); 433 433 return; … … 444 444 curDecl->print( std::cerr ); 445 445 std::cerr << std::endl; 446 )446 ) 447 447 std::list< DeclarationWithType* > candidates; 448 448 decls.lookupId( curDecl->get_name(), candidates ); … … 453 453 (*candidate)->print( std::cout ); 454 454 std::cout << std::endl; 455 )455 ) 456 456 AssertionSet newHave, newerNeed( newNeed ); 457 457 TypeEnvironment newEnv( newAlt.env ); … … 466 466 adjType->print( std::cerr ); 467 467 std::cerr << std::endl; 468 )468 ) 469 469 if ( unify( curDecl->get_type(), adjType, newEnv, newerNeed, newHave, newOpenVars, indexer ) ) { 470 470 PRINT( 471 471 std::cerr << "success!" << std::endl; 472 )472 ) 473 473 SymTab::Indexer newDecls( decls ); 474 474 addToIndexer( newHave, newDecls ); … … 486 486 (*candidate)->print( std::cout ); 487 487 std::cout << std::endl; 488 )488 ) 489 489 ApplicationExpr *appExpr = static_cast< ApplicationExpr* >( newerAlt.expr ); 490 490 // XXX: this is a memory leak, but adjType can't be deleted because it might contain assertions … … 509 509 std::cout << "============= new indexer" << std::endl; 510 510 decls.print( std::cout ); 511 )511 ) 512 512 addToIndexer( have, decls ); 513 513 AssertionSet newNeed; … … 533 533 std::cout << "need assertions:" << std::endl; 534 534 printAssertionSet( resultNeed, std::cout, 8 ); 535 )535 ) 536 536 inferParameters( resultNeed, resultHave, newAlt, openVars, out ); 537 537 } … … 542 542 AlternativeFinder funcOpFinder( indexer, env ); 543 543 544 AlternativeFinder funcFinder( indexer, env ); 545 546 { 544 AlternativeFinder funcFinder( indexer, env ); { 547 545 NameExpr *fname; 548 546 if ( ( fname = dynamic_cast<NameExpr *>( untypedExpr->get_function())) 549 && ( fname->get_name() == std::string(" LabAddress")) ) {550 alternatives.push_back( Alternative( untypedExpr , env, Cost()) );547 && ( fname->get_name() == std::string("&&")) ) { 548 alternatives.push_back( Alternative( untypedExpr->clone(), env, Cost()) ); 551 549 return; 552 550 } … … 562 560 Tuples::TupleAssignSpotter tassign( this ); 563 561 if ( tassign.isTupleAssignment( untypedExpr, possibilities ) ) { 564 // TODOtake care of possible tuple assignments, or discard expression562 // take care of possible tuple assignments, or discard expression 565 563 return; 566 564 } // else ... … … 572 570 std::cout << "working on alternative: " << std::endl; 573 571 func->print( std::cout, 8 ); 574 )572 ) 575 573 // check if the type is pointer to function 576 574 PointerType *pointer; … … 605 603 std::cout << "known function ops:" << std::endl; 606 604 printAlts( funcOpFinder.alternatives, std::cout, 8 ); 607 )605 ) 608 606 } 609 607 … … 644 642 withFunc->env.print( std::cout, 8 ); 645 643 std::cout << "cost of conversion is:" << cvtCost << std::endl; 646 )647 if ( cvtCost != Cost::infinity ) {648 withFunc->cvtCost = cvtCost;649 alternatives.push_back( *withFunc );650 } // if644 ) 645 if ( cvtCost != Cost::infinity ) { 646 withFunc->cvtCost = cvtCost; 647 alternatives.push_back( *withFunc ); 648 } // if 651 649 } // for 652 650 candidates.clear(); … … 749 747 newExpr.print( std::cerr ); 750 748 std::cerr << std::endl; 751 )749 ) 752 750 renameTypes( alternatives.back().expr ); 753 751 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( (*i)->get_type() ) ) { … … 796 794 argType->print( std::cout ); 797 795 std::cout << std::endl; 798 )799 if ( typesCompatibleIgnoreQualifiers( argType, function->get_parameters().front()->get_type(), indexer, env ) ) {800 alternatives.push_back( Alternative( new AttrExpr( new VariableExpr( funcDecl ), argType->clone() ), env, Cost::zero ) );801 for ( std::list< DeclarationWithType* >::iterator i = function->get_returnVals().begin(); i != function->get_returnVals().end(); ++i ) {802 alternatives.back().expr->get_results().push_back( (*i)->get_type()->clone() );803 } // for804 } // if796 ) 797 if ( typesCompatibleIgnoreQualifiers( argType, function->get_parameters().front()->get_type(), indexer, env ) ) { 798 alternatives.push_back( Alternative( new AttrExpr( new VariableExpr( funcDecl ), argType->clone() ), env, Cost::zero ) ); 799 for ( std::list< DeclarationWithType* >::iterator i = function->get_returnVals().begin(); i != function->get_returnVals().end(); ++i ) { 800 alternatives.back().expr->get_results().push_back( (*i)->get_type()->clone() ); 801 } // for 802 } // if 805 803 } 806 804
Note:
See TracChangeset
for help on using the changeset viewer.