Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Tuples/TupleExpansion.cc

    raee472e rf240484  
    3030#include "SynTree/Type.h"         // for Type, Type::Qualifiers, TupleType
    3131#include "SynTree/Visitor.h"      // for Visitor
    32 #include "Tuples.h"
    3332
    3433class CompoundStmt;
     
    129128                        Expression * aggr = memberExpr->aggregate->clone()->acceptMutator( *visitor );
    130129                        // aggregate expressions which might be impure must be wrapped in unique expressions
    131                         if ( Tuples::maybeImpureIgnoreUnique( memberExpr->aggregate ) ) aggr = new UniqueExpr( aggr );
     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 );
    132133                        for ( Expression *& expr : tupleExpr->exprs ) {
    133134                                expr = reconstructMemberExpr( expr, aggr, memberExpr->location );
     
    226227
    227228        Expression * TupleIndexExpander::postmutate( TupleIndexExpr * tupleExpr ) {
    228                 Expression * tuple = tupleExpr->tuple;
     229                Expression * tuple = tupleExpr->get_tuple();
    229230                assert( tuple );
    230                 tupleExpr->tuple = nullptr;
    231                 unsigned int idx = tupleExpr->index;
    232                 TypeSubstitution * env = tupleExpr->env;
    233                 tupleExpr->env = nullptr;
     231                tupleExpr->set_tuple( nullptr );
     232                unsigned int idx = tupleExpr->get_index();
     233                TypeSubstitution * env = tupleExpr->get_env();
     234                tupleExpr->set_env( nullptr );
    234235                delete tupleExpr;
    235236
    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);
     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);
    253241                MemberExpr * memExpr = new MemberExpr( strict_dynamic_cast< DeclarationWithType * >( member ), tuple );
    254                 memExpr->env = env;
     242                memExpr->set_env( env );
    255243                return memExpr;
    256244        }
Note: See TracChangeset for help on using the changeset viewer.