Changeset eba74ba for src/Tuples/TupleExpansion.cc
- Timestamp:
- May 25, 2018, 2:51:06 PM (6 years ago)
- Branches:
- new-env, with_gc
- Children:
- cdc4d43
- Parents:
- 3ef35bd (diff), 58e822a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Tuples/TupleExpansion.cc
r3ef35bd reba74ba 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; … … 119 120 Expression * aggr = memberExpr->aggregate->clone()->acceptMutator( *visitor ); 120 121 // 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 ); 122 if ( Tuples::maybeImpureIgnoreUnique( memberExpr->aggregate ) ) aggr = new UniqueExpr( aggr ); 124 123 for ( Expression *& expr : tupleExpr->exprs ) { 125 124 expr = reconstructMemberExpr( expr, aggr, memberExpr->location ); … … 214 213 215 214 Expression * TupleIndexExpander::postmutate( TupleIndexExpr * tupleExpr ) { 216 Expression * tuple = tupleExpr-> get_tuple();215 Expression * tuple = tupleExpr->tuple; 217 216 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); 217 tupleExpr->tuple = nullptr; 218 unsigned int idx = tupleExpr->index; 219 TypeSubstitution * env = tupleExpr->env; 220 tupleExpr->env = nullptr; 221 delete tupleExpr; 222 223 if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * > ( tuple ) ) { 224 if ( ! maybeImpureIgnoreUnique( tupleExpr ) ) { 225 // optimization: definitely pure tuple expr => can reduce to the only relevant component. 226 assert( tupleExpr->exprs.size() > idx ); 227 Expression *& expr = *std::next(tupleExpr->exprs.begin(), idx); 228 Expression * ret = expr; 229 ret->env = env; 230 expr = nullptr; // remove from list so it can safely be deleted 231 return ret; 232 } 233 } 234 235 StructInstType * type = strict_dynamic_cast< StructInstType * >( tuple->result ); 236 StructDecl * structDecl = type->baseStruct; 237 assert( structDecl->members.size() > idx ); 238 Declaration * member = *std::next(structDecl->members.begin(), idx); 227 239 MemberExpr * memExpr = new MemberExpr( strict_dynamic_cast< DeclarationWithType * >( member ), tuple ); 228 memExpr-> set_env( env );240 memExpr->env = env; 229 241 return memExpr; 230 242 } … … 262 274 263 275 // remove data from shell 276 tupleExpr->set_result( nullptr ); 277 tupleExpr->get_exprs().clear(); 264 278 tupleExpr->set_env( nullptr ); 265 279
Note: See TracChangeset
for help on using the changeset viewer.