Changes in src/Tuples/TupleExpansion.cc [68f9c43:aee472e]
- File:
-
- 1 edited
-
src/Tuples/TupleExpansion.cc (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Tuples/TupleExpansion.cc
r68f9c43 raee472e 30 30 #include "SynTree/Type.h" // for Type, Type::Qualifiers, TupleType 31 31 #include "SynTree/Visitor.h" // for Visitor 32 #include "Tuples.h" 32 33 33 34 class CompoundStmt; … … 45 46 46 47 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 } 47 54 }; 48 55 … … 105 112 UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( memberExpr->member, inner ); 106 113 inner->location = newMemberExpr->location = loc; 114 memberExpr->member = nullptr; 115 memberExpr->aggregate = nullptr; 116 delete memberExpr; 107 117 return newMemberExpr->acceptMutator( expander ); 108 118 } else { … … 119 129 Expression * aggr = memberExpr->aggregate->clone()->acceptMutator( *visitor ); 120 130 // 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 ); 124 132 for ( Expression *& expr : tupleExpr->exprs ) { 125 133 expr = reconstructMemberExpr( expr, aggr, memberExpr->location ); 126 134 expr->location = memberExpr->location; 127 135 } 136 delete aggr; 128 137 tupleExpr->location = memberExpr->location; 129 138 return tupleExpr; … … 171 180 decls[id] = condExpr; 172 181 } 182 delete unqExpr; 173 183 return decls[id]->clone(); 174 184 } … … 180 190 ret->set_env( assnExpr->get_env() ); 181 191 assnExpr->set_env( nullptr ); 192 delete assnExpr; 182 193 return ret; 183 194 } … … 210 221 newType->get_parameters().push_back( new TypeExpr( t->clone() ) ); 211 222 } 223 delete tupleType; 212 224 return newType; 213 225 } 214 226 215 227 Expression * TupleIndexExpander::postmutate( TupleIndexExpr * tupleExpr ) { 216 Expression * tuple = tupleExpr-> get_tuple();228 Expression * tuple = tupleExpr->tuple; 217 229 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); 227 253 MemberExpr * memExpr = new MemberExpr( strict_dynamic_cast< DeclarationWithType * >( member ), tuple ); 228 memExpr-> set_env( env );254 memExpr->env = env; 229 255 return memExpr; 230 256 } … … 261 287 TypeSubstitution * env = tupleExpr->get_env(); 262 288 263 // remove data from shell 289 // remove data from shell and delete it 290 tupleExpr->set_result( nullptr ); 291 tupleExpr->get_exprs().clear(); 264 292 tupleExpr->set_env( nullptr ); 293 delete tupleExpr; 265 294 266 295 return replaceTupleExpr( result, exprs, env );
Note:
See TracChangeset
for help on using the changeset viewer.