Changeset 1f44196 for src/SynTree/TupleExpr.cc
- Timestamp:
- Nov 29, 2016, 3:30:59 PM (9 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:
- 8e5724e
- Parents:
- 3a2128f (diff), 9129a84 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/SynTree/TupleExpr.cc
r3a2128f r1f44196 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" 18 22 19 TupleExpr::TupleExpr( Expression *_aname ) : Expression( _aname ) { 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 } 20 29 } 21 30 … … 29 38 30 39 void TupleExpr::print( std::ostream &os, int indent ) const { 31 os << std::string( indent, ' ' ) <<"Tuple:" << std::endl;40 os << "Tuple:" << std::endl; 32 41 printAll( exprs, os, indent+2 ); 33 42 Expression::print( os, indent ); 34 43 } 35 44 36 SolvedTupleExpr::SolvedTupleExpr( std::list<Expression *> &_exprs, Expression *_aname ) : Expression( _aname ) { 37 std::copy(_exprs.begin(), _exprs.end(), back_inserter(exprs)); 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() ); 38 50 } 39 51 40 SolvedTupleExpr::SolvedTupleExpr( const SolvedTupleExpr &other ) : Expression( other ) { 41 cloneAll( other.exprs, exprs ); 52 TupleIndexExpr::TupleIndexExpr( const TupleIndexExpr &other ) : Expression( other ), tuple( other.tuple->clone() ), index( other.index ) { 42 53 } 43 54 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 ); 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; 47 64 Expression::print( os, indent ); 48 65 } 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 tempDecls 99 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 49 130 50 131 // Local Variables: //
Note:
See TracChangeset
for help on using the changeset viewer.