Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Tuples/TupleExpansion.cc

    raee472e r68f9c43  
    3030#include "SynTree/Type.h"         // for Type, Type::Qualifiers, TupleType
    3131#include "SynTree/Visitor.h"      // for Visitor
    32 #include "Tuples.h"
    3332
    3433class CompoundStmt;
     
    4645
    4746                        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                         }
    5447                };
    5548
     
    112105                                UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( memberExpr->member, inner );
    113106                                inner->location = newMemberExpr->location = loc;
    114                                 memberExpr->member = nullptr;
    115                                 memberExpr->aggregate = nullptr;
    116                                 delete memberExpr;
    117107                                return newMemberExpr->acceptMutator( expander );
    118108                        } else {
     
    129119                        Expression * aggr = memberExpr->aggregate->clone()->acceptMutator( *visitor );
    130120                        // aggregate expressions which might be impure must be wrapped in unique expressions
    131                         if ( Tuples::maybeImpureIgnoreUnique( memberExpr->aggregate ) ) aggr = new UniqueExpr( aggr );
     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 );
    132124                        for ( Expression *& expr : tupleExpr->exprs ) {
    133125                                expr = reconstructMemberExpr( expr, aggr, memberExpr->location );
    134126                                expr->location = memberExpr->location;
    135127                        }
    136                         delete aggr;
    137128                        tupleExpr->location = memberExpr->location;
    138129                        return tupleExpr;
     
    180171                        decls[id] = condExpr;
    181172                }
    182                 delete unqExpr;
    183173                return decls[id]->clone();
    184174        }
     
    190180                ret->set_env( assnExpr->get_env() );
    191181                assnExpr->set_env( nullptr );
    192                 delete assnExpr;
    193182                return ret;
    194183        }
     
    221210                        newType->get_parameters().push_back( new TypeExpr( t->clone() ) );
    222211                }
    223                 delete tupleType;
    224212                return newType;
    225213        }
    226214
    227215        Expression * TupleIndexExpander::postmutate( TupleIndexExpr * tupleExpr ) {
    228                 Expression * tuple = tupleExpr->tuple;
     216                Expression * tuple = tupleExpr->get_tuple();
    229217                assert( tuple );
    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);
     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);
    253227                MemberExpr * memExpr = new MemberExpr( strict_dynamic_cast< DeclarationWithType * >( member ), tuple );
    254                 memExpr->env = env;
     228                memExpr->set_env( env );
    255229                return memExpr;
    256230        }
     
    287261                TypeSubstitution * env = tupleExpr->get_env();
    288262
    289                 // remove data from shell and delete it
    290                 tupleExpr->set_result( nullptr );
    291                 tupleExpr->get_exprs().clear();
     263                // remove data from shell
    292264                tupleExpr->set_env( nullptr );
    293                 delete tupleExpr;
    294265
    295266                return replaceTupleExpr( result, exprs, env );
Note: See TracChangeset for help on using the changeset viewer.