- File:
-
- 1 edited
-
src/ResolvExpr/AlternativeFinder.cc (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AlternativeFinder.cc
r00ac42e r5de1e2c 102 102 void addAnonConversions( const Alternative & alt ); 103 103 /// Adds alternatives for member expressions, given the aggregate, conversion cost for that aggregate, and name of the member 104 template< typename StructOrUnionType > void addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, const std::string & name);104 template< typename StructOrUnionType > void addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member ); 105 105 /// Adds alternatives for member expressions where the left side has tuple type 106 106 void addTupleMembers( TupleType * tupleType, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member ); … … 307 307 308 308 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( aggrExpr->result ) ) { 309 addAggMembers( structInst, aggrExpr.get(), alt.cost+Cost::safe, alt.env, "" ); 309 NameExpr nameExpr( "" ); 310 addAggMembers( structInst, aggrExpr.get(), alt.cost+Cost::safe, alt.env, &nameExpr ); 310 311 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( aggrExpr->result ) ) { 311 addAggMembers( unionInst, aggrExpr.get(), alt.cost+Cost::safe, alt.env, "" ); 312 NameExpr nameExpr( "" ); 313 addAggMembers( unionInst, aggrExpr.get(), alt.cost+Cost::safe, alt.env, &nameExpr ); 312 314 } // if 313 315 } 314 316 315 317 template< typename StructOrUnionType > 316 void AlternativeFinder::Finder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, const std::string & name ) { 318 void AlternativeFinder::Finder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member ) { 319 // by this point, member must be a name expr 320 NameExpr * nameExpr = dynamic_cast< NameExpr * >( member ); 321 if ( ! nameExpr ) return; 322 const std::string & name = nameExpr->name; 317 323 std::list< Declaration* > members; 318 324 aggInst->lookup( name, members ); … … 466 472 } 467 473 474 // /// Map of declaration uniqueIds (intended to be the assertions in an AssertionSet) to their parents and the number of times they've been included 475 //typedef std::unordered_map< UniqueId, std::unordered_map< UniqueId, unsigned > > AssertionParentSet; 476 468 477 static const int recursionLimit = /*10*/ 4; ///< Limit to depth of recursion satisfaction 478 //static const unsigned recursionParentLimit = 1; ///< Limit to the number of times an assertion can recursively use itself 469 479 470 480 void addToIndexer( AssertionSet &assertSet, SymTab::Indexer &indexer ) { … … 477 487 478 488 template< typename ForwardIterator, typename OutputIterator > 479 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 ) { 489 void inferRecursive( ForwardIterator begin, ForwardIterator end, const Alternative &newAlt, OpenVarSet &openVars, const SymTab::Indexer &decls, const AssertionSet &newNeed, /*const AssertionParentSet &needParents,*/ 490 int level, const SymTab::Indexer &indexer, OutputIterator out ) { 480 491 if ( begin == end ) { 481 492 if ( newNeed.empty() ) { … … 495 506 printAssertionSet( newNeed, std::cerr, 8 ); 496 507 ) 497 inferRecursive( newNeed.begin(), newNeed.end(), newAlt, openVars, decls, newerNeed, level+1, indexer, out );508 inferRecursive( newNeed.begin(), newNeed.end(), newAlt, openVars, decls, newerNeed, /*needParents,*/ level+1, indexer, out ); 498 509 return; 499 510 } … … 502 513 ForwardIterator cur = begin++; 503 514 if ( ! cur->second.isUsed ) { 504 inferRecursive( begin, end, newAlt, openVars, decls, newNeed, level, indexer, out );515 inferRecursive( begin, end, newAlt, openVars, decls, newNeed, /*needParents,*/ level, indexer, out ); 505 516 return; // xxx - should this continue? previously this wasn't here, and it looks like it should be 506 517 } … … 555 566 } 556 567 568 //AssertionParentSet newNeedParents( needParents ); 569 // skip repeatingly-self-recursive assertion satisfaction 570 // DOESN'T WORK: grandchild nodes conflict with their cousins 571 //if ( newNeedParents[ curDecl->get_uniqueId() ][ candDecl->get_uniqueId() ]++ > recursionParentLimit ) continue; 572 557 573 Expression *varExpr = data.combine( newerAlt.cvtCost ); 558 574 delete varExpr->get_result(); … … 572 588 // XXX: this is a memory leak, but adjType can't be deleted because it might contain assertions 573 589 (*inferParameters)[ curDecl->get_uniqueId() ] = ParamEntry( candidate->get_uniqueId(), adjType->clone(), curDecl->get_type()->clone(), varExpr ); 574 inferRecursive( begin, end, newerAlt, newOpenVars, newDecls, newerNeed, level, indexer, out );590 inferRecursive( begin, end, newerAlt, newOpenVars, newDecls, newerNeed, /*newNeedParents,*/ level, indexer, out ); 575 591 } else { 576 592 delete adjType; … … 594 610 addToIndexer( have, decls ); 595 611 AssertionSet newNeed; 612 //AssertionParentSet needParents; 596 613 PRINT( 597 614 std::cerr << "env is: " << std::endl; … … 600 617 ) 601 618 602 inferRecursive( need.begin(), need.end(), newAlt, openVars, decls, newNeed, 0, indexer, out );619 inferRecursive( need.begin(), need.end(), newAlt, openVars, decls, newNeed, /*needParents,*/ 0, indexer, out ); 603 620 // PRINT( 604 621 // std::cerr << "declaration 14 is "; … … 1079 1096 AlternativeFinder funcOpFinder( indexer, env ); 1080 1097 // it's ok if there aren't any defined function ops 1081 funcOpFinder.maybeFind( opExpr );1098 funcOpFinder.maybeFind( opExpr); 1082 1099 PRINT( 1083 1100 std::cerr << "known function ops:" << std::endl; … … 1116 1133 } 1117 1134 } else if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( func->expr->result->stripReferences() ) ) { // handle ftype (e.g. *? on function pointer) 1118 if ( const EqvClass *eqvClass = func->env.lookup( typeInst->name ) ) { 1119 if ( FunctionType *function = dynamic_cast< FunctionType* >( eqvClass->type ) ) { 1135 EqvClass eqvClass; 1136 if ( func->env.lookup( typeInst->name, eqvClass ) && eqvClass.type ) { 1137 if ( FunctionType *function = dynamic_cast< FunctionType* >( eqvClass.type ) ) { 1120 1138 Alternative newFunc( *func ); 1121 1139 referenceToRvalueConversion( newFunc.expr, newFunc.cost ); … … 1332 1350 } 1333 1351 1334 namespace {1335 /// Gets name from untyped member expression (member must be NameExpr)1336 const std::string& get_member_name( UntypedMemberExpr *memberExpr ) {1337 NameExpr * nameExpr = dynamic_cast< NameExpr * >( memberExpr->get_member() );1338 assert( nameExpr );1339 return nameExpr->get_name();1340 }1341 }1342 1343 1352 void AlternativeFinder::Finder::postvisit( UntypedMemberExpr *memberExpr ) { 1344 1353 AlternativeFinder funcFinder( indexer, env ); … … 1353 1362 // find member of the given type 1354 1363 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( aggrExpr->get_result() ) ) { 1355 addAggMembers( structInst, aggrExpr, cost, agg->env, get_member_name(memberExpr) );1364 addAggMembers( structInst, aggrExpr, cost, agg->env, memberExpr->get_member() ); 1356 1365 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( aggrExpr->get_result() ) ) { 1357 addAggMembers( unionInst, aggrExpr, cost, agg->env, get_member_name(memberExpr) );1366 addAggMembers( unionInst, aggrExpr, cost, agg->env, memberExpr->get_member() ); 1358 1367 } else if ( TupleType * tupleType = dynamic_cast< TupleType * >( aggrExpr->get_result() ) ) { 1359 1368 addTupleMembers( tupleType, aggrExpr, cost, agg->env, memberExpr->get_member() );
Note:
See TracChangeset
for help on using the changeset viewer.