Changeset bf32bb8 for src/ResolvExpr/AlternativeFinder.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/ResolvExpr/AlternativeFinder.cc
r848ce71 rbf32bb8 209 209 template< typename StructOrUnionType > 210 210 void AlternativeFinder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member ) { 211 // member must be either a tuple expression or a name expr 212 if ( NameExpr * nameExpr = dynamic_cast< NameExpr * >( member ) ) { 213 const std::string & name = nameExpr->get_name(); 214 std::list< Declaration* > members; 215 aggInst->lookup( name, members ); 216 for ( std::list< Declaration* >::const_iterator i = members.begin(); i != members.end(); ++i ) { 217 if ( DeclarationWithType *dwt = dynamic_cast< DeclarationWithType* >( *i ) ) { 218 alternatives.push_back( Alternative( new MemberExpr( dwt, expr->clone() ), env, newCost ) ); 219 renameTypes( alternatives.back().expr ); 220 } else { 221 assert( false ); 222 } 223 } 224 } else if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * >( member ) ) { 225 assert( false ); 226 } else { 227 // xxx - temporary 228 std::cerr << member << std::endl; 229 assertf( false, "reached unexpected case of addAggMembers" ); 211 212 // by this point, member must be a name expr 213 NameExpr * nameExpr = safe_dynamic_cast< NameExpr * >( member ); 214 const std::string & name = nameExpr->get_name(); 215 std::list< Declaration* > members; 216 aggInst->lookup( name, members ); 217 for ( std::list< Declaration* >::const_iterator i = members.begin(); i != members.end(); ++i ) { 218 if ( DeclarationWithType *dwt = dynamic_cast< DeclarationWithType* >( *i ) ) { 219 alternatives.push_back( Alternative( new MemberExpr( dwt, expr->clone() ), env, newCost ) ); 220 renameTypes( alternatives.back().expr ); 221 } else { 222 assert( false ); 223 } 230 224 } 231 225 } … … 1059 1053 alternatives.push_back( Alternative( tupleAssignExpr->clone(), env, Cost::zero ) ); 1060 1054 } 1055 1056 void AlternativeFinder::visit( UniqueExpr *unqExpr ) { 1057 AlternativeFinder finder( indexer, env ); 1058 finder.findWithAdjustment( unqExpr->get_expr() ); 1059 for ( Alternative & alt : finder.alternatives ) { 1060 // xxx - it's possible that this won't always do the right thing, i.e. two UniqueExprs 1061 // with the same ID may resolve to different expressions. If this ever happens, it might be necessary 1062 // to try to select an alternative here (i.e. error is there is not a unique min-cost expression). 1063 // One other thought is to to resolve each ID once and map the IDs to resolved expressions, 1064 // but this isn't as simple as it sounds since the alternative is not selected here, meaning it might 1065 // require complicated tracking throughout the system. 1066 1067 // brand the new UniqueExprs with the same id so that they are recognized as the same expression by the expansion pass 1068 alternatives.push_back( Alternative( new UniqueExpr( alt.expr->clone(), unqExpr->get_id() ), env, Cost::zero ) ); 1069 } 1070 } 1071 1061 1072 } // namespace ResolvExpr 1062 1073
Note: See TracChangeset
for help on using the changeset viewer.