Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(259)

Side by Side Diff: src/ast.h

Issue 3431026: Add an AST node type enum to AST nodes. (Closed)
Patch Set: Created 10 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 AST_NODE_LIST(DEF_FORWARD_DECLARATION) 111 AST_NODE_LIST(DEF_FORWARD_DECLARATION)
112 #undef DEF_FORWARD_DECLARATION 112 #undef DEF_FORWARD_DECLARATION
113 113
114 114
115 // Typedef only introduced to avoid unreadable code. 115 // Typedef only introduced to avoid unreadable code.
116 // Please do appreciate the required space in "> >". 116 // Please do appreciate the required space in "> >".
117 typedef ZoneList<Handle<String> > ZoneStringList; 117 typedef ZoneList<Handle<String> > ZoneStringList;
118 typedef ZoneList<Handle<Object> > ZoneObjectList; 118 typedef ZoneList<Handle<Object> > ZoneObjectList;
119 119
120 120
121 #define DECLARE_NODE_TYPE(type) \
122 virtual void Accept(AstVisitor* v); \
123 virtual AstNode::Type node_type() const { return AstNode::k##type; } \
124 virtual type* As##type() { return this; }
125
126
121 class AstNode: public ZoneObject { 127 class AstNode: public ZoneObject {
122 public: 128 public:
129 #define DECLARE_TYPE_ENUM(type) k##type,
130 enum Type {
131 AST_NODE_LIST(DECLARE_TYPE_ENUM)
132 kInvalid = -1
133 };
134 #undef DECLARE_TYPE_ENUM
135
123 virtual ~AstNode() { } 136 virtual ~AstNode() { }
137
124 virtual void Accept(AstVisitor* v) = 0; 138 virtual void Accept(AstVisitor* v) = 0;
139 virtual Type node_type() const { return kInvalid; }
125 140
126 // Type testing & conversion. 141 // Type testing & conversion functions overridden by concrete subclasses.
142 #define DECLARE_NODE_FUNCTIONS(type) \
143 virtual type* As##type() { return NULL; }
144 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS)
145 #undef DECLARE_NODE_FUNCTIONS
146
127 virtual Statement* AsStatement() { return NULL; } 147 virtual Statement* AsStatement() { return NULL; }
128 virtual Block* AsBlock() { return NULL; }
129 virtual ExpressionStatement* AsExpressionStatement() { return NULL; }
130 virtual EmptyStatement* AsEmptyStatement() { return NULL; }
131 virtual Expression* AsExpression() { return NULL; } 148 virtual Expression* AsExpression() { return NULL; }
132 virtual Literal* AsLiteral() { return NULL; }
133 virtual Slot* AsSlot() { return NULL; }
134 virtual VariableProxy* AsVariableProxy() { return NULL; }
135 virtual Property* AsProperty() { return NULL; }
136 virtual Call* AsCall() { return NULL; }
137 virtual TargetCollector* AsTargetCollector() { return NULL; } 149 virtual TargetCollector* AsTargetCollector() { return NULL; }
138 virtual BreakableStatement* AsBreakableStatement() { return NULL; } 150 virtual BreakableStatement* AsBreakableStatement() { return NULL; }
139 virtual IterationStatement* AsIterationStatement() { return NULL; } 151 virtual IterationStatement* AsIterationStatement() { return NULL; }
140 virtual ForStatement* AsForStatement() { return NULL; }
141 virtual UnaryOperation* AsUnaryOperation() { return NULL; }
142 virtual CountOperation* AsCountOperation() { return NULL; }
143 virtual BinaryOperation* AsBinaryOperation() { return NULL; }
144 virtual Assignment* AsAssignment() { return NULL; }
145 virtual FunctionLiteral* AsFunctionLiteral() { return NULL; }
146 virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; } 152 virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; }
147 virtual ObjectLiteral* AsObjectLiteral() { return NULL; }
148 virtual ArrayLiteral* AsArrayLiteral() { return NULL; }
149 virtual CompareOperation* AsCompareOperation() { return NULL; }
150 }; 153 };
151 154
152 155
153 class Statement: public AstNode { 156 class Statement: public AstNode {
154 public: 157 public:
155 Statement() : statement_pos_(RelocInfo::kNoPosition) {} 158 Statement() : statement_pos_(RelocInfo::kNoPosition) {}
156 159
157 virtual Statement* AsStatement() { return this; } 160 virtual Statement* AsStatement() { return this; }
158 virtual ReturnStatement* AsReturnStatement() { return NULL; }
159 161
160 virtual Assignment* StatementAsSimpleAssignment() { return NULL; } 162 virtual Assignment* StatementAsSimpleAssignment() { return NULL; }
161 virtual CountOperation* StatementAsCountOperation() { return NULL; } 163 virtual CountOperation* StatementAsCountOperation() { return NULL; }
162 164
163 bool IsEmpty() { return AsEmptyStatement() != NULL; } 165 bool IsEmpty() { return AsEmptyStatement() != NULL; }
164 166
165 void set_statement_pos(int statement_pos) { statement_pos_ = statement_pos; } 167 void set_statement_pos(int statement_pos) { statement_pos_ = statement_pos; }
166 int statement_pos() const { return statement_pos_; } 168 int statement_pos() const { return statement_pos_; }
167 169
168 private: 170 private:
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
306 ZoneStringList* labels_; 308 ZoneStringList* labels_;
307 Type type_; 309 Type type_;
308 BreakTarget break_target_; 310 BreakTarget break_target_;
309 }; 311 };
310 312
311 313
312 class Block: public BreakableStatement { 314 class Block: public BreakableStatement {
313 public: 315 public:
314 inline Block(ZoneStringList* labels, int capacity, bool is_initializer_block); 316 inline Block(ZoneStringList* labels, int capacity, bool is_initializer_block);
315 317
316 virtual void Accept(AstVisitor* v); 318 DECLARE_NODE_TYPE(Block)
317
318 virtual Block* AsBlock() { return this; }
319 319
320 virtual Assignment* StatementAsSimpleAssignment() { 320 virtual Assignment* StatementAsSimpleAssignment() {
321 if (statements_.length() != 1) return NULL; 321 if (statements_.length() != 1) return NULL;
322 return statements_[0]->StatementAsSimpleAssignment(); 322 return statements_[0]->StatementAsSimpleAssignment();
323 } 323 }
324 324
325 virtual CountOperation* StatementAsCountOperation() { 325 virtual CountOperation* StatementAsCountOperation() {
326 if (statements_.length() != 1) return NULL; 326 if (statements_.length() != 1) return NULL;
327 return statements_[0]->StatementAsCountOperation(); 327 return statements_[0]->StatementAsCountOperation();
328 } 328 }
(...skipping 13 matching lines...) Expand all
342 public: 342 public:
343 Declaration(VariableProxy* proxy, Variable::Mode mode, FunctionLiteral* fun) 343 Declaration(VariableProxy* proxy, Variable::Mode mode, FunctionLiteral* fun)
344 : proxy_(proxy), 344 : proxy_(proxy),
345 mode_(mode), 345 mode_(mode),
346 fun_(fun) { 346 fun_(fun) {
347 ASSERT(mode == Variable::VAR || mode == Variable::CONST); 347 ASSERT(mode == Variable::VAR || mode == Variable::CONST);
348 // At the moment there are no "const functions"'s in JavaScript... 348 // At the moment there are no "const functions"'s in JavaScript...
349 ASSERT(fun == NULL || mode == Variable::VAR); 349 ASSERT(fun == NULL || mode == Variable::VAR);
350 } 350 }
351 351
352 virtual void Accept(AstVisitor* v); 352 DECLARE_NODE_TYPE(Declaration)
353 353
354 VariableProxy* proxy() const { return proxy_; } 354 VariableProxy* proxy() const { return proxy_; }
355 Variable::Mode mode() const { return mode_; } 355 Variable::Mode mode() const { return mode_; }
356 FunctionLiteral* fun() const { return fun_; } // may be NULL 356 FunctionLiteral* fun() const { return fun_; } // may be NULL
357 357
358 private: 358 private:
359 VariableProxy* proxy_; 359 VariableProxy* proxy_;
360 Variable::Mode mode_; 360 Variable::Mode mode_;
361 FunctionLiteral* fun_; 361 FunctionLiteral* fun_;
362 }; 362 };
(...skipping 20 matching lines...) Expand all
383 private: 383 private:
384 Statement* body_; 384 Statement* body_;
385 BreakTarget continue_target_; 385 BreakTarget continue_target_;
386 }; 386 };
387 387
388 388
389 class DoWhileStatement: public IterationStatement { 389 class DoWhileStatement: public IterationStatement {
390 public: 390 public:
391 explicit inline DoWhileStatement(ZoneStringList* labels); 391 explicit inline DoWhileStatement(ZoneStringList* labels);
392 392
393 DECLARE_NODE_TYPE(DoWhileStatement)
394
393 void Initialize(Expression* cond, Statement* body) { 395 void Initialize(Expression* cond, Statement* body) {
394 IterationStatement::Initialize(body); 396 IterationStatement::Initialize(body);
395 cond_ = cond; 397 cond_ = cond;
396 } 398 }
397 399
398 virtual void Accept(AstVisitor* v);
399
400 Expression* cond() const { return cond_; } 400 Expression* cond() const { return cond_; }
401 401
402 // Position where condition expression starts. We need it to make 402 // Position where condition expression starts. We need it to make
403 // the loop's condition a breakable location. 403 // the loop's condition a breakable location.
404 int condition_position() { return condition_position_; } 404 int condition_position() { return condition_position_; }
405 void set_condition_position(int pos) { condition_position_ = pos; } 405 void set_condition_position(int pos) { condition_position_ = pos; }
406 406
407 private: 407 private:
408 Expression* cond_; 408 Expression* cond_;
409 int condition_position_; 409 int condition_position_;
410 }; 410 };
411 411
412 412
413 class WhileStatement: public IterationStatement { 413 class WhileStatement: public IterationStatement {
414 public: 414 public:
415 explicit WhileStatement(ZoneStringList* labels); 415 explicit WhileStatement(ZoneStringList* labels);
416 416
417 DECLARE_NODE_TYPE(WhileStatement)
418
417 void Initialize(Expression* cond, Statement* body) { 419 void Initialize(Expression* cond, Statement* body) {
418 IterationStatement::Initialize(body); 420 IterationStatement::Initialize(body);
419 cond_ = cond; 421 cond_ = cond;
420 } 422 }
421 423
422 virtual void Accept(AstVisitor* v);
423
424 Expression* cond() const { return cond_; } 424 Expression* cond() const { return cond_; }
425 bool may_have_function_literal() const { 425 bool may_have_function_literal() const {
426 return may_have_function_literal_; 426 return may_have_function_literal_;
427 } 427 }
428 void set_may_have_function_literal(bool value) { 428 void set_may_have_function_literal(bool value) {
429 may_have_function_literal_ = value; 429 may_have_function_literal_ = value;
430 } 430 }
431 431
432 private: 432 private:
433 Expression* cond_; 433 Expression* cond_;
434 // True if there is a function literal subexpression in the condition. 434 // True if there is a function literal subexpression in the condition.
435 bool may_have_function_literal_; 435 bool may_have_function_literal_;
436 }; 436 };
437 437
438 438
439 class ForStatement: public IterationStatement { 439 class ForStatement: public IterationStatement {
440 public: 440 public:
441 explicit inline ForStatement(ZoneStringList* labels); 441 explicit inline ForStatement(ZoneStringList* labels);
442 442
443 virtual ForStatement* AsForStatement() { return this; } 443 DECLARE_NODE_TYPE(ForStatement)
444 444
445 void Initialize(Statement* init, 445 void Initialize(Statement* init,
446 Expression* cond, 446 Expression* cond,
447 Statement* next, 447 Statement* next,
448 Statement* body) { 448 Statement* body) {
449 IterationStatement::Initialize(body); 449 IterationStatement::Initialize(body);
450 init_ = init; 450 init_ = init;
451 cond_ = cond; 451 cond_ = cond;
452 next_ = next; 452 next_ = next;
453 } 453 }
454 454
455 virtual void Accept(AstVisitor* v);
456
457 Statement* init() const { return init_; } 455 Statement* init() const { return init_; }
458 void set_init(Statement* stmt) { init_ = stmt; } 456 void set_init(Statement* stmt) { init_ = stmt; }
459 Expression* cond() const { return cond_; } 457 Expression* cond() const { return cond_; }
460 void set_cond(Expression* expr) { cond_ = expr; } 458 void set_cond(Expression* expr) { cond_ = expr; }
461 Statement* next() const { return next_; } 459 Statement* next() const { return next_; }
462 void set_next(Statement* stmt) { next_ = stmt; } 460 void set_next(Statement* stmt) { next_ = stmt; }
463 461
464 bool may_have_function_literal() const { 462 bool may_have_function_literal() const {
465 return may_have_function_literal_; 463 return may_have_function_literal_;
466 } 464 }
(...skipping 12 matching lines...) Expand all
479 // True if there is a function literal subexpression in the condition. 477 // True if there is a function literal subexpression in the condition.
480 bool may_have_function_literal_; 478 bool may_have_function_literal_;
481 Variable* loop_variable_; 479 Variable* loop_variable_;
482 }; 480 };
483 481
484 482
485 class ForInStatement: public IterationStatement { 483 class ForInStatement: public IterationStatement {
486 public: 484 public:
487 explicit inline ForInStatement(ZoneStringList* labels); 485 explicit inline ForInStatement(ZoneStringList* labels);
488 486
487 DECLARE_NODE_TYPE(ForInStatement)
488
489 void Initialize(Expression* each, Expression* enumerable, Statement* body) { 489 void Initialize(Expression* each, Expression* enumerable, Statement* body) {
490 IterationStatement::Initialize(body); 490 IterationStatement::Initialize(body);
491 each_ = each; 491 each_ = each;
492 enumerable_ = enumerable; 492 enumerable_ = enumerable;
493 } 493 }
494 494
495 virtual void Accept(AstVisitor* v);
496
497 Expression* each() const { return each_; } 495 Expression* each() const { return each_; }
498 Expression* enumerable() const { return enumerable_; } 496 Expression* enumerable() const { return enumerable_; }
499 497
500 private: 498 private:
501 Expression* each_; 499 Expression* each_;
502 Expression* enumerable_; 500 Expression* enumerable_;
503 }; 501 };
504 502
505 503
506 class ExpressionStatement: public Statement { 504 class ExpressionStatement: public Statement {
507 public: 505 public:
508 explicit ExpressionStatement(Expression* expression) 506 explicit ExpressionStatement(Expression* expression)
509 : expression_(expression) { } 507 : expression_(expression) { }
510 508
511 virtual void Accept(AstVisitor* v); 509 DECLARE_NODE_TYPE(ExpressionStatement)
512
513 // Type testing & conversion.
514 virtual ExpressionStatement* AsExpressionStatement() { return this; }
515 510
516 virtual Assignment* StatementAsSimpleAssignment(); 511 virtual Assignment* StatementAsSimpleAssignment();
517 virtual CountOperation* StatementAsCountOperation(); 512 virtual CountOperation* StatementAsCountOperation();
518 513
519 void set_expression(Expression* e) { expression_ = e; } 514 void set_expression(Expression* e) { expression_ = e; }
520 Expression* expression() { return expression_; } 515 Expression* expression() { return expression_; }
521 516
522 private: 517 private:
523 Expression* expression_; 518 Expression* expression_;
524 }; 519 };
525 520
526 521
527 class ContinueStatement: public Statement { 522 class ContinueStatement: public Statement {
528 public: 523 public:
529 explicit ContinueStatement(IterationStatement* target) 524 explicit ContinueStatement(IterationStatement* target)
530 : target_(target) { } 525 : target_(target) { }
531 526
532 virtual void Accept(AstVisitor* v); 527 DECLARE_NODE_TYPE(ContinueStatement)
533 528
534 IterationStatement* target() const { return target_; } 529 IterationStatement* target() const { return target_; }
535 530
536 private: 531 private:
537 IterationStatement* target_; 532 IterationStatement* target_;
538 }; 533 };
539 534
540 535
541 class BreakStatement: public Statement { 536 class BreakStatement: public Statement {
542 public: 537 public:
543 explicit BreakStatement(BreakableStatement* target) 538 explicit BreakStatement(BreakableStatement* target)
544 : target_(target) { } 539 : target_(target) { }
545 540
546 virtual void Accept(AstVisitor* v); 541 DECLARE_NODE_TYPE(BreakStatement)
547 542
548 BreakableStatement* target() const { return target_; } 543 BreakableStatement* target() const { return target_; }
549 544
550 private: 545 private:
551 BreakableStatement* target_; 546 BreakableStatement* target_;
552 }; 547 };
553 548
554 549
555 class ReturnStatement: public Statement { 550 class ReturnStatement: public Statement {
556 public: 551 public:
557 explicit ReturnStatement(Expression* expression) 552 explicit ReturnStatement(Expression* expression)
558 : expression_(expression) { } 553 : expression_(expression) { }
559 554
560 virtual void Accept(AstVisitor* v); 555 DECLARE_NODE_TYPE(ReturnStatement)
561
562 // Type testing & conversion.
563 virtual ReturnStatement* AsReturnStatement() { return this; }
564 556
565 Expression* expression() { return expression_; } 557 Expression* expression() { return expression_; }
566 558
567 private: 559 private:
568 Expression* expression_; 560 Expression* expression_;
569 }; 561 };
570 562
571 563
572 class WithEnterStatement: public Statement { 564 class WithEnterStatement: public Statement {
573 public: 565 public:
574 explicit WithEnterStatement(Expression* expression, bool is_catch_block) 566 explicit WithEnterStatement(Expression* expression, bool is_catch_block)
575 : expression_(expression), is_catch_block_(is_catch_block) { } 567 : expression_(expression), is_catch_block_(is_catch_block) { }
576 568
577 virtual void Accept(AstVisitor* v); 569 DECLARE_NODE_TYPE(WithEnterStatement)
578 570
579 Expression* expression() const { return expression_; } 571 Expression* expression() const { return expression_; }
580 572
581 bool is_catch_block() const { return is_catch_block_; } 573 bool is_catch_block() const { return is_catch_block_; }
582 574
583 private: 575 private:
584 Expression* expression_; 576 Expression* expression_;
585 bool is_catch_block_; 577 bool is_catch_block_;
586 }; 578 };
587 579
588 580
589 class WithExitStatement: public Statement { 581 class WithExitStatement: public Statement {
590 public: 582 public:
591 WithExitStatement() { } 583 WithExitStatement() { }
592 584
593 virtual void Accept(AstVisitor* v); 585 DECLARE_NODE_TYPE(WithExitStatement)
594 }; 586 };
595 587
596 588
597 class CaseClause: public ZoneObject { 589 class CaseClause: public ZoneObject {
598 public: 590 public:
599 CaseClause(Expression* label, ZoneList<Statement*>* statements); 591 CaseClause(Expression* label, ZoneList<Statement*>* statements);
600 592
601 bool is_default() const { return label_ == NULL; } 593 bool is_default() const { return label_ == NULL; }
602 Expression* label() const { 594 Expression* label() const {
603 CHECK(!is_default()); 595 CHECK(!is_default());
604 return label_; 596 return label_;
605 } 597 }
606 JumpTarget* body_target() { return &body_target_; } 598 JumpTarget* body_target() { return &body_target_; }
607 ZoneList<Statement*>* statements() const { return statements_; } 599 ZoneList<Statement*>* statements() const { return statements_; }
608 600
609 private: 601 private:
610 Expression* label_; 602 Expression* label_;
611 JumpTarget body_target_; 603 JumpTarget body_target_;
612 ZoneList<Statement*>* statements_; 604 ZoneList<Statement*>* statements_;
613 }; 605 };
614 606
615 607
616 class SwitchStatement: public BreakableStatement { 608 class SwitchStatement: public BreakableStatement {
617 public: 609 public:
618 explicit inline SwitchStatement(ZoneStringList* labels); 610 explicit inline SwitchStatement(ZoneStringList* labels);
619 611
612 DECLARE_NODE_TYPE(SwitchStatement)
613
620 void Initialize(Expression* tag, ZoneList<CaseClause*>* cases) { 614 void Initialize(Expression* tag, ZoneList<CaseClause*>* cases) {
621 tag_ = tag; 615 tag_ = tag;
622 cases_ = cases; 616 cases_ = cases;
623 } 617 }
624 618
625 virtual void Accept(AstVisitor* v);
626
627 Expression* tag() const { return tag_; } 619 Expression* tag() const { return tag_; }
628 ZoneList<CaseClause*>* cases() const { return cases_; } 620 ZoneList<CaseClause*>* cases() const { return cases_; }
629 621
630 private: 622 private:
631 Expression* tag_; 623 Expression* tag_;
632 ZoneList<CaseClause*>* cases_; 624 ZoneList<CaseClause*>* cases_;
633 }; 625 };
634 626
635 627
636 // If-statements always have non-null references to their then- and 628 // If-statements always have non-null references to their then- and
637 // else-parts. When parsing if-statements with no explicit else-part, 629 // else-parts. When parsing if-statements with no explicit else-part,
638 // the parser implicitly creates an empty statement. Use the 630 // the parser implicitly creates an empty statement. Use the
639 // HasThenStatement() and HasElseStatement() functions to check if a 631 // HasThenStatement() and HasElseStatement() functions to check if a
640 // given if-statement has a then- or an else-part containing code. 632 // given if-statement has a then- or an else-part containing code.
641 class IfStatement: public Statement { 633 class IfStatement: public Statement {
642 public: 634 public:
643 IfStatement(Expression* condition, 635 IfStatement(Expression* condition,
644 Statement* then_statement, 636 Statement* then_statement,
645 Statement* else_statement) 637 Statement* else_statement)
646 : condition_(condition), 638 : condition_(condition),
647 then_statement_(then_statement), 639 then_statement_(then_statement),
648 else_statement_(else_statement) { } 640 else_statement_(else_statement) { }
649 641
650 virtual void Accept(AstVisitor* v); 642 DECLARE_NODE_TYPE(IfStatement)
651 643
652 bool HasThenStatement() const { return !then_statement()->IsEmpty(); } 644 bool HasThenStatement() const { return !then_statement()->IsEmpty(); }
653 bool HasElseStatement() const { return !else_statement()->IsEmpty(); } 645 bool HasElseStatement() const { return !else_statement()->IsEmpty(); }
654 646
655 Expression* condition() const { return condition_; } 647 Expression* condition() const { return condition_; }
656 Statement* then_statement() const { return then_statement_; } 648 Statement* then_statement() const { return then_statement_; }
657 void set_then_statement(Statement* stmt) { then_statement_ = stmt; } 649 void set_then_statement(Statement* stmt) { then_statement_ = stmt; }
658 Statement* else_statement() const { return else_statement_; } 650 Statement* else_statement() const { return else_statement_; }
659 void set_else_statement(Statement* stmt) { else_statement_ = stmt; } 651 void set_else_statement(Statement* stmt) { else_statement_ = stmt; }
660 652
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
710 class TryCatchStatement: public TryStatement { 702 class TryCatchStatement: public TryStatement {
711 public: 703 public:
712 TryCatchStatement(Block* try_block, 704 TryCatchStatement(Block* try_block,
713 VariableProxy* catch_var, 705 VariableProxy* catch_var,
714 Block* catch_block) 706 Block* catch_block)
715 : TryStatement(try_block), 707 : TryStatement(try_block),
716 catch_var_(catch_var), 708 catch_var_(catch_var),
717 catch_block_(catch_block) { 709 catch_block_(catch_block) {
718 } 710 }
719 711
720 virtual void Accept(AstVisitor* v); 712 DECLARE_NODE_TYPE(TryCatchStatement)
721 713
722 VariableProxy* catch_var() const { return catch_var_; } 714 VariableProxy* catch_var() const { return catch_var_; }
723 Block* catch_block() const { return catch_block_; } 715 Block* catch_block() const { return catch_block_; }
724 716
725 private: 717 private:
726 VariableProxy* catch_var_; 718 VariableProxy* catch_var_;
727 Block* catch_block_; 719 Block* catch_block_;
728 }; 720 };
729 721
730 722
731 class TryFinallyStatement: public TryStatement { 723 class TryFinallyStatement: public TryStatement {
732 public: 724 public:
733 TryFinallyStatement(Block* try_block, Block* finally_block) 725 TryFinallyStatement(Block* try_block, Block* finally_block)
734 : TryStatement(try_block), 726 : TryStatement(try_block),
735 finally_block_(finally_block) { } 727 finally_block_(finally_block) { }
736 728
737 virtual void Accept(AstVisitor* v); 729 DECLARE_NODE_TYPE(TryFinallyStatement)
738 730
739 Block* finally_block() const { return finally_block_; } 731 Block* finally_block() const { return finally_block_; }
740 732
741 private: 733 private:
742 Block* finally_block_; 734 Block* finally_block_;
743 }; 735 };
744 736
745 737
746 class DebuggerStatement: public Statement { 738 class DebuggerStatement: public Statement {
747 public: 739 public:
748 virtual void Accept(AstVisitor* v); 740 DECLARE_NODE_TYPE(DebuggerStatement)
749 }; 741 };
750 742
751 743
752 class EmptyStatement: public Statement { 744 class EmptyStatement: public Statement {
753 public: 745 public:
754 EmptyStatement() {} 746 DECLARE_NODE_TYPE(EmptyStatement)
755
756 virtual void Accept(AstVisitor* v);
757
758 // Type testing & conversion.
759 virtual EmptyStatement* AsEmptyStatement() { return this; }
760 }; 747 };
761 748
762 749
763 class Literal: public Expression { 750 class Literal: public Expression {
764 public: 751 public:
765 explicit Literal(Handle<Object> handle) : handle_(handle) { } 752 explicit Literal(Handle<Object> handle) : handle_(handle) { }
766 753
767 virtual void Accept(AstVisitor* v); 754 DECLARE_NODE_TYPE(Literal)
755
768 virtual bool IsTrivial() { return true; } 756 virtual bool IsTrivial() { return true; }
769 virtual bool IsSmiLiteral() { return handle_->IsSmi(); } 757 virtual bool IsSmiLiteral() { return handle_->IsSmi(); }
770 758
771 // Type testing & conversion.
772 virtual Literal* AsLiteral() { return this; }
773
774 // Check if this literal is identical to the other literal. 759 // Check if this literal is identical to the other literal.
775 bool IsIdenticalTo(const Literal* other) const { 760 bool IsIdenticalTo(const Literal* other) const {
776 return handle_.is_identical_to(other->handle_); 761 return handle_.is_identical_to(other->handle_);
777 } 762 }
778 763
779 virtual bool IsPropertyName() { 764 virtual bool IsPropertyName() {
780 if (handle_->IsSymbol()) { 765 if (handle_->IsSymbol()) {
781 uint32_t ignored; 766 uint32_t ignored;
782 return !String::cast(*handle_)->AsArrayIndex(&ignored); 767 return !String::cast(*handle_)->AsArrayIndex(&ignored);
783 } 768 }
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
857 ZoneList<Property*>* properties, 842 ZoneList<Property*>* properties,
858 int literal_index, 843 int literal_index,
859 bool is_simple, 844 bool is_simple,
860 bool fast_elements, 845 bool fast_elements,
861 int depth) 846 int depth)
862 : MaterializedLiteral(literal_index, is_simple, depth), 847 : MaterializedLiteral(literal_index, is_simple, depth),
863 constant_properties_(constant_properties), 848 constant_properties_(constant_properties),
864 properties_(properties), 849 properties_(properties),
865 fast_elements_(fast_elements) {} 850 fast_elements_(fast_elements) {}
866 851
867 virtual ObjectLiteral* AsObjectLiteral() { return this; } 852 DECLARE_NODE_TYPE(ObjectLiteral)
868 virtual void Accept(AstVisitor* v);
869 853
870 Handle<FixedArray> constant_properties() const { 854 Handle<FixedArray> constant_properties() const {
871 return constant_properties_; 855 return constant_properties_;
872 } 856 }
873 ZoneList<Property*>* properties() const { return properties_; } 857 ZoneList<Property*>* properties() const { return properties_; }
874 858
875 bool fast_elements() const { return fast_elements_; } 859 bool fast_elements() const { return fast_elements_; }
876 860
877 private: 861 private:
878 Handle<FixedArray> constant_properties_; 862 Handle<FixedArray> constant_properties_;
879 ZoneList<Property*>* properties_; 863 ZoneList<Property*>* properties_;
880 bool fast_elements_; 864 bool fast_elements_;
881 }; 865 };
882 866
883 867
884 // Node for capturing a regexp literal. 868 // Node for capturing a regexp literal.
885 class RegExpLiteral: public MaterializedLiteral { 869 class RegExpLiteral: public MaterializedLiteral {
886 public: 870 public:
887 RegExpLiteral(Handle<String> pattern, 871 RegExpLiteral(Handle<String> pattern,
888 Handle<String> flags, 872 Handle<String> flags,
889 int literal_index) 873 int literal_index)
890 : MaterializedLiteral(literal_index, false, 1), 874 : MaterializedLiteral(literal_index, false, 1),
891 pattern_(pattern), 875 pattern_(pattern),
892 flags_(flags) {} 876 flags_(flags) {}
893 877
894 virtual void Accept(AstVisitor* v); 878 DECLARE_NODE_TYPE(RegExpLiteral)
895 879
896 Handle<String> pattern() const { return pattern_; } 880 Handle<String> pattern() const { return pattern_; }
897 Handle<String> flags() const { return flags_; } 881 Handle<String> flags() const { return flags_; }
898 882
899 private: 883 private:
900 Handle<String> pattern_; 884 Handle<String> pattern_;
901 Handle<String> flags_; 885 Handle<String> flags_;
902 }; 886 };
903 887
904 // An array literal has a literals object that is used 888 // An array literal has a literals object that is used
905 // for minimizing the work when constructing it at runtime. 889 // for minimizing the work when constructing it at runtime.
906 class ArrayLiteral: public MaterializedLiteral { 890 class ArrayLiteral: public MaterializedLiteral {
907 public: 891 public:
908 ArrayLiteral(Handle<FixedArray> constant_elements, 892 ArrayLiteral(Handle<FixedArray> constant_elements,
909 ZoneList<Expression*>* values, 893 ZoneList<Expression*>* values,
910 int literal_index, 894 int literal_index,
911 bool is_simple, 895 bool is_simple,
912 int depth) 896 int depth)
913 : MaterializedLiteral(literal_index, is_simple, depth), 897 : MaterializedLiteral(literal_index, is_simple, depth),
914 constant_elements_(constant_elements), 898 constant_elements_(constant_elements),
915 values_(values) {} 899 values_(values) {}
916 900
917 virtual void Accept(AstVisitor* v); 901 DECLARE_NODE_TYPE(ArrayLiteral)
918 virtual ArrayLiteral* AsArrayLiteral() { return this; }
919 902
920 Handle<FixedArray> constant_elements() const { return constant_elements_; } 903 Handle<FixedArray> constant_elements() const { return constant_elements_; }
921 ZoneList<Expression*>* values() const { return values_; } 904 ZoneList<Expression*>* values() const { return values_; }
922 905
923 private: 906 private:
924 Handle<FixedArray> constant_elements_; 907 Handle<FixedArray> constant_elements_;
925 ZoneList<Expression*>* values_; 908 ZoneList<Expression*>* values_;
926 }; 909 };
927 910
928 911
929 // Node for constructing a context extension object for a catch block. 912 // Node for constructing a context extension object for a catch block.
930 // The catch context extension object has one property, the catch 913 // The catch context extension object has one property, the catch
931 // variable, which should be DontDelete. 914 // variable, which should be DontDelete.
932 class CatchExtensionObject: public Expression { 915 class CatchExtensionObject: public Expression {
933 public: 916 public:
934 CatchExtensionObject(Literal* key, VariableProxy* value) 917 CatchExtensionObject(Literal* key, VariableProxy* value)
935 : key_(key), value_(value) { 918 : key_(key), value_(value) {
936 } 919 }
937 920
938 virtual void Accept(AstVisitor* v); 921 DECLARE_NODE_TYPE(CatchExtensionObject)
939 922
940 Literal* key() const { return key_; } 923 Literal* key() const { return key_; }
941 VariableProxy* value() const { return value_; } 924 VariableProxy* value() const { return value_; }
942 925
943 private: 926 private:
944 Literal* key_; 927 Literal* key_;
945 VariableProxy* value_; 928 VariableProxy* value_;
946 }; 929 };
947 930
948 931
949 class VariableProxy: public Expression { 932 class VariableProxy: public Expression {
950 public: 933 public:
951 explicit VariableProxy(Variable* var); 934 explicit VariableProxy(Variable* var);
952 935
953 virtual void Accept(AstVisitor* v); 936 DECLARE_NODE_TYPE(VariableProxy)
954 937
955 // Type testing & conversion 938 // Type testing & conversion
956 virtual Property* AsProperty() { 939 virtual Property* AsProperty() {
957 return var_ == NULL ? NULL : var_->AsProperty(); 940 return var_ == NULL ? NULL : var_->AsProperty();
958 } 941 }
959 942
960 virtual VariableProxy* AsVariableProxy() {
961 return this;
962 }
963
964 Variable* AsVariable() { 943 Variable* AsVariable() {
965 if (this == NULL || var_ == NULL) return NULL; 944 if (this == NULL || var_ == NULL) return NULL;
966 Expression* rewrite = var_->rewrite(); 945 Expression* rewrite = var_->rewrite();
967 if (rewrite == NULL || rewrite->AsSlot() != NULL) return var_; 946 if (rewrite == NULL || rewrite->AsSlot() != NULL) return var_;
968 return NULL; 947 return NULL;
969 } 948 }
970 949
971 virtual bool IsValidLeftHandSide() { 950 virtual bool IsValidLeftHandSide() {
972 return var_ == NULL ? true : var_->IsValidLeftHandSide(); 951 return var_ == NULL ? true : var_->IsValidLeftHandSide();
973 } 952 }
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1048 // with lookup starting at the current context. index() 1027 // with lookup starting at the current context. index()
1049 // is invalid. 1028 // is invalid.
1050 LOOKUP 1029 LOOKUP
1051 }; 1030 };
1052 1031
1053 Slot(Variable* var, Type type, int index) 1032 Slot(Variable* var, Type type, int index)
1054 : var_(var), type_(type), index_(index) { 1033 : var_(var), type_(type), index_(index) {
1055 ASSERT(var != NULL); 1034 ASSERT(var != NULL);
1056 } 1035 }
1057 1036
1058 virtual void Accept(AstVisitor* v); 1037 DECLARE_NODE_TYPE(Slot)
1059
1060 // Type testing & conversion
1061 virtual Slot* AsSlot() { return this; }
1062 1038
1063 bool IsStackAllocated() { return type_ == PARAMETER || type_ == LOCAL; } 1039 bool IsStackAllocated() { return type_ == PARAMETER || type_ == LOCAL; }
1064 1040
1065 // Accessors 1041 // Accessors
1066 Variable* var() const { return var_; } 1042 Variable* var() const { return var_; }
1067 Type type() const { return type_; } 1043 Type type() const { return type_; }
1068 int index() const { return index_; } 1044 int index() const { return index_; }
1069 bool is_arguments() const { return var_->is_arguments(); } 1045 bool is_arguments() const { return var_->is_arguments(); }
1070 1046
1071 private: 1047 private:
1072 Variable* var_; 1048 Variable* var_;
1073 Type type_; 1049 Type type_;
1074 int index_; 1050 int index_;
1075 }; 1051 };
1076 1052
1077 1053
1078 class Property: public Expression { 1054 class Property: public Expression {
1079 public: 1055 public:
1080 // Synthetic properties are property lookups introduced by the system, 1056 // Synthetic properties are property lookups introduced by the system,
1081 // to objects that aren't visible to the user. Function calls to synthetic 1057 // to objects that aren't visible to the user. Function calls to synthetic
1082 // properties should use the global object as receiver, not the base object 1058 // properties should use the global object as receiver, not the base object
1083 // of the resolved Reference. 1059 // of the resolved Reference.
1084 enum Type { NORMAL, SYNTHETIC }; 1060 enum Type { NORMAL, SYNTHETIC };
1085 Property(Expression* obj, Expression* key, int pos, Type type = NORMAL) 1061 Property(Expression* obj, Expression* key, int pos, Type type = NORMAL)
1086 : obj_(obj), key_(key), pos_(pos), type_(type) { } 1062 : obj_(obj), key_(key), pos_(pos), type_(type) { }
1087 1063
1088 virtual void Accept(AstVisitor* v); 1064 DECLARE_NODE_TYPE(Property)
1089
1090 // Type testing & conversion
1091 virtual Property* AsProperty() { return this; }
1092 1065
1093 virtual bool IsValidLeftHandSide() { return true; } 1066 virtual bool IsValidLeftHandSide() { return true; }
1094 1067
1095 Expression* obj() const { return obj_; } 1068 Expression* obj() const { return obj_; }
1096 Expression* key() const { return key_; } 1069 Expression* key() const { return key_; }
1097 int position() const { return pos_; } 1070 int position() const { return pos_; }
1098 bool is_synthetic() const { return type_ == SYNTHETIC; } 1071 bool is_synthetic() const { return type_ == SYNTHETIC; }
1099 1072
1100 // Returns a property singleton property access on 'this'. Used 1073 // Returns a property singleton property access on 'this'. Used
1101 // during preparsing. 1074 // during preparsing.
1102 static Property* this_property() { return &this_property_; } 1075 static Property* this_property() { return &this_property_; }
1103 1076
1104 private: 1077 private:
1105 Expression* obj_; 1078 Expression* obj_;
1106 Expression* key_; 1079 Expression* key_;
1107 int pos_; 1080 int pos_;
1108 Type type_; 1081 Type type_;
1109 1082
1110 // Dummy property used during preparsing. 1083 // Dummy property used during preparsing.
1111 static Property this_property_; 1084 static Property this_property_;
1112 }; 1085 };
1113 1086
1114 1087
1115 class Call: public Expression { 1088 class Call: public Expression {
1116 public: 1089 public:
1117 Call(Expression* expression, ZoneList<Expression*>* arguments, int pos) 1090 Call(Expression* expression, ZoneList<Expression*>* arguments, int pos)
1118 : expression_(expression), arguments_(arguments), pos_(pos) { } 1091 : expression_(expression), arguments_(arguments), pos_(pos) { }
1119 1092
1120 virtual void Accept(AstVisitor* v); 1093 DECLARE_NODE_TYPE(Call)
1121
1122 // Type testing and conversion.
1123 virtual Call* AsCall() { return this; }
1124 1094
1125 Expression* expression() const { return expression_; } 1095 Expression* expression() const { return expression_; }
1126 ZoneList<Expression*>* arguments() const { return arguments_; } 1096 ZoneList<Expression*>* arguments() const { return arguments_; }
1127 int position() { return pos_; } 1097 int position() { return pos_; }
1128 1098
1129 static Call* sentinel() { return &sentinel_; } 1099 static Call* sentinel() { return &sentinel_; }
1130 1100
1131 private: 1101 private:
1132 Expression* expression_; 1102 Expression* expression_;
1133 ZoneList<Expression*>* arguments_; 1103 ZoneList<Expression*>* arguments_;
1134 int pos_; 1104 int pos_;
1135 1105
1136 static Call sentinel_; 1106 static Call sentinel_;
1137 }; 1107 };
1138 1108
1139 1109
1140 class CallNew: public Expression { 1110 class CallNew: public Expression {
1141 public: 1111 public:
1142 CallNew(Expression* expression, ZoneList<Expression*>* arguments, int pos) 1112 CallNew(Expression* expression, ZoneList<Expression*>* arguments, int pos)
1143 : expression_(expression), arguments_(arguments), pos_(pos) { } 1113 : expression_(expression), arguments_(arguments), pos_(pos) { }
1144 1114
1145 virtual void Accept(AstVisitor* v); 1115 DECLARE_NODE_TYPE(CallNew)
1146 1116
1147 Expression* expression() const { return expression_; } 1117 Expression* expression() const { return expression_; }
1148 ZoneList<Expression*>* arguments() const { return arguments_; } 1118 ZoneList<Expression*>* arguments() const { return arguments_; }
1149 int position() { return pos_; } 1119 int position() { return pos_; }
1150 1120
1151 private: 1121 private:
1152 Expression* expression_; 1122 Expression* expression_;
1153 ZoneList<Expression*>* arguments_; 1123 ZoneList<Expression*>* arguments_;
1154 int pos_; 1124 int pos_;
1155 }; 1125 };
1156 1126
1157 1127
1158 // The CallRuntime class does not represent any official JavaScript 1128 // The CallRuntime class does not represent any official JavaScript
1159 // language construct. Instead it is used to call a C or JS function 1129 // language construct. Instead it is used to call a C or JS function
1160 // with a set of arguments. This is used from the builtins that are 1130 // with a set of arguments. This is used from the builtins that are
1161 // implemented in JavaScript (see "v8natives.js"). 1131 // implemented in JavaScript (see "v8natives.js").
1162 class CallRuntime: public Expression { 1132 class CallRuntime: public Expression {
1163 public: 1133 public:
1164 CallRuntime(Handle<String> name, 1134 CallRuntime(Handle<String> name,
1165 Runtime::Function* function, 1135 Runtime::Function* function,
1166 ZoneList<Expression*>* arguments) 1136 ZoneList<Expression*>* arguments)
1167 : name_(name), function_(function), arguments_(arguments) { } 1137 : name_(name), function_(function), arguments_(arguments) { }
1168 1138
1169 virtual void Accept(AstVisitor* v); 1139 DECLARE_NODE_TYPE(CallRuntime)
1170 1140
1171 Handle<String> name() const { return name_; } 1141 Handle<String> name() const { return name_; }
1172 Runtime::Function* function() const { return function_; } 1142 Runtime::Function* function() const { return function_; }
1173 ZoneList<Expression*>* arguments() const { return arguments_; } 1143 ZoneList<Expression*>* arguments() const { return arguments_; }
1174 bool is_jsruntime() const { return function_ == NULL; } 1144 bool is_jsruntime() const { return function_ == NULL; }
1175 1145
1176 private: 1146 private:
1177 Handle<String> name_; 1147 Handle<String> name_;
1178 Runtime::Function* function_; 1148 Runtime::Function* function_;
1179 ZoneList<Expression*>* arguments_; 1149 ZoneList<Expression*>* arguments_;
1180 }; 1150 };
1181 1151
1182 1152
1183 class UnaryOperation: public Expression { 1153 class UnaryOperation: public Expression {
1184 public: 1154 public:
1185 UnaryOperation(Token::Value op, Expression* expression) 1155 UnaryOperation(Token::Value op, Expression* expression)
1186 : op_(op), expression_(expression) { 1156 : op_(op), expression_(expression) {
1187 ASSERT(Token::IsUnaryOp(op)); 1157 ASSERT(Token::IsUnaryOp(op));
1188 } 1158 }
1189 1159
1190 virtual void Accept(AstVisitor* v); 1160 DECLARE_NODE_TYPE(UnaryOperation)
1161
1191 virtual bool ResultOverwriteAllowed(); 1162 virtual bool ResultOverwriteAllowed();
1192 1163
1193 // Type testing & conversion
1194 virtual UnaryOperation* AsUnaryOperation() { return this; }
1195
1196 Token::Value op() const { return op_; } 1164 Token::Value op() const { return op_; }
1197 Expression* expression() const { return expression_; } 1165 Expression* expression() const { return expression_; }
1198 1166
1199 private: 1167 private:
1200 Token::Value op_; 1168 Token::Value op_;
1201 Expression* expression_; 1169 Expression* expression_;
1202 }; 1170 };
1203 1171
1204 1172
1205 class BinaryOperation: public Expression { 1173 class BinaryOperation: public Expression {
1206 public: 1174 public:
1207 BinaryOperation(Token::Value op, 1175 BinaryOperation(Token::Value op,
1208 Expression* left, 1176 Expression* left,
1209 Expression* right, 1177 Expression* right,
1210 int pos) 1178 int pos)
1211 : op_(op), left_(left), right_(right), pos_(pos) { 1179 : op_(op), left_(left), right_(right), pos_(pos) {
1212 ASSERT(Token::IsBinaryOp(op)); 1180 ASSERT(Token::IsBinaryOp(op));
1213 } 1181 }
1214 1182
1215 // Create the binary operation corresponding to a compound assignment. 1183 // Create the binary operation corresponding to a compound assignment.
1216 explicit BinaryOperation(Assignment* assignment); 1184 explicit BinaryOperation(Assignment* assignment);
1217 1185
1218 virtual void Accept(AstVisitor* v); 1186 DECLARE_NODE_TYPE(BinaryOperation)
1187
1219 virtual bool ResultOverwriteAllowed(); 1188 virtual bool ResultOverwriteAllowed();
1220 1189
1221 // Type testing & conversion
1222 virtual BinaryOperation* AsBinaryOperation() { return this; }
1223
1224 Token::Value op() const { return op_; } 1190 Token::Value op() const { return op_; }
1225 Expression* left() const { return left_; } 1191 Expression* left() const { return left_; }
1226 Expression* right() const { return right_; } 1192 Expression* right() const { return right_; }
1227 int position() const { return pos_; } 1193 int position() const { return pos_; }
1228 1194
1229 private: 1195 private:
1230 Token::Value op_; 1196 Token::Value op_;
1231 Expression* left_; 1197 Expression* left_;
1232 Expression* right_; 1198 Expression* right_;
1233 int pos_; 1199 int pos_;
1234 }; 1200 };
1235 1201
1236 1202
1237 class IncrementOperation: public Expression { 1203 class IncrementOperation: public Expression {
1238 public: 1204 public:
1239 IncrementOperation(Token::Value op, Expression* expr) 1205 IncrementOperation(Token::Value op, Expression* expr)
1240 : op_(op), expression_(expr) { 1206 : op_(op), expression_(expr) {
1241 ASSERT(Token::IsCountOp(op)); 1207 ASSERT(Token::IsCountOp(op));
1242 } 1208 }
1243 1209
1210 DECLARE_NODE_TYPE(IncrementOperation)
1211
1244 Token::Value op() const { return op_; } 1212 Token::Value op() const { return op_; }
1245 bool is_increment() { return op_ == Token::INC; } 1213 bool is_increment() { return op_ == Token::INC; }
1246 Expression* expression() const { return expression_; } 1214 Expression* expression() const { return expression_; }
1247 1215
1248 virtual void Accept(AstVisitor* v);
1249
1250 private: 1216 private:
1251 Token::Value op_; 1217 Token::Value op_;
1252 Expression* expression_; 1218 Expression* expression_;
1253 int pos_; 1219 int pos_;
1254 }; 1220 };
1255 1221
1256 1222
1257 class CountOperation: public Expression { 1223 class CountOperation: public Expression {
1258 public: 1224 public:
1259 CountOperation(bool is_prefix, IncrementOperation* increment, int pos) 1225 CountOperation(bool is_prefix, IncrementOperation* increment, int pos)
1260 : is_prefix_(is_prefix), increment_(increment), pos_(pos) { } 1226 : is_prefix_(is_prefix), increment_(increment), pos_(pos) { }
1261 1227
1262 virtual void Accept(AstVisitor* v); 1228 DECLARE_NODE_TYPE(CountOperation)
1263
1264 virtual CountOperation* AsCountOperation() { return this; }
1265 1229
1266 bool is_prefix() const { return is_prefix_; } 1230 bool is_prefix() const { return is_prefix_; }
1267 bool is_postfix() const { return !is_prefix_; } 1231 bool is_postfix() const { return !is_prefix_; }
1268 1232
1269 Token::Value op() const { return increment_->op(); } 1233 Token::Value op() const { return increment_->op(); }
1270 Token::Value binary_op() { 1234 Token::Value binary_op() {
1271 return (op() == Token::INC) ? Token::ADD : Token::SUB; 1235 return (op() == Token::INC) ? Token::ADD : Token::SUB;
1272 } 1236 }
1273 1237
1274 Expression* expression() const { return increment_->expression(); } 1238 Expression* expression() const { return increment_->expression(); }
(...skipping 12 matching lines...) Expand all
1287 class CompareOperation: public Expression { 1251 class CompareOperation: public Expression {
1288 public: 1252 public:
1289 CompareOperation(Token::Value op, 1253 CompareOperation(Token::Value op,
1290 Expression* left, 1254 Expression* left,
1291 Expression* right, 1255 Expression* right,
1292 int pos) 1256 int pos)
1293 : op_(op), left_(left), right_(right), pos_(pos) { 1257 : op_(op), left_(left), right_(right), pos_(pos) {
1294 ASSERT(Token::IsCompareOp(op)); 1258 ASSERT(Token::IsCompareOp(op));
1295 } 1259 }
1296 1260
1297 virtual void Accept(AstVisitor* v); 1261 DECLARE_NODE_TYPE(CompareOperation)
1298 1262
1299 Token::Value op() const { return op_; } 1263 Token::Value op() const { return op_; }
1300 Expression* left() const { return left_; } 1264 Expression* left() const { return left_; }
1301 Expression* right() const { return right_; } 1265 Expression* right() const { return right_; }
1302 int position() const { return pos_; } 1266 int position() const { return pos_; }
1303 1267
1304 // Type testing & conversion
1305 virtual CompareOperation* AsCompareOperation() { return this; }
1306
1307 private: 1268 private:
1308 Token::Value op_; 1269 Token::Value op_;
1309 Expression* left_; 1270 Expression* left_;
1310 Expression* right_; 1271 Expression* right_;
1311 int pos_; 1272 int pos_;
1312 }; 1273 };
1313 1274
1314 1275
1315 class CompareToNull: public Expression { 1276 class CompareToNull: public Expression {
1316 public: 1277 public:
1317 CompareToNull(bool is_strict, Expression* expression) 1278 CompareToNull(bool is_strict, Expression* expression)
1318 : is_strict_(is_strict), expression_(expression) { } 1279 : is_strict_(is_strict), expression_(expression) { }
1319 1280
1320 virtual void Accept(AstVisitor* v); 1281 DECLARE_NODE_TYPE(CompareToNull)
1321 1282
1322 bool is_strict() const { return is_strict_; } 1283 bool is_strict() const { return is_strict_; }
1323 Token::Value op() const { return is_strict_ ? Token::EQ_STRICT : Token::EQ; } 1284 Token::Value op() const { return is_strict_ ? Token::EQ_STRICT : Token::EQ; }
1324 Expression* expression() const { return expression_; } 1285 Expression* expression() const { return expression_; }
1325 1286
1326 private: 1287 private:
1327 bool is_strict_; 1288 bool is_strict_;
1328 Expression* expression_; 1289 Expression* expression_;
1329 }; 1290 };
1330 1291
1331 1292
1332 class Conditional: public Expression { 1293 class Conditional: public Expression {
1333 public: 1294 public:
1334 Conditional(Expression* condition, 1295 Conditional(Expression* condition,
1335 Expression* then_expression, 1296 Expression* then_expression,
1336 Expression* else_expression, 1297 Expression* else_expression,
1337 int then_expression_position, 1298 int then_expression_position,
1338 int else_expression_position) 1299 int else_expression_position)
1339 : condition_(condition), 1300 : condition_(condition),
1340 then_expression_(then_expression), 1301 then_expression_(then_expression),
1341 else_expression_(else_expression), 1302 else_expression_(else_expression),
1342 then_expression_position_(then_expression_position), 1303 then_expression_position_(then_expression_position),
1343 else_expression_position_(else_expression_position) { } 1304 else_expression_position_(else_expression_position) { }
1344 1305
1345 virtual void Accept(AstVisitor* v); 1306 DECLARE_NODE_TYPE(Conditional)
1346 1307
1347 Expression* condition() const { return condition_; } 1308 Expression* condition() const { return condition_; }
1348 Expression* then_expression() const { return then_expression_; } 1309 Expression* then_expression() const { return then_expression_; }
1349 Expression* else_expression() const { return else_expression_; } 1310 Expression* else_expression() const { return else_expression_; }
1350 1311
1351 int then_expression_position() { return then_expression_position_; } 1312 int then_expression_position() { return then_expression_position_; }
1352 int else_expression_position() { return else_expression_position_; } 1313 int else_expression_position() { return else_expression_position_; }
1353 1314
1354 private: 1315 private:
1355 Expression* condition_; 1316 Expression* condition_;
1356 Expression* then_expression_; 1317 Expression* then_expression_;
1357 Expression* else_expression_; 1318 Expression* else_expression_;
1358 int then_expression_position_; 1319 int then_expression_position_;
1359 int else_expression_position_; 1320 int else_expression_position_;
1360 }; 1321 };
1361 1322
1362 1323
1363 class Assignment: public Expression { 1324 class Assignment: public Expression {
1364 public: 1325 public:
1365 Assignment(Token::Value op, Expression* target, Expression* value, int pos) 1326 Assignment(Token::Value op, Expression* target, Expression* value, int pos)
1366 : op_(op), target_(target), value_(value), pos_(pos), 1327 : op_(op), target_(target), value_(value), pos_(pos),
1367 block_start_(false), block_end_(false) { 1328 block_start_(false), block_end_(false) {
1368 ASSERT(Token::IsAssignmentOp(op)); 1329 ASSERT(Token::IsAssignmentOp(op));
1369 } 1330 }
1370 1331
1371 virtual void Accept(AstVisitor* v); 1332 DECLARE_NODE_TYPE(Assignment)
1372 virtual Assignment* AsAssignment() { return this; }
1373 1333
1374 Assignment* AsSimpleAssignment() { return !is_compound() ? this : NULL; } 1334 Assignment* AsSimpleAssignment() { return !is_compound() ? this : NULL; }
1375 1335
1376 Token::Value binary_op() const; 1336 Token::Value binary_op() const;
1377 1337
1378 Token::Value op() const { return op_; } 1338 Token::Value op() const { return op_; }
1379 Expression* target() const { return target_; } 1339 Expression* target() const { return target_; }
1380 Expression* value() const { return value_; } 1340 Expression* value() const { return value_; }
1381 int position() { return pos_; } 1341 int position() { return pos_; }
1382 // This check relies on the definition order of token in token.h. 1342 // This check relies on the definition order of token in token.h.
(...skipping 16 matching lines...) Expand all
1399 bool block_start_; 1359 bool block_start_;
1400 bool block_end_; 1360 bool block_end_;
1401 }; 1361 };
1402 1362
1403 1363
1404 class Throw: public Expression { 1364 class Throw: public Expression {
1405 public: 1365 public:
1406 Throw(Expression* exception, int pos) 1366 Throw(Expression* exception, int pos)
1407 : exception_(exception), pos_(pos) {} 1367 : exception_(exception), pos_(pos) {}
1408 1368
1409 virtual void Accept(AstVisitor* v); 1369 DECLARE_NODE_TYPE(Throw)
1410 1370
1411 Expression* exception() const { return exception_; } 1371 Expression* exception() const { return exception_; }
1412 int position() const { return pos_; } 1372 int position() const { return pos_; }
1413 1373
1414 private: 1374 private:
1415 Expression* exception_; 1375 Expression* exception_;
1416 int pos_; 1376 int pos_;
1417 }; 1377 };
1418 1378
1419 1379
(...skipping 25 matching lines...) Expand all
1445 is_expression_(is_expression), 1405 is_expression_(is_expression),
1446 contains_loops_(contains_loops), 1406 contains_loops_(contains_loops),
1447 function_token_position_(RelocInfo::kNoPosition), 1407 function_token_position_(RelocInfo::kNoPosition),
1448 inferred_name_(Heap::empty_string()), 1408 inferred_name_(Heap::empty_string()),
1449 try_full_codegen_(false) { 1409 try_full_codegen_(false) {
1450 #ifdef DEBUG 1410 #ifdef DEBUG
1451 already_compiled_ = false; 1411 already_compiled_ = false;
1452 #endif 1412 #endif
1453 } 1413 }
1454 1414
1455 virtual void Accept(AstVisitor* v); 1415 DECLARE_NODE_TYPE(FunctionLiteral)
1456
1457 // Type testing & conversion
1458 virtual FunctionLiteral* AsFunctionLiteral() { return this; }
1459 1416
1460 Handle<String> name() const { return name_; } 1417 Handle<String> name() const { return name_; }
1461 Scope* scope() const { return scope_; } 1418 Scope* scope() const { return scope_; }
1462 ZoneList<Statement*>* body() const { return body_; } 1419 ZoneList<Statement*>* body() const { return body_; }
1463 void set_function_token_position(int pos) { function_token_position_ = pos; } 1420 void set_function_token_position(int pos) { function_token_position_ = pos; }
1464 int function_token_position() const { return function_token_position_; } 1421 int function_token_position() const { return function_token_position_; }
1465 int start_position() const { return start_position_; } 1422 int start_position() const { return start_position_; }
1466 int end_position() const { return end_position_; } 1423 int end_position() const { return end_position_; }
1467 bool is_expression() const { return is_expression_; } 1424 bool is_expression() const { return is_expression_; }
1468 bool contains_loops() const { return contains_loops_; } 1425 bool contains_loops() const { return contains_loops_; }
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1515 #endif 1472 #endif
1516 }; 1473 };
1517 1474
1518 1475
1519 class SharedFunctionInfoLiteral: public Expression { 1476 class SharedFunctionInfoLiteral: public Expression {
1520 public: 1477 public:
1521 explicit SharedFunctionInfoLiteral( 1478 explicit SharedFunctionInfoLiteral(
1522 Handle<SharedFunctionInfo> shared_function_info) 1479 Handle<SharedFunctionInfo> shared_function_info)
1523 : shared_function_info_(shared_function_info) { } 1480 : shared_function_info_(shared_function_info) { }
1524 1481
1482 DECLARE_NODE_TYPE(SharedFunctionInfoLiteral)
1483
1525 Handle<SharedFunctionInfo> shared_function_info() const { 1484 Handle<SharedFunctionInfo> shared_function_info() const {
1526 return shared_function_info_; 1485 return shared_function_info_;
1527 } 1486 }
1528 1487
1529 virtual void Accept(AstVisitor* v);
1530
1531 private: 1488 private:
1532 Handle<SharedFunctionInfo> shared_function_info_; 1489 Handle<SharedFunctionInfo> shared_function_info_;
1533 }; 1490 };
1534 1491
1535 1492
1536 class ThisFunction: public Expression { 1493 class ThisFunction: public Expression {
1537 public: 1494 public:
1538 virtual void Accept(AstVisitor* v); 1495 DECLARE_NODE_TYPE(ThisFunction)
1539 }; 1496 };
1540 1497
1541 1498
1542 // ---------------------------------------------------------------------------- 1499 // ----------------------------------------------------------------------------
1543 // Regular expressions 1500 // Regular expressions
1544 1501
1545 1502
1546 class RegExpVisitor BASE_EMBEDDED { 1503 class RegExpVisitor BASE_EMBEDDED {
1547 public: 1504 public:
1548 virtual ~RegExpVisitor() { } 1505 virtual ~RegExpVisitor() { }
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
1919 AST_NODE_LIST(DEF_VISIT) 1876 AST_NODE_LIST(DEF_VISIT)
1920 #undef DEF_VISIT 1877 #undef DEF_VISIT
1921 1878
1922 private: 1879 private:
1923 bool stack_overflow_; 1880 bool stack_overflow_;
1924 }; 1881 };
1925 1882
1926 } } // namespace v8::internal 1883 } } // namespace v8::internal
1927 1884
1928 #endif // V8_AST_H_ 1885 #endif // V8_AST_H_
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698