Changeset bf32bb8 for src/Tuples/TupleExpansion.cc
- Timestamp:
- Oct 18, 2016, 4:23:04 PM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- f0121d7
- Parents:
- 848ce71
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Tuples/TupleExpansion.cc
r848ce71 rbf32bb8 31 31 namespace Tuples { 32 32 namespace { 33 class MemberTupleExpander : public Mutator { 34 public: 35 typedef Mutator Parent; 36 virtual Expression * mutate( UntypedMemberExpr * memberExpr ); 37 }; 38 33 39 class UniqueExprExpander : public GenPoly::DeclMutator { 34 40 public: 35 41 typedef GenPoly::DeclMutator Parent; 36 42 virtual Expression * mutate( UniqueExpr * unqExpr ); 37 std::map< Expression *, ObjectDecl * > decls;43 std::map< int, ObjectDecl * > decls; // not vector, because order added may not be increasing order 38 44 }; 39 45 … … 73 79 } 74 80 81 void expandMemberTuples( std::list< Declaration * > & translationUnit ) { 82 MemberTupleExpander expander; 83 mutateAll( translationUnit, expander ); 84 } 85 75 86 void expandUniqueExpr( std::list< Declaration * > & translationUnit ) { 76 87 UniqueExprExpander unqExpander; … … 92 103 } 93 104 105 namespace { 106 /// given a expression representing the member and an expression representing the aggregate, 107 /// reconstructs a flattened UntypedMemberExpr with the right precedence 108 Expression * reconstructMemberExpr( Expression * member, UniqueExpr * aggr ) { 109 if ( UntypedMemberExpr * memberExpr = dynamic_cast< UntypedMemberExpr * >( member ) ) { 110 // construct a new UntypedMemberExpr with the correct structure , and recursively 111 // expand that member expression. 112 MemberTupleExpander expander; 113 UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( memberExpr->get_member(), new UntypedMemberExpr( memberExpr->get_aggregate(), aggr->clone() ) ); 114 115 memberExpr->set_member(nullptr); 116 memberExpr->set_aggregate(nullptr); 117 delete memberExpr; 118 return newMemberExpr->acceptMutator( expander ); 119 } else { 120 // not a member expression, so there is nothing to do but attach and return 121 return new UntypedMemberExpr( member, aggr->clone() ); 122 } 123 } 124 } 125 126 Expression * MemberTupleExpander::mutate( UntypedMemberExpr * memberExpr ) { 127 if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * > ( memberExpr->get_member() ) ) { 128 UniqueExpr * unqExpr = new UniqueExpr( memberExpr->get_aggregate()->clone() ); 129 for ( Expression *& expr : tupleExpr->get_exprs() ) { 130 expr = reconstructMemberExpr( expr, unqExpr ); 131 } 132 delete unqExpr; 133 return tupleExpr; 134 } else { 135 return memberExpr; 136 } 137 } 138 94 139 Expression * UniqueExprExpander::mutate( UniqueExpr * unqExpr ) { 95 140 static UniqueName tempNamer( "_unq_expr_" ); 96 141 unqExpr = safe_dynamic_cast< UniqueExpr * > ( Parent::mutate( unqExpr ) ); 97 if ( ! decls.count( unqExpr->get_ expr() ) ) {142 if ( ! decls.count( unqExpr->get_id() ) ) { 98 143 // xxx - it's possible (likely?) that expressions can appear in the wrong order because of this. Need to ensure they're placed in the correct location. 144 // xxx - is it possible to make the decl's type const? 99 145 ObjectDecl * decl = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, unqExpr->get_result()->clone(), new SingleInit( unqExpr->get_expr()->clone() ) ); 100 decls[unqExpr->get_ expr()] = decl;146 decls[unqExpr->get_id()] = decl; 101 147 addDeclaration( decl ); 102 148 } 103 return new VariableExpr( decls[unqExpr->get_ expr()] );149 return new VariableExpr( decls[unqExpr->get_id()] ); 104 150 } 105 151 … … 176 222 177 223 Expression * TupleExprExpander::mutate( TupleExpr * tupleExpr ) { 224 // recursively expand sub-tuple-expressions 225 tupleExpr = safe_dynamic_cast<TupleExpr *>(Parent::mutate(tupleExpr)); 178 226 Type * result = tupleExpr->get_result(); 179 227 std::list< Expression * > exprs = tupleExpr->get_exprs(); 180 228 assert( result ); 181 229 230 // remove data from shell and delete it 182 231 tupleExpr->set_result( nullptr ); 183 232 tupleExpr->get_exprs().clear();
Note: See TracChangeset
for help on using the changeset viewer.