Ignore:
Timestamp:
May 25, 2018, 2:51:06 PM (6 years ago)
Author:
Aaron Moss <a3moss@…>
Branches:
new-env, with_gc
Children:
cdc4d43
Parents:
3ef35bd (diff), 58e822a (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.
Message:

Merge remote-tracking branch 'origin/master' into with_gc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Tuples/TupleExpansion.cc

    r3ef35bd reba74ba  
    3030#include "SynTree/Type.h"         // for Type, Type::Qualifiers, TupleType
    3131#include "SynTree/Visitor.h"      // for Visitor
     32#include "Tuples.h"
    3233
    3334class CompoundStmt;
     
    119120                        Expression * aggr = memberExpr->aggregate->clone()->acceptMutator( *visitor );
    120121                        // aggregate expressions which might be impure must be wrapped in unique expressions
    121                         // 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
    122                         // if ( Tuples::maybeImpureIgnoreUnique( memberExpr->get_aggregate() ) ) aggr = new UniqueExpr( aggr );
    123                         aggr = new UniqueExpr( aggr );
     122                        if ( Tuples::maybeImpureIgnoreUnique( memberExpr->aggregate ) ) aggr = new UniqueExpr( aggr );
    124123                        for ( Expression *& expr : tupleExpr->exprs ) {
    125124                                expr = reconstructMemberExpr( expr, aggr, memberExpr->location );
     
    214213
    215214        Expression * TupleIndexExpander::postmutate( TupleIndexExpr * tupleExpr ) {
    216                 Expression * tuple = tupleExpr->get_tuple();
     215                Expression * tuple = tupleExpr->tuple;
    217216                assert( tuple );
    218                 tupleExpr->set_tuple( nullptr );
    219                 unsigned int idx = tupleExpr->get_index();
    220                 TypeSubstitution * env = tupleExpr->get_env();
    221                 tupleExpr->set_env( nullptr );
    222 
    223                 StructInstType * type = strict_dynamic_cast< StructInstType * >( tuple->get_result() );
    224                 StructDecl * structDecl = type->get_baseStruct();
    225                 assert( structDecl->get_members().size() > idx );
    226                 Declaration * member = *std::next(structDecl->get_members().begin(), idx);
     217                tupleExpr->tuple = nullptr;
     218                unsigned int idx = tupleExpr->index;
     219                TypeSubstitution * env = tupleExpr->env;
     220                tupleExpr->env = nullptr;
     221                delete tupleExpr;
     222
     223                if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * > ( tuple ) ) {
     224                        if ( ! maybeImpureIgnoreUnique( tupleExpr ) ) {
     225                                // optimization: definitely pure tuple expr => can reduce to the only relevant component.
     226                                assert( tupleExpr->exprs.size() > idx );
     227                                Expression *& expr = *std::next(tupleExpr->exprs.begin(), idx);
     228                                Expression * ret = expr;
     229                                ret->env = env;
     230                                expr = nullptr; // remove from list so it can safely be deleted
     231                                return ret;
     232                        }
     233                }
     234
     235                StructInstType * type = strict_dynamic_cast< StructInstType * >( tuple->result );
     236                StructDecl * structDecl = type->baseStruct;
     237                assert( structDecl->members.size() > idx );
     238                Declaration * member = *std::next(structDecl->members.begin(), idx);
    227239                MemberExpr * memExpr = new MemberExpr( strict_dynamic_cast< DeclarationWithType * >( member ), tuple );
    228                 memExpr->set_env( env );
     240                memExpr->env = env;
    229241                return memExpr;
    230242        }
     
    262274
    263275                // remove data from shell
     276                tupleExpr->set_result( nullptr );
     277                tupleExpr->get_exprs().clear();
    264278                tupleExpr->set_env( nullptr );
    265279
Note: See TracChangeset for help on using the changeset viewer.