Changes in src/SynTree/TupleExpr.cc [23bb1b9:d3b7937]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/SynTree/TupleExpr.cc
r23bb1b9 rd3b7937 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // TupleExpr.cc -- 7 // TupleExpr.cc -- 8 8 // 9 9 // Author : Richard C. Bilson … … 16 16 #include "Expression.h" 17 17 #include "Common/utility.h" 18 #include "Type.h"19 #include "Declaration.h"20 #include "Tuples/Tuples.h"21 #include "VarExprReplacer.h"22 18 23 TupleExpr::TupleExpr( const std::list< Expression * > & exprs, Expression *_aname ) : Expression( _aname ), exprs( exprs ) { 24 if ( ! exprs.empty() ) { 25 if ( std::all_of( exprs.begin(), exprs.end(), [](Expression * expr) { return expr->get_result(); } ) ) { 26 set_result( Tuples::makeTupleType( exprs ) ); 27 } 28 } 19 TupleExpr::TupleExpr( Expression *_aname ) : Expression( _aname ) { 29 20 } 30 21 … … 38 29 39 30 void TupleExpr::print( std::ostream &os, int indent ) const { 40 os << "Tuple:" << std::endl;31 os << std::string( indent, ' ' ) << "Tuple:" << std::endl; 41 32 printAll( exprs, os, indent+2 ); 42 33 Expression::print( os, indent ); 43 34 } 44 35 45 TupleIndexExpr::TupleIndexExpr( Expression * tuple, unsigned int index ) : tuple( tuple ), index( index ) { 46 TupleType * type = safe_dynamic_cast< TupleType * >( tuple->get_result() ); 47 assert( type->size() > index ); 48 set_result( (*std::next( type->get_types().begin(), index ))->clone() ); 49 get_result()->set_isLvalue( type->get_isLvalue() ); 36 SolvedTupleExpr::SolvedTupleExpr( std::list<Expression *> &_exprs, Expression *_aname ) : Expression( _aname ) { 37 std::copy(_exprs.begin(), _exprs.end(), back_inserter(exprs)); 50 38 } 51 39 52 TupleIndexExpr::TupleIndexExpr( const TupleIndexExpr &other ) : Expression( other ), tuple( other.tuple->clone() ), index( other.index ) { 40 SolvedTupleExpr::SolvedTupleExpr( const SolvedTupleExpr &other ) : Expression( other ) { 41 cloneAll( other.exprs, exprs ); 53 42 } 54 43 55 TupleIndexExpr::~TupleIndexExpr() { 56 delete tuple; 57 } 58 59 void TupleIndexExpr::print( std::ostream &os, int indent ) const { 60 os << "Tuple Index Expression, with tuple:" << std::endl; 61 os << std::string( indent+2, ' ' ); 62 tuple->print( os, indent+2 ); 63 os << std::string( indent+2, ' ' ) << "with index: " << index << std::endl; 44 void SolvedTupleExpr::print( std::ostream &os, int indent ) const { 45 os << std::string( indent, ' ' ) << "Solved Tuple:" << std::endl; 46 printAll( exprs, os, indent+2 ); 64 47 Expression::print( os, indent ); 65 48 } 66 67 MemberTupleExpr::MemberTupleExpr( Expression * member, Expression * aggregate, Expression * _aname ) : Expression( _aname ) {68 set_result( maybeClone( member->get_result() ) ); // xxx - ???69 }70 71 MemberTupleExpr::MemberTupleExpr( const MemberTupleExpr &other ) : Expression( other ), member( other.member->clone() ), aggregate( other.aggregate->clone() ) {72 }73 74 MemberTupleExpr::~MemberTupleExpr() {75 delete member;76 delete aggregate;77 }78 79 void MemberTupleExpr::print( std::ostream &os, int indent ) const {80 os << "Member Tuple Expression, with aggregate:" << std::endl;81 os << std::string( indent+2, ' ' );82 aggregate->print( os, indent+2 );83 os << std::string( indent+2, ' ' ) << "with member: " << std::endl;84 os << std::string( indent+2, ' ' );85 member->print( os, indent+2 );86 Expression::print( os, indent );87 }88 89 90 TupleAssignExpr::TupleAssignExpr( const std::list< Expression * > & assigns, const std::list< ObjectDecl * > & tempDecls, Expression * _aname ) : Expression( _aname ), assigns( assigns ), tempDecls( tempDecls ) {91 set_result( Tuples::makeTupleType( assigns ) );92 }93 94 TupleAssignExpr::TupleAssignExpr( const TupleAssignExpr &other ) : Expression( other ) {95 cloneAll( other.assigns, assigns );96 cloneAll( other.tempDecls, tempDecls );97 98 // clone needs to go into assigns and replace tempDecls99 VarExprReplacer::DeclMap declMap;100 std::list< ObjectDecl * >::const_iterator origit = other.tempDecls.begin();101 for ( ObjectDecl * temp : tempDecls ) {102 assert( origit != other.tempDecls.end() );103 ObjectDecl * origTemp = *origit++;104 assert( origTemp );105 assert( temp->get_name() == origTemp->get_name() );106 declMap[ origTemp ] = temp;107 }108 if ( ! declMap.empty() ) {109 VarExprReplacer replacer( declMap );110 for ( Expression * assn : assigns ) {111 assn->accept( replacer );112 }113 }114 }115 116 TupleAssignExpr::~TupleAssignExpr() {117 deleteAll( assigns );118 // deleteAll( tempDecls );119 }120 121 void TupleAssignExpr::print( std::ostream &os, int indent ) const {122 os << "Tuple Assignment Expression, with temporaries:" << std::endl;123 printAll( tempDecls, os, indent+4 );124 os << std::string( indent+2, ' ' ) << "with assignments: " << std::endl;125 printAll( assigns, os, indent+4 );126 Expression::print( os, indent );127 }128 129 130 49 131 50 // Local Variables: //
Note:
See TracChangeset
for help on using the changeset viewer.