Changeset 249d6e6 for src/ResolvExpr/AlternativeFinder.cc
- Timestamp:
- Jun 4, 2018, 10:53:34 AM (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, with_gc
- Children:
- 1ddbf3b, b429026
- Parents:
- 863c413 (diff), 428bef8 (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
r863c413 r249d6e6 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, Expression * member);104 template< typename StructOrUnionType > void addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, const std::string & name ); 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 NameExpr nameExpr( "" ); 310 addAggMembers( structInst, aggrExpr.get(), alt.cost+Cost::safe, alt.env, &nameExpr ); 309 addAggMembers( structInst, aggrExpr.get(), alt.cost+Cost::safe, alt.env, "" ); 311 310 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( aggrExpr->result ) ) { 312 NameExpr nameExpr( "" ); 313 addAggMembers( unionInst, aggrExpr.get(), alt.cost+Cost::safe, alt.env, &nameExpr ); 311 addAggMembers( unionInst, aggrExpr.get(), alt.cost+Cost::safe, alt.env, "" ); 314 312 } // if 315 313 } 316 314 317 315 template< typename StructOrUnionType > 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; 316 void AlternativeFinder::Finder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, const std::string & name ) { 323 317 std::list< Declaration* > members; 324 318 aggInst->lookup( name, members ); … … 472 466 } 473 467 474 // /// Map of declaration uniqueIds (intended to be the assertions in an AssertionSet) to their parents and the number of times they've been included475 //typedef std::unordered_map< UniqueId, std::unordered_map< UniqueId, unsigned > > AssertionParentSet;476 477 468 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 itself479 469 480 470 void addToIndexer( AssertionSet &assertSet, SymTab::Indexer &indexer ) { … … 487 477 488 478 template< typename ForwardIterator, typename OutputIterator > 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 ) { 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 ) { 491 480 if ( begin == end ) { 492 481 if ( newNeed.empty() ) { … … 506 495 printAssertionSet( newNeed, std::cerr, 8 ); 507 496 ) 508 inferRecursive( newNeed.begin(), newNeed.end(), newAlt, openVars, decls, newerNeed, /*needParents,*/level+1, indexer, out );497 inferRecursive( newNeed.begin(), newNeed.end(), newAlt, openVars, decls, newerNeed, level+1, indexer, out ); 509 498 return; 510 499 } … … 513 502 ForwardIterator cur = begin++; 514 503 if ( ! cur->second.isUsed ) { 515 inferRecursive( begin, end, newAlt, openVars, decls, newNeed, /*needParents,*/level, indexer, out );504 inferRecursive( begin, end, newAlt, openVars, decls, newNeed, level, indexer, out ); 516 505 return; // xxx - should this continue? previously this wasn't here, and it looks like it should be 517 506 } … … 566 555 } 567 556 568 //AssertionParentSet newNeedParents( needParents );569 // skip repeatingly-self-recursive assertion satisfaction570 // DOESN'T WORK: grandchild nodes conflict with their cousins571 //if ( newNeedParents[ curDecl->get_uniqueId() ][ candDecl->get_uniqueId() ]++ > recursionParentLimit ) continue;572 573 557 Expression *varExpr = data.combine( newerAlt.cvtCost ); 574 558 delete varExpr->get_result(); … … 588 572 // XXX: this is a memory leak, but adjType can't be deleted because it might contain assertions 589 573 (*inferParameters)[ curDecl->get_uniqueId() ] = ParamEntry( candidate->get_uniqueId(), adjType->clone(), curDecl->get_type()->clone(), varExpr ); 590 inferRecursive( begin, end, newerAlt, newOpenVars, newDecls, newerNeed, /*newNeedParents,*/level, indexer, out );574 inferRecursive( begin, end, newerAlt, newOpenVars, newDecls, newerNeed, level, indexer, out ); 591 575 } else { 592 576 delete adjType; … … 610 594 addToIndexer( have, decls ); 611 595 AssertionSet newNeed; 612 //AssertionParentSet needParents;613 596 PRINT( 614 597 std::cerr << "env is: " << std::endl; … … 617 600 ) 618 601 619 inferRecursive( need.begin(), need.end(), newAlt, openVars, decls, newNeed, /*needParents,*/0, indexer, out );602 inferRecursive( need.begin(), need.end(), newAlt, openVars, decls, newNeed, 0, indexer, out ); 620 603 // PRINT( 621 604 // std::cerr << "declaration 14 is "; … … 1096 1079 AlternativeFinder funcOpFinder( indexer, env ); 1097 1080 // it's ok if there aren't any defined function ops 1098 funcOpFinder.maybeFind( opExpr );1081 funcOpFinder.maybeFind( opExpr ); 1099 1082 PRINT( 1100 1083 std::cerr << "known function ops:" << std::endl; … … 1133 1116 } 1134 1117 } else if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( func->expr->result->stripReferences() ) ) { // handle ftype (e.g. *? on function pointer) 1135 EqvClass eqvClass; 1136 if ( func->env.lookup( typeInst->name, eqvClass ) && eqvClass.type ) { 1137 if ( FunctionType *function = dynamic_cast< FunctionType* >( eqvClass.type ) ) { 1118 if ( const EqvClass *eqvClass = func->env.lookup( typeInst->name ) ) { 1119 if ( FunctionType *function = dynamic_cast< FunctionType* >( eqvClass->type ) ) { 1138 1120 Alternative newFunc( *func ); 1139 1121 referenceToRvalueConversion( newFunc.expr, newFunc.cost ); … … 1350 1332 } 1351 1333 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 1352 1343 void AlternativeFinder::Finder::postvisit( UntypedMemberExpr *memberExpr ) { 1353 1344 AlternativeFinder funcFinder( indexer, env ); … … 1362 1353 // find member of the given type 1363 1354 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( aggrExpr->get_result() ) ) { 1364 addAggMembers( structInst, aggrExpr, cost, agg->env, memberExpr->get_member() );1355 addAggMembers( structInst, aggrExpr, cost, agg->env, get_member_name(memberExpr) ); 1365 1356 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( aggrExpr->get_result() ) ) { 1366 addAggMembers( unionInst, aggrExpr, cost, agg->env, memberExpr->get_member() );1357 addAggMembers( unionInst, aggrExpr, cost, agg->env, get_member_name(memberExpr) ); 1367 1358 } else if ( TupleType * tupleType = dynamic_cast< TupleType * >( aggrExpr->get_result() ) ) { 1368 1359 addTupleMembers( tupleType, aggrExpr, cost, agg->env, memberExpr->get_member() );
Note: See TracChangeset
for help on using the changeset viewer.