Ignore:
Timestamp:
Oct 18, 2016, 4:23:04 PM (8 years ago)
Author:
Rob Schluntz <rschlunt@…>
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
Message:

implement transformation for MemberTupleExprs?

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/AlternativeFinder.cc

    r848ce71 rbf32bb8  
    209209        template< typename StructOrUnionType >
    210210        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                        }
    230224                }
    231225        }
     
    10591053                alternatives.push_back( Alternative( tupleAssignExpr->clone(), env, Cost::zero ) );
    10601054        }
     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
    10611072} // namespace ResolvExpr
    10621073
Note: See TracChangeset for help on using the changeset viewer.