- File:
-
- 1 edited
-
src/ResolvExpr/AlternativeFinder.cc (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AlternativeFinder.cc
rfee651f r13deae88 1544 1544 AlternativeFinder firstFinder( indexer, env ); 1545 1545 firstFinder.findWithAdjustment( logicalExpr->get_arg1() ); 1546 if ( firstFinder.alternatives.empty() ) return;1547 AlternativeFinder secondFinder( indexer, env );1548 secondFinder.findWithAdjustment( logicalExpr->get_arg2() );1549 if ( secondFinder.alternatives.empty() ) return;1550 1546 for ( AltList::const_iterator first = firstFinder.alternatives.begin(); first != firstFinder.alternatives.end(); ++first ) { 1547 AlternativeFinder secondFinder( indexer, first->env ); 1548 secondFinder.findWithAdjustment( logicalExpr->get_arg2() ); 1551 1549 for ( AltList::const_iterator second = secondFinder.alternatives.begin(); second != secondFinder.alternatives.end(); ++second ) { 1552 TypeEnvironment compositeEnv;1553 compositeEnv.simpleCombine( first->env );1554 compositeEnv.simpleCombine( second->env );1555 1556 1550 LogicalExpr *newExpr = new LogicalExpr( first->expr->clone(), second->expr->clone(), logicalExpr->get_isAnd() ); 1557 alternatives.push_back( Alternative( newExpr, compositeEnv, first->cost + second->cost ) );1551 alternatives.push_back( Alternative( newExpr, second->env, first->cost + second->cost ) ); 1558 1552 } 1559 1553 } … … 1564 1558 AlternativeFinder firstFinder( indexer, env ); 1565 1559 firstFinder.findWithAdjustment( conditionalExpr->get_arg1() ); 1566 if ( firstFinder.alternatives.empty() ) return;1567 // find alternatives for true expression1568 AlternativeFinder secondFinder( indexer, env );1569 secondFinder.findWithAdjustment( conditionalExpr->get_arg2() );1570 if ( secondFinder.alternatives.empty() ) return;1571 // find alterantives for false expression1572 AlternativeFinder thirdFinder( indexer, env );1573 thirdFinder.findWithAdjustment( conditionalExpr->get_arg3() );1574 if ( thirdFinder.alternatives.empty() ) return;1575 1560 for ( AltList::const_iterator first = firstFinder.alternatives.begin(); first != firstFinder.alternatives.end(); ++first ) { 1561 // find alternatives for true expression 1562 AlternativeFinder secondFinder( indexer, first->env ); 1563 secondFinder.findWithAdjustment( conditionalExpr->get_arg2() ); 1576 1564 for ( AltList::const_iterator second = secondFinder.alternatives.begin(); second != secondFinder.alternatives.end(); ++second ) { 1565 // find alterantives for false expression 1566 AlternativeFinder thirdFinder( indexer, second->env ); 1567 thirdFinder.findWithAdjustment( conditionalExpr->get_arg3() ); 1577 1568 for ( AltList::const_iterator third = thirdFinder.alternatives.begin(); third != thirdFinder.alternatives.end(); ++third ) { 1578 TypeEnvironment compositeEnv;1579 compositeEnv.simpleCombine( first->env );1580 compositeEnv.simpleCombine( second->env );1581 compositeEnv.simpleCombine( third->env );1582 1583 1569 // unify true and false types, then infer parameters to produce new alternatives 1584 1570 OpenVarSet openVars; 1585 1571 AssertionSet needAssertions, haveAssertions; 1586 Alternative newAlt( 0, compositeEnv, first->cost + second->cost + third->cost );1572 Alternative newAlt( 0, third->env, first->cost + second->cost + third->cost ); 1587 1573 Type* commonType = nullptr; 1588 1574 if ( unify( second->expr->get_result(), third->expr->get_result(), newAlt.env, needAssertions, haveAssertions, openVars, indexer, commonType ) ) { … … 1615 1601 AlternativeFinder firstFinder( indexer, env ); 1616 1602 firstFinder.findWithAdjustment( rangeExpr->get_low() ); 1617 if ( firstFinder.alternatives.empty() ) return;1618 AlternativeFinder secondFinder( indexer, env );1619 secondFinder.findWithAdjustment( rangeExpr->get_high() );1620 if ( secondFinder.alternatives.empty() ) return;1621 1603 for ( AltList::const_iterator first = firstFinder.alternatives.begin(); first != firstFinder.alternatives.end(); ++first ) { 1604 AlternativeFinder secondFinder( indexer, first->env ); 1605 secondFinder.findWithAdjustment( rangeExpr->get_high() ); 1622 1606 for ( AltList::const_iterator second = secondFinder.alternatives.begin(); second != secondFinder.alternatives.end(); ++second ) { 1623 TypeEnvironment compositeEnv;1624 compositeEnv.simpleCombine( first->env );1625 compositeEnv.simpleCombine( second->env );1626 1607 OpenVarSet openVars; 1627 1608 AssertionSet needAssertions, haveAssertions; 1628 Alternative newAlt( 0, compositeEnv, first->cost + second->cost );1609 Alternative newAlt( 0, second->env, first->cost + second->cost ); 1629 1610 Type* commonType = nullptr; 1630 1611 if ( unify( first->expr->get_result(), second->expr->get_result(), newAlt.env, needAssertions, haveAssertions, openVars, indexer, commonType ) ) {
Note:
See TracChangeset
for help on using the changeset viewer.