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