Changeset 937e51d for src/ResolvExpr/AlternativeFinder.cc
- Timestamp:
- Jun 26, 2015, 4:00:26 PM (9 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, string, with_gc
- Children:
- 0df292b, e0ff3e6
- Parents:
- eb50842 (diff), 1869adf (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AlternativeFinder.cc
reb50842 r937e51d 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 … … 108 108 PRINT( 109 109 std::cout << "cost " << candidate->cost << " beats " << mapPlace->second.candidate->cost << std::endl; 110 110 ) 111 111 selected[ mangleName ] = current; 112 112 } else if ( candidate->cost == mapPlace->second.candidate->cost ) { 113 113 PRINT( 114 114 std::cout << "marking ambiguous" << std::endl; 115 115 ) 116 116 mapPlace->second.isAmbiguous = true; 117 117 } … … 123 123 PRINT( 124 124 std::cout << "there are " << selected.size() << " alternatives before elimination" << std::endl; 125 125 ) 126 126 127 127 // accept the alternatives that were unambiguous … … 184 184 std::cout << "findSubExprs" << std::endl; 185 185 printAlts( finder.alternatives, std::cout ); 186 186 ) 187 187 *out++ = finder; 188 188 } … … 206 206 std::cout << "alternatives before prune:" << std::endl; 207 207 printAlts( alternatives, std::cout ); 208 208 ) 209 209 AltList::iterator oldBegin = alternatives.begin(); 210 210 pruneAlternatives( alternatives.begin(), alternatives.end(), front_inserter( alternatives ), indexer ); 211 211 if ( alternatives.begin() == oldBegin ) { 212 std::ostr stream stream;212 std::ostringstream stream; 213 213 stream << "Can't choose between alternatives for expression "; 214 214 expr->print( stream ); … … 217 217 findMinCost( alternatives.begin(), alternatives.end(), back_inserter( winners ) ); 218 218 printAlts( winners, stream, 8 ); 219 throw SemanticError( st d::string( stream.str(), stream.pcount()) );219 throw SemanticError( stream.str() ); 220 220 } 221 221 alternatives.erase( oldBegin, alternatives.end() ); 222 222 PRINT( 223 223 std::cout << "there are " << alternatives.size() << " alternatives after elimination" << std::endl; 224 224 ) 225 225 } 226 226 … … 265 265 std::cout << "--- results are" << std::endl; 266 266 printAll( (*actualExpr)->get_results(), std::cout, 8 ); 267 268 267 ) 268 std::list< DeclarationWithType* >::iterator startFormal = formal; 269 269 Cost actualCost; 270 270 for ( std::list< Type* >::iterator actual = (*actualExpr)->get_results().begin(); actual != (*actualExpr)->get_results().end(); ++actual ) { … … 282 282 std::cout << std::endl << " to "; 283 283 (*formal)->get_type()->print( std::cout, 8 ); 284 285 284 ) 285 Cost newCost = conversionCost( *actual, (*formal)->get_type(), indexer, alt.env ); 286 286 PRINT( 287 287 std::cout << std::endl << "cost is" << newCost << std::endl; 288 289 290 291 292 288 ) 289 290 if ( newCost == Cost::infinity ) { 291 return newCost; 292 } 293 293 convCost += newCost; 294 294 actualCost += newCost; … … 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 648 649 650 644 ) 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 800 801 802 803 804 796 ) 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.