Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Tuples/TupleExpansion.cc

    rf240484 raee472e  
    3030#include "SynTree/Type.h"         // for Type, Type::Qualifiers, TupleType
    3131#include "SynTree/Visitor.h"      // for Visitor
     32#include "Tuples.h"
    3233
    3334class CompoundStmt;
     
    128129                        Expression * aggr = memberExpr->aggregate->clone()->acceptMutator( *visitor );
    129130                        // aggregate expressions which might be impure must be wrapped in unique expressions
    130                         // xxx - if there's a member-tuple expression nested in the aggregate, this currently generates the wrong code if a UniqueExpr is not used, and it's purely an optimization to remove the UniqueExpr
    131                         // if ( Tuples::maybeImpureIgnoreUnique( memberExpr->get_aggregate() ) ) aggr = new UniqueExpr( aggr );
    132                         aggr = new UniqueExpr( aggr );
     131                        if ( Tuples::maybeImpureIgnoreUnique( memberExpr->aggregate ) ) aggr = new UniqueExpr( aggr );
    133132                        for ( Expression *& expr : tupleExpr->exprs ) {
    134133                                expr = reconstructMemberExpr( expr, aggr, memberExpr->location );
     
    227226
    228227        Expression * TupleIndexExpander::postmutate( TupleIndexExpr * tupleExpr ) {
    229                 Expression * tuple = tupleExpr->get_tuple();
     228                Expression * tuple = tupleExpr->tuple;
    230229                assert( tuple );
    231                 tupleExpr->set_tuple( nullptr );
    232                 unsigned int idx = tupleExpr->get_index();
    233                 TypeSubstitution * env = tupleExpr->get_env();
    234                 tupleExpr->set_env( nullptr );
     230                tupleExpr->tuple = nullptr;
     231                unsigned int idx = tupleExpr->index;
     232                TypeSubstitution * env = tupleExpr->env;
     233                tupleExpr->env = nullptr;
    235234                delete tupleExpr;
    236235
    237                 StructInstType * type = strict_dynamic_cast< StructInstType * >( tuple->get_result() );
    238                 StructDecl * structDecl = type->get_baseStruct();
    239                 assert( structDecl->get_members().size() > idx );
    240                 Declaration * member = *std::next(structDecl->get_members().begin(), idx);
     236                if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * > ( tuple ) ) {
     237                        if ( ! maybeImpureIgnoreUnique( tupleExpr ) ) {
     238                                // optimization: definitely pure tuple expr => can reduce to the only relevant component.
     239                                assert( tupleExpr->exprs.size() > idx );
     240                                Expression *& expr = *std::next(tupleExpr->exprs.begin(), idx);
     241                                Expression * ret = expr;
     242                                ret->env = env;
     243                                expr = nullptr; // remove from list so it can safely be deleted
     244                                delete tupleExpr;
     245                                return ret;
     246                        }
     247                }
     248
     249                StructInstType * type = strict_dynamic_cast< StructInstType * >( tuple->result );
     250                StructDecl * structDecl = type->baseStruct;
     251                assert( structDecl->members.size() > idx );
     252                Declaration * member = *std::next(structDecl->members.begin(), idx);
    241253                MemberExpr * memExpr = new MemberExpr( strict_dynamic_cast< DeclarationWithType * >( member ), tuple );
    242                 memExpr->set_env( env );
     254                memExpr->env = env;
    243255                return memExpr;
    244256        }
Note: See TracChangeset for help on using the changeset viewer.