Changes in / [e9a3b20b:d56e5bc]
- Location:
- src
- Files:
-
- 19 edited
-
Common/PassVisitor.h (modified) (3 diffs)
-
Common/PassVisitor.impl.h (modified) (23 diffs)
-
InitTweak/FixInit.cc (modified) (4 diffs)
-
Parser/ExpressionNode.cc (modified) (1 diff)
-
Parser/ParseNode.h (modified) (1 diff)
-
Parser/StatementNode.cc (modified) (1 diff)
-
SymTab/Indexer.cc (modified) (1 diff)
-
SymTab/Indexer.h (modified) (1 diff)
-
SymTab/Validate.cc (modified) (17 diffs)
-
SynTree/BaseSyntaxNode.h (modified) (1 diff)
-
SynTree/Expression.cc (modified) (4 diffs)
-
SynTree/Expression.h (modified) (3 diffs)
-
SynTree/Mutator.cc (modified) (1 diff)
-
SynTree/Mutator.h (modified) (1 diff)
-
SynTree/ObjectDecl.cc (modified) (1 diff)
-
SynTree/Statement.cc (modified) (2 diffs)
-
SynTree/Statement.h (modified) (3 diffs)
-
SynTree/Visitor.cc (modified) (1 diff)
-
SynTree/Visitor.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Common/PassVisitor.h
re9a3b20b rd56e5bc 18 18 // Templated visitor type 19 19 // To use declare a PassVisitor< YOUR VISITOR TYPE > 20 // The visitor type should specify the previsit/postvisit/premutate/postmutate for types that are desired. 21 // Note: previsit/postvisit/premutate/postmutate must be **public** members 22 // 23 // Several additional features are available through inheritance 24 // | WithTypeSubstitution - provides polymorphic TypeSubstitution * env for the current expression 25 // | WithStmtsToAdd - provides the ability to insert statements before or after the current statement by adding new statements into 26 // stmtsToAddBefore or stmtsToAddAfter respectively. 27 // | WithShortCircuiting - provides the ability to skip visiting child nodes; set skip_children to true if pre{visit,mutate} to skip visiting children 28 // | WithScopes - provides the ability to save/restore data like a LIFO stack; to save, call GuardValue with the variable to save, the variable 29 // will automatically be restored to its previous value after the corresponding postvisit/postmutate teminates. 20 // The visitor type should specify the previsit/postvisit for types that are desired. 30 21 //------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 31 22 template< typename pass_type > … … 95 86 virtual void visit( ConstructorExpr * ctorExpr ) override final; 96 87 virtual void visit( CompoundLiteralExpr *compLitExpr ) override final; 88 virtual void visit( UntypedValofExpr *valofExpr ) override final; 97 89 virtual void visit( RangeExpr *rangeExpr ) override final; 98 90 virtual void visit( UntypedTupleExpr *tupleExpr ) override final; … … 180 172 virtual Expression* mutate( ConstructorExpr *ctorExpr ) override final; 181 173 virtual Expression* mutate( CompoundLiteralExpr *compLitExpr ) override final; 174 virtual Expression* mutate( UntypedValofExpr *valofExpr ) override final; 182 175 virtual Expression* mutate( RangeExpr *rangeExpr ) override final; 183 176 virtual Expression* mutate( UntypedTupleExpr *tupleExpr ) override final; -
src/Common/PassVisitor.impl.h
re9a3b20b rd56e5bc 6 6 call_previsit( node ); \ 7 7 if( visit_children() ) { \ 8 reset_visit(); \ 8 9 9 10 #define VISIT_END( node ) \ 10 11 } \ 11 reset_visit(); \12 12 call_postvisit( node ); \ 13 13 … … 17 17 call_premutate( node ); \ 18 18 if( visit_children() ) { \ 19 reset_visit(); \ 19 20 20 21 #define MUTATE_END( type, node ) \ 21 22 } \ 22 reset_visit(); \23 23 return call_postmutate< type * >( node ); \ 24 24 … … 159 159 template< typename pass_type > 160 160 void PassVisitor< pass_type >::visit( ObjectDecl * node ) { 161 VISIT_BODY( node ); 161 VISIT_BODY( node ); 162 162 } 163 163 164 164 template< typename pass_type > 165 165 void PassVisitor< pass_type >::visit( FunctionDecl * node ) { 166 VISIT_BODY( node ); 166 VISIT_BODY( node ); 167 167 } 168 168 169 169 template< typename pass_type > 170 170 void PassVisitor< pass_type >::visit( StructDecl * node ) { 171 VISIT_BODY( node ); 171 VISIT_BODY( node ); 172 172 } 173 173 174 174 template< typename pass_type > 175 175 void PassVisitor< pass_type >::visit( UnionDecl * node ) { 176 VISIT_BODY( node ); 176 VISIT_BODY( node ); 177 177 } 178 178 179 179 template< typename pass_type > 180 180 void PassVisitor< pass_type >::visit( EnumDecl * node ) { 181 VISIT_BODY( node ); 181 VISIT_BODY( node ); 182 182 } 183 183 184 184 template< typename pass_type > 185 185 void PassVisitor< pass_type >::visit( TraitDecl * node ) { 186 VISIT_BODY( node ); 186 VISIT_BODY( node ); 187 187 } 188 188 189 189 template< typename pass_type > 190 190 void PassVisitor< pass_type >::visit( TypeDecl * node ) { 191 VISIT_BODY( node ); 191 VISIT_BODY( node ); 192 192 } 193 193 194 194 template< typename pass_type > 195 195 void PassVisitor< pass_type >::visit( TypedefDecl * node ) { 196 VISIT_BODY( node ); 196 VISIT_BODY( node ); 197 197 } 198 198 199 199 template< typename pass_type > 200 200 void PassVisitor< pass_type >::visit( AsmDecl * node ) { 201 VISIT_BODY( node ); 201 VISIT_BODY( node ); 202 202 } 203 203 … … 250 250 template< typename pass_type > 251 251 void PassVisitor< pass_type >::visit( AsmStmt * node ) { 252 VISIT_BODY( node ); 252 VISIT_BODY( node ); 253 253 } 254 254 … … 257 257 template< typename pass_type > 258 258 void PassVisitor< pass_type >::visit( IfStmt * node ) { 259 VISIT_START( node ); 259 VISIT_START( node ); 260 260 261 261 visitExpression( node->get_condition() ); … … 268 268 template< typename pass_type > 269 269 Statement * PassVisitor< pass_type >::mutate( IfStmt * node ) { 270 MUTATE_START( node ); 270 MUTATE_START( node ); 271 271 272 272 node->set_condition( mutateExpression( node->get_condition() ) ); … … 281 281 template< typename pass_type > 282 282 void PassVisitor< pass_type >::visit( WhileStmt * node ) { 283 VISIT_START( node ); 283 VISIT_START( node ); 284 284 285 285 visitExpression( node->get_condition() ); … … 291 291 template< typename pass_type > 292 292 Statement * PassVisitor< pass_type >::mutate( WhileStmt * node ) { 293 MUTATE_START( node ); 293 MUTATE_START( node ); 294 294 295 295 node->set_condition( mutateExpression( node->get_condition() ) ); … … 303 303 template< typename pass_type > 304 304 void PassVisitor< pass_type >::visit( ForStmt * node ) { 305 VISIT_START( node ); 305 VISIT_START( node ); 306 306 307 307 acceptAll( node->get_initialization(), *this ); … … 315 315 template< typename pass_type > 316 316 Statement * PassVisitor< pass_type >::mutate( ForStmt * node ) { 317 MUTATE_START( node ); 317 MUTATE_START( node ); 318 318 319 319 mutateAll( node->get_initialization(), *this ); … … 329 329 template< typename pass_type > 330 330 void PassVisitor< pass_type >::visit( SwitchStmt * node ) { 331 VISIT_START( node ); 331 VISIT_START( node ); 332 332 333 333 visitExpression( node->get_condition() ); … … 339 339 template< typename pass_type > 340 340 Statement * PassVisitor< pass_type >::mutate( SwitchStmt * node ) { 341 MUTATE_START( node ); 342 341 MUTATE_START( node ); 342 343 343 node->set_condition( mutateExpression( node->get_condition() ) ); 344 344 mutateStatementList( node->get_statements() ); 345 345 346 346 MUTATE_END( Statement, node ); 347 347 } … … 351 351 template< typename pass_type > 352 352 void PassVisitor< pass_type >::visit( CaseStmt * node ) { 353 VISIT_START( node ); 354 353 VISIT_START( node ); 354 355 355 visitExpression( node->get_condition() ); 356 356 visitStatementList( node->get_statements() ); 357 357 358 358 VISIT_END( node ); 359 359 } … … 361 361 template< typename pass_type > 362 362 Statement * PassVisitor< pass_type >::mutate( CaseStmt * node ) { 363 MUTATE_START( node ); 364 363 MUTATE_START( node ); 364 365 365 node->set_condition( mutateExpression( node->get_condition() ) ); 366 366 mutateStatementList( node->get_statements() ); 367 367 368 368 MUTATE_END( Statement, node ); 369 369 } … … 371 371 template< typename pass_type > 372 372 void PassVisitor< pass_type >::visit( BranchStmt * node ) { 373 VISIT_BODY( node ); 373 VISIT_BODY( node ); 374 374 } 375 375 … … 425 425 node->set_block( maybeMutate( node->get_block(), *this ) ); 426 426 mutateAll( node->get_catchers(), *this ); 427 427 428 428 MUTATE_END( Statement, node ); 429 429 } … … 444 444 Statement * PassVisitor< pass_type >::mutate( CatchStmt * node ) { 445 445 MUTATE_START( node ); 446 446 447 447 node->set_body( mutateStatement( node->get_body() ) ); 448 448 node->set_decl( maybeMutate( node->get_decl(), *this ) ); 449 449 450 450 MUTATE_END( Statement, node ); 451 451 } … … 453 453 template< typename pass_type > 454 454 void PassVisitor< pass_type >::visit( FinallyStmt * node ) { 455 VISIT_BODY( node ); 455 VISIT_BODY( node ); 456 456 } 457 457 458 458 template< typename pass_type > 459 459 void PassVisitor< pass_type >::visit( NullStmt * node ) { 460 VISIT_BODY( node ); 460 VISIT_BODY( node ); 461 461 } 462 462 463 463 template< typename pass_type > 464 464 void PassVisitor< pass_type >::visit( DeclStmt * node ) { 465 VISIT_BODY( node ); 465 VISIT_BODY( node ); 466 466 } 467 467 468 468 template< typename pass_type > 469 469 void PassVisitor< pass_type >::visit( ImplicitCtorDtorStmt * node ) { 470 VISIT_BODY( node ); 470 VISIT_BODY( node ); 471 471 } 472 472 473 473 template< typename pass_type > 474 474 void PassVisitor< pass_type >::visit( ApplicationExpr * node ) { 475 VISIT_BODY( node ); 475 VISIT_BODY( node ); 476 476 } 477 477 … … 502 502 template< typename pass_type > 503 503 void PassVisitor< pass_type >::visit( NameExpr * node ) { 504 VISIT_BODY( node ); 504 VISIT_BODY( node ); 505 505 } 506 506 507 507 template< typename pass_type > 508 508 void PassVisitor< pass_type >::visit( CastExpr * node ) { 509 VISIT_BODY( node ); 509 VISIT_BODY( node ); 510 510 } 511 511 512 512 template< typename pass_type > 513 513 void PassVisitor< pass_type >::visit( AddressExpr * node ) { 514 VISIT_BODY( node ); 514 VISIT_BODY( node ); 515 515 } 516 516 517 517 template< typename pass_type > 518 518 void PassVisitor< pass_type >::visit( LabelAddressExpr * node ) { 519 VISIT_BODY( node ); 519 VISIT_BODY( node ); 520 520 } 521 521 522 522 template< typename pass_type > 523 523 void PassVisitor< pass_type >::visit( UntypedMemberExpr * node ) { 524 VISIT_BODY( node ); 524 VISIT_BODY( node ); 525 525 } 526 526 527 527 template< typename pass_type > 528 528 void PassVisitor< pass_type >::visit( MemberExpr * node ) { 529 VISIT_BODY( node ); 529 VISIT_BODY( node ); 530 530 } 531 531 532 532 template< typename pass_type > 533 533 void PassVisitor< pass_type >::visit( VariableExpr * node ) { 534 VISIT_BODY( node ); 534 VISIT_BODY( node ); 535 535 } 536 536 537 537 template< typename pass_type > 538 538 void PassVisitor< pass_type >::visit( ConstantExpr * node ) { 539 VISIT_BODY( node ); 539 VISIT_BODY( node ); 540 540 } 541 541 542 542 template< typename pass_type > 543 543 void PassVisitor< pass_type >::visit( SizeofExpr * node ) { 544 VISIT_BODY( node ); 544 VISIT_BODY( node ); 545 545 } 546 546 547 547 template< typename pass_type > 548 548 void PassVisitor< pass_type >::visit( AlignofExpr * node ) { 549 VISIT_BODY( node ); 549 VISIT_BODY( node ); 550 550 } 551 551 552 552 template< typename pass_type > 553 553 void PassVisitor< pass_type >::visit( UntypedOffsetofExpr * node ) { 554 VISIT_BODY( node ); 554 VISIT_BODY( node ); 555 555 } 556 556 557 557 template< typename pass_type > 558 558 void PassVisitor< pass_type >::visit( OffsetofExpr * node ) { 559 VISIT_BODY( node ); 559 VISIT_BODY( node ); 560 560 } 561 561 562 562 template< typename pass_type > 563 563 void PassVisitor< pass_type >::visit( OffsetPackExpr * node ) { 564 VISIT_BODY( node ); 564 VISIT_BODY( node ); 565 565 } 566 566 567 567 template< typename pass_type > 568 568 void PassVisitor< pass_type >::visit( AttrExpr * node ) { 569 VISIT_BODY( node ); 569 VISIT_BODY( node ); 570 570 } 571 571 572 572 template< typename pass_type > 573 573 void PassVisitor< pass_type >::visit( LogicalExpr * node ) { 574 VISIT_BODY( node ); 574 VISIT_BODY( node ); 575 575 } 576 576 577 577 template< typename pass_type > 578 578 void PassVisitor< pass_type >::visit( ConditionalExpr * node ) { 579 VISIT_BODY( node ); 579 VISIT_BODY( node ); 580 580 } 581 581 582 582 template< typename pass_type > 583 583 void PassVisitor< pass_type >::visit( CommaExpr * node ) { 584 VISIT_BODY( node ); 584 VISIT_BODY( node ); 585 585 } 586 586 587 587 template< typename pass_type > 588 588 void PassVisitor< pass_type >::visit( TypeExpr * node ) { 589 VISIT_BODY( node ); 589 VISIT_BODY( node ); 590 590 } 591 591 592 592 template< typename pass_type > 593 593 void PassVisitor< pass_type >::visit( AsmExpr * node ) { 594 VISIT_BODY( node ); 594 VISIT_BODY( node ); 595 595 } 596 596 597 597 template< typename pass_type > 598 598 void PassVisitor< pass_type >::visit( ImplicitCopyCtorExpr * node ) { 599 VISIT_BODY( node ); 599 VISIT_BODY( node ); 600 600 } 601 601 602 602 template< typename pass_type > 603 603 void PassVisitor< pass_type >::visit( ConstructorExpr * node ) { 604 VISIT_BODY( node ); 604 VISIT_BODY( node ); 605 605 } 606 606 607 607 template< typename pass_type > 608 608 void PassVisitor< pass_type >::visit( CompoundLiteralExpr * node ) { 609 VISIT_BODY( node ); 609 VISIT_BODY( node ); 610 } 611 612 template< typename pass_type > 613 void PassVisitor< pass_type >::visit( UntypedValofExpr * node ) { 614 VISIT_BODY( node ); 610 615 } 611 616 612 617 template< typename pass_type > 613 618 void PassVisitor< pass_type >::visit( RangeExpr * node ) { 614 VISIT_BODY( node ); 619 VISIT_BODY( node ); 615 620 } 616 621 617 622 template< typename pass_type > 618 623 void PassVisitor< pass_type >::visit( UntypedTupleExpr * node ) { 619 VISIT_BODY( node ); 624 VISIT_BODY( node ); 620 625 } 621 626 622 627 template< typename pass_type > 623 628 void PassVisitor< pass_type >::visit( TupleExpr * node ) { 624 VISIT_BODY( node ); 629 VISIT_BODY( node ); 625 630 } 626 631 627 632 template< typename pass_type > 628 633 void PassVisitor< pass_type >::visit( TupleIndexExpr * node ) { 629 VISIT_BODY( node ); 634 VISIT_BODY( node ); 630 635 } 631 636 632 637 template< typename pass_type > 633 638 void PassVisitor< pass_type >::visit( TupleAssignExpr * node ) { 634 VISIT_BODY( node ); 639 VISIT_BODY( node ); 635 640 } 636 641 … … 654 659 Expression * PassVisitor< pass_type >::mutate( StmtExpr * node ) { 655 660 MUTATE_START( node ); 656 661 657 662 // don't want statements from outer CompoundStmts to be added to this StmtExpr 658 663 ValueGuardPtr< TypeSubstitution * > oldEnv ( get_env_ptr() ); … … 667 672 template< typename pass_type > 668 673 void PassVisitor< pass_type >::visit( UniqueExpr * node ) { 669 VISIT_BODY( node ); 674 VISIT_BODY( node ); 670 675 } 671 676 672 677 template< typename pass_type > 673 678 void PassVisitor< pass_type >::visit( VoidType * node ) { 674 VISIT_BODY( node ); 679 VISIT_BODY( node ); 675 680 } 676 681 677 682 template< typename pass_type > 678 683 void PassVisitor< pass_type >::visit( BasicType * node ) { 679 VISIT_BODY( node ); 684 VISIT_BODY( node ); 680 685 } 681 686 682 687 template< typename pass_type > 683 688 void PassVisitor< pass_type >::visit( PointerType * node ) { 684 VISIT_BODY( node ); 689 VISIT_BODY( node ); 685 690 } 686 691 687 692 template< typename pass_type > 688 693 void PassVisitor< pass_type >::visit( ArrayType * node ) { 689 VISIT_BODY( node ); 694 VISIT_BODY( node ); 690 695 } 691 696 692 697 template< typename pass_type > 693 698 void PassVisitor< pass_type >::visit( FunctionType * node ) { 694 VISIT_BODY( node ); 699 VISIT_BODY( node ); 695 700 } 696 701 697 702 template< typename pass_type > 698 703 void PassVisitor< pass_type >::visit( StructInstType * node ) { 699 VISIT_BODY( node ); 704 VISIT_BODY( node ); 700 705 } 701 706 702 707 template< typename pass_type > 703 708 void PassVisitor< pass_type >::visit( UnionInstType * node ) { 704 VISIT_BODY( node ); 709 VISIT_BODY( node ); 705 710 } 706 711 707 712 template< typename pass_type > 708 713 void PassVisitor< pass_type >::visit( EnumInstType * node ) { 709 VISIT_BODY( node ); 714 VISIT_BODY( node ); 710 715 } 711 716 712 717 template< typename pass_type > 713 718 void PassVisitor< pass_type >::visit( TraitInstType * node ) { 714 VISIT_BODY( node ); 719 VISIT_BODY( node ); 715 720 } 716 721 717 722 template< typename pass_type > 718 723 void PassVisitor< pass_type >::visit( TypeInstType * node ) { 719 VISIT_BODY( node ); 724 VISIT_BODY( node ); 720 725 } 721 726 722 727 template< typename pass_type > 723 728 void PassVisitor< pass_type >::visit( TupleType * node ) { 724 VISIT_BODY( node ); 729 VISIT_BODY( node ); 725 730 } 726 731 727 732 template< typename pass_type > 728 733 void PassVisitor< pass_type >::visit( TypeofType * node ) { 729 VISIT_BODY( node ); 734 VISIT_BODY( node ); 730 735 } 731 736 732 737 template< typename pass_type > 733 738 void PassVisitor< pass_type >::visit( AttrType * node ) { 734 VISIT_BODY( node ); 739 VISIT_BODY( node ); 735 740 } 736 741 737 742 template< typename pass_type > 738 743 void PassVisitor< pass_type >::visit( VarArgsType * node ) { 739 VISIT_BODY( node ); 744 VISIT_BODY( node ); 740 745 } 741 746 742 747 template< typename pass_type > 743 748 void PassVisitor< pass_type >::visit( ZeroType * node ) { 744 VISIT_BODY( node ); 749 VISIT_BODY( node ); 745 750 } 746 751 747 752 template< typename pass_type > 748 753 void PassVisitor< pass_type >::visit( OneType * node ) { 749 VISIT_BODY( node ); 754 VISIT_BODY( node ); 750 755 } 751 756 … … 772 777 template< typename pass_type > 773 778 void PassVisitor< pass_type >::visit( ListInit * node ) { 774 VISIT_BODY( node ); 779 VISIT_BODY( node ); 775 780 } 776 781 777 782 template< typename pass_type > 778 783 void PassVisitor< pass_type >::visit( ConstructorInit * node ) { 779 VISIT_BODY( node ); 784 VISIT_BODY( node ); 780 785 } 781 786 782 787 template< typename pass_type > 783 788 void PassVisitor< pass_type >::visit( Subrange * node ) { 784 VISIT_BODY( node ); 789 VISIT_BODY( node ); 785 790 } 786 791 787 792 template< typename pass_type > 788 793 void PassVisitor< pass_type >::visit( Constant * node ) { 789 VISIT_BODY( node ); 794 VISIT_BODY( node ); 790 795 } 791 796 … … 983 988 984 989 template< typename pass_type > 990 Expression * PassVisitor< pass_type >::mutate( UntypedValofExpr * node ) { 991 MUTATE_BODY( Expression, node ); 992 } 993 994 template< typename pass_type > 985 995 Expression * PassVisitor< pass_type >::mutate( RangeExpr * node ) { 986 996 MUTATE_BODY( Expression, node ); -
src/InitTweak/FixInit.cc
re9a3b20b rd56e5bc 56 56 typedef std::unordered_map< int, int > UnqCount; 57 57 58 class InsertImplicitCalls : public WithTypeSubstitution{58 class InsertImplicitCalls { 59 59 public: 60 60 /// wrap function application expressions as ImplicitCopyCtorExpr nodes so that it is easy to identify which … … 69 69 // collects environments for relevant nodes 70 70 EnvMap & envMap; 71 TypeSubstitution * env; //Magically populated by the PassVisitor 71 72 }; 72 73 … … 191 192 }; 192 193 193 class FixInit : public WithStmtsToAdd{194 class FixInit { 194 195 public: 195 196 /// expand each object declaration to use its constructor after it is declared. … … 199 200 200 201 std::list< Declaration * > staticDtorDecls; 202 std::list< Statement * > stmtsToAddAfter; // found by PassVisitor 201 203 }; 202 204 -
src/Parser/ExpressionNode.cc
re9a3b20b rd56e5bc 348 348 349 349 Expression *build_valexpr( StatementNode *s ) { 350 return new StmtExpr( dynamic_cast< CompoundStmt * >(maybeMoveBuild< Statement >(s) ));350 return new UntypedValofExpr( maybeMoveBuild< Statement >(s), nullptr ); 351 351 } 352 352 Expression *build_typevalue( DeclarationNode *decl ) { -
src/Parser/ParseNode.h
re9a3b20b rd56e5bc 415 415 result->location = cur->location; 416 416 * out++ = result; 417 } else {418 assertf(false, "buildList unknown type");419 417 } // if 420 418 } catch( SemanticError &e ) { -
src/Parser/StatementNode.cc
re9a3b20b rd56e5bc 175 175 176 176 Statement *build_try( StatementNode *try_stmt, StatementNode *catch_stmt, StatementNode *finally_stmt ) { 177 std::list< CatchStmt * > branches;178 buildMoveList< CatchStmt, StatementNode >( catch_stmt, branches );177 std::list< Statement * > branches; 178 buildMoveList< Statement, StatementNode >( catch_stmt, branches ); 179 179 CompoundStmt *tryBlock = safe_dynamic_cast< CompoundStmt * >(maybeMoveBuild< Statement >(try_stmt)); 180 180 FinallyStmt *finallyBlock = dynamic_cast< FinallyStmt * >(maybeMoveBuild< Statement >(finally_stmt) ); -
src/SymTab/Indexer.cc
re9a3b20b rd56e5bc 493 493 acceptNewScope( compLitExpr->get_result(), *this ); 494 494 maybeAccept( compLitExpr->get_initializer(), *this ); 495 } 496 497 void Indexer::visit( UntypedValofExpr *valofExpr ) { 498 acceptNewScope( valofExpr->get_result(), *this ); 499 maybeAccept( valofExpr->get_body(), *this ); 495 500 } 496 501 -
src/SymTab/Indexer.h
re9a3b20b rd56e5bc 69 69 virtual void visit( ConstructorExpr * ctorExpr ); 70 70 virtual void visit( CompoundLiteralExpr *compLitExpr ); 71 virtual void visit( UntypedValofExpr *valofExpr ); 71 72 virtual void visit( RangeExpr *rangeExpr ); 72 73 virtual void visit( UntypedTupleExpr *tupleExpr ); -
src/SymTab/Validate.cc
re9a3b20b rd56e5bc 115 115 116 116 /// Replaces enum types by int, and function or array types in function parameter and return lists by appropriate pointers. 117 class EnumAndPointerDecay {118 public:119 v oid previsit( EnumDecl *aggregateDecl );120 v oid previsit( FunctionType *func );117 class EnumAndPointerDecayPass final : public Visitor { 118 typedef Visitor Parent; 119 virtual void visit( EnumDecl *aggregateDecl ); 120 virtual void visit( FunctionType *func ); 121 121 }; 122 122 … … 126 126 public: 127 127 LinkReferenceToTypes( bool doDebug, const Indexer *indexer ); 128 private: 128 129 using Parent::visit; 129 130 void visit( EnumInstType *enumInst ) final; … … 135 136 void visit( UnionDecl *unionDecl ) final; 136 137 void visit( TypeInstType *typeInst ) final; 137 private: 138 138 139 const Indexer *indexer; 139 140 … … 146 147 }; 147 148 148 /// Replaces array and function types in forall lists by appropriate pointer type and assigns each Object and Function declaration a unique ID.149 class ForallPointerDecayfinal : public Indexer {149 /// Replaces array and function types in forall lists by appropriate pointer type 150 class Pass3 final : public Indexer { 150 151 typedef Indexer Parent; 151 152 public: 152 153 using Parent::visit; 153 ForallPointerDecay( const Indexer *indexer );154 154 Pass3( const Indexer *indexer ); 155 private: 155 156 virtual void visit( ObjectDecl *object ) override; 156 157 virtual void visit( FunctionDecl *func ) override; … … 159 160 }; 160 161 161 class ReturnChecker : public WithScopes{162 class ReturnChecker { 162 163 public: 163 164 /// Checks that return statements return nothing if their return type is void … … 166 167 private: 167 168 void previsit( FunctionDecl * functionDecl ); 169 void postvisit( FunctionDecl * functionDecl ); 168 170 void previsit( ReturnStmt * returnStmt ); 169 171 170 172 typedef std::list< DeclarationWithType * > ReturnVals; 171 173 ReturnVals returnVals; 174 std::stack< ReturnVals > returnValsStack; 172 175 }; 173 176 … … 245 248 246 249 void validate( std::list< Declaration * > &translationUnit, bool doDebug ) { 247 PassVisitor<EnumAndPointerDecay>epc;250 EnumAndPointerDecayPass epc; 248 251 LinkReferenceToTypes lrt( doDebug, 0 ); 249 ForallPointerDecay fpd( 0 );252 Pass3 pass3( 0 ); 250 253 CompoundLiteral compoundliteral; 251 254 PassVisitor<ValidateGenericParameters> genericParams; … … 259 262 VerifyCtorDtorAssign::verify( translationUnit ); // must happen before autogen, because autogen examines existing ctor/dtors 260 263 Concurrency::applyKeywords( translationUnit ); 261 autogenerateRoutines( translationUnit ); // moved up, used to be below compoundLiteral - currently needs EnumAndPointerDecay 264 autogenerateRoutines( translationUnit ); // moved up, used to be below compoundLiteral - currently needs EnumAndPointerDecayPass 262 265 Concurrency::implementMutexFuncs( translationUnit ); 263 266 Concurrency::implementThreadStarter( translationUnit ); 264 267 ReturnChecker::checkFunctionReturns( translationUnit ); 265 268 compoundliteral.mutateDeclarationList( translationUnit ); 266 acceptAll( translationUnit, fpd);269 acceptAll( translationUnit, pass3 ); 267 270 ArrayLength::computeLength( translationUnit ); 268 271 } 269 272 270 273 void validateType( Type *type, const Indexer *indexer ) { 271 PassVisitor<EnumAndPointerDecay>epc;274 EnumAndPointerDecayPass epc; 272 275 LinkReferenceToTypes lrt( false, indexer ); 273 ForallPointerDecay fpd( indexer );276 Pass3 pass3( indexer ); 274 277 type->accept( epc ); 275 278 type->accept( lrt ); 276 type->accept( fpd);279 type->accept( pass3 ); 277 280 } 278 281 … … 353 356 } 354 357 355 void EnumAndPointerDecay ::previsit( EnumDecl *enumDecl ) {358 void EnumAndPointerDecayPass::visit( EnumDecl *enumDecl ) { 356 359 // Set the type of each member of the enumeration to be EnumConstant 357 360 for ( std::list< Declaration * >::iterator i = enumDecl->get_members().begin(); i != enumDecl->get_members().end(); ++i ) { … … 360 363 obj->set_type( new EnumInstType( Type::Qualifiers( Type::Const ), enumDecl->get_name() ) ); 361 364 } // for 365 Parent::visit( enumDecl ); 362 366 } 363 367 … … 366 370 void fixFunctionList( DWTList & dwts, FunctionType * func ) { 367 371 // the only case in which "void" is valid is where it is the only one in the list; then it should be removed 368 // entirely .other fix ups are handled by the FixFunction class372 // entirely other fix ups are handled by the FixFunction class 369 373 typedef typename DWTList::iterator DWTIterator; 370 374 DWTIterator begin( dwts.begin() ), end( dwts.end() ); … … 385 389 for ( ; i != end; ++i ) { 386 390 FixFunction fixer; 387 *i = (*i )->acceptMutator( fixer );391 *i = (*i )->acceptMutator( fixer ); 388 392 if ( fixer.get_isVoid() ) { 389 393 throw SemanticError( "invalid type void in function type ", func ); … … 394 398 } 395 399 396 void EnumAndPointerDecay ::previsit( FunctionType *func ) {400 void EnumAndPointerDecayPass::visit( FunctionType *func ) { 397 401 // Fix up parameters and return types 398 402 fixFunctionList( func->get_parameters(), func ); 399 403 fixFunctionList( func->get_returnVals(), func ); 404 Visitor::visit( func ); 400 405 } 401 406 … … 544 549 } 545 550 546 ForallPointerDecay::ForallPointerDecay( const Indexer *other_indexer ) : Indexer( false ) {551 Pass3::Pass3( const Indexer *other_indexer ) : Indexer( false ) { 547 552 if ( other_indexer ) { 548 553 indexer = other_indexer; … … 582 587 } 583 588 584 void ForallPointerDecay::visit( ObjectDecl *object ) {589 void Pass3::visit( ObjectDecl *object ) { 585 590 forallFixer( object->get_type() ); 586 591 if ( PointerType *pointer = dynamic_cast< PointerType * >( object->get_type() ) ) { … … 591 596 } 592 597 593 void ForallPointerDecay::visit( FunctionDecl *func ) {598 void Pass3::visit( FunctionDecl *func ) { 594 599 forallFixer( func->get_type() ); 595 600 Parent::visit( func ); … … 603 608 604 609 void ReturnChecker::previsit( FunctionDecl * functionDecl ) { 605 GuardValue( returnVals );610 returnValsStack.push( returnVals ); 606 611 returnVals = functionDecl->get_functionType()->get_returnVals(); 612 } 613 void ReturnChecker::postvisit( __attribute__((unused)) FunctionDecl * functionDecl ) { 614 returnVals = returnValsStack.top(); 615 returnValsStack.pop(); 607 616 } 608 617 -
src/SynTree/BaseSyntaxNode.h
re9a3b20b rd56e5bc 24 24 CodeLocation location; 25 25 26 virtual ~BaseSyntaxNode() {} 27 28 virtual void accept( Visitor & v ) = 0; 26 virtual void accept( Visitor & v ) = 0; // temporary -- needs to be here so that BaseSyntaxNode is polymorphic and can be dynamic_cast 29 27 }; 30 28 -
src/SynTree/Expression.cc
re9a3b20b rd56e5bc 288 288 } 289 289 290 // CastExpr *CastExpr::clone() const { return 0; } 291 290 292 void CastExpr::print( std::ostream &os, int indent ) const { 291 293 os << "Cast of:" << std::endl << std::string( indent+2, ' ' ); … … 353 355 } 354 356 357 //// is this right? It's cloning the member, but the member is a declaration so probably shouldn't be cloned... 355 358 MemberExpr::MemberExpr( const MemberExpr &other ) : 356 359 Expression( other ), member( other.member ), aggregate( maybeClone( other.aggregate ) ) { … … 358 361 359 362 MemberExpr::~MemberExpr() { 360 // d on't delete the member declaration, since it points somewhere else in the tree363 // delete member; 361 364 delete aggregate; 362 365 } … … 588 591 } 589 592 593 UntypedValofExpr::UntypedValofExpr( const UntypedValofExpr & other ) : Expression( other ), body ( maybeClone( other.body ) ) {} 594 595 UntypedValofExpr::~UntypedValofExpr() { delete body; } 596 597 void UntypedValofExpr::print( std::ostream &os, int indent ) const { 598 os << std::string( indent, ' ' ) << "Valof Expression: " << std::endl; 599 if ( get_body() != 0 ) 600 get_body()->print( os, indent + 2 ); 601 } 602 590 603 RangeExpr::RangeExpr( Expression *low, Expression *high ) : low( low ), high( high ) {} 591 604 RangeExpr::RangeExpr( const RangeExpr &other ) : Expression( other ), low( other.low->clone() ), high( other.high->clone() ) {} -
src/SynTree/Expression.h
re9a3b20b rd56e5bc 226 226 }; 227 227 228 /// MemberExpr represents a member selection operation, e.g. q.p after processing by the expression analyzer. 229 /// Does not take ownership of member. 228 /// MemberExpr represents a member selection operation, e.g. q.p after processing by the expression analyzer 230 229 class MemberExpr : public Expression { 231 230 public: … … 248 247 }; 249 248 250 /// VariableExpr represents an expression that simply refers to the value of a named variable. 251 /// Does not take ownership of var. 249 /// VariableExpr represents an expression that simply refers to the value of a named variable 252 250 class VariableExpr : public Expression { 253 251 public: … … 600 598 }; 601 599 600 /// ValofExpr represents a GCC 'lambda expression' 601 class UntypedValofExpr : public Expression { 602 public: 603 UntypedValofExpr( Statement *_body, Expression *_aname = nullptr ) : Expression( _aname ), body ( _body ) {} 604 UntypedValofExpr( const UntypedValofExpr & other ); 605 virtual ~UntypedValofExpr(); 606 607 Expression * get_value(); 608 Statement * get_body() const { return body; } 609 610 virtual UntypedValofExpr * clone() const { return new UntypedValofExpr( * this ); } 611 virtual void accept( Visitor & v ) { v.visit( this ); } 612 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 613 virtual void print( std::ostream & os, int indent = 0 ) const; 614 private: 615 Statement * body; 616 }; 617 602 618 /// RangeExpr represents a range e.g. '3 ... 5' or '1~10' 603 619 class RangeExpr : public Expression { -
src/SynTree/Mutator.cc
re9a3b20b rd56e5bc 380 380 } 381 381 382 Expression *Mutator::mutate( UntypedValofExpr *valofExpr ) { 383 valofExpr->set_env( maybeMutate( valofExpr->get_env(), *this ) ); 384 valofExpr->set_result( maybeMutate( valofExpr->get_result(), *this ) ); 385 return valofExpr; 386 } 387 382 388 Expression *Mutator::mutate( RangeExpr *rangeExpr ) { 383 389 rangeExpr->set_env( maybeMutate( rangeExpr->get_env(), *this ) ); -
src/SynTree/Mutator.h
re9a3b20b rd56e5bc 78 78 virtual Expression* mutate( ConstructorExpr *ctorExpr ); 79 79 virtual Expression* mutate( CompoundLiteralExpr *compLitExpr ); 80 virtual Expression* mutate( UntypedValofExpr *valofExpr ); 80 81 virtual Expression* mutate( RangeExpr *rangeExpr ); 81 82 virtual Expression* mutate( UntypedTupleExpr *tupleExpr ); -
src/SynTree/ObjectDecl.cc
re9a3b20b rd56e5bc 56 56 57 57 if ( init ) { 58 os << " with initializer " << std::endl;59 init->print( os, indent +2);60 os << std::endl << std::string(indent +2, ' ');58 os << " with initializer "; 59 init->print( os, indent ); 60 os << std::endl << std::string(indent, ' '); 61 61 os << "maybeConstructed? " << init->get_maybeConstructed(); 62 62 } // if -
src/SynTree/Statement.cc
re9a3b20b rd56e5bc 313 313 } 314 314 315 TryStmt::TryStmt( std::list<Label> labels, CompoundStmt *tryBlock, std::list< CatchStmt *> &_handlers, FinallyStmt *_finallyBlock ) :315 TryStmt::TryStmt( std::list<Label> labels, CompoundStmt *tryBlock, std::list<Statement *> &_handlers, FinallyStmt *_finallyBlock ) : 316 316 Statement( labels ), block( tryBlock ), handlers( _handlers ), finallyBlock( _finallyBlock ) { 317 317 } … … 334 334 // handlers 335 335 os << string( indent + 2, ' ' ) << "and handlers: " << endl; 336 for ( std::list< CatchStmt *>::const_iterator i = handlers.begin(); i != handlers.end(); i++)336 for ( std::list<Statement *>::const_iterator i = handlers.begin(); i != handlers.end(); i++) 337 337 (*i )->print( os, indent + 4 ); 338 338 -
src/SynTree/Statement.h
re9a3b20b rd56e5bc 315 315 class TryStmt : public Statement { 316 316 public: 317 TryStmt( std::list<Label> labels, CompoundStmt *tryBlock, std::list< CatchStmt *> &handlers, FinallyStmt *finallyBlock = 0 );317 TryStmt( std::list<Label> labels, CompoundStmt *tryBlock, std::list<Statement *> &handlers, FinallyStmt *finallyBlock = 0 ); 318 318 TryStmt( const TryStmt &other ); 319 319 virtual ~TryStmt(); … … 321 321 CompoundStmt *get_block() const { return block; } 322 322 void set_block( CompoundStmt *newValue ) { block = newValue; } 323 std::list< CatchStmt *>& get_catchers() { return handlers; }323 std::list<Statement *>& get_catchers() { return handlers; } 324 324 325 325 FinallyStmt *get_finally() const { return finallyBlock; } … … 333 333 private: 334 334 CompoundStmt *block; 335 std::list< CatchStmt *> handlers;335 std::list<Statement *> handlers; 336 336 FinallyStmt *finallyBlock; 337 337 }; -
src/SynTree/Visitor.cc
re9a3b20b rd56e5bc 301 301 } 302 302 303 void Visitor::visit( UntypedValofExpr *valofExpr ) { 304 maybeAccept( valofExpr->get_result(), *this ); 305 maybeAccept( valofExpr->get_body(), *this ); 306 } 307 303 308 void Visitor::visit( RangeExpr *rangeExpr ) { 304 309 maybeAccept( rangeExpr->get_low(), *this ); -
src/SynTree/Visitor.h
re9a3b20b rd56e5bc 81 81 virtual void visit( ConstructorExpr * ctorExpr ); 82 82 virtual void visit( CompoundLiteralExpr *compLitExpr ); 83 virtual void visit( UntypedValofExpr *valofExpr ); 83 84 virtual void visit( RangeExpr *rangeExpr ); 84 85 virtual void visit( UntypedTupleExpr *tupleExpr ); … … 162 163 } // if 163 164 } catch( SemanticError &e ) { 164 e.set_location( (*i)->location ); 165 e.set_location( (*i)->location ); 165 166 errors.append( e ); 166 167 } // try
Note:
See TracChangeset
for help on using the changeset viewer.