Changeset 907eccb
- Timestamp:
- Dec 22, 2016, 3:23:49 PM (8 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:
- 4c8621ac
- Parents:
- 0c286cf
- Location:
- src
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
r0c286cf r907eccb 656 656 } 657 657 658 void CodeGenerator::visit( TupleExpr * tupleExpr ) { assert( false ); } 658 void CodeGenerator::visit( UntypedTupleExpr * tupleExpr ) { assertf( false, "UntypedTupleExpr should not make it to Code Gen" ); } 659 660 void CodeGenerator::visit( TupleExpr * tupleExpr ) { assertf( false, "TupleExpr should not make it to Code Gen" ); } 659 661 660 662 void CodeGenerator::visit( TypeExpr * typeExpr ) {} -
src/CodeGen/CodeGenerator.h
r0c286cf r907eccb 72 72 virtual void visit( CommaExpr *commaExpr ); 73 73 virtual void visit( CompoundLiteralExpr *compLitExpr ); 74 virtual void visit( UntypedTupleExpr *tupleExpr ); 74 75 virtual void visit( TupleExpr *tupleExpr ); 75 76 virtual void visit( TypeExpr *typeExpr ); -
src/InitTweak/InitTweak.cc
r0c286cf r907eccb 487 487 virtual void visit( UntypedValofExpr *valofExpr ) { isConstExpr = false; } 488 488 virtual void visit( CompoundLiteralExpr *compLitExpr ) { isConstExpr = false; } 489 virtual void visit( UntypedTupleExpr *tupleExpr ) { isConstExpr = false; } 489 490 virtual void visit( TupleExpr *tupleExpr ) { isConstExpr = false; } 490 491 virtual void visit( TupleAssignExpr *tupleExpr ) { isConstExpr = false; } -
src/Parser/ExpressionNode.cc
r0c286cf r907eccb 323 323 324 324 Expression *build_tuple( ExpressionNode * expr_node ) { 325 TupleExpr *ret = new TupleExpr();326 buildMoveList( expr_node, ret->get_exprs());327 return ret;325 std::list< Expression * > exprs; 326 buildMoveList( expr_node, exprs ); 327 return new UntypedTupleExpr( exprs );; 328 328 } 329 329 -
src/ResolvExpr/AlternativeFinder.cc
r0c286cf r907eccb 351 351 if ( TupleType * tupleType = dynamic_cast< TupleType * >( formalType ) ) { 352 352 // formalType is a TupleType - group actuals into a TupleExpr whose type unifies with the TupleType 353 TupleExpr * tupleExpr = new TupleExpr();353 std::list< Expression * > exprs; 354 354 for ( Type * type : *tupleType ) { 355 if ( ! instantiateArgument( type, defaultValue, actualIt, actualEnd, openVars, resultEnv, resultNeed, resultHave, indexer, cost, back_inserter( tupleExpr->get_exprs()) ) ) {356 delete tupleExpr;355 if ( ! instantiateArgument( type, defaultValue, actualIt, actualEnd, openVars, resultEnv, resultNeed, resultHave, indexer, cost, back_inserter( exprs ) ) ) { 356 deleteAll( exprs ); 357 357 return false; 358 358 } 359 359 } 360 tupleExpr->set_result( Tuples::makeTupleType( tupleExpr->get_exprs() ) ); 361 *out++ = tupleExpr; 360 *out++ = new TupleExpr( exprs ); 362 361 } else if ( actualIt != actualEnd ) { 363 362 if ( TypeInstType * ttype = Tuples::isTtype( formalType ) ) { … … 1058 1057 } 1059 1058 1060 void AlternativeFinder::visit( TupleExpr *tupleExpr ) {1059 void AlternativeFinder::visit( UntypedTupleExpr *tupleExpr ) { 1061 1060 std::list< AlternativeFinder > subExprAlternatives; 1062 1061 findSubExprs( tupleExpr->get_exprs().begin(), tupleExpr->get_exprs().end(), back_inserter( subExprAlternatives ) ); … … 1064 1063 combos( subExprAlternatives.begin(), subExprAlternatives.end(), back_inserter( possibilities ) ); 1065 1064 for ( std::list< AltList >::const_iterator i = possibilities.begin(); i != possibilities.end(); ++i ) { 1066 TupleExpr *newExpr = new TupleExpr; 1067 makeExprList( *i, newExpr->get_exprs() ); 1068 newExpr->set_result( Tuples::makeTupleType( newExpr->get_exprs() ) ); 1065 std::list< Expression * > exprs; 1066 makeExprList( *i, exprs ); 1069 1067 1070 1068 TypeEnvironment compositeEnv; 1071 1069 simpleCombineEnvironments( i->begin(), i->end(), compositeEnv ); 1072 alternatives.push_back( Alternative( new Expr, compositeEnv, sumCost( *i ) ) );1070 alternatives.push_back( Alternative( new TupleExpr( exprs ) , compositeEnv, sumCost( *i ) ) ); 1073 1071 } // for 1072 } 1073 1074 void AlternativeFinder::visit( TupleExpr *tupleExpr ) { 1075 alternatives.push_back( Alternative( tupleExpr->clone(), env, Cost::zero ) ); 1074 1076 } 1075 1077 -
src/ResolvExpr/AlternativeFinder.h
r0c286cf r907eccb 64 64 virtual void visit( ConditionalExpr *conditionalExpr ); 65 65 virtual void visit( CommaExpr *commaExpr ); 66 virtual void visit( TupleExpr *tupleExpr );67 66 virtual void visit( ImplicitCopyCtorExpr * impCpCtorExpr ); 68 67 virtual void visit( ConstructorExpr * ctorExpr ); 68 virtual void visit( UntypedTupleExpr *tupleExpr ); 69 virtual void visit( TupleExpr *tupleExpr ); 69 70 virtual void visit( TupleIndexExpr *tupleExpr ); 70 71 virtual void visit( TupleAssignExpr *tupleExpr ); -
src/SymTab/Indexer.cc
r0c286cf r907eccb 453 453 } 454 454 455 void Indexer::visit( TupleExpr *tupleExpr ) {456 acceptNewScope( tupleExpr->get_result(), *this );457 acceptAll( tupleExpr->get_exprs(), *this );458 }459 460 void Indexer::visit( TupleAssignExpr *tupleExpr ) {461 acceptNewScope( tupleExpr->get_result(), *this );462 maybeAccept( tupleExpr->get_stmtExpr(), *this );463 }464 465 455 void Indexer::visit( TypeExpr *typeExpr ) { 466 456 acceptNewScope( typeExpr->get_result(), *this ); … … 474 464 } 475 465 466 void Indexer::visit( ImplicitCopyCtorExpr *impCpCtorExpr ) { 467 acceptNewScope( impCpCtorExpr->get_result(), *this ); 468 maybeAccept( impCpCtorExpr->get_callExpr(), *this ); 469 acceptAll( impCpCtorExpr->get_tempDecls(), *this ); 470 acceptAll( impCpCtorExpr->get_returnDecls(), *this ); 471 acceptAll( impCpCtorExpr->get_dtors(), *this ); 472 } 473 474 void Indexer::visit( ConstructorExpr * ctorExpr ) { 475 acceptNewScope( ctorExpr->get_result(), *this ); 476 maybeAccept( ctorExpr->get_callExpr(), *this ); 477 } 478 479 void Indexer::visit( CompoundLiteralExpr *compLitExpr ) { 480 acceptNewScope( compLitExpr->get_result(), *this ); 481 maybeAccept( compLitExpr->get_type(), *this ); 482 maybeAccept( compLitExpr->get_initializer(), *this ); 483 } 484 476 485 void Indexer::visit( UntypedValofExpr *valofExpr ) { 477 486 acceptNewScope( valofExpr->get_result(), *this ); 478 487 maybeAccept( valofExpr->get_body(), *this ); 488 } 489 490 void Indexer::visit( RangeExpr *rangeExpr ) { 491 maybeAccept( rangeExpr->get_low(), *this ); 492 maybeAccept( rangeExpr->get_high(), *this ); 493 } 494 495 void Indexer::visit( UntypedTupleExpr *tupleExpr ) { 496 acceptNewScope( tupleExpr->get_result(), *this ); 497 acceptAll( tupleExpr->get_exprs(), *this ); 498 } 499 500 void Indexer::visit( TupleExpr *tupleExpr ) { 501 acceptNewScope( tupleExpr->get_result(), *this ); 502 acceptAll( tupleExpr->get_exprs(), *this ); 503 } 504 505 void Indexer::visit( TupleIndexExpr *tupleExpr ) { 506 acceptNewScope( tupleExpr->get_result(), *this ); 507 maybeAccept( tupleExpr->get_tuple(), *this ); 508 } 509 510 void Indexer::visit( MemberTupleExpr *tupleExpr ) { 511 acceptNewScope( tupleExpr->get_result(), *this ); 512 maybeAccept( tupleExpr->get_member(), *this ); 513 maybeAccept( tupleExpr->get_aggregate(), *this ); 514 } 515 516 void Indexer::visit( TupleAssignExpr *tupleExpr ) { 517 acceptNewScope( tupleExpr->get_result(), *this ); 518 maybeAccept( tupleExpr->get_stmtExpr(), *this ); 519 } 520 521 void Indexer::visit( StmtExpr *stmtExpr ) { 522 acceptNewScope( stmtExpr->get_result(), *this ); 523 maybeAccept( stmtExpr->get_statements(), *this ); 524 acceptAll( stmtExpr->get_returnDecls(), *this ); 525 acceptAll( stmtExpr->get_dtors(), *this ); 526 } 527 528 void Indexer::visit( UniqueExpr *uniqueExpr ) { 529 acceptNewScope( uniqueExpr->get_result(), *this ); 530 maybeAccept( uniqueExpr->get_expr(), *this ); 479 531 } 480 532 -
src/SymTab/Indexer.h
r0c286cf r907eccb 66 66 virtual void visit( TypeExpr *typeExpr ); 67 67 virtual void visit( AsmExpr *asmExpr ); 68 virtual void visit( ImplicitCopyCtorExpr *impCpCtorExpr ); 69 virtual void visit( ConstructorExpr * ctorExpr ); 70 virtual void visit( CompoundLiteralExpr *compLitExpr ); 68 71 virtual void visit( UntypedValofExpr *valofExpr ); 72 virtual void visit( RangeExpr *rangeExpr ); 73 virtual void visit( UntypedTupleExpr *tupleExpr ); 69 74 virtual void visit( TupleExpr *tupleExpr ); 75 virtual void visit( TupleIndexExpr *tupleExpr ); 76 virtual void visit( MemberTupleExpr *tupleExpr ); 70 77 virtual void visit( TupleAssignExpr *tupleExpr ); 78 virtual void visit( StmtExpr * stmtExpr ); 79 virtual void visit( UniqueExpr * uniqueExpr ); 71 80 72 81 virtual void visit( TraitInstType *contextInst ); -
src/SynTree/Expression.h
r0c286cf r907eccb 634 634 }; 635 635 636 /// UntypedTupleExpr represents a tuple expression ( [a, b, c] ) before resolution 637 class UntypedTupleExpr : public Expression { 638 public: 639 UntypedTupleExpr( const std::list< Expression * > & exprs, Expression *_aname = nullptr ); 640 UntypedTupleExpr( const UntypedTupleExpr &other ); 641 virtual ~UntypedTupleExpr(); 642 643 std::list<Expression*>& get_exprs() { return exprs; } 644 645 virtual UntypedTupleExpr *clone() const { return new UntypedTupleExpr( *this ); } 646 virtual void accept( Visitor &v ) { v.visit( this ); } 647 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); } 648 virtual void print( std::ostream &os, int indent = 0 ) const; 649 private: 650 std::list<Expression*> exprs; 651 }; 652 636 653 /// TupleExpr represents a tuple expression ( [a, b, c] ) 637 654 class TupleExpr : public Expression { 638 655 public: 639 TupleExpr( const std::list< Expression * > & exprs = std::list< Expression * >(), Expression *_aname = nullptr );656 TupleExpr( const std::list< Expression * > & exprs, Expression *_aname = nullptr ); 640 657 TupleExpr( const TupleExpr &other ); 641 658 virtual ~TupleExpr(); 642 659 643 void set_exprs( std::list<Expression*> newValue ) { exprs = newValue; }644 660 std::list<Expression*>& get_exprs() { return exprs; } 645 661 -
src/SynTree/Mutator.cc
r0c286cf r907eccb 345 345 Expression* Mutator::mutate( ImplicitCopyCtorExpr *impCpCtorExpr ) { 346 346 impCpCtorExpr->set_env( maybeMutate( impCpCtorExpr->get_env(), *this ) ); 347 impCpCtorExpr->set_result( maybeMutate( impCpCtorExpr->get_result(), *this ) ); 347 348 impCpCtorExpr->set_callExpr( maybeMutate( impCpCtorExpr->get_callExpr(), *this ) ); 348 349 mutateAll( impCpCtorExpr->get_tempDecls(), *this ); … … 378 379 rangeExpr->set_high( maybeMutate( rangeExpr->get_high(), *this ) ); 379 380 return rangeExpr; 381 } 382 383 Expression *Mutator::mutate( UntypedTupleExpr *tupleExpr ) { 384 tupleExpr->set_env( maybeMutate( tupleExpr->get_env(), *this ) ); 385 tupleExpr->set_result( maybeMutate( tupleExpr->get_result(), *this ) ); 386 mutateAll( tupleExpr->get_exprs(), *this ); 387 return tupleExpr; 380 388 } 381 389 -
src/SynTree/Mutator.h
r0c286cf r907eccb 78 78 virtual Expression* mutate( UntypedValofExpr *valofExpr ); 79 79 virtual Expression* mutate( RangeExpr *rangeExpr ); 80 virtual Expression* mutate( UntypedTupleExpr *tupleExpr ); 80 81 virtual Expression* mutate( TupleExpr *tupleExpr ); 81 82 virtual Expression* mutate( TupleIndexExpr *tupleExpr ); -
src/SynTree/SynTree.h
r0c286cf r907eccb 83 83 class UntypedValofExpr; 84 84 class RangeExpr; 85 class UntypedTupleExpr; 85 86 class TupleExpr; 86 87 class TupleIndexExpr; -
src/SynTree/TupleExpr.cc
r0c286cf r907eccb 21 21 #include "VarExprReplacer.h" 22 22 23 UntypedTupleExpr::UntypedTupleExpr( const std::list< Expression * > & exprs, Expression *_aname ) : Expression( _aname ), exprs( exprs ) { 24 } 25 26 UntypedTupleExpr::UntypedTupleExpr( const UntypedTupleExpr &other ) : Expression( other ) { 27 cloneAll( other.exprs, exprs ); 28 } 29 30 UntypedTupleExpr::~UntypedTupleExpr() { 31 deleteAll( exprs ); 32 } 33 34 void UntypedTupleExpr::print( std::ostream &os, int indent ) const { 35 os << "Untyped Tuple:" << std::endl; 36 printAll( exprs, os, indent+2 ); 37 Expression::print( os, indent ); 38 } 39 23 40 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 } 41 set_result( Tuples::makeTupleType( exprs ) ); 29 42 } 30 43 … … 45 58 TupleIndexExpr::TupleIndexExpr( Expression * tuple, unsigned int index ) : tuple( tuple ), index( index ) { 46 59 TupleType * type = safe_dynamic_cast< TupleType * >( tuple->get_result() ); 47 assert ( type->size() >index );60 assertf( type->size() > index, "TupleIndexExpr index out of bounds: tuple size %d, requested index %d", type->size(), index ); 48 61 set_result( (*std::next( type->get_types().begin(), index ))->clone() ); 49 62 get_result()->set_isLvalue( type->get_isLvalue() ); -
src/SynTree/Visitor.cc
r0c286cf r907eccb 273 273 274 274 void Visitor::visit( ImplicitCopyCtorExpr *impCpCtorExpr ) { 275 maybeAccept( impCpCtorExpr->get_result(), *this ); 275 276 maybeAccept( impCpCtorExpr->get_callExpr(), *this ); 276 277 acceptAll( impCpCtorExpr->get_tempDecls(), *this ); … … 298 299 maybeAccept( rangeExpr->get_low(), *this ); 299 300 maybeAccept( rangeExpr->get_high(), *this ); 301 } 302 303 void Visitor::visit( UntypedTupleExpr *tupleExpr ) { 304 maybeAccept( tupleExpr->get_result(), *this ); 305 acceptAll( tupleExpr->get_exprs(), *this ); 300 306 } 301 307 -
src/SynTree/Visitor.h
r0c286cf r907eccb 78 78 virtual void visit( UntypedValofExpr *valofExpr ); 79 79 virtual void visit( RangeExpr *rangeExpr ); 80 virtual void visit( UntypedTupleExpr *tupleExpr ); 80 81 virtual void visit( TupleExpr *tupleExpr ); 81 82 virtual void visit( TupleIndexExpr *tupleExpr ); -
src/Tuples/TupleExpansion.cc
r0c286cf r907eccb 144 144 145 145 Expression * MemberTupleExpander::mutate( UntypedMemberExpr * memberExpr ) { 146 if ( TupleExpr * tupleExpr = dynamic_cast<TupleExpr * > ( memberExpr->get_member() ) ) {146 if ( UntypedTupleExpr * tupleExpr = dynamic_cast< UntypedTupleExpr * > ( memberExpr->get_member() ) ) { 147 147 Expression * aggr = memberExpr->get_aggregate()->clone()->acceptMutator( *this ); 148 148 // aggregate expressions which might be impure must be wrapped in unique expressions … … 315 315 qualifiers &= type->get_qualifiers(); 316 316 } // for 317 if ( exprs.empty() ) qualifiers = Type::Qualifiers(); 317 318 return tupleType; 318 319 }
Note: See TracChangeset
for help on using the changeset viewer.