Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Tuples/TupleExpansion.cc

    r68f9c43 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;
     
    4546
    4647                        std::map< int, Expression * > decls; // not vector, because order added may not be increasing order
     48
     49                        ~UniqueExprExpander() {
     50                                for ( std::pair<const int, Expression *> & p : decls ) {
     51                                        delete p.second;
     52                                }
     53                        }
    4754                };
    4855
     
    105112                                UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( memberExpr->member, inner );
    106113                                inner->location = newMemberExpr->location = loc;
     114                                memberExpr->member = nullptr;
     115                                memberExpr->aggregate = nullptr;
     116                                delete memberExpr;
    107117                                return newMemberExpr->acceptMutator( expander );
    108118                        } else {
     
    119129                        Expression * aggr = memberExpr->aggregate->clone()->acceptMutator( *visitor );
    120130                        // 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 );
     131                        if ( Tuples::maybeImpureIgnoreUnique( memberExpr->aggregate ) ) aggr = new UniqueExpr( aggr );
    124132                        for ( Expression *& expr : tupleExpr->exprs ) {
    125133                                expr = reconstructMemberExpr( expr, aggr, memberExpr->location );
    126134                                expr->location = memberExpr->location;
    127135                        }
     136                        delete aggr;
    128137                        tupleExpr->location = memberExpr->location;
    129138                        return tupleExpr;
     
    171180                        decls[id] = condExpr;
    172181                }
     182                delete unqExpr;
    173183                return decls[id]->clone();
    174184        }
     
    180190                ret->set_env( assnExpr->get_env() );
    181191                assnExpr->set_env( nullptr );
     192                delete assnExpr;
    182193                return ret;
    183194        }
     
    210221                        newType->get_parameters().push_back( new TypeExpr( t->clone() ) );
    211222                }
     223                delete tupleType;
    212224                return newType;
    213225        }
    214226
    215227        Expression * TupleIndexExpander::postmutate( TupleIndexExpr * tupleExpr ) {
    216                 Expression * tuple = tupleExpr->get_tuple();
     228                Expression * tuple = tupleExpr->tuple;
    217229                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);
     230                tupleExpr->tuple = nullptr;
     231                unsigned int idx = tupleExpr->index;
     232                TypeSubstitution * env = tupleExpr->env;
     233                tupleExpr->env = nullptr;
     234                delete tupleExpr;
     235
     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);
    227253                MemberExpr * memExpr = new MemberExpr( strict_dynamic_cast< DeclarationWithType * >( member ), tuple );
    228                 memExpr->set_env( env );
     254                memExpr->env = env;
    229255                return memExpr;
    230256        }
     
    261287                TypeSubstitution * env = tupleExpr->get_env();
    262288
    263                 // remove data from shell
     289                // remove data from shell and delete it
     290                tupleExpr->set_result( nullptr );
     291                tupleExpr->get_exprs().clear();
    264292                tupleExpr->set_env( nullptr );
     293                delete tupleExpr;
    265294
    266295                return replaceTupleExpr( result, exprs, env );
Note: See TracChangeset for help on using the changeset viewer.