Changeset 90152a4 for src/Tuples/TupleExpansion.cc
- Timestamp:
- Aug 27, 2018, 4:40:34 PM (7 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, cleanup-dtors, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- b7c89aa
- Parents:
- f9feab8 (diff), 305581d (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
-
src/Tuples/TupleExpansion.cc (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Tuples/TupleExpansion.cc
rf9feab8 r90152a4 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; … … 36 37 namespace Tuples { 37 38 namespace { 38 struct MemberTupleExpander final : public Mutator { 39 typedef Mutator Parent; 40 using Parent::mutate; 41 42 virtual Expression * mutate( UntypedMemberExpr * memberExpr ) override; 39 struct MemberTupleExpander final : public WithShortCircuiting, public WithVisitorRef<MemberTupleExpander> { 40 void premutate( UntypedMemberExpr * ) { visit_children = false; } 41 Expression * postmutate( UntypedMemberExpr * memberExpr ); 43 42 }; 44 43 … … 79 78 80 79 void expandMemberTuples( std::list< Declaration * > & translationUnit ) { 81 MemberTupleExpanderexpander;80 PassVisitor<MemberTupleExpander> expander; 82 81 mutateAll( translationUnit, expander ); 83 82 } … … 109 108 // construct a new UntypedMemberExpr with the correct structure , and recursively 110 109 // expand that member expression. 111 MemberTupleExpanderexpander;112 UntypedMemberExpr * inner = new UntypedMemberExpr( memberExpr-> get_aggregate(), aggr->clone() );113 UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( memberExpr-> get_member(), inner );110 PassVisitor<MemberTupleExpander> expander; 111 UntypedMemberExpr * inner = new UntypedMemberExpr( memberExpr->aggregate, aggr->clone() ); 112 UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( memberExpr->member, inner ); 114 113 inner->location = newMemberExpr->location = loc; 115 memberExpr-> set_member(nullptr);116 memberExpr-> set_aggregate(nullptr);114 memberExpr->member = nullptr; 115 memberExpr->aggregate = nullptr; 117 116 delete memberExpr; 118 117 return newMemberExpr->acceptMutator( expander ); … … 126 125 } 127 126 128 Expression * MemberTupleExpander:: mutate( UntypedMemberExpr * memberExpr ) {129 if ( UntypedTupleExpr * tupleExpr = dynamic_cast< UntypedTupleExpr * > ( memberExpr-> get_member()) ) {130 Expression * aggr = memberExpr-> get_aggregate()->clone()->acceptMutator( *this);127 Expression * MemberTupleExpander::postmutate( UntypedMemberExpr * memberExpr ) { 128 if ( UntypedTupleExpr * tupleExpr = dynamic_cast< UntypedTupleExpr * > ( memberExpr->member ) ) { 129 Expression * aggr = memberExpr->aggregate->clone()->acceptMutator( *visitor ); 131 130 // aggregate expressions which might be impure must be wrapped in unique expressions 132 // 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 133 // if ( Tuples::maybeImpureIgnoreUnique( memberExpr->get_aggregate() ) ) aggr = new UniqueExpr( aggr ); 134 aggr = new UniqueExpr( aggr ); 135 for ( Expression *& expr : tupleExpr->get_exprs() ) { 131 if ( Tuples::maybeImpureIgnoreUnique( memberExpr->aggregate ) ) aggr = new UniqueExpr( aggr ); 132 for ( Expression *& expr : tupleExpr->exprs ) { 136 133 expr = reconstructMemberExpr( expr, aggr, memberExpr->location ); 137 134 expr->location = memberExpr->location; … … 143 140 // there may be a tuple expr buried in the aggregate 144 141 // xxx - this is a memory leak 145 UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( memberExpr-> get_member()->clone(), memberExpr->get_aggregate()->acceptMutator( *this) );142 UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( memberExpr->member->clone(), memberExpr->aggregate->acceptMutator( *visitor ) ); 146 143 newMemberExpr->location = memberExpr->location; 147 144 return newMemberExpr; … … 202 199 // generate struct type to replace tuple type based on the number of components in the tuple 203 200 StructDecl * decl = new StructDecl( toString( "_tuple", tupleSize, "_" ) ); 201 decl->location = tupleType->location; 204 202 decl->set_body( true ); 205 203 for ( size_t i = 0; i < tupleSize; ++i ) { … … 228 226 229 227 Expression * TupleIndexExpander::postmutate( TupleIndexExpr * tupleExpr ) { 230 Expression * tuple = tupleExpr-> get_tuple();228 Expression * tuple = tupleExpr->tuple; 231 229 assert( tuple ); 232 tupleExpr-> set_tuple( nullptr );233 unsigned int idx = tupleExpr-> get_index();234 TypeSubstitution * env = tupleExpr-> get_env();235 tupleExpr-> set_env( nullptr );230 tupleExpr->tuple = nullptr; 231 unsigned int idx = tupleExpr->index; 232 TypeSubstitution * env = tupleExpr->env; 233 tupleExpr->env = nullptr; 236 234 delete tupleExpr; 237 235 238 StructInstType * type = strict_dynamic_cast< StructInstType * >( tuple->get_result() ); 239 StructDecl * structDecl = type->get_baseStruct(); 240 assert( structDecl->get_members().size() > idx ); 241 Declaration * member = *std::next(structDecl->get_members().begin(), idx); 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); 242 253 MemberExpr * memExpr = new MemberExpr( strict_dynamic_cast< DeclarationWithType * >( member ), tuple ); 243 memExpr-> set_env( env );254 memExpr->env = env; 244 255 return memExpr; 245 256 }
Note:
See TracChangeset
for help on using the changeset viewer.