Changes in src/Tuples/Explode.h [0b5d871:03321e4]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Tuples/Explode.h
r0b5d871 r03321e4 16 16 #pragma once 17 17 18 #include "ResolvExpr/AlternativeFinder.h" 19 #include "ResolvExpr/Resolver.h" 18 #include <iterator> // for back_inserter, back_insert_iterator 20 19 21 #include "SynTree/Expression.h" 22 #include "SynTree/Declaration.h" 23 #include "SynTree/Type.h" 20 #include "ResolvExpr/Alternative.h" // for Alternative, AltList 21 #include "SynTree/Expression.h" // for Expression, UniqueExpr, AddressExpr 22 #include "SynTree/Type.h" // for TupleType, Type 23 #include "Tuples.h" // for maybeImpure 24 24 25 #include "Tuples.h" 25 namespace SymTab { 26 class Indexer; 27 } // namespace SymTab 26 28 27 29 namespace Tuples { 28 Expression * distributeReference( Expression * ); 30 /// helper function used by explode to properly distribute 31 /// '&' across a tuple expression 32 Expression * distributeAddr( Expression * expr ); 29 33 30 34 /// helper function used by explode … … 32 36 void explodeUnique( Expression * expr, const ResolvExpr::Alternative & alt, const SymTab::Indexer & indexer, OutputIterator out, bool isTupleAssign ) { 33 37 if ( isTupleAssign ) { 34 // tuple assignment needs CastExprs to be recursively exploded to easily get at all of the components35 if ( CastExpr * castExpr = dynamic_cast< CastExpr * >( expr ) ) {38 // tuple assignment needs AddressExprs to be recursively exploded to easily get at all of the components 39 if ( AddressExpr * addrExpr = dynamic_cast< AddressExpr * >( expr ) ) { 36 40 ResolvExpr::AltList alts; 37 explodeUnique( castExpr->get_arg(), alt, indexer, back_inserter( alts ), isTupleAssign );41 explodeUnique( addrExpr->get_arg(), alt, indexer, back_inserter( alts ), isTupleAssign ); 38 42 for ( ResolvExpr::Alternative & alt : alts ) { 39 // distribute reference castover all components40 alt.expr = distribute Reference( alt.expr );43 // distribute '&' over all components 44 alt.expr = distributeAddr( alt.expr ); 41 45 *out++ = alt; 42 46 } … … 45 49 } 46 50 } 47 Type * res = expr->get_result() ->stripReferences();51 Type * res = expr->get_result(); 48 52 if ( TupleType * tupleType = dynamic_cast< TupleType * > ( res ) ) { 49 53 if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * >( expr ) ) { … … 53 57 } 54 58 } else { 55 // tuple type, but not tuple expr - recursively index into its components. 56 // if expr type is reference, convert to value type 59 // tuple type, but not tuple expr - recursively index into its components 57 60 Expression * arg = expr->clone(); 58 if ( Tuples::maybeImpure IgnoreUnique( arg ) ) {61 if ( Tuples::maybeImpure( arg ) && ! dynamic_cast< UniqueExpr * >( arg ) ) { 59 62 // expressions which may contain side effects require a single unique instance of the expression. 60 63 arg = new UniqueExpr( arg ); 61 }62 // cast reference to value type to facilitate further explosion63 if ( dynamic_cast<ReferenceType *>( arg->get_result() ) ) {64 arg = new CastExpr( arg, tupleType->clone() );65 64 } 66 65 for ( unsigned int i = 0; i < tupleType->size(); i++ ) {
Note:
See TracChangeset
for help on using the changeset viewer.