- File:
-
- 1 edited
-
src/ResolvExpr/AlternativeFinder.cc (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AlternativeFinder.cc
r22cad76 re04ef3a 19 19 #include <functional> 20 20 #include <cassert> 21 #include <unordered_map>22 #include <utility>23 #include <vector>24 21 25 22 #include "AlternativeFinder.h" … … 42 39 #include "Tuples/NameMatcher.h" 43 40 #include "Common/utility.h" 44 #include "InitTweak/InitTweak.h"45 41 46 42 extern bool resolvep; … … 411 407 } 412 408 413 /// Map of declaration uniqueIds (intended to be the assertions in an AssertionSet) to their parents and the number of times they've been included 414 typedef std::unordered_map< UniqueId, std::unordered_map< UniqueId, unsigned > > AssertionParentSet; 415 416 static const int recursionLimit = 10; ///< Limit to depth of recursion satisfaction 417 static const unsigned recursionParentLimit = 1; ///< Limit to the number of times an assertion can recursively use itself 409 static const int recursionLimit = 10; 418 410 419 411 void addToIndexer( AssertionSet &assertSet, SymTab::Indexer &indexer ) { … … 424 416 } 425 417 } 426 418 427 419 template< typename ForwardIterator, typename OutputIterator > 428 void inferRecursive( ForwardIterator begin, ForwardIterator end, const Alternative &newAlt, OpenVarSet &openVars, const SymTab::Indexer &decls, const AssertionSet &newNeed, const AssertionParentSet &needParents, 429 int level, const SymTab::Indexer &indexer, OutputIterator out ) { 420 void inferRecursive( ForwardIterator begin, ForwardIterator end, const Alternative &newAlt, OpenVarSet &openVars, const SymTab::Indexer &decls, const AssertionSet &newNeed, int level, const SymTab::Indexer &indexer, OutputIterator out ) { 430 421 if ( begin == end ) { 431 422 if ( newNeed.empty() ) { … … 440 431 printAssertionSet( newNeed, std::cerr, 8 ); 441 432 ) 442 inferRecursive( newNeed.begin(), newNeed.end(), newAlt, openVars, decls, newerNeed, needParents,level+1, indexer, out );433 inferRecursive( newNeed.begin(), newNeed.end(), newAlt, openVars, decls, newerNeed, level+1, indexer, out ); 443 434 return; 444 435 } … … 447 438 ForwardIterator cur = begin++; 448 439 if ( ! cur->second ) { 449 inferRecursive( begin, end, newAlt, openVars, decls, newNeed, needParents,level, indexer, out );440 inferRecursive( begin, end, newAlt, openVars, decls, newNeed, level, indexer, out ); 450 441 } 451 442 DeclarationWithType *curDecl = cur->first; … … 464 455 std::cerr << std::endl; 465 456 ) 466 467 457 AssertionSet newHave, newerNeed( newNeed ); 468 458 TypeEnvironment newEnv( newAlt.env ); … … 487 477 newerAlt.env = newEnv; 488 478 assert( (*candidate)->get_uniqueId() ); 489 DeclarationWithType *candDecl = static_cast< DeclarationWithType* >( Declaration::declFromId( (*candidate)->get_uniqueId() ) ); 490 AssertionParentSet newNeedParents( needParents ); 491 // skip repeatingly-self-recursive assertion satisfaction 492 if ( newNeedParents[ curDecl->get_uniqueId() ][ candDecl->get_uniqueId() ]++ > recursionParentLimit ) continue; 493 Expression *varExpr = new VariableExpr( candDecl ); 479 Expression *varExpr = new VariableExpr( static_cast< DeclarationWithType* >( Declaration::declFromId( (*candidate)->get_uniqueId() ) ) ); 494 480 deleteAll( varExpr->get_results() ); 495 481 varExpr->get_results().clear(); … … 505 491 // XXX: this is a memory leak, but adjType can't be deleted because it might contain assertions 506 492 appExpr->get_inferParams()[ curDecl->get_uniqueId() ] = ParamEntry( (*candidate)->get_uniqueId(), adjType->clone(), curDecl->get_type()->clone(), varExpr ); 507 inferRecursive( begin, end, newerAlt, newOpenVars, newDecls, newerNeed, newNeedParents,level, indexer, out );493 inferRecursive( begin, end, newerAlt, newOpenVars, newDecls, newerNeed, level, indexer, out ); 508 494 } else { 509 495 delete adjType; … … 527 513 addToIndexer( have, decls ); 528 514 AssertionSet newNeed; 529 AssertionParentSet needParents; 530 inferRecursive( need.begin(), need.end(), newAlt, openVars, decls, newNeed, needParents, 0, indexer, out ); 515 inferRecursive( need.begin(), need.end(), newAlt, openVars, decls, newNeed, 0, indexer, out ); 531 516 // PRINT( 532 517 // std::cerr << "declaration 14 is "; … … 561 546 562 547 { 563 std::string fname = InitTweak::getFunctionName( untypedExpr ); 564 if ( fname == "&&" ) { 548 NameExpr *fname = 0;; 549 if ( ( fname = dynamic_cast<NameExpr *>( untypedExpr->get_function())) 550 && ( fname->get_name() == std::string("&&")) ) { 565 551 VoidType v = Type::Qualifiers(); // resolve to type void * 566 552 PointerType pt( Type::Qualifiers(), v.clone() );
Note:
See TracChangeset
for help on using the changeset viewer.