Changes in src/SynTree/Expression.cc [6eb8948:906e24d]
- File:
-
- 1 edited
-
src/SynTree/Expression.cc (modified) (19 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/SynTree/Expression.cc
r6eb8948 r906e24d 31 31 32 32 33 Expression::Expression( Expression *_aname ) : env( 0 ), argName( _aname ) {} 34 35 Expression::Expression( const Expression &other ) : env( maybeClone( other.env ) ), argName( maybeClone( other.get_argName() ) ), extension( other.extension ) { 36 cloneAll( other.results, results ); 33 Expression::Expression( Expression *_aname ) : result( 0 ), env( 0 ), argName( _aname ) {} 34 35 Expression::Expression( const Expression &other ) : result( maybeClone( other.result ) ), env( maybeClone( other.env ) ), argName( maybeClone( other.get_argName() ) ), extension( other.extension ) { 37 36 } 38 37 … … 40 39 delete env; 41 40 delete argName; // xxx -- there's a problem in cloning ConstantExpr I still don't know how to fix 42 deleteAll( results ); 43 } 44 45 void Expression::add_result( Type *t ) { 46 if ( TupleType *tuple = dynamic_cast< TupleType* >( t ) ) { 47 std::copy( tuple->get_types().begin(), tuple->get_types().end(), back_inserter( results ) ); 48 } else { 49 results.push_back(t); 50 } // if 41 delete result; 51 42 } 52 43 … … 68 59 69 60 ConstantExpr::ConstantExpr( Constant _c, Expression *_aname ) : Expression( _aname ), constant( _c ) { 70 add_result( constant.get_type()->clone() );61 set_result( constant.get_type()->clone() ); 71 62 } 72 63 … … 85 76 assert( var ); 86 77 assert( var->get_type() ); 87 add_result( var->get_type()->clone() ); 88 for ( std::list< Type* >::iterator i = get_results().begin(); i != get_results().end(); ++i ) { 89 (*i)->set_isLvalue( true ); 90 } // for 78 Type * type = var->get_type()->clone(); 79 type->set_isLvalue( true ); 80 set_result( type ); 91 81 } 92 82 … … 110 100 SizeofExpr::SizeofExpr( Expression *expr_, Expression *_aname ) : 111 101 Expression( _aname ), expr(expr_), type(0), isType(false) { 112 add_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) );102 set_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ); 113 103 } 114 104 115 105 SizeofExpr::SizeofExpr( Type *type_, Expression *_aname ) : 116 106 Expression( _aname ), expr(0), type(type_), isType(true) { 117 add_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) );107 set_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ); 118 108 } 119 109 … … 141 131 AlignofExpr::AlignofExpr( Expression *expr_, Expression *_aname ) : 142 132 Expression( _aname ), expr(expr_), type(0), isType(false) { 143 add_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) );133 set_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ); 144 134 } 145 135 146 136 AlignofExpr::AlignofExpr( Type *type_, Expression *_aname ) : 147 137 Expression( _aname ), expr(0), type(type_), isType(true) { 148 add_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) );138 set_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ); 149 139 } 150 140 … … 172 162 UntypedOffsetofExpr::UntypedOffsetofExpr( Type *type_, const std::string &member_, Expression *_aname ) : 173 163 Expression( _aname ), type(type_), member(member_) { 174 add_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) );164 set_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ); 175 165 } 176 166 … … 197 187 OffsetofExpr::OffsetofExpr( Type *type_, DeclarationWithType *member_, Expression *_aname ) : 198 188 Expression( _aname ), type(type_), member(member_) { 199 add_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) );189 set_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ); 200 190 } 201 191 … … 229 219 230 220 OffsetPackExpr::OffsetPackExpr( StructInstType *type_, Expression *aname_ ) : Expression( aname_ ), type( type_ ) { 231 add_result( new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), 0, false, false ) );221 set_result( new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), 0, false, false ) ); 232 222 } 233 223 … … 284 274 285 275 CastExpr::CastExpr( Expression *arg_, Type *toType, Expression *_aname ) : Expression( _aname ), arg(arg_) { 286 add_result(toType);276 set_result(toType); 287 277 } 288 278 289 279 CastExpr::CastExpr( Expression *arg_, Expression *_aname ) : Expression( _aname ), arg(arg_) { 280 set_result( new VoidType( Type::Qualifiers() ) ); 290 281 } 291 282 … … 303 294 arg->print(os, indent+2); 304 295 os << std::endl << std::string( indent, ' ' ) << "to:" << std::endl; 305 if ( results.empty() ) { 306 os << std::string( indent+2, ' ' ) << "nothing" << std::endl; 296 os << std::string( indent+2, ' ' ); 297 if ( result->isVoid() ) { 298 os << "nothing"; 307 299 } else { 308 printAll(results, os, indent+2);300 result->print( os, indent+2 ); 309 301 } // if 310 Expression::print( os, indent ); 311 } 312 313 UntypedMemberExpr::UntypedMemberExpr( Expression * _member, Expression *_aggregate, Expression *_aname ) : 302 os << std::endl; 303 Expression::print( os, indent ); 304 } 305 306 UntypedMemberExpr::UntypedMemberExpr( std::string _member, Expression *_aggregate, Expression *_aname ) : 314 307 Expression( _aname ), member(_member), aggregate(_aggregate) {} 315 308 316 309 UntypedMemberExpr::UntypedMemberExpr( const UntypedMemberExpr &other ) : 317 Expression( other ), member( maybeClone( other.member )), aggregate( maybeClone( other.aggregate ) ) {310 Expression( other ), member( other.member ), aggregate( maybeClone( other.aggregate ) ) { 318 311 } 319 312 320 313 UntypedMemberExpr::~UntypedMemberExpr() { 321 314 delete aggregate; 322 delete member;323 315 } 324 316 325 317 void UntypedMemberExpr::print( std::ostream &os, int indent ) const { 326 os << "Untyped Member Expression, with field: " << std::endl; 327 get_member()->print(os, indent+4); 328 os << std::string( indent+2, ' ' ); 318 os << "Untyped Member Expression, with field: " << get_member(); 329 319 330 320 Expression *agg = get_aggregate(); 331 os << " from aggregate: " << std::endl;321 os << ", from aggregate: "; 332 322 if (agg != 0) { 333 os << std::string( indent + 4, ' ' );334 agg->print(os, indent + 4);323 os << std::string( indent + 2, ' ' ); 324 agg->print(os, indent + 2); 335 325 } 336 326 os << std::string( indent+2, ' ' ); … … 341 331 MemberExpr::MemberExpr( DeclarationWithType *_member, Expression *_aggregate, Expression *_aname ) : 342 332 Expression( _aname ), member(_member), aggregate(_aggregate) { 343 add_result( member->get_type()->clone() ); 344 for ( std::list< Type* >::iterator i = get_results().begin(); i != get_results().end(); ++i ) { 345 (*i)->set_isLvalue( true ); 346 } // for 333 set_result( member->get_type()->clone() ); 334 get_result()->set_isLvalue( true ); 347 335 } 348 336 … … 375 363 } 376 364 377 UntypedExpr::UntypedExpr( Expression *_function, const std::list<Expression *> &_args, Expression *_aname ) : 378 Expression( _aname ), function(_function), args(_args) {}365 366 UntypedExpr::UntypedExpr( Expression *_function, Expression *_aname ) : Expression( _aname ), function( _function ) {} 379 367 380 368 UntypedExpr::UntypedExpr( const UntypedExpr &other ) : … … 382 370 cloneAll( other.args, args ); 383 371 } 372 373 UntypedExpr::UntypedExpr( Expression *_function, std::list<Expression *> &_args, Expression *_aname ) : 374 Expression( _aname ), function(_function), args(_args) {} 384 375 385 376 UntypedExpr::~UntypedExpr() { … … 419 410 LogicalExpr::LogicalExpr( Expression *arg1_, Expression *arg2_, bool andp, Expression *_aname ) : 420 411 Expression( _aname ), arg1(arg1_), arg2(arg2_), isAnd(andp) { 421 add_result( new BasicType( Type::Qualifiers(), BasicType::SignedInt ) );412 set_result( new BasicType( Type::Qualifiers(), BasicType::SignedInt ) ); 422 413 } 423 414 … … 477 468 ImplicitCopyCtorExpr::ImplicitCopyCtorExpr( ApplicationExpr * callExpr ) : callExpr( callExpr ) { 478 469 assert( callExpr ); 479 cloneAll( callExpr->get_results(), results ); 470 assert( callExpr->has_result() ); 471 set_result( callExpr->get_result()->clone() ); 480 472 } 481 473 … … 510 502 Expression * arg = InitTweak::getCallArg( callExpr, 0 ); 511 503 assert( arg ); 512 cloneAll( arg->get_results(), results);504 set_result( maybeClone( arg->get_result() ) ); 513 505 } 514 506 … … 530 522 531 523 CompoundLiteralExpr::CompoundLiteralExpr( Type * type, Initializer * initializer ) : type( type ), initializer( initializer ) { 532 add_result( type->clone() );524 set_result( type->clone() ); 533 525 } 534 526 … … 565 557 } 566 558 567 StmtExpr::StmtExpr( CompoundStmt *statements ) : statements( statements ) {568 assert( statements );569 std::list< Statement * > & body = statements->get_kids();570 if ( ! body.empty() ) {571 if ( ExprStmt * exprStmt = dynamic_cast< ExprStmt * >( body.back() ) ) {572 cloneAll( exprStmt->get_expr()->get_results(), get_results() );573 }574 }575 }576 StmtExpr::StmtExpr( const StmtExpr &other ) : statements( other.statements->clone() ) {}577 StmtExpr::~StmtExpr() {578 delete statements;579 }580 void StmtExpr::print( std::ostream &os, int indent ) const {581 os << std::string( indent, ' ' ) << "Statement Expression: " << std::endl;582 statements->print( os, indent+2 );583 }584 585 559 std::ostream & operator<<( std::ostream & out, const Expression * expr ) { 586 560 expr->print( out );
Note:
See TracChangeset
for help on using the changeset viewer.