Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Tuples/Explode.h

    rf831177 r141b786  
    3333        /// helper function used by explode
    3434        template< typename OutputIterator >
    35         void explodeUnique( Expression * expr, const ResolvExpr::Alternative & alt, const SymTab::Indexer & indexer, OutputIterator out, bool isTupleAssign ) {
    36                 if ( isTupleAssign ) {
    37                         // tuple assignment needs AddressExprs to be recursively exploded to easily get at all of the components
    38                         if ( AddressExpr * addrExpr = dynamic_cast< AddressExpr * >( expr ) ) {
    39                                 ResolvExpr::AltList alts;
    40                                 explodeUnique( addrExpr->get_arg(), alt, indexer, back_inserter( alts ), isTupleAssign );
    41                                 for ( ResolvExpr::Alternative & alt : alts ) {
    42                                         // distribute '&' over all components
    43                                         alt.expr = distributeAddr( alt.expr );
    44                                         *out++ = alt;
    45                                 }
    46                                 // in tuple assignment, still need to handle the other cases, but only if not already handled here (don't want to output too many alternatives)
    47                                 return;
     35        void explodeUnique( Expression * expr, const ResolvExpr::Alternative & alt, const SymTab::Indexer & indexer, OutputIterator out ) {
     36                Type * res = expr->get_result();
     37                if ( AddressExpr * addrExpr = dynamic_cast< AddressExpr * >( expr ) ) {
     38                        ResolvExpr::AltList alts;
     39                        explodeUnique( addrExpr->get_arg(), alt, indexer, back_inserter( alts ) );
     40                        for ( ResolvExpr::Alternative & alt : alts ) {
     41                                // distribute '&' over all components
     42                                alt.expr = distributeAddr( alt.expr );
     43                                *out++ = alt;
    4844                        }
    49                 }
    50                 Type * res = expr->get_result();
    51                 if ( TupleType * tupleType = dynamic_cast< TupleType * > ( res ) ) {
     45                } else if ( TupleType * tupleType = dynamic_cast< TupleType * > ( res ) ) {
    5246                        if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * >( expr ) ) {
    5347                                // can open tuple expr and dump its exploded components
    5448                                for ( Expression * expr : tupleExpr->get_exprs() ) {
    55                                         explodeUnique( expr, alt, indexer, out, isTupleAssign );
     49                                        explodeUnique( expr, alt, indexer, out );
    5650                                }
    5751                        } else {
     
    6458                                for ( unsigned int i = 0; i < tupleType->size(); i++ ) {
    6559                                        TupleIndexExpr * idx = new TupleIndexExpr( arg->clone(), i );
    66                                         explodeUnique( idx, alt, indexer, out, isTupleAssign );
     60                                        explodeUnique( idx, alt, indexer, out );
    6761                                        delete idx;
    6862                                }
     
    7771        /// expands a tuple-valued alternative into multiple alternatives, each with a non-tuple-type
    7872        template< typename OutputIterator >
    79         void explode( const ResolvExpr::Alternative &alt, const SymTab::Indexer & indexer, OutputIterator out, bool isTupleAssign = false ) {
    80                 explodeUnique( alt.expr, alt, indexer, out, isTupleAssign );
     73        void explode( const ResolvExpr::Alternative &alt, const SymTab::Indexer & indexer, OutputIterator out ) {
     74                explodeUnique( alt.expr, alt, indexer, out );
    8175        }
    8276
    8377        // explode list of alternatives
    8478        template< typename AltIterator, typename OutputIterator >
    85         void explode( AltIterator altBegin, AltIterator altEnd, const SymTab::Indexer & indexer, OutputIterator out, bool isTupleAssign = false ) {
     79        void explode( AltIterator altBegin, AltIterator altEnd, const SymTab::Indexer & indexer, OutputIterator out ) {
    8680                for ( ; altBegin != altEnd; ++altBegin ) {
    87                         explode( *altBegin, indexer, out, isTupleAssign );
     81                        explode( *altBegin, indexer, out );
    8882                }
    8983        }
    9084
    9185        template< typename OutputIterator >
    92         void explode( const ResolvExpr::AltList & alts, const SymTab::Indexer & indexer, OutputIterator out, bool isTupleAssign = false ) {
    93                 explode( alts.begin(), alts.end(), indexer, out, isTupleAssign );
     86        void explode( const ResolvExpr::AltList & alts, const SymTab::Indexer & indexer, OutputIterator out ) {
     87                explode( alts.begin(), alts.end(), indexer, out );
    9488        }
    9589} // namespace Tuples
Note: See TracChangeset for help on using the changeset viewer.