Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Tuples/TupleAssignment.cc

    r2c187378 r753bf60  
    6262                struct Matcher {
    6363                  public:
    64                         Matcher( TupleAssignSpotter &spotter, const ResolvExpr::AltList& lhs,
    65                                 const ResolvExpr::AltList& rhs );
     64                        Matcher( TupleAssignSpotter &spotter, const ResolvExpr::AltList& lhs, const
     65                                ResolvExpr::AltList& rhs );
    6666                        virtual ~Matcher() {}
    67                        
    6867                        virtual void match( std::list< Expression * > &out ) = 0;
    6968                        ObjectDecl * newObject( UniqueName & namer, Expression * expr );
    70 
    71                         void combineState( const ResolvExpr::Alternative& alt ) {
    72                                 compositeEnv.simpleCombine( alt.env );
    73                                 ResolvExpr::mergeOpenVars( openVars, alt.openVars );
    74                                 cloneAll( alt.need, need );
    75                         }
    76 
    77                         void combineState( const ResolvExpr::AltList& alts ) {
    78                                 for ( const ResolvExpr::Alternative& alt : alts ) { combineState( alt ); }
    79                         }
    80                        
    8169                        ResolvExpr::AltList lhs, rhs;
    8270                        TupleAssignSpotter &spotter;
     
    8472                        std::list< ObjectDecl * > tmpDecls;
    8573                        ResolvExpr::TypeEnvironment compositeEnv;
    86                         ResolvExpr::OpenVarSet openVars;
    87                         ResolvExpr::AssertionSet need;
    8874                };
    8975
     
    259245                }
    260246
    261                 // extract expressions from the assignment alternatives to produce a list of assignments
    262                 // that together form a single alternative
     247                // extract expressions from the assignment alternatives to produce a list of assignments that
     248                // together form a single alternative
    263249                std::list< Expression *> solved_assigns;
    264250                for ( ResolvExpr::Alternative & alt : current ) {
    265251                        solved_assigns.push_back( alt.expr->clone() );
    266                         matcher->combineState( alt );
    267                 }
    268                
     252                }
     253                // combine assignment environments into combined expression environment
     254                simpleCombineEnvironments( current.begin(), current.end(), matcher->compositeEnv );
    269255                // xxx -- was push_front
    270                 currentFinder.get_alternatives().push_back( ResolvExpr::Alternative{
    271                         new TupleAssignExpr{ solved_assigns, matcher->tmpDecls }, matcher->compositeEnv,
    272                         matcher->openVars,
    273                         ResolvExpr::AssertionList( matcher->need.begin(), matcher->need.end() ),
    274                         ResolvExpr::sumCost( current ) + matcher->baseCost } );
     256                currentFinder.get_alternatives().push_back( ResolvExpr::Alternative(
     257                        new TupleAssignExpr(solved_assigns, matcher->tmpDecls), matcher->compositeEnv,
     258                        ResolvExpr::sumCost( current ) + matcher->baseCost ) );
    275259        }
    276260
     
    279263        : lhs(lhs), rhs(rhs), spotter(spotter),
    280264          baseCost( ResolvExpr::sumCost( lhs ) + ResolvExpr::sumCost( rhs ) ) {
    281                 combineState( lhs );
    282                 combineState( rhs );
     265                simpleCombineEnvironments( lhs.begin(), lhs.end(), compositeEnv );
     266                simpleCombineEnvironments( rhs.begin(), rhs.end(), compositeEnv );
    283267        }
    284268
Note: See TracChangeset for help on using the changeset viewer.