Changes in src/Tuples/TupleExpansion.cc [aee472e:f240484]
- File:
-
- 1 edited
-
src/Tuples/TupleExpansion.cc (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Tuples/TupleExpansion.cc
raee472e rf240484 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; … … 129 128 Expression * aggr = memberExpr->aggregate->clone()->acceptMutator( *visitor ); 130 129 // 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 ); 132 133 for ( Expression *& expr : tupleExpr->exprs ) { 133 134 expr = reconstructMemberExpr( expr, aggr, memberExpr->location ); … … 226 227 227 228 Expression * TupleIndexExpander::postmutate( TupleIndexExpr * tupleExpr ) { 228 Expression * tuple = tupleExpr-> tuple;229 Expression * tuple = tupleExpr->get_tuple(); 229 230 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 ); 234 235 delete tupleExpr; 235 236 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); 253 241 MemberExpr * memExpr = new MemberExpr( strict_dynamic_cast< DeclarationWithType * >( member ), tuple ); 254 memExpr-> env = env;242 memExpr->set_env( env ); 255 243 return memExpr; 256 244 }
Note:
See TracChangeset
for help on using the changeset viewer.