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

Side by Side Diff: src/ast.h

Issue 9221011: Collect AstNode type information (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: removed VariableProxy::ast_properties_ Created 8 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | src/ast.cc » ('j') | src/ast.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 21 matching lines...) Expand all
32 32
33 #include "assembler.h" 33 #include "assembler.h"
34 #include "factory.h" 34 #include "factory.h"
35 #include "isolate.h" 35 #include "isolate.h"
36 #include "jsregexp.h" 36 #include "jsregexp.h"
37 #include "list-inl.h" 37 #include "list-inl.h"
38 #include "runtime.h" 38 #include "runtime.h"
39 #include "small-pointer-list.h" 39 #include "small-pointer-list.h"
40 #include "smart-array-pointer.h" 40 #include "smart-array-pointer.h"
41 #include "token.h" 41 #include "token.h"
42 #include "utils.h"
42 #include "variables.h" 43 #include "variables.h"
43 #include "zone-inl.h" 44 #include "zone-inl.h"
44 45
45 namespace v8 { 46 namespace v8 {
46 namespace internal { 47 namespace internal {
47 48
48 // The abstract syntax tree is an intermediate, light-weight 49 // The abstract syntax tree is an intermediate, light-weight
49 // representation of the parsed JavaScript code suitable for 50 // representation of the parsed JavaScript code suitable for
50 // compilation to native code. 51 // compilation to native code.
51 52
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 V(BinaryOperation) \ 97 V(BinaryOperation) \
97 V(CompareOperation) \ 98 V(CompareOperation) \
98 V(ThisFunction) 99 V(ThisFunction)
99 100
100 #define AST_NODE_LIST(V) \ 101 #define AST_NODE_LIST(V) \
101 V(Declaration) \ 102 V(Declaration) \
102 STATEMENT_NODE_LIST(V) \ 103 STATEMENT_NODE_LIST(V) \
103 EXPRESSION_NODE_LIST(V) 104 EXPRESSION_NODE_LIST(V)
104 105
105 // Forward declarations 106 // Forward declarations
107 class AstConstructionVisitor;
108 class AstNodeFactory;
109 class AstProperties;
106 class AstVisitor; 110 class AstVisitor;
107 class BreakableStatement; 111 class BreakableStatement;
108 class Expression; 112 class Expression;
109 class IterationStatement; 113 class IterationStatement;
110 class MaterializedLiteral; 114 class MaterializedLiteral;
111 class Statement; 115 class Statement;
112 class TargetCollector; 116 class TargetCollector;
113 class TypeFeedbackOracle; 117 class TypeFeedbackOracle;
114 118
115 class RegExpAlternative; 119 class RegExpAlternative;
(...skipping 13 matching lines...) Expand all
129 AST_NODE_LIST(DEF_FORWARD_DECLARATION) 133 AST_NODE_LIST(DEF_FORWARD_DECLARATION)
130 #undef DEF_FORWARD_DECLARATION 134 #undef DEF_FORWARD_DECLARATION
131 135
132 136
133 // Typedef only introduced to avoid unreadable code. 137 // Typedef only introduced to avoid unreadable code.
134 // Please do appreciate the required space in "> >". 138 // Please do appreciate the required space in "> >".
135 typedef ZoneList<Handle<String> > ZoneStringList; 139 typedef ZoneList<Handle<String> > ZoneStringList;
136 typedef ZoneList<Handle<Object> > ZoneObjectList; 140 typedef ZoneList<Handle<Object> > ZoneObjectList;
137 141
138 142
143 #define DECLARE_NODE_TYPE(type) \
144 virtual void Accept(AstVisitor* v); \
145 virtual AstNode::Type node_type() const { return AstNode::k##type; } \
146
147
139 class AstNode: public ZoneObject { 148 class AstNode: public ZoneObject {
140 public: 149 public:
141 #define DECLARE_TYPE_ENUM(type) k##type, 150 #define DECLARE_TYPE_ENUM(type) k##type,
142 enum Type { 151 enum Type {
143 AST_NODE_LIST(DECLARE_TYPE_ENUM) 152 AST_NODE_LIST(DECLARE_TYPE_ENUM)
144 kInvalid = -1 153 kInvalid = -1
145 }; 154 };
146 #undef DECLARE_TYPE_ENUM 155 #undef DECLARE_TYPE_ENUM
147 156
148 static const int kNoNumber = -1; 157 static const int kNoNumber = -1;
149 static const int kFunctionEntryId = 2; // Using 0 could disguise errors. 158 static const int kFunctionEntryId = 2; // Using 0 could disguise errors.
150 // This AST id identifies the point after the declarations have been 159 // This AST id identifies the point after the declarations have been
151 // visited. We need it to capture the environment effects of declarations 160 // visited. We need it to capture the environment effects of declarations
152 // that emit code (function declarations). 161 // that emit code (function declarations).
153 static const int kDeclarationsId = 3; 162 static const int kDeclarationsId = 3;
154 163
155 // Override ZoneObject's new to count allocated AST nodes.
156 void* operator new(size_t size, Zone* zone) { 164 void* operator new(size_t size, Zone* zone) {
157 Isolate* isolate = zone->isolate();
158 isolate->set_ast_node_count(isolate->ast_node_count() + 1);
159 return zone->New(static_cast<int>(size)); 165 return zone->New(static_cast<int>(size));
160 } 166 }
161 167
162 AstNode() {} 168 AstNode() { }
163 169
164 virtual ~AstNode() { } 170 virtual ~AstNode() { }
165 171
166 virtual void Accept(AstVisitor* v) = 0; 172 virtual void Accept(AstVisitor* v) = 0;
167 virtual Type node_type() const { return kInvalid; } 173 virtual Type node_type() const { return kInvalid; }
168 174
169 // Type testing & conversion functions overridden by concrete subclasses. 175 // Type testing & conversion functions overridden by concrete subclasses.
170 #define DECLARE_NODE_FUNCTIONS(type) \ 176 #define DECLARE_NODE_FUNCTIONS(type) \
171 bool Is##type() { return node_type() == AstNode::k##type; } \ 177 bool Is##type() { return node_type() == AstNode::k##type; } \
172 type* As##type() { return Is##type() ? reinterpret_cast<type*>(this) : NULL; } 178 type* As##type() { return Is##type() ? reinterpret_cast<type*>(this) : NULL; }
173 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) 179 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS)
174 #undef DECLARE_NODE_FUNCTIONS 180 #undef DECLARE_NODE_FUNCTIONS
175 181
176 virtual Statement* AsStatement() { return NULL; } 182 virtual Statement* AsStatement() { return NULL; }
177 virtual Expression* AsExpression() { return NULL; } 183 virtual Expression* AsExpression() { return NULL; }
178 virtual TargetCollector* AsTargetCollector() { return NULL; } 184 virtual TargetCollector* AsTargetCollector() { return NULL; }
179 virtual BreakableStatement* AsBreakableStatement() { return NULL; } 185 virtual BreakableStatement* AsBreakableStatement() { return NULL; }
180 virtual IterationStatement* AsIterationStatement() { return NULL; } 186 virtual IterationStatement* AsIterationStatement() { return NULL; }
181 virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; } 187 virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; }
182 188
183 // True if the node is simple enough for us to inline calls containing it.
184 virtual bool IsInlineable() const = 0;
185
186 static int Count() { return Isolate::Current()->ast_node_count(); }
187 static void ResetIds() { Isolate::Current()->set_ast_node_id(0); } 189 static void ResetIds() { Isolate::Current()->set_ast_node_id(0); }
188 190
189 protected: 191 protected:
190 static unsigned GetNextId(Isolate* isolate) { 192 static unsigned GetNextId(Isolate* isolate) {
191 return ReserveIdRange(isolate, 1); 193 return ReserveIdRange(isolate, 1);
192 } 194 }
193 195
194 static unsigned ReserveIdRange(Isolate* isolate, int n) { 196 static unsigned ReserveIdRange(Isolate* isolate, int n) {
195 unsigned tmp = isolate->ast_node_id(); 197 unsigned tmp = isolate->ast_node_id();
196 isolate->set_ast_node_id(tmp + n); 198 isolate->set_ast_node_id(tmp + n);
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 ZoneStringList* labels_; 371 ZoneStringList* labels_;
370 Type type_; 372 Type type_;
371 Label break_target_; 373 Label break_target_;
372 int entry_id_; 374 int entry_id_;
373 int exit_id_; 375 int exit_id_;
374 }; 376 };
375 377
376 378
377 class Block: public BreakableStatement { 379 class Block: public BreakableStatement {
378 public: 380 public:
379 Block(Isolate* isolate,
380 ZoneStringList* labels,
381 int capacity,
382 bool is_initializer_block)
383 : BreakableStatement(isolate, labels, TARGET_FOR_NAMED_ONLY),
384 statements_(capacity),
385 is_initializer_block_(is_initializer_block),
386 block_scope_(NULL) {
387 }
388
389
390 DECLARE_NODE_TYPE(Block) 381 DECLARE_NODE_TYPE(Block)
391 382
392 virtual bool IsInlineable() const;
393
394 void AddStatement(Statement* statement) { statements_.Add(statement); } 383 void AddStatement(Statement* statement) { statements_.Add(statement); }
395 384
396 ZoneList<Statement*>* statements() { return &statements_; } 385 ZoneList<Statement*>* statements() { return &statements_; }
397 bool is_initializer_block() const { return is_initializer_block_; } 386 bool is_initializer_block() const { return is_initializer_block_; }
398 387
399 Scope* block_scope() const { return block_scope_; } 388 Scope* block_scope() const { return block_scope_; }
400 void set_block_scope(Scope* block_scope) { block_scope_ = block_scope; } 389 void set_block_scope(Scope* block_scope) { block_scope_ = block_scope; }
401 390
391 protected:
392 friend class AstNodeFactory;
393
394 Block(Isolate* isolate,
395 ZoneStringList* labels,
396 int capacity,
397 bool is_initializer_block)
398 : BreakableStatement(isolate, labels, TARGET_FOR_NAMED_ONLY),
399 statements_(capacity),
400 is_initializer_block_(is_initializer_block),
401 block_scope_(NULL) {
402 }
403
402 private: 404 private:
403 ZoneList<Statement*> statements_; 405 ZoneList<Statement*> statements_;
404 bool is_initializer_block_; 406 bool is_initializer_block_;
405 Scope* block_scope_; 407 Scope* block_scope_;
406 }; 408 };
407 409
408 410
409 class Declaration: public AstNode { 411 class Declaration: public AstNode {
410 public: 412 public:
413 DECLARE_NODE_TYPE(Declaration)
414
415 VariableProxy* proxy() const { return proxy_; }
416 VariableMode mode() const { return mode_; }
417 FunctionLiteral* fun() const { return fun_; } // may be NULL
418 bool IsInlineable() const;
419 Scope* scope() const { return scope_; }
420
421 protected:
422 friend class AstNodeFactory;
423
411 Declaration(VariableProxy* proxy, 424 Declaration(VariableProxy* proxy,
412 VariableMode mode, 425 VariableMode mode,
413 FunctionLiteral* fun, 426 FunctionLiteral* fun,
414 Scope* scope) 427 Scope* scope)
415 : proxy_(proxy), 428 : proxy_(proxy),
416 mode_(mode), 429 mode_(mode),
417 fun_(fun), 430 fun_(fun),
418 scope_(scope) { 431 scope_(scope) {
419 ASSERT(mode == VAR || 432 ASSERT(mode == VAR ||
420 mode == CONST || 433 mode == CONST ||
421 mode == CONST_HARMONY || 434 mode == CONST_HARMONY ||
422 mode == LET); 435 mode == LET);
423 // At the moment there are no "const functions"'s in JavaScript... 436 // At the moment there are no "const functions"'s in JavaScript...
424 ASSERT(fun == NULL || mode == VAR || mode == LET); 437 ASSERT(fun == NULL || mode == VAR || mode == LET);
425 } 438 }
426 439
427 DECLARE_NODE_TYPE(Declaration)
428
429 VariableProxy* proxy() const { return proxy_; }
430 VariableMode mode() const { return mode_; }
431 FunctionLiteral* fun() const { return fun_; } // may be NULL
432 virtual bool IsInlineable() const;
433 Scope* scope() const { return scope_; }
434
435 private: 440 private:
436 VariableProxy* proxy_; 441 VariableProxy* proxy_;
437 VariableMode mode_; 442 VariableMode mode_;
438 FunctionLiteral* fun_; 443 FunctionLiteral* fun_;
439 444
440 // Nested scope from which the declaration originated. 445 // Nested scope from which the declaration originated.
441 Scope* scope_; 446 Scope* scope_;
442 }; 447 };
443 448
444 449
(...skipping 25 matching lines...) Expand all
470 475
471 private: 476 private:
472 Statement* body_; 477 Statement* body_;
473 Label continue_target_; 478 Label continue_target_;
474 int osr_entry_id_; 479 int osr_entry_id_;
475 }; 480 };
476 481
477 482
478 class DoWhileStatement: public IterationStatement { 483 class DoWhileStatement: public IterationStatement {
479 public: 484 public:
480 DoWhileStatement(Isolate* isolate, ZoneStringList* labels)
481 : IterationStatement(isolate, labels),
482 cond_(NULL),
483 condition_position_(-1),
484 continue_id_(GetNextId(isolate)),
485 back_edge_id_(GetNextId(isolate)) {
486 }
487
488 DECLARE_NODE_TYPE(DoWhileStatement) 485 DECLARE_NODE_TYPE(DoWhileStatement)
489 486
490 void Initialize(Expression* cond, Statement* body) { 487 void Initialize(Expression* cond, Statement* body) {
491 IterationStatement::Initialize(body); 488 IterationStatement::Initialize(body);
492 cond_ = cond; 489 cond_ = cond;
493 } 490 }
494 491
495 Expression* cond() const { return cond_; } 492 Expression* cond() const { return cond_; }
496 493
497 // Position where condition expression starts. We need it to make 494 // Position where condition expression starts. We need it to make
498 // the loop's condition a breakable location. 495 // the loop's condition a breakable location.
499 int condition_position() { return condition_position_; } 496 int condition_position() { return condition_position_; }
500 void set_condition_position(int pos) { condition_position_ = pos; } 497 void set_condition_position(int pos) { condition_position_ = pos; }
501 498
502 // Bailout support. 499 // Bailout support.
503 virtual int ContinueId() const { return continue_id_; } 500 virtual int ContinueId() const { return continue_id_; }
504 virtual int StackCheckId() const { return back_edge_id_; } 501 virtual int StackCheckId() const { return back_edge_id_; }
505 int BackEdgeId() const { return back_edge_id_; } 502 int BackEdgeId() const { return back_edge_id_; }
506 503
507 virtual bool IsInlineable() const; 504 protected:
505 friend class AstNodeFactory;
506
507 DoWhileStatement(Isolate* isolate, ZoneStringList* labels)
508 : IterationStatement(isolate, labels),
509 cond_(NULL),
510 condition_position_(-1),
511 continue_id_(GetNextId(isolate)),
512 back_edge_id_(GetNextId(isolate)) {
513 }
508 514
509 private: 515 private:
510 Expression* cond_; 516 Expression* cond_;
511 int condition_position_; 517 int condition_position_;
512 int continue_id_; 518 int continue_id_;
513 int back_edge_id_; 519 int back_edge_id_;
514 }; 520 };
515 521
516 522
517 class WhileStatement: public IterationStatement { 523 class WhileStatement: public IterationStatement {
518 public: 524 public:
519 WhileStatement(Isolate* isolate, ZoneStringList* labels)
520 : IterationStatement(isolate, labels),
521 cond_(NULL),
522 may_have_function_literal_(true),
523 body_id_(GetNextId(isolate)) {
524 }
525
526 DECLARE_NODE_TYPE(WhileStatement) 525 DECLARE_NODE_TYPE(WhileStatement)
527 526
528 void Initialize(Expression* cond, Statement* body) { 527 void Initialize(Expression* cond, Statement* body) {
529 IterationStatement::Initialize(body); 528 IterationStatement::Initialize(body);
530 cond_ = cond; 529 cond_ = cond;
531 } 530 }
532 531
533 Expression* cond() const { return cond_; } 532 Expression* cond() const { return cond_; }
534 bool may_have_function_literal() const { 533 bool may_have_function_literal() const {
535 return may_have_function_literal_; 534 return may_have_function_literal_;
536 } 535 }
537 void set_may_have_function_literal(bool value) { 536 void set_may_have_function_literal(bool value) {
538 may_have_function_literal_ = value; 537 may_have_function_literal_ = value;
539 } 538 }
540 virtual bool IsInlineable() const;
541 539
542 // Bailout support. 540 // Bailout support.
543 virtual int ContinueId() const { return EntryId(); } 541 virtual int ContinueId() const { return EntryId(); }
544 virtual int StackCheckId() const { return body_id_; } 542 virtual int StackCheckId() const { return body_id_; }
545 int BodyId() const { return body_id_; } 543 int BodyId() const { return body_id_; }
546 544
545 protected:
546 friend class AstNodeFactory;
547
548 WhileStatement(Isolate* isolate, ZoneStringList* labels)
549 : IterationStatement(isolate, labels),
550 cond_(NULL),
551 may_have_function_literal_(true),
552 body_id_(GetNextId(isolate)) {
553 }
554
547 private: 555 private:
548 Expression* cond_; 556 Expression* cond_;
549 // True if there is a function literal subexpression in the condition. 557 // True if there is a function literal subexpression in the condition.
550 bool may_have_function_literal_; 558 bool may_have_function_literal_;
551 int body_id_; 559 int body_id_;
552 }; 560 };
553 561
554 562
555 class ForStatement: public IterationStatement { 563 class ForStatement: public IterationStatement {
556 public: 564 public:
557 ForStatement(Isolate* isolate, ZoneStringList* labels)
558 : IterationStatement(isolate, labels),
559 init_(NULL),
560 cond_(NULL),
561 next_(NULL),
562 may_have_function_literal_(true),
563 loop_variable_(NULL),
564 continue_id_(GetNextId(isolate)),
565 body_id_(GetNextId(isolate)) {
566 }
567
568 DECLARE_NODE_TYPE(ForStatement) 565 DECLARE_NODE_TYPE(ForStatement)
569 566
570 void Initialize(Statement* init, 567 void Initialize(Statement* init,
571 Expression* cond, 568 Expression* cond,
572 Statement* next, 569 Statement* next,
573 Statement* body) { 570 Statement* body) {
574 IterationStatement::Initialize(body); 571 IterationStatement::Initialize(body);
575 init_ = init; 572 init_ = init;
576 cond_ = cond; 573 cond_ = cond;
577 next_ = next; 574 next_ = next;
(...skipping 11 matching lines...) Expand all
589 } 586 }
590 587
591 // Bailout support. 588 // Bailout support.
592 virtual int ContinueId() const { return continue_id_; } 589 virtual int ContinueId() const { return continue_id_; }
593 virtual int StackCheckId() const { return body_id_; } 590 virtual int StackCheckId() const { return body_id_; }
594 int BodyId() const { return body_id_; } 591 int BodyId() const { return body_id_; }
595 592
596 bool is_fast_smi_loop() { return loop_variable_ != NULL; } 593 bool is_fast_smi_loop() { return loop_variable_ != NULL; }
597 Variable* loop_variable() { return loop_variable_; } 594 Variable* loop_variable() { return loop_variable_; }
598 void set_loop_variable(Variable* var) { loop_variable_ = var; } 595 void set_loop_variable(Variable* var) { loop_variable_ = var; }
599 virtual bool IsInlineable() const; 596
597 protected:
598 friend class AstNodeFactory;
599
600 ForStatement(Isolate* isolate, ZoneStringList* labels)
601 : IterationStatement(isolate, labels),
602 init_(NULL),
603 cond_(NULL),
604 next_(NULL),
605 may_have_function_literal_(true),
606 loop_variable_(NULL),
607 continue_id_(GetNextId(isolate)),
608 body_id_(GetNextId(isolate)) {
609 }
600 610
601 private: 611 private:
602 Statement* init_; 612 Statement* init_;
603 Expression* cond_; 613 Expression* cond_;
604 Statement* next_; 614 Statement* next_;
605 // True if there is a function literal subexpression in the condition. 615 // True if there is a function literal subexpression in the condition.
606 bool may_have_function_literal_; 616 bool may_have_function_literal_;
607 Variable* loop_variable_; 617 Variable* loop_variable_;
608 int continue_id_; 618 int continue_id_;
609 int body_id_; 619 int body_id_;
610 }; 620 };
611 621
612 622
613 class ForInStatement: public IterationStatement { 623 class ForInStatement: public IterationStatement {
614 public: 624 public:
615 ForInStatement(Isolate* isolate, ZoneStringList* labels)
616 : IterationStatement(isolate, labels),
617 each_(NULL),
618 enumerable_(NULL),
619 assignment_id_(GetNextId(isolate)) {
620 }
621
622 DECLARE_NODE_TYPE(ForInStatement) 625 DECLARE_NODE_TYPE(ForInStatement)
623 626
624 void Initialize(Expression* each, Expression* enumerable, Statement* body) { 627 void Initialize(Expression* each, Expression* enumerable, Statement* body) {
625 IterationStatement::Initialize(body); 628 IterationStatement::Initialize(body);
626 each_ = each; 629 each_ = each;
627 enumerable_ = enumerable; 630 enumerable_ = enumerable;
628 } 631 }
629 632
630 Expression* each() const { return each_; } 633 Expression* each() const { return each_; }
631 Expression* enumerable() const { return enumerable_; } 634 Expression* enumerable() const { return enumerable_; }
632 virtual bool IsInlineable() const;
633 635
634 // Bailout support. 636 // Bailout support.
635 int AssignmentId() const { return assignment_id_; } 637 int AssignmentId() const { return assignment_id_; }
636 virtual int ContinueId() const { return EntryId(); } 638 virtual int ContinueId() const { return EntryId(); }
637 virtual int StackCheckId() const { return EntryId(); } 639 virtual int StackCheckId() const { return EntryId(); }
638 640
641 protected:
642 friend class AstNodeFactory;
643
644 ForInStatement(Isolate* isolate, ZoneStringList* labels)
645 : IterationStatement(isolate, labels),
646 each_(NULL),
647 enumerable_(NULL),
648 assignment_id_(GetNextId(isolate)) {
649 }
650
639 private: 651 private:
640 Expression* each_; 652 Expression* each_;
641 Expression* enumerable_; 653 Expression* enumerable_;
642 int assignment_id_; 654 int assignment_id_;
643 }; 655 };
644 656
645 657
646 class ExpressionStatement: public Statement { 658 class ExpressionStatement: public Statement {
647 public: 659 public:
648 explicit ExpressionStatement(Expression* expression)
649 : expression_(expression) { }
650
651 DECLARE_NODE_TYPE(ExpressionStatement) 660 DECLARE_NODE_TYPE(ExpressionStatement)
652 661
653 virtual bool IsInlineable() const;
654
655 void set_expression(Expression* e) { expression_ = e; } 662 void set_expression(Expression* e) { expression_ = e; }
656 Expression* expression() const { return expression_; } 663 Expression* expression() const { return expression_; }
657 664
665 protected:
666 friend class AstNodeFactory;
667
668 explicit ExpressionStatement(Expression* expression)
669 : expression_(expression) { }
670
658 private: 671 private:
659 Expression* expression_; 672 Expression* expression_;
660 }; 673 };
661 674
662 675
663 class ContinueStatement: public Statement { 676 class ContinueStatement: public Statement {
664 public: 677 public:
678 DECLARE_NODE_TYPE(ContinueStatement)
679
680 IterationStatement* target() const { return target_; }
681
682 protected:
683 friend class AstNodeFactory;
684
665 explicit ContinueStatement(IterationStatement* target) 685 explicit ContinueStatement(IterationStatement* target)
666 : target_(target) { } 686 : target_(target) { }
667 687
668 DECLARE_NODE_TYPE(ContinueStatement)
669
670 IterationStatement* target() const { return target_; }
671 virtual bool IsInlineable() const;
672
673 private: 688 private:
674 IterationStatement* target_; 689 IterationStatement* target_;
675 }; 690 };
676 691
677 692
678 class BreakStatement: public Statement { 693 class BreakStatement: public Statement {
679 public: 694 public:
695 DECLARE_NODE_TYPE(BreakStatement)
696
697 BreakableStatement* target() const { return target_; }
698
699 protected:
700 friend class AstNodeFactory;
701
680 explicit BreakStatement(BreakableStatement* target) 702 explicit BreakStatement(BreakableStatement* target)
681 : target_(target) { } 703 : target_(target) { }
682 704
683 DECLARE_NODE_TYPE(BreakStatement)
684
685 BreakableStatement* target() const { return target_; }
686 virtual bool IsInlineable() const;
687
688 private: 705 private:
689 BreakableStatement* target_; 706 BreakableStatement* target_;
690 }; 707 };
691 708
692 709
693 class ReturnStatement: public Statement { 710 class ReturnStatement: public Statement {
694 public: 711 public:
712 DECLARE_NODE_TYPE(ReturnStatement)
713
714 Expression* expression() const { return expression_; }
715
716 protected:
717 friend class AstNodeFactory;
718
695 explicit ReturnStatement(Expression* expression) 719 explicit ReturnStatement(Expression* expression)
696 : expression_(expression) { } 720 : expression_(expression) { }
697 721
698 DECLARE_NODE_TYPE(ReturnStatement)
699
700 Expression* expression() const { return expression_; }
701 virtual bool IsInlineable() const;
702
703 private: 722 private:
704 Expression* expression_; 723 Expression* expression_;
705 }; 724 };
706 725
707 726
708 class WithStatement: public Statement { 727 class WithStatement: public Statement {
709 public: 728 public:
710 WithStatement(Expression* expression, Statement* statement)
711 : expression_(expression), statement_(statement) { }
712
713 DECLARE_NODE_TYPE(WithStatement) 729 DECLARE_NODE_TYPE(WithStatement)
714 730
715 Expression* expression() const { return expression_; } 731 Expression* expression() const { return expression_; }
716 Statement* statement() const { return statement_; } 732 Statement* statement() const { return statement_; }
717 733
718 virtual bool IsInlineable() const; 734 protected:
735 friend class AstNodeFactory;
736
737 WithStatement(Expression* expression, Statement* statement)
738 : expression_(expression),
739 statement_(statement) { }
719 740
720 private: 741 private:
721 Expression* expression_; 742 Expression* expression_;
722 Statement* statement_; 743 Statement* statement_;
723 }; 744 };
724 745
725 746
726 class CaseClause: public ZoneObject { 747 class CaseClause: public ZoneObject {
727 public: 748 public:
728 CaseClause(Isolate* isolate, 749 CaseClause(Isolate* isolate,
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
764 OBJECT_ONLY 785 OBJECT_ONLY
765 }; 786 };
766 CompareTypeFeedback compare_type_; 787 CompareTypeFeedback compare_type_;
767 int compare_id_; 788 int compare_id_;
768 int entry_id_; 789 int entry_id_;
769 }; 790 };
770 791
771 792
772 class SwitchStatement: public BreakableStatement { 793 class SwitchStatement: public BreakableStatement {
773 public: 794 public:
774 SwitchStatement(Isolate* isolate, ZoneStringList* labels)
775 : BreakableStatement(isolate, labels, TARGET_FOR_ANONYMOUS),
776 tag_(NULL),
777 cases_(NULL) {
778 }
779
780
781 DECLARE_NODE_TYPE(SwitchStatement) 795 DECLARE_NODE_TYPE(SwitchStatement)
782 796
783 void Initialize(Expression* tag, ZoneList<CaseClause*>* cases) { 797 void Initialize(Expression* tag, ZoneList<CaseClause*>* cases) {
784 tag_ = tag; 798 tag_ = tag;
785 cases_ = cases; 799 cases_ = cases;
786 } 800 }
787 801
788 Expression* tag() const { return tag_; } 802 Expression* tag() const { return tag_; }
789 ZoneList<CaseClause*>* cases() const { return cases_; } 803 ZoneList<CaseClause*>* cases() const { return cases_; }
790 virtual bool IsInlineable() const; 804
805 protected:
806 friend class AstNodeFactory;
807
808 SwitchStatement(Isolate* isolate, ZoneStringList* labels)
809 : BreakableStatement(isolate, labels, TARGET_FOR_ANONYMOUS),
810 tag_(NULL),
811 cases_(NULL) { }
791 812
792 private: 813 private:
793 Expression* tag_; 814 Expression* tag_;
794 ZoneList<CaseClause*>* cases_; 815 ZoneList<CaseClause*>* cases_;
795 }; 816 };
796 817
797 818
798 // If-statements always have non-null references to their then- and 819 // If-statements always have non-null references to their then- and
799 // else-parts. When parsing if-statements with no explicit else-part, 820 // else-parts. When parsing if-statements with no explicit else-part,
800 // the parser implicitly creates an empty statement. Use the 821 // the parser implicitly creates an empty statement. Use the
801 // HasThenStatement() and HasElseStatement() functions to check if a 822 // HasThenStatement() and HasElseStatement() functions to check if a
802 // given if-statement has a then- or an else-part containing code. 823 // given if-statement has a then- or an else-part containing code.
803 class IfStatement: public Statement { 824 class IfStatement: public Statement {
804 public: 825 public:
805 IfStatement(Isolate* isolate,
806 Expression* condition,
807 Statement* then_statement,
808 Statement* else_statement)
809 : condition_(condition),
810 then_statement_(then_statement),
811 else_statement_(else_statement),
812 if_id_(GetNextId(isolate)),
813 then_id_(GetNextId(isolate)),
814 else_id_(GetNextId(isolate)) {
815 }
816
817 DECLARE_NODE_TYPE(IfStatement) 826 DECLARE_NODE_TYPE(IfStatement)
818 827
819 virtual bool IsInlineable() const;
820
821 bool HasThenStatement() const { return !then_statement()->IsEmpty(); } 828 bool HasThenStatement() const { return !then_statement()->IsEmpty(); }
822 bool HasElseStatement() const { return !else_statement()->IsEmpty(); } 829 bool HasElseStatement() const { return !else_statement()->IsEmpty(); }
823 830
824 Expression* condition() const { return condition_; } 831 Expression* condition() const { return condition_; }
825 Statement* then_statement() const { return then_statement_; } 832 Statement* then_statement() const { return then_statement_; }
826 Statement* else_statement() const { return else_statement_; } 833 Statement* else_statement() const { return else_statement_; }
827 834
828 int IfId() const { return if_id_; } 835 int IfId() const { return if_id_; }
829 int ThenId() const { return then_id_; } 836 int ThenId() const { return then_id_; }
830 int ElseId() const { return else_id_; } 837 int ElseId() const { return else_id_; }
831 838
839 protected:
840 friend class AstNodeFactory;
841
842 IfStatement(Isolate* isolate,
843 Expression* condition,
844 Statement* then_statement,
845 Statement* else_statement)
846 : condition_(condition),
847 then_statement_(then_statement),
848 else_statement_(else_statement),
849 if_id_(GetNextId(isolate)),
850 then_id_(GetNextId(isolate)),
851 else_id_(GetNextId(isolate)) {
852 }
853
832 private: 854 private:
833 Expression* condition_; 855 Expression* condition_;
834 Statement* then_statement_; 856 Statement* then_statement_;
835 Statement* else_statement_; 857 Statement* else_statement_;
836 int if_id_; 858 int if_id_;
837 int then_id_; 859 int then_id_;
838 int else_id_; 860 int else_id_;
839 }; 861 };
840 862
841 863
842 // NOTE: TargetCollectors are represented as nodes to fit in the target 864 // NOTE: TargetCollectors are represented as nodes to fit in the target
843 // stack in the compiler; this should probably be reworked. 865 // stack in the compiler; this should probably be reworked.
844 class TargetCollector: public AstNode { 866 class TargetCollector: public AstNode {
845 public: 867 public:
846 TargetCollector(): targets_(0) { } 868 TargetCollector() : targets_(0) { }
847 869
848 // Adds a jump target to the collector. The collector stores a pointer not 870 // Adds a jump target to the collector. The collector stores a pointer not
849 // a copy of the target to make binding work, so make sure not to pass in 871 // a copy of the target to make binding work, so make sure not to pass in
850 // references to something on the stack. 872 // references to something on the stack.
851 void AddTarget(Label* target); 873 void AddTarget(Label* target);
852 874
853 // Virtual behaviour. TargetCollectors are never part of the AST. 875 // Virtual behaviour. TargetCollectors are never part of the AST.
854 virtual void Accept(AstVisitor* v) { UNREACHABLE(); } 876 virtual void Accept(AstVisitor* v) { UNREACHABLE(); }
855 virtual TargetCollector* AsTargetCollector() { return this; } 877 virtual TargetCollector* AsTargetCollector() { return this; }
856 878
857 ZoneList<Label*>* targets() { return &targets_; } 879 ZoneList<Label*>* targets() { return &targets_; }
858 virtual bool IsInlineable() const;
859 880
860 private: 881 private:
861 ZoneList<Label*> targets_; 882 ZoneList<Label*> targets_;
862 }; 883 };
863 884
864 885
865 class TryStatement: public Statement { 886 class TryStatement: public Statement {
866 public: 887 public:
867 explicit TryStatement(int index, Block* try_block)
868 : index_(index),
869 try_block_(try_block),
870 escaping_targets_(NULL) {
871 }
872
873 void set_escaping_targets(ZoneList<Label*>* targets) { 888 void set_escaping_targets(ZoneList<Label*>* targets) {
874 escaping_targets_ = targets; 889 escaping_targets_ = targets;
875 } 890 }
876 891
877 int index() const { return index_; } 892 int index() const { return index_; }
878 Block* try_block() const { return try_block_; } 893 Block* try_block() const { return try_block_; }
879 ZoneList<Label*>* escaping_targets() const { return escaping_targets_; } 894 ZoneList<Label*>* escaping_targets() const { return escaping_targets_; }
880 virtual bool IsInlineable() const; 895
896 protected:
897 TryStatement(int index, Block* try_block)
898 : index_(index),
899 try_block_(try_block),
900 escaping_targets_(NULL) { }
881 901
882 private: 902 private:
883 // Unique (per-function) index of this handler. This is not an AST ID. 903 // Unique (per-function) index of this handler. This is not an AST ID.
884 int index_; 904 int index_;
885 905
886 Block* try_block_; 906 Block* try_block_;
887 ZoneList<Label*>* escaping_targets_; 907 ZoneList<Label*>* escaping_targets_;
888 }; 908 };
889 909
890 910
891 class TryCatchStatement: public TryStatement { 911 class TryCatchStatement: public TryStatement {
892 public: 912 public:
913 DECLARE_NODE_TYPE(TryCatchStatement)
914
915 Scope* scope() { return scope_; }
916 Variable* variable() { return variable_; }
917 Block* catch_block() const { return catch_block_; }
918
919 protected:
920 friend class AstNodeFactory;
921
893 TryCatchStatement(int index, 922 TryCatchStatement(int index,
894 Block* try_block, 923 Block* try_block,
895 Scope* scope, 924 Scope* scope,
896 Variable* variable, 925 Variable* variable,
897 Block* catch_block) 926 Block* catch_block)
898 : TryStatement(index, try_block), 927 : TryStatement(index, try_block),
899 scope_(scope), 928 scope_(scope),
900 variable_(variable), 929 variable_(variable),
901 catch_block_(catch_block) { 930 catch_block_(catch_block) {
902 } 931 }
903 932
904 DECLARE_NODE_TYPE(TryCatchStatement)
905
906 Scope* scope() { return scope_; }
907 Variable* variable() { return variable_; }
908 Block* catch_block() const { return catch_block_; }
909 virtual bool IsInlineable() const;
910
911 private: 933 private:
912 Scope* scope_; 934 Scope* scope_;
913 Variable* variable_; 935 Variable* variable_;
914 Block* catch_block_; 936 Block* catch_block_;
915 }; 937 };
916 938
917 939
918 class TryFinallyStatement: public TryStatement { 940 class TryFinallyStatement: public TryStatement {
919 public: 941 public:
942 DECLARE_NODE_TYPE(TryFinallyStatement)
943
944 Block* finally_block() const { return finally_block_; }
945
946 protected:
947 friend class AstNodeFactory;
948
920 TryFinallyStatement(int index, Block* try_block, Block* finally_block) 949 TryFinallyStatement(int index, Block* try_block, Block* finally_block)
921 : TryStatement(index, try_block), 950 : TryStatement(index, try_block),
922 finally_block_(finally_block) { } 951 finally_block_(finally_block) { }
923 952
924 DECLARE_NODE_TYPE(TryFinallyStatement)
925
926 Block* finally_block() const { return finally_block_; }
927 virtual bool IsInlineable() const;
928
929 private: 953 private:
930 Block* finally_block_; 954 Block* finally_block_;
931 }; 955 };
932 956
933 957
934 class DebuggerStatement: public Statement { 958 class DebuggerStatement: public Statement {
935 public: 959 public:
936 DECLARE_NODE_TYPE(DebuggerStatement) 960 DECLARE_NODE_TYPE(DebuggerStatement)
937 virtual bool IsInlineable() const; 961
962 protected:
963 friend class AstNodeFactory;
964
965 DebuggerStatement() {}
938 }; 966 };
939 967
940 968
941 class EmptyStatement: public Statement { 969 class EmptyStatement: public Statement {
942 public: 970 public:
943 DECLARE_NODE_TYPE(EmptyStatement) 971 DECLARE_NODE_TYPE(EmptyStatement)
944 972
945 virtual bool IsInlineable() const; 973 protected:
974 friend class AstNodeFactory;
975
976 EmptyStatement() {}
946 }; 977 };
947 978
948 979
949 class Literal: public Expression { 980 class Literal: public Expression {
950 public: 981 public:
951 Literal(Isolate* isolate, Handle<Object> handle)
952 : Expression(isolate), handle_(handle) { }
953
954 DECLARE_NODE_TYPE(Literal) 982 DECLARE_NODE_TYPE(Literal)
955 983
956 // Check if this literal is identical to the other literal. 984 // Check if this literal is identical to the other literal.
957 bool IsIdenticalTo(const Literal* other) const { 985 bool IsIdenticalTo(const Literal* other) const {
958 return handle_.is_identical_to(other->handle_); 986 return handle_.is_identical_to(other->handle_);
959 } 987 }
960 988
961 virtual bool IsPropertyName() { 989 virtual bool IsPropertyName() {
962 if (handle_->IsSymbol()) { 990 if (handle_->IsSymbol()) {
963 uint32_t ignored; 991 uint32_t ignored;
(...skipping 18 matching lines...) Expand all
982 bool IsTrue() const { 1010 bool IsTrue() const {
983 ASSERT(!handle_.is_null()); 1011 ASSERT(!handle_.is_null());
984 return handle_->IsTrue(); 1012 return handle_->IsTrue();
985 } 1013 }
986 bool IsFalse() const { 1014 bool IsFalse() const {
987 ASSERT(!handle_.is_null()); 1015 ASSERT(!handle_.is_null());
988 return handle_->IsFalse(); 1016 return handle_->IsFalse();
989 } 1017 }
990 1018
991 Handle<Object> handle() const { return handle_; } 1019 Handle<Object> handle() const { return handle_; }
992 virtual bool IsInlineable() const; 1020
1021 protected:
1022 friend class AstNodeFactory;
1023
1024 Literal(Isolate* isolate, Handle<Object> handle)
1025 : Expression(isolate),
1026 handle_(handle) { }
993 1027
994 private: 1028 private:
995 Handle<Object> handle_; 1029 Handle<Object> handle_;
996 }; 1030 };
997 1031
998 1032
999 // Base class for literals that needs space in the corresponding JSFunction. 1033 // Base class for literals that needs space in the corresponding JSFunction.
1000 class MaterializedLiteral: public Expression { 1034 class MaterializedLiteral: public Expression {
1001 public: 1035 public:
1002 MaterializedLiteral(Isolate* isolate,
1003 int literal_index,
1004 bool is_simple,
1005 int depth)
1006 : Expression(isolate),
1007 literal_index_(literal_index),
1008 is_simple_(is_simple),
1009 depth_(depth) {}
1010
1011 virtual MaterializedLiteral* AsMaterializedLiteral() { return this; } 1036 virtual MaterializedLiteral* AsMaterializedLiteral() { return this; }
1012 1037
1013 int literal_index() { return literal_index_; } 1038 int literal_index() { return literal_index_; }
1014 1039
1015 // A materialized literal is simple if the values consist of only 1040 // A materialized literal is simple if the values consist of only
1016 // constants and simple object and array literals. 1041 // constants and simple object and array literals.
1017 bool is_simple() const { return is_simple_; } 1042 bool is_simple() const { return is_simple_; }
1018 1043
1019 int depth() const { return depth_; } 1044 int depth() const { return depth_; }
1020 virtual bool IsInlineable() const; 1045
1046 protected:
1047 MaterializedLiteral(Isolate* isolate,
1048 int literal_index,
1049 bool is_simple,
1050 int depth)
1051 : Expression(isolate),
1052 literal_index_(literal_index),
1053 is_simple_(is_simple),
1054 depth_(depth) {}
1021 1055
1022 private: 1056 private:
1023 int literal_index_; 1057 int literal_index_;
1024 bool is_simple_; 1058 bool is_simple_;
1025 int depth_; 1059 int depth_;
1026 }; 1060 };
1027 1061
1028 1062
1029 // An object literal has a boilerplate object that is used 1063 // An object literal has a boilerplate object that is used
1030 // for minimizing the work when constructing it at runtime. 1064 // for minimizing the work when constructing it at runtime.
1031 class ObjectLiteral: public MaterializedLiteral { 1065 class ObjectLiteral: public MaterializedLiteral {
1032 public: 1066 public:
1033 // Property is used for passing information 1067 // Property is used for passing information
1034 // about an object literal's properties from the parser 1068 // about an object literal's properties from the parser
1035 // to the code generator. 1069 // to the code generator.
1036 class Property: public ZoneObject { 1070 class Property: public ZoneObject {
1037 public: 1071 public:
1038 enum Kind { 1072 enum Kind {
1039 CONSTANT, // Property with constant value (compile time). 1073 CONSTANT, // Property with constant value (compile time).
1040 COMPUTED, // Property with computed value (execution time). 1074 COMPUTED, // Property with computed value (execution time).
1041 MATERIALIZED_LITERAL, // Property value is a materialized literal. 1075 MATERIALIZED_LITERAL, // Property value is a materialized literal.
1042 GETTER, SETTER, // Property is an accessor function. 1076 GETTER, SETTER, // Property is an accessor function.
1043 PROTOTYPE // Property is __proto__. 1077 PROTOTYPE // Property is __proto__.
1044 }; 1078 };
1045 1079
1046 Property(Literal* key, Expression* value); 1080 Property(Literal* key, Expression* value);
1047 Property(bool is_getter, FunctionLiteral* value); 1081 Property(bool is_getter, FunctionLiteral* value, AstNodeFactory* factory);
1048 1082
1049 Literal* key() { return key_; } 1083 Literal* key() { return key_; }
1050 Expression* value() { return value_; } 1084 Expression* value() { return value_; }
1051 Kind kind() { return kind_; } 1085 Kind kind() { return kind_; }
1052 1086
1053 bool IsCompileTimeValue(); 1087 bool IsCompileTimeValue();
1054 1088
1055 void set_emit_store(bool emit_store); 1089 void set_emit_store(bool emit_store);
1056 bool emit_store(); 1090 bool emit_store();
1057 1091
1058 private: 1092 private:
1059 Literal* key_; 1093 Literal* key_;
1060 Expression* value_; 1094 Expression* value_;
1061 Kind kind_; 1095 Kind kind_;
1062 bool emit_store_; 1096 bool emit_store_;
1063 }; 1097 };
1064 1098
1065 ObjectLiteral(Isolate* isolate,
1066 Handle<FixedArray> constant_properties,
1067 ZoneList<Property*>* properties,
1068 int literal_index,
1069 bool is_simple,
1070 bool fast_elements,
1071 int depth,
1072 bool has_function)
1073 : MaterializedLiteral(isolate, literal_index, is_simple, depth),
1074 constant_properties_(constant_properties),
1075 properties_(properties),
1076 fast_elements_(fast_elements),
1077 has_function_(has_function) {}
1078
1079 DECLARE_NODE_TYPE(ObjectLiteral) 1099 DECLARE_NODE_TYPE(ObjectLiteral)
1080 1100
1081 Handle<FixedArray> constant_properties() const { 1101 Handle<FixedArray> constant_properties() const {
1082 return constant_properties_; 1102 return constant_properties_;
1083 } 1103 }
1084 ZoneList<Property*>* properties() const { return properties_; } 1104 ZoneList<Property*>* properties() const { return properties_; }
1085 1105
1086 bool fast_elements() const { return fast_elements_; } 1106 bool fast_elements() const { return fast_elements_; }
1087 1107
1088 bool has_function() { return has_function_; } 1108 bool has_function() { return has_function_; }
1089 1109
1090 // Mark all computed expressions that are bound to a key that 1110 // Mark all computed expressions that are bound to a key that
1091 // is shadowed by a later occurrence of the same key. For the 1111 // is shadowed by a later occurrence of the same key. For the
1092 // marked expressions, no store code is emitted. 1112 // marked expressions, no store code is emitted.
1093 void CalculateEmitStore(); 1113 void CalculateEmitStore();
1094 1114
1095 enum Flags { 1115 enum Flags {
1096 kNoFlags = 0, 1116 kNoFlags = 0,
1097 kFastElements = 1, 1117 kFastElements = 1,
1098 kHasFunction = 1 << 1 1118 kHasFunction = 1 << 1
1099 }; 1119 };
1100 1120
1121 protected:
1122 friend class AstNodeFactory;
1123
1124 ObjectLiteral(Isolate* isolate,
1125 Handle<FixedArray> constant_properties,
1126 ZoneList<Property*>* properties,
1127 int literal_index,
1128 bool is_simple,
1129 bool fast_elements,
1130 int depth,
1131 bool has_function)
1132 : MaterializedLiteral(isolate, literal_index, is_simple, depth),
1133 constant_properties_(constant_properties),
1134 properties_(properties),
1135 fast_elements_(fast_elements),
1136 has_function_(has_function) {}
1137
1101 private: 1138 private:
1102 Handle<FixedArray> constant_properties_; 1139 Handle<FixedArray> constant_properties_;
1103 ZoneList<Property*>* properties_; 1140 ZoneList<Property*>* properties_;
1104 bool fast_elements_; 1141 bool fast_elements_;
1105 bool has_function_; 1142 bool has_function_;
1106 }; 1143 };
1107 1144
1108 1145
1109 // Node for capturing a regexp literal. 1146 // Node for capturing a regexp literal.
1110 class RegExpLiteral: public MaterializedLiteral { 1147 class RegExpLiteral: public MaterializedLiteral {
1111 public: 1148 public:
1149 DECLARE_NODE_TYPE(RegExpLiteral)
1150
1151 Handle<String> pattern() const { return pattern_; }
1152 Handle<String> flags() const { return flags_; }
1153
1154 protected:
1155 friend class AstNodeFactory;
1156
1112 RegExpLiteral(Isolate* isolate, 1157 RegExpLiteral(Isolate* isolate,
1113 Handle<String> pattern, 1158 Handle<String> pattern,
1114 Handle<String> flags, 1159 Handle<String> flags,
1115 int literal_index) 1160 int literal_index)
1116 : MaterializedLiteral(isolate, literal_index, false, 1), 1161 : MaterializedLiteral(isolate, literal_index, false, 1),
1117 pattern_(pattern), 1162 pattern_(pattern),
1118 flags_(flags) {} 1163 flags_(flags) {}
1119 1164
1120 DECLARE_NODE_TYPE(RegExpLiteral)
1121
1122 Handle<String> pattern() const { return pattern_; }
1123 Handle<String> flags() const { return flags_; }
1124
1125 private: 1165 private:
1126 Handle<String> pattern_; 1166 Handle<String> pattern_;
1127 Handle<String> flags_; 1167 Handle<String> flags_;
1128 }; 1168 };
1129 1169
1130 // An array literal has a literals object that is used 1170 // An array literal has a literals object that is used
1131 // for minimizing the work when constructing it at runtime. 1171 // for minimizing the work when constructing it at runtime.
1132 class ArrayLiteral: public MaterializedLiteral { 1172 class ArrayLiteral: public MaterializedLiteral {
1133 public: 1173 public:
1174 DECLARE_NODE_TYPE(ArrayLiteral)
1175
1176 Handle<FixedArray> constant_elements() const { return constant_elements_; }
1177 ZoneList<Expression*>* values() const { return values_; }
1178
1179 // Return an AST id for an element that is used in simulate instructions.
1180 int GetIdForElement(int i) { return first_element_id_ + i; }
1181
1182 protected:
1183 friend class AstNodeFactory;
1184
1134 ArrayLiteral(Isolate* isolate, 1185 ArrayLiteral(Isolate* isolate,
1135 Handle<FixedArray> constant_elements, 1186 Handle<FixedArray> constant_elements,
1136 ZoneList<Expression*>* values, 1187 ZoneList<Expression*>* values,
1137 int literal_index, 1188 int literal_index,
1138 bool is_simple, 1189 bool is_simple,
1139 int depth) 1190 int depth)
1140 : MaterializedLiteral(isolate, literal_index, is_simple, depth), 1191 : MaterializedLiteral(isolate, literal_index, is_simple, depth),
1141 constant_elements_(constant_elements), 1192 constant_elements_(constant_elements),
1142 values_(values), 1193 values_(values),
1143 first_element_id_(ReserveIdRange(isolate, values->length())) {} 1194 first_element_id_(ReserveIdRange(isolate, values->length())) {}
1144 1195
1145 DECLARE_NODE_TYPE(ArrayLiteral)
1146
1147 Handle<FixedArray> constant_elements() const { return constant_elements_; }
1148 ZoneList<Expression*>* values() const { return values_; }
1149
1150 // Return an AST id for an element that is used in simulate instructions.
1151 int GetIdForElement(int i) { return first_element_id_ + i; }
1152
1153 private: 1196 private:
1154 Handle<FixedArray> constant_elements_; 1197 Handle<FixedArray> constant_elements_;
1155 ZoneList<Expression*>* values_; 1198 ZoneList<Expression*>* values_;
1156 int first_element_id_; 1199 int first_element_id_;
1157 }; 1200 };
1158 1201
1159 1202
1160 class VariableProxy: public Expression { 1203 class VariableProxy: public Expression {
1161 public: 1204 public:
1162 VariableProxy(Isolate* isolate, Variable* var);
1163
1164 VariableProxy(Isolate* isolate,
1165 Handle<String> name,
1166 bool is_this,
1167 int position = RelocInfo::kNoPosition);
1168
1169 DECLARE_NODE_TYPE(VariableProxy) 1205 DECLARE_NODE_TYPE(VariableProxy)
1170 1206
1171 virtual bool IsValidLeftHandSide() { 1207 virtual bool IsValidLeftHandSide() {
1172 return var_ == NULL ? true : var_->IsValidLeftHandSide(); 1208 return var_ == NULL ? true : var_->IsValidLeftHandSide();
1173 } 1209 }
1174 1210
1175 virtual bool IsInlineable() const;
1176
1177 bool IsVariable(Handle<String> n) { 1211 bool IsVariable(Handle<String> n) {
1178 return !is_this() && name().is_identical_to(n); 1212 return !is_this() && name().is_identical_to(n);
1179 } 1213 }
1180 1214
1181 bool IsArguments() { return var_ != NULL && var_->is_arguments(); } 1215 bool IsArguments() { return var_ != NULL && var_->is_arguments(); }
1182 1216
1183 bool IsLValue() { 1217 bool IsLValue() {
1184 return is_lvalue_; 1218 return is_lvalue_;
1185 } 1219 }
1186 1220
1187 Handle<String> name() const { return name_; } 1221 Handle<String> name() const { return name_; }
1188 Variable* var() const { return var_; } 1222 Variable* var() const { return var_; }
1189 bool is_this() const { return is_this_; } 1223 bool is_this() const { return is_this_; }
1190 int position() const { return position_; } 1224 int position() const { return position_; }
1191 1225
1192 void MarkAsTrivial() { is_trivial_ = true; } 1226 void MarkAsTrivial() { is_trivial_ = true; }
1193 void MarkAsLValue() { is_lvalue_ = true; } 1227 void MarkAsLValue() { is_lvalue_ = true; }
1194 1228
1195 // Bind this proxy to the variable var. 1229 // Bind this proxy to the variable var.
1196 void BindTo(Variable* var); 1230 void BindTo(Variable* var);
1197 1231
1198 protected: 1232 protected:
1233 friend class AstNodeFactory;
1234
1235 VariableProxy(Isolate* isolate, Variable* var);
1236
1237 VariableProxy(Isolate* isolate,
1238 Handle<String> name,
1239 bool is_this,
1240 int position);
1241
1199 Handle<String> name_; 1242 Handle<String> name_;
1200 Variable* var_; // resolved variable, or NULL 1243 Variable* var_; // resolved variable, or NULL
1201 bool is_this_; 1244 bool is_this_;
1202 bool is_trivial_; 1245 bool is_trivial_;
1203 // True if this variable proxy is being used in an assignment 1246 // True if this variable proxy is being used in an assignment
1204 // or with a increment/decrement operator. 1247 // or with a increment/decrement operator.
1205 bool is_lvalue_; 1248 bool is_lvalue_;
1206 int position_; 1249 int position_;
1207 }; 1250 };
1208 1251
1209 1252
1210 class Property: public Expression { 1253 class Property: public Expression {
1211 public: 1254 public:
1212 Property(Isolate* isolate,
1213 Expression* obj,
1214 Expression* key,
1215 int pos)
1216 : Expression(isolate),
1217 obj_(obj),
1218 key_(key),
1219 pos_(pos),
1220 is_monomorphic_(false),
1221 is_array_length_(false),
1222 is_string_length_(false),
1223 is_string_access_(false),
1224 is_function_prototype_(false) { }
1225
1226 DECLARE_NODE_TYPE(Property) 1255 DECLARE_NODE_TYPE(Property)
1227 1256
1228 virtual bool IsValidLeftHandSide() { return true; } 1257 virtual bool IsValidLeftHandSide() { return true; }
1229 virtual bool IsInlineable() const;
1230 1258
1231 Expression* obj() const { return obj_; } 1259 Expression* obj() const { return obj_; }
1232 Expression* key() const { return key_; } 1260 Expression* key() const { return key_; }
1233 virtual int position() const { return pos_; } 1261 virtual int position() const { return pos_; }
1234 1262
1235 bool IsStringLength() const { return is_string_length_; } 1263 bool IsStringLength() const { return is_string_length_; }
1236 bool IsStringAccess() const { return is_string_access_; } 1264 bool IsStringAccess() const { return is_string_access_; }
1237 bool IsFunctionPrototype() const { return is_function_prototype_; } 1265 bool IsFunctionPrototype() const { return is_function_prototype_; }
1238 1266
1239 // Type feedback information. 1267 // Type feedback information.
1240 void RecordTypeFeedback(TypeFeedbackOracle* oracle); 1268 void RecordTypeFeedback(TypeFeedbackOracle* oracle);
1241 virtual bool IsMonomorphic() { return is_monomorphic_; } 1269 virtual bool IsMonomorphic() { return is_monomorphic_; }
1242 virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; } 1270 virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; }
1243 bool IsArrayLength() { return is_array_length_; } 1271 bool IsArrayLength() { return is_array_length_; }
1244 1272
1273 protected:
1274 friend class AstNodeFactory;
1275
1276 Property(Isolate* isolate,
1277 Expression* obj,
1278 Expression* key,
1279 int pos)
1280 : Expression(isolate),
1281 obj_(obj),
1282 key_(key),
1283 pos_(pos),
1284 is_monomorphic_(false),
1285 is_array_length_(false),
1286 is_string_length_(false),
1287 is_string_access_(false),
1288 is_function_prototype_(false) { }
1289
1245 private: 1290 private:
1246 Expression* obj_; 1291 Expression* obj_;
1247 Expression* key_; 1292 Expression* key_;
1248 int pos_; 1293 int pos_;
1249 1294
1250 SmallMapList receiver_types_; 1295 SmallMapList receiver_types_;
1251 bool is_monomorphic_ : 1; 1296 bool is_monomorphic_ : 1;
1252 bool is_array_length_ : 1; 1297 bool is_array_length_ : 1;
1253 bool is_string_length_ : 1; 1298 bool is_string_length_ : 1;
1254 bool is_string_access_ : 1; 1299 bool is_string_access_ : 1;
1255 bool is_function_prototype_ : 1; 1300 bool is_function_prototype_ : 1;
1256 }; 1301 };
1257 1302
1258 1303
1259 class Call: public Expression { 1304 class Call: public Expression {
1260 public: 1305 public:
1261 Call(Isolate* isolate,
1262 Expression* expression,
1263 ZoneList<Expression*>* arguments,
1264 int pos)
1265 : Expression(isolate),
1266 expression_(expression),
1267 arguments_(arguments),
1268 pos_(pos),
1269 is_monomorphic_(false),
1270 check_type_(RECEIVER_MAP_CHECK),
1271 return_id_(GetNextId(isolate)) {
1272 }
1273
1274 DECLARE_NODE_TYPE(Call) 1306 DECLARE_NODE_TYPE(Call)
1275 1307
1276 virtual bool IsInlineable() const;
1277
1278 Expression* expression() const { return expression_; } 1308 Expression* expression() const { return expression_; }
1279 ZoneList<Expression*>* arguments() const { return arguments_; } 1309 ZoneList<Expression*>* arguments() const { return arguments_; }
1280 virtual int position() const { return pos_; } 1310 virtual int position() const { return pos_; }
1281 1311
1282 void RecordTypeFeedback(TypeFeedbackOracle* oracle, 1312 void RecordTypeFeedback(TypeFeedbackOracle* oracle,
1283 CallKind call_kind); 1313 CallKind call_kind);
1284 virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; } 1314 virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; }
1285 virtual bool IsMonomorphic() { return is_monomorphic_; } 1315 virtual bool IsMonomorphic() { return is_monomorphic_; }
1286 CheckType check_type() const { return check_type_; } 1316 CheckType check_type() const { return check_type_; }
1287 Handle<JSFunction> target() { return target_; } 1317 Handle<JSFunction> target() { return target_; }
1288 Handle<JSObject> holder() { return holder_; } 1318 Handle<JSObject> holder() { return holder_; }
1289 Handle<JSGlobalPropertyCell> cell() { return cell_; } 1319 Handle<JSGlobalPropertyCell> cell() { return cell_; }
1290 1320
1291 bool ComputeTarget(Handle<Map> type, Handle<String> name); 1321 bool ComputeTarget(Handle<Map> type, Handle<String> name);
1292 bool ComputeGlobalTarget(Handle<GlobalObject> global, LookupResult* lookup); 1322 bool ComputeGlobalTarget(Handle<GlobalObject> global, LookupResult* lookup);
1293 1323
1294 // Bailout support. 1324 // Bailout support.
1295 int ReturnId() const { return return_id_; } 1325 int ReturnId() const { return return_id_; }
1296 1326
1297 #ifdef DEBUG 1327 #ifdef DEBUG
1298 // Used to assert that the FullCodeGenerator records the return site. 1328 // Used to assert that the FullCodeGenerator records the return site.
1299 bool return_is_recorded_; 1329 bool return_is_recorded_;
1300 #endif 1330 #endif
1301 1331
1332 protected:
1333 friend class AstNodeFactory;
1334
1335 Call(Isolate* isolate,
1336 Expression* expression,
1337 ZoneList<Expression*>* arguments,
1338 int pos)
1339 : Expression(isolate),
1340 expression_(expression),
1341 arguments_(arguments),
1342 pos_(pos),
1343 is_monomorphic_(false),
1344 check_type_(RECEIVER_MAP_CHECK),
1345 return_id_(GetNextId(isolate)) { }
1346
1302 private: 1347 private:
1303 Expression* expression_; 1348 Expression* expression_;
1304 ZoneList<Expression*>* arguments_; 1349 ZoneList<Expression*>* arguments_;
1305 int pos_; 1350 int pos_;
1306 1351
1307 bool is_monomorphic_; 1352 bool is_monomorphic_;
1308 CheckType check_type_; 1353 CheckType check_type_;
1309 SmallMapList receiver_types_; 1354 SmallMapList receiver_types_;
1310 Handle<JSFunction> target_; 1355 Handle<JSFunction> target_;
1311 Handle<JSObject> holder_; 1356 Handle<JSObject> holder_;
1312 Handle<JSGlobalPropertyCell> cell_; 1357 Handle<JSGlobalPropertyCell> cell_;
1313 1358
1314 int return_id_; 1359 int return_id_;
1315 }; 1360 };
1316 1361
1317 1362
1318 class CallNew: public Expression { 1363 class CallNew: public Expression {
1319 public: 1364 public:
1365 DECLARE_NODE_TYPE(CallNew)
1366
1367 Expression* expression() const { return expression_; }
1368 ZoneList<Expression*>* arguments() const { return arguments_; }
1369 virtual int position() const { return pos_; }
1370
1371 protected:
1372 friend class AstNodeFactory;
1373
1320 CallNew(Isolate* isolate, 1374 CallNew(Isolate* isolate,
1321 Expression* expression, 1375 Expression* expression,
1322 ZoneList<Expression*>* arguments, 1376 ZoneList<Expression*>* arguments,
1323 int pos) 1377 int pos)
1324 : Expression(isolate), 1378 : Expression(isolate),
1325 expression_(expression), 1379 expression_(expression),
1326 arguments_(arguments), 1380 arguments_(arguments),
1327 pos_(pos) { } 1381 pos_(pos) { }
1328 1382
1329 DECLARE_NODE_TYPE(CallNew)
1330
1331 virtual bool IsInlineable() const;
1332
1333 Expression* expression() const { return expression_; }
1334 ZoneList<Expression*>* arguments() const { return arguments_; }
1335 virtual int position() const { return pos_; }
1336
1337 private: 1383 private:
1338 Expression* expression_; 1384 Expression* expression_;
1339 ZoneList<Expression*>* arguments_; 1385 ZoneList<Expression*>* arguments_;
1340 int pos_; 1386 int pos_;
1341 }; 1387 };
1342 1388
1343 1389
1344 // The CallRuntime class does not represent any official JavaScript 1390 // The CallRuntime class does not represent any official JavaScript
1345 // language construct. Instead it is used to call a C or JS function 1391 // language construct. Instead it is used to call a C or JS function
1346 // with a set of arguments. This is used from the builtins that are 1392 // with a set of arguments. This is used from the builtins that are
1347 // implemented in JavaScript (see "v8natives.js"). 1393 // implemented in JavaScript (see "v8natives.js").
1348 class CallRuntime: public Expression { 1394 class CallRuntime: public Expression {
1349 public: 1395 public:
1396 DECLARE_NODE_TYPE(CallRuntime)
1397
1398 Handle<String> name() const { return name_; }
1399 const Runtime::Function* function() const { return function_; }
1400 ZoneList<Expression*>* arguments() const { return arguments_; }
1401 bool is_jsruntime() const { return function_ == NULL; }
1402
1403 protected:
1404 friend class AstNodeFactory;
1405
1350 CallRuntime(Isolate* isolate, 1406 CallRuntime(Isolate* isolate,
1351 Handle<String> name, 1407 Handle<String> name,
1352 const Runtime::Function* function, 1408 const Runtime::Function* function,
1353 ZoneList<Expression*>* arguments) 1409 ZoneList<Expression*>* arguments)
1354 : Expression(isolate), 1410 : Expression(isolate),
1355 name_(name), 1411 name_(name),
1356 function_(function), 1412 function_(function),
1357 arguments_(arguments) { } 1413 arguments_(arguments) { }
1358 1414
1359 DECLARE_NODE_TYPE(CallRuntime)
1360
1361 virtual bool IsInlineable() const;
1362
1363 Handle<String> name() const { return name_; }
1364 const Runtime::Function* function() const { return function_; }
1365 ZoneList<Expression*>* arguments() const { return arguments_; }
1366 bool is_jsruntime() const { return function_ == NULL; }
1367
1368 private: 1415 private:
1369 Handle<String> name_; 1416 Handle<String> name_;
1370 const Runtime::Function* function_; 1417 const Runtime::Function* function_;
1371 ZoneList<Expression*>* arguments_; 1418 ZoneList<Expression*>* arguments_;
1372 }; 1419 };
1373 1420
1374 1421
1375 class UnaryOperation: public Expression { 1422 class UnaryOperation: public Expression {
1376 public: 1423 public:
1424 DECLARE_NODE_TYPE(UnaryOperation)
1425
1426 virtual bool ResultOverwriteAllowed();
1427
1428 Token::Value op() const { return op_; }
1429 Expression* expression() const { return expression_; }
1430 virtual int position() const { return pos_; }
1431
1432 int MaterializeTrueId() { return materialize_true_id_; }
1433 int MaterializeFalseId() { return materialize_false_id_; }
1434
1435 protected:
1436 friend class AstNodeFactory;
1437
1377 UnaryOperation(Isolate* isolate, 1438 UnaryOperation(Isolate* isolate,
1378 Token::Value op, 1439 Token::Value op,
1379 Expression* expression, 1440 Expression* expression,
1380 int pos) 1441 int pos)
1381 : Expression(isolate), 1442 : Expression(isolate),
1382 op_(op), 1443 op_(op),
1383 expression_(expression), 1444 expression_(expression),
1384 pos_(pos), 1445 pos_(pos),
1385 materialize_true_id_(AstNode::kNoNumber), 1446 materialize_true_id_(AstNode::kNoNumber),
1386 materialize_false_id_(AstNode::kNoNumber) { 1447 materialize_false_id_(AstNode::kNoNumber) {
1387 ASSERT(Token::IsUnaryOp(op)); 1448 ASSERT(Token::IsUnaryOp(op));
1388 if (op == Token::NOT) { 1449 if (op == Token::NOT) {
1389 materialize_true_id_ = GetNextId(isolate); 1450 materialize_true_id_ = GetNextId(isolate);
1390 materialize_false_id_ = GetNextId(isolate); 1451 materialize_false_id_ = GetNextId(isolate);
1391 } 1452 }
1392 } 1453 }
1393 1454
1394 DECLARE_NODE_TYPE(UnaryOperation)
1395
1396 virtual bool IsInlineable() const;
1397
1398 virtual bool ResultOverwriteAllowed();
1399
1400 Token::Value op() const { return op_; }
1401 Expression* expression() const { return expression_; }
1402 virtual int position() const { return pos_; }
1403
1404 int MaterializeTrueId() { return materialize_true_id_; }
1405 int MaterializeFalseId() { return materialize_false_id_; }
1406
1407 private: 1455 private:
1408 Token::Value op_; 1456 Token::Value op_;
1409 Expression* expression_; 1457 Expression* expression_;
1410 int pos_; 1458 int pos_;
1411 1459
1412 // For unary not (Token::NOT), the AST ids where true and false will 1460 // For unary not (Token::NOT), the AST ids where true and false will
1413 // actually be materialized, respectively. 1461 // actually be materialized, respectively.
1414 int materialize_true_id_; 1462 int materialize_true_id_;
1415 int materialize_false_id_; 1463 int materialize_false_id_;
1416 }; 1464 };
1417 1465
1418 1466
1419 class BinaryOperation: public Expression { 1467 class BinaryOperation: public Expression {
1420 public: 1468 public:
1421 BinaryOperation(Isolate* isolate,
1422 Token::Value op,
1423 Expression* left,
1424 Expression* right,
1425 int pos)
1426 : Expression(isolate), op_(op), left_(left), right_(right), pos_(pos) {
1427 ASSERT(Token::IsBinaryOp(op));
1428 right_id_ = (op == Token::AND || op == Token::OR)
1429 ? static_cast<int>(GetNextId(isolate))
1430 : AstNode::kNoNumber;
1431 }
1432
1433 DECLARE_NODE_TYPE(BinaryOperation) 1469 DECLARE_NODE_TYPE(BinaryOperation)
1434 1470
1435 virtual bool IsInlineable() const;
1436
1437 virtual bool ResultOverwriteAllowed(); 1471 virtual bool ResultOverwriteAllowed();
1438 1472
1439 Token::Value op() const { return op_; } 1473 Token::Value op() const { return op_; }
1440 Expression* left() const { return left_; } 1474 Expression* left() const { return left_; }
1441 Expression* right() const { return right_; } 1475 Expression* right() const { return right_; }
1442 virtual int position() const { return pos_; } 1476 virtual int position() const { return pos_; }
1443 1477
1444 // Bailout support. 1478 // Bailout support.
1445 int RightId() const { return right_id_; } 1479 int RightId() const { return right_id_; }
1446 1480
1481 protected:
1482 friend class AstNodeFactory;
1483
1484 BinaryOperation(Isolate* isolate,
1485 Token::Value op,
1486 Expression* left,
1487 Expression* right,
1488 int pos)
1489 : Expression(isolate), op_(op), left_(left), right_(right), pos_(pos) {
1490 ASSERT(Token::IsBinaryOp(op));
1491 right_id_ = (op == Token::AND || op == Token::OR)
1492 ? static_cast<int>(GetNextId(isolate))
fschneider 2012/02/06 14:14:29 GetNextId returns unsigned, yet all ast ids are st
Jakob Kummerow 2012/02/07 12:38:37 Done.
1493 : AstNode::kNoNumber;
1494 }
1495
1447 private: 1496 private:
1448 Token::Value op_; 1497 Token::Value op_;
1449 Expression* left_; 1498 Expression* left_;
1450 Expression* right_; 1499 Expression* right_;
1451 int pos_; 1500 int pos_;
1452 // The short-circuit logical operations have an AST ID for their 1501 // The short-circuit logical operations have an AST ID for their
1453 // right-hand subexpression. 1502 // right-hand subexpression.
1454 int right_id_; 1503 int right_id_;
1455 }; 1504 };
1456 1505
1457 1506
1458 class CountOperation: public Expression { 1507 class CountOperation: public Expression {
1459 public: 1508 public:
1460 CountOperation(Isolate* isolate,
1461 Token::Value op,
1462 bool is_prefix,
1463 Expression* expr,
1464 int pos)
1465 : Expression(isolate),
1466 op_(op),
1467 is_prefix_(is_prefix),
1468 expression_(expr),
1469 pos_(pos),
1470 assignment_id_(GetNextId(isolate)),
1471 count_id_(GetNextId(isolate)) {}
1472
1473 DECLARE_NODE_TYPE(CountOperation) 1509 DECLARE_NODE_TYPE(CountOperation)
1474 1510
1475 bool is_prefix() const { return is_prefix_; } 1511 bool is_prefix() const { return is_prefix_; }
1476 bool is_postfix() const { return !is_prefix_; } 1512 bool is_postfix() const { return !is_prefix_; }
1477 1513
1478 Token::Value op() const { return op_; } 1514 Token::Value op() const { return op_; }
1479 Token::Value binary_op() { 1515 Token::Value binary_op() {
1480 return (op() == Token::INC) ? Token::ADD : Token::SUB; 1516 return (op() == Token::INC) ? Token::ADD : Token::SUB;
1481 } 1517 }
1482 1518
1483 Expression* expression() const { return expression_; } 1519 Expression* expression() const { return expression_; }
1484 virtual int position() const { return pos_; } 1520 virtual int position() const { return pos_; }
1485 1521
1486 virtual void MarkAsStatement() { is_prefix_ = true; } 1522 virtual void MarkAsStatement() { is_prefix_ = true; }
1487 1523
1488 virtual bool IsInlineable() const;
1489
1490 void RecordTypeFeedback(TypeFeedbackOracle* oracle); 1524 void RecordTypeFeedback(TypeFeedbackOracle* oracle);
1491 virtual bool IsMonomorphic() { return is_monomorphic_; } 1525 virtual bool IsMonomorphic() { return is_monomorphic_; }
1492 virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; } 1526 virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; }
1493 1527
1494 // Bailout support. 1528 // Bailout support.
1495 int AssignmentId() const { return assignment_id_; } 1529 int AssignmentId() const { return assignment_id_; }
1496 int CountId() const { return count_id_; } 1530 int CountId() const { return count_id_; }
1497 1531
1532 protected:
1533 friend class AstNodeFactory;
1534
1535 CountOperation(Isolate* isolate,
1536 Token::Value op,
1537 bool is_prefix,
1538 Expression* expr,
1539 int pos)
1540 : Expression(isolate),
1541 op_(op),
1542 is_prefix_(is_prefix),
1543 expression_(expr),
1544 pos_(pos),
1545 assignment_id_(GetNextId(isolate)),
1546 count_id_(GetNextId(isolate)) {}
1547
1498 private: 1548 private:
1499 Token::Value op_; 1549 Token::Value op_;
1500 bool is_prefix_; 1550 bool is_prefix_;
1501 bool is_monomorphic_; 1551 bool is_monomorphic_;
1502 Expression* expression_; 1552 Expression* expression_;
1503 int pos_; 1553 int pos_;
1504 int assignment_id_; 1554 int assignment_id_;
1505 int count_id_; 1555 int count_id_;
1506 SmallMapList receiver_types_; 1556 SmallMapList receiver_types_;
1507 }; 1557 };
1508 1558
1509 1559
1510 class CompareOperation: public Expression { 1560 class CompareOperation: public Expression {
1511 public: 1561 public:
1512 CompareOperation(Isolate* isolate,
1513 Token::Value op,
1514 Expression* left,
1515 Expression* right,
1516 int pos)
1517 : Expression(isolate),
1518 op_(op),
1519 left_(left),
1520 right_(right),
1521 pos_(pos),
1522 compare_type_(NONE) {
1523 ASSERT(Token::IsCompareOp(op));
1524 }
1525
1526 DECLARE_NODE_TYPE(CompareOperation) 1562 DECLARE_NODE_TYPE(CompareOperation)
1527 1563
1528 Token::Value op() const { return op_; } 1564 Token::Value op() const { return op_; }
1529 Expression* left() const { return left_; } 1565 Expression* left() const { return left_; }
1530 Expression* right() const { return right_; } 1566 Expression* right() const { return right_; }
1531 virtual int position() const { return pos_; } 1567 virtual int position() const { return pos_; }
1532 1568
1533 virtual bool IsInlineable() const;
1534
1535 // Type feedback information. 1569 // Type feedback information.
1536 void RecordTypeFeedback(TypeFeedbackOracle* oracle); 1570 void RecordTypeFeedback(TypeFeedbackOracle* oracle);
1537 bool IsSmiCompare() { return compare_type_ == SMI_ONLY; } 1571 bool IsSmiCompare() { return compare_type_ == SMI_ONLY; }
1538 bool IsObjectCompare() { return compare_type_ == OBJECT_ONLY; } 1572 bool IsObjectCompare() { return compare_type_ == OBJECT_ONLY; }
1539 1573
1540 // Match special cases. 1574 // Match special cases.
1541 bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check); 1575 bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check);
1542 bool IsLiteralCompareUndefined(Expression** expr); 1576 bool IsLiteralCompareUndefined(Expression** expr);
1543 bool IsLiteralCompareNull(Expression** expr); 1577 bool IsLiteralCompareNull(Expression** expr);
1544 1578
1579 protected:
1580 friend class AstNodeFactory;
1581
1582 CompareOperation(Isolate* isolate,
1583 Token::Value op,
1584 Expression* left,
1585 Expression* right,
1586 int pos)
1587 : Expression(isolate),
1588 op_(op),
1589 left_(left),
1590 right_(right),
1591 pos_(pos),
1592 compare_type_(NONE) {
1593 ASSERT(Token::IsCompareOp(op));
1594 }
1595
1545 private: 1596 private:
1546 Token::Value op_; 1597 Token::Value op_;
1547 Expression* left_; 1598 Expression* left_;
1548 Expression* right_; 1599 Expression* right_;
1549 int pos_; 1600 int pos_;
1550 1601
1551 enum CompareTypeFeedback { NONE, SMI_ONLY, OBJECT_ONLY }; 1602 enum CompareTypeFeedback { NONE, SMI_ONLY, OBJECT_ONLY };
1552 CompareTypeFeedback compare_type_; 1603 CompareTypeFeedback compare_type_;
1553 }; 1604 };
1554 1605
1555 1606
1556 class Conditional: public Expression { 1607 class Conditional: public Expression {
1557 public: 1608 public:
1609 DECLARE_NODE_TYPE(Conditional)
1610
1611 Expression* condition() const { return condition_; }
1612 Expression* then_expression() const { return then_expression_; }
1613 Expression* else_expression() const { return else_expression_; }
1614
1615 int then_expression_position() const { return then_expression_position_; }
1616 int else_expression_position() const { return else_expression_position_; }
1617
1618 int ThenId() const { return then_id_; }
1619 int ElseId() const { return else_id_; }
1620
1621 protected:
1622 friend class AstNodeFactory;
1623
1558 Conditional(Isolate* isolate, 1624 Conditional(Isolate* isolate,
1559 Expression* condition, 1625 Expression* condition,
1560 Expression* then_expression, 1626 Expression* then_expression,
1561 Expression* else_expression, 1627 Expression* else_expression,
1562 int then_expression_position, 1628 int then_expression_position,
1563 int else_expression_position) 1629 int else_expression_position)
1564 : Expression(isolate), 1630 : Expression(isolate),
1565 condition_(condition), 1631 condition_(condition),
1566 then_expression_(then_expression), 1632 then_expression_(then_expression),
1567 else_expression_(else_expression), 1633 else_expression_(else_expression),
1568 then_expression_position_(then_expression_position), 1634 then_expression_position_(then_expression_position),
1569 else_expression_position_(else_expression_position), 1635 else_expression_position_(else_expression_position),
1570 then_id_(GetNextId(isolate)), 1636 then_id_(GetNextId(isolate)),
1571 else_id_(GetNextId(isolate)) { 1637 else_id_(GetNextId(isolate)) { }
1572 }
1573
1574 DECLARE_NODE_TYPE(Conditional)
1575
1576 virtual bool IsInlineable() const;
1577
1578 Expression* condition() const { return condition_; }
1579 Expression* then_expression() const { return then_expression_; }
1580 Expression* else_expression() const { return else_expression_; }
1581
1582 int then_expression_position() const { return then_expression_position_; }
1583 int else_expression_position() const { return else_expression_position_; }
1584
1585 int ThenId() const { return then_id_; }
1586 int ElseId() const { return else_id_; }
1587 1638
1588 private: 1639 private:
1589 Expression* condition_; 1640 Expression* condition_;
1590 Expression* then_expression_; 1641 Expression* then_expression_;
1591 Expression* else_expression_; 1642 Expression* else_expression_;
1592 int then_expression_position_; 1643 int then_expression_position_;
1593 int else_expression_position_; 1644 int else_expression_position_;
1594 int then_id_; 1645 int then_id_;
1595 int else_id_; 1646 int else_id_;
1596 }; 1647 };
1597 1648
1598 1649
1599 class Assignment: public Expression { 1650 class Assignment: public Expression {
1600 public: 1651 public:
1601 Assignment(Isolate* isolate,
1602 Token::Value op,
1603 Expression* target,
1604 Expression* value,
1605 int pos);
1606
1607 DECLARE_NODE_TYPE(Assignment) 1652 DECLARE_NODE_TYPE(Assignment)
1608 1653
1609 virtual bool IsInlineable() const;
1610
1611 Assignment* AsSimpleAssignment() { return !is_compound() ? this : NULL; } 1654 Assignment* AsSimpleAssignment() { return !is_compound() ? this : NULL; }
1612 1655
1613 Token::Value binary_op() const; 1656 Token::Value binary_op() const;
1614 1657
1615 Token::Value op() const { return op_; } 1658 Token::Value op() const { return op_; }
1616 Expression* target() const { return target_; } 1659 Expression* target() const { return target_; }
1617 Expression* value() const { return value_; } 1660 Expression* value() const { return value_; }
1618 virtual int position() const { return pos_; } 1661 virtual int position() const { return pos_; }
1619 BinaryOperation* binary_operation() const { return binary_operation_; } 1662 BinaryOperation* binary_operation() const { return binary_operation_; }
1620 1663
(...skipping 11 matching lines...) Expand all
1632 1675
1633 // Type feedback information. 1676 // Type feedback information.
1634 void RecordTypeFeedback(TypeFeedbackOracle* oracle); 1677 void RecordTypeFeedback(TypeFeedbackOracle* oracle);
1635 virtual bool IsMonomorphic() { return is_monomorphic_; } 1678 virtual bool IsMonomorphic() { return is_monomorphic_; }
1636 virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; } 1679 virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; }
1637 1680
1638 // Bailout support. 1681 // Bailout support.
1639 int CompoundLoadId() const { return compound_load_id_; } 1682 int CompoundLoadId() const { return compound_load_id_; }
1640 int AssignmentId() const { return assignment_id_; } 1683 int AssignmentId() const { return assignment_id_; }
1641 1684
1685 protected:
1686 friend class AstNodeFactory;
1687
1688 Assignment(Isolate* isolate,
1689 Token::Value op,
1690 Expression* target,
1691 Expression* value,
1692 int pos,
1693 AstNodeFactory* factory);
1694
1642 private: 1695 private:
1643 Token::Value op_; 1696 Token::Value op_;
1644 Expression* target_; 1697 Expression* target_;
1645 Expression* value_; 1698 Expression* value_;
1646 int pos_; 1699 int pos_;
1647 BinaryOperation* binary_operation_; 1700 BinaryOperation* binary_operation_;
1648 int compound_load_id_; 1701 int compound_load_id_;
1649 int assignment_id_; 1702 int assignment_id_;
1650 1703
1651 bool block_start_; 1704 bool block_start_;
1652 bool block_end_; 1705 bool block_end_;
1653 1706
1654 bool is_monomorphic_; 1707 bool is_monomorphic_;
1655 SmallMapList receiver_types_; 1708 SmallMapList receiver_types_;
1656 }; 1709 };
1657 1710
1658 1711
1659 class Throw: public Expression { 1712 class Throw: public Expression {
1660 public: 1713 public:
1661 Throw(Isolate* isolate, Expression* exception, int pos)
1662 : Expression(isolate), exception_(exception), pos_(pos) {}
1663
1664 DECLARE_NODE_TYPE(Throw) 1714 DECLARE_NODE_TYPE(Throw)
1665 1715
1666 Expression* exception() const { return exception_; } 1716 Expression* exception() const { return exception_; }
1667 virtual int position() const { return pos_; } 1717 virtual int position() const { return pos_; }
1668 virtual bool IsInlineable() const; 1718
1719 protected:
1720 friend class AstNodeFactory;
1721
1722 Throw(Isolate* isolate, Expression* exception, int pos)
1723 : Expression(isolate), exception_(exception), pos_(pos) {}
1669 1724
1670 private: 1725 private:
1671 Expression* exception_; 1726 Expression* exception_;
1672 int pos_; 1727 int pos_;
1673 }; 1728 };
1674 1729
1675 1730
1676 class FunctionLiteral: public Expression { 1731 class FunctionLiteral: public Expression {
1677 public: 1732 public:
1678 enum Type { 1733 enum Type {
1679 ANONYMOUS_EXPRESSION, 1734 ANONYMOUS_EXPRESSION,
1680 NAMED_EXPRESSION, 1735 NAMED_EXPRESSION,
1681 DECLARATION 1736 DECLARATION
1682 }; 1737 };
1683 1738
1684 FunctionLiteral(Isolate* isolate,
1685 Handle<String> name,
1686 Scope* scope,
1687 ZoneList<Statement*>* body,
1688 int materialized_literal_count,
1689 int expected_property_count,
1690 int handler_count,
1691 bool has_only_simple_this_property_assignments,
1692 Handle<FixedArray> this_property_assignments,
1693 int parameter_count,
1694 Type type,
1695 bool has_duplicate_parameters)
1696 : Expression(isolate),
1697 name_(name),
1698 scope_(scope),
1699 body_(body),
1700 this_property_assignments_(this_property_assignments),
1701 inferred_name_(isolate->factory()->empty_string()),
1702 materialized_literal_count_(materialized_literal_count),
1703 expected_property_count_(expected_property_count),
1704 handler_count_(handler_count),
1705 parameter_count_(parameter_count),
1706 function_token_position_(RelocInfo::kNoPosition) {
1707 bitfield_ =
1708 HasOnlySimpleThisPropertyAssignments::encode(
1709 has_only_simple_this_property_assignments) |
1710 IsExpression::encode(type != DECLARATION) |
1711 IsAnonymous::encode(type == ANONYMOUS_EXPRESSION) |
1712 Pretenure::encode(false) |
1713 HasDuplicateParameters::encode(has_duplicate_parameters);
1714 }
1715
1716 DECLARE_NODE_TYPE(FunctionLiteral) 1739 DECLARE_NODE_TYPE(FunctionLiteral)
1717 1740
1718 Handle<String> name() const { return name_; } 1741 Handle<String> name() const { return name_; }
1719 Scope* scope() const { return scope_; } 1742 Scope* scope() const { return scope_; }
1720 ZoneList<Statement*>* body() const { return body_; } 1743 ZoneList<Statement*>* body() const { return body_; }
1721 void set_function_token_position(int pos) { function_token_position_ = pos; } 1744 void set_function_token_position(int pos) { function_token_position_ = pos; }
1722 int function_token_position() const { return function_token_position_; } 1745 int function_token_position() const { return function_token_position_; }
1723 int start_position() const; 1746 int start_position() const;
1724 int end_position() const; 1747 int end_position() const;
1725 bool is_expression() const { return IsExpression::decode(bitfield_); } 1748 bool is_expression() const { return IsExpression::decode(bitfield_); }
(...skipping 19 matching lines...) Expand all
1745 return inferred_name(); 1768 return inferred_name();
1746 } 1769 }
1747 1770
1748 Handle<String> inferred_name() const { return inferred_name_; } 1771 Handle<String> inferred_name() const { return inferred_name_; }
1749 void set_inferred_name(Handle<String> inferred_name) { 1772 void set_inferred_name(Handle<String> inferred_name) {
1750 inferred_name_ = inferred_name; 1773 inferred_name_ = inferred_name;
1751 } 1774 }
1752 1775
1753 bool pretenure() { return Pretenure::decode(bitfield_); } 1776 bool pretenure() { return Pretenure::decode(bitfield_); }
1754 void set_pretenure() { bitfield_ |= Pretenure::encode(true); } 1777 void set_pretenure() { bitfield_ |= Pretenure::encode(true); }
1755 virtual bool IsInlineable() const;
1756 1778
1757 bool has_duplicate_parameters() { 1779 bool has_duplicate_parameters() {
1758 return HasDuplicateParameters::decode(bitfield_); 1780 return HasDuplicateParameters::decode(bitfield_);
1759 } 1781 }
1760 1782
1783 bool ShouldSelfOptimize();
1784 int AstNodeCount();
1785 AstProperties* ast_properties() { return ast_properties_; }
1786 void set_ast_properties(AstProperties* ast_properties) {
1787 ast_properties_ = ast_properties;
1788 }
1789
1790 protected:
1791 friend class AstNodeFactory;
1792
1793 FunctionLiteral(Isolate* isolate,
1794 Handle<String> name,
1795 Scope* scope,
1796 ZoneList<Statement*>* body,
1797 int materialized_literal_count,
1798 int expected_property_count,
1799 int handler_count,
1800 bool has_only_simple_this_property_assignments,
1801 Handle<FixedArray> this_property_assignments,
1802 int parameter_count,
1803 Type type,
1804 bool has_duplicate_parameters)
1805 : Expression(isolate),
1806 name_(name),
1807 scope_(scope),
1808 body_(body),
1809 this_property_assignments_(this_property_assignments),
1810 inferred_name_(isolate->factory()->empty_string()),
1811 ast_properties_(NULL),
1812 materialized_literal_count_(materialized_literal_count),
1813 expected_property_count_(expected_property_count),
1814 handler_count_(handler_count),
1815 parameter_count_(parameter_count),
1816 function_token_position_(RelocInfo::kNoPosition) {
1817 bitfield_ =
1818 HasOnlySimpleThisPropertyAssignments::encode(
1819 has_only_simple_this_property_assignments) |
1820 IsExpression::encode(type != DECLARATION) |
1821 IsAnonymous::encode(type == ANONYMOUS_EXPRESSION) |
1822 Pretenure::encode(false) |
1823 HasDuplicateParameters::encode(has_duplicate_parameters);
1824 }
1825
1761 private: 1826 private:
1762 Handle<String> name_; 1827 Handle<String> name_;
1763 Scope* scope_; 1828 Scope* scope_;
1764 ZoneList<Statement*>* body_; 1829 ZoneList<Statement*>* body_;
1765 Handle<FixedArray> this_property_assignments_; 1830 Handle<FixedArray> this_property_assignments_;
1766 Handle<String> inferred_name_; 1831 Handle<String> inferred_name_;
1832 AstProperties* ast_properties_;
1767 1833
1768 int materialized_literal_count_; 1834 int materialized_literal_count_;
1769 int expected_property_count_; 1835 int expected_property_count_;
1770 int handler_count_; 1836 int handler_count_;
1771 int parameter_count_; 1837 int parameter_count_;
1772 int function_token_position_; 1838 int function_token_position_;
1773 1839
1774 unsigned bitfield_; 1840 unsigned bitfield_;
1775 class HasOnlySimpleThisPropertyAssignments: public BitField<bool, 0, 1> {}; 1841 class HasOnlySimpleThisPropertyAssignments: public BitField<bool, 0, 1> {};
1776 class IsExpression: public BitField<bool, 1, 1> {}; 1842 class IsExpression: public BitField<bool, 1, 1> {};
1777 class IsAnonymous: public BitField<bool, 2, 1> {}; 1843 class IsAnonymous: public BitField<bool, 2, 1> {};
1778 class Pretenure: public BitField<bool, 3, 1> {}; 1844 class Pretenure: public BitField<bool, 3, 1> {};
1779 class HasDuplicateParameters: public BitField<bool, 4, 1> {}; 1845 class HasDuplicateParameters: public BitField<bool, 4, 1> {};
1780 }; 1846 };
1781 1847
1782 1848
1783 class SharedFunctionInfoLiteral: public Expression { 1849 class SharedFunctionInfoLiteral: public Expression {
1784 public: 1850 public:
1785 SharedFunctionInfoLiteral(
1786 Isolate* isolate,
1787 Handle<SharedFunctionInfo> shared_function_info)
1788 : Expression(isolate), shared_function_info_(shared_function_info) { }
1789
1790 DECLARE_NODE_TYPE(SharedFunctionInfoLiteral) 1851 DECLARE_NODE_TYPE(SharedFunctionInfoLiteral)
1791 1852
1792 Handle<SharedFunctionInfo> shared_function_info() const { 1853 Handle<SharedFunctionInfo> shared_function_info() const {
1793 return shared_function_info_; 1854 return shared_function_info_;
1794 } 1855 }
1795 virtual bool IsInlineable() const; 1856
1857 protected:
1858 friend class AstNodeFactory;
1859
1860 SharedFunctionInfoLiteral(
1861 Isolate* isolate,
1862 Handle<SharedFunctionInfo> shared_function_info)
1863 : Expression(isolate),
1864 shared_function_info_(shared_function_info) { }
1796 1865
1797 private: 1866 private:
1798 Handle<SharedFunctionInfo> shared_function_info_; 1867 Handle<SharedFunctionInfo> shared_function_info_;
1799 }; 1868 };
1800 1869
1801 1870
1802 class ThisFunction: public Expression { 1871 class ThisFunction: public Expression {
1803 public: 1872 public:
1804 explicit ThisFunction(Isolate* isolate) : Expression(isolate) {}
1805 DECLARE_NODE_TYPE(ThisFunction) 1873 DECLARE_NODE_TYPE(ThisFunction)
1806 virtual bool IsInlineable() const; 1874
1875 protected:
1876 friend class AstNodeFactory;
1877
1878 explicit ThisFunction(Isolate* isolate): Expression(isolate) {}
1807 }; 1879 };
1808 1880
1809 1881
1810 // ---------------------------------------------------------------------------- 1882 // ----------------------------------------------------------------------------
1811 // Regular expressions 1883 // Regular expressions
1812 1884
1813 1885
1814 class RegExpVisitor BASE_EMBEDDED { 1886 class RegExpVisitor BASE_EMBEDDED {
1815 public: 1887 public:
1816 virtual ~RegExpVisitor() { } 1888 virtual ~RegExpVisitor() { }
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after
2200 2272
2201 protected: 2273 protected:
2202 Isolate* isolate() { return isolate_; } 2274 Isolate* isolate() { return isolate_; }
2203 2275
2204 private: 2276 private:
2205 Isolate* isolate_; 2277 Isolate* isolate_;
2206 bool stack_overflow_; 2278 bool stack_overflow_;
2207 }; 2279 };
2208 2280
2209 2281
2282 // ----------------------------------------------------------------------------
2283 // Construction time visitor.
2284
2285 enum AstPropertiesFlag {
2286 kDontCrankshaft,
2287 kDontInline,
2288 kDontSelfOptimize,
2289 kDontSoftInline
2290 };
2291
2292
2293 class AstProperties : public ZoneObject {
2294 public:
2295 class Flags : public EnumSet<AstPropertiesFlag, int> {};
2296
2297 AstProperties() : node_count_(0) { }
2298 virtual ~AstProperties() { }
2299
2300 Flags* flags() { return &flags_; }
2301 int node_count() { return node_count_; }
2302 void add_node_count(int count) { node_count_ += count; }
2303
2304 private:
2305 Flags flags_;
2306 int node_count_;
2307
2308 DISALLOW_COPY_AND_ASSIGN(AstProperties);
2309 };
2310
2311
2312 class AstConstructionVisitor : public AstVisitor {
2313 public:
2314 explicit AstConstructionVisitor(Zone* zone)
2315 : node_count_(0),
2316 properties_(new(zone) AstProperties()) { }
2317 virtual ~AstConstructionVisitor() {}
2318
2319 void set_ast_properties(AstProperties* properties) {
2320 properties_ = properties;
2321 }
2322 AstProperties* DetachAstProperties();
Kevin Millikin (Chromium) 2012/02/06 15:14:23 I don't understand why the AstProperties ownership
Jakob Kummerow 2012/02/07 12:38:37 Done.
2323
2324 private:
2325 friend class AstNodeFactory;
2326
2327 // Node visitors.
2328 #define DEF_VISIT(type) \
2329 virtual void Visit##type(type* node);
fschneider 2012/02/06 14:14:29 It seems that none of the functions actually recur
Jakob Kummerow 2012/02/07 12:38:37 Done.
2330 AST_NODE_LIST(DEF_VISIT)
2331 #undef DEF_VISIT
2332
2333 void increase_node_count() { node_count_++; }
2334 void add_flag(AstPropertiesFlag flag) { flags_.Add(flag); }
2335
2336 AstProperties::Flags flags_;
2337 int node_count_;
2338
2339 // Non-owning pointer to the AstProperties object that will eventually
2340 // hold the results; is passed to VariableProxies upon their construction
fschneider 2012/02/06 14:14:29 Comment outdated? VariableProxies don't update the
Jakob Kummerow 2012/02/07 12:38:37 Done.
2341 // because they need to fill in more information later.
2342 AstProperties* properties_;
2343 };
2344
2345
2346
2347 // ----------------------------------------------------------------------------
2348 // AstNode factory
2349
2350 class AstNodeFactory BASE_EMBEDDED {
2351 public:
2352 AstNodeFactory(Isolate* isolate,
2353 Zone* zone = NULL,
2354 AstConstructionVisitor* visitor = NULL)
2355 : isolate_(isolate),
2356 zone_(zone),
fschneider 2012/02/06 14:14:29 Maybe simplify initialization to: zone_(zone != N
Kevin Millikin (Chromium) 2012/02/06 15:14:23 Since every call (that I could find) does not pass
Jakob Kummerow 2012/02/07 12:38:37 Obsolete -- see Kevin's comment.
Jakob Kummerow 2012/02/07 12:38:37 Done.
2357 visitor_(visitor) {
2358 if (zone == NULL) {
2359 zone_ = isolate_->zone();
2360 }
2361 }
2362
2363 AstConstructionVisitor* visitor() { return visitor_; }
2364 void set_visitor(AstConstructionVisitor* visitor) {
2365 visitor_ = visitor;
2366 }
2367
2368 #define VISIT_AND_RETURN(NodeType, node) \
2369 if (visitor_ != NULL) { \
2370 visitor_->Visit##NodeType(node); \
fschneider 2012/02/06 14:14:29 Suggestion for further optimization: If the visit
Kevin Millikin (Chromium) 2012/02/06 15:14:23 Possibly: visitor_->Visit##NodeType((node)); to
Jakob Kummerow 2012/02/07 12:38:37 Done.
Jakob Kummerow 2012/02/07 12:38:37 Done.
2371 } \
2372 return node;
2373
2374 Block* NewBlock(ZoneStringList* labels,
2375 int capacity,
2376 bool is_initializer_block) {
2377 Block* block = new(zone_) Block(
2378 isolate_, labels, capacity, is_initializer_block);
2379 VISIT_AND_RETURN(Block, block)
2380 }
2381
2382 Declaration* NewDeclaration(VariableProxy* proxy,
2383 VariableMode mode,
2384 FunctionLiteral* fun,
2385 Scope* scope) {
2386 Declaration* decl = new(zone_) Declaration(proxy, mode, fun, scope);
2387 VISIT_AND_RETURN(Declaration, decl)
2388 }
2389
2390 #define ITERATION_STATEMENT(NodeType) \
2391 NodeType* New##NodeType(ZoneStringList* labels) { \
2392 NodeType* stmt = new(zone_) NodeType(isolate_, labels); \
2393 VISIT_AND_RETURN(NodeType, stmt); \
2394 }
2395 ITERATION_STATEMENT(DoWhileStatement)
2396 ITERATION_STATEMENT(WhileStatement)
2397 ITERATION_STATEMENT(ForStatement)
2398 ITERATION_STATEMENT(ForInStatement)
2399 ITERATION_STATEMENT(SwitchStatement)
Kevin Millikin (Chromium) 2012/02/06 15:14:23 Switch is not iteration, so this is probably a bad
Jakob Kummerow 2012/02/07 12:38:37 Done.
2400 #undef ITERATION_STATEMENT
2401
2402 ExpressionStatement* NewExpressionStatement(Expression* expression) {
2403 ExpressionStatement* stmt = new(zone_) ExpressionStatement(expression);
2404 VISIT_AND_RETURN(ExpressionStatement, stmt)
2405 }
2406
2407 ContinueStatement* NewContinueStatement(IterationStatement* target) {
2408 ContinueStatement* stmt = new(zone_) ContinueStatement(target);
2409 VISIT_AND_RETURN(ContinueStatement, stmt)
2410 }
2411
2412 BreakStatement* NewBreakStatement(BreakableStatement* target) {
2413 BreakStatement* stmt = new(zone_) BreakStatement(target);
2414 VISIT_AND_RETURN(BreakStatement, stmt)
2415 }
2416
2417 ReturnStatement* NewReturnStatement(Expression* expression) {
2418 ReturnStatement* stmt = new(zone_) ReturnStatement(expression);
2419 VISIT_AND_RETURN(ReturnStatement, stmt)
2420 }
2421
2422 WithStatement* NewWithStatement(Expression* expression,
2423 Statement* statement) {
2424 WithStatement* stmt = new(zone_) WithStatement(expression, statement);
2425 VISIT_AND_RETURN(WithStatement, stmt)
2426 }
2427
2428 IfStatement* NewIfStatement(Expression* condition,
2429 Statement* then_statement,
2430 Statement* else_statement) {
2431 IfStatement* stmt = new(zone_) IfStatement(
2432 isolate_, condition, then_statement, else_statement);
2433 VISIT_AND_RETURN(IfStatement, stmt)
2434 }
2435
2436 TryCatchStatement* NewTryCatchStatement(int index,
2437 Block* try_block,
2438 Scope* scope,
2439 Variable* variable,
2440 Block* catch_block) {
2441 TryCatchStatement* stmt = new(zone_) TryCatchStatement(
2442 index, try_block, scope, variable, catch_block);
2443 VISIT_AND_RETURN(TryCatchStatement, stmt)
2444 }
2445
2446 TryFinallyStatement* NewTryFinallyStatement(int index,
2447 Block* try_block,
2448 Block* finally_block) {
2449 TryFinallyStatement* stmt =
2450 new(zone_) TryFinallyStatement(index, try_block, finally_block);
2451 VISIT_AND_RETURN(TryFinallyStatement, stmt)
2452 }
2453
2454 DebuggerStatement* NewDebuggerStatement() {
2455 DebuggerStatement* stmt = new(zone_) DebuggerStatement();
2456 VISIT_AND_RETURN(DebuggerStatement, stmt)
2457 }
2458
2459 EmptyStatement* NewEmptyStatement() {
2460 static EmptyStatement* empty = ::new EmptyStatement();
Kevin Millikin (Chromium) 2012/02/06 15:14:23 It seems wrong to have this singleton empty statem
Jakob Kummerow 2012/02/07 12:38:37 Done.
2461 return empty;
2462 }
2463
2464 Literal* NewLiteral(Handle<Object> handle) {
2465 Literal* lit = new(zone_) Literal(isolate_, handle);
2466 VISIT_AND_RETURN(Literal, lit)
2467 }
2468
2469 Literal* NewNumberLiteral(double number) {
2470 return NewLiteral(isolate_->factory()->NewNumber(number, TENURED));
2471 }
2472
2473 ObjectLiteral* NewObjectLiteral(
2474 Handle<FixedArray> constant_properties,
2475 ZoneList<ObjectLiteral::Property*>* properties,
2476 int literal_index,
2477 bool is_simple,
2478 bool fast_elements,
2479 int depth,
2480 bool has_function) {
2481 ObjectLiteral* lit = new(zone_) ObjectLiteral(
2482 isolate_, constant_properties, properties, literal_index,
2483 is_simple, fast_elements, depth, has_function);
2484 VISIT_AND_RETURN(ObjectLiteral, lit)
2485 }
2486
2487 RegExpLiteral* NewRegExpLiteral(Handle<String> pattern,
2488 Handle<String> flags,
2489 int literal_index) {
2490 RegExpLiteral* lit =
2491 new(zone_) RegExpLiteral(isolate_, pattern, flags, literal_index);
2492 VISIT_AND_RETURN(RegExpLiteral, lit);
2493 }
2494
2495 ArrayLiteral* NewArrayLiteral(Handle<FixedArray> constant_elements,
2496 ZoneList<Expression*>* values,
2497 int literal_index,
2498 bool is_simple,
2499 int depth) {
2500 ArrayLiteral* lit = new(zone_) ArrayLiteral(
2501 isolate_, constant_elements, values, literal_index, is_simple, depth);
2502 VISIT_AND_RETURN(ArrayLiteral, lit)
2503 }
2504
2505 VariableProxy* NewVariableProxy(Variable* var) {
2506 VariableProxy* proxy = new(zone_) VariableProxy(isolate_, var);
2507 VISIT_AND_RETURN(VariableProxy, proxy)
2508 }
2509
2510 VariableProxy* NewVariableProxy(Handle<String> name,
2511 bool is_this,
2512 int position = RelocInfo::kNoPosition) {
2513 VariableProxy* proxy =
2514 new(zone_) VariableProxy(isolate_, name, is_this, position);
2515 VISIT_AND_RETURN(VariableProxy, proxy)
2516 }
2517
2518 Property* NewProperty(Expression* obj, Expression* key, int pos) {
2519 Property* prop = new(zone_) Property(isolate_, obj, key, pos);
2520 VISIT_AND_RETURN(Property, prop)
2521 }
2522
2523 Call* NewCall(Expression* expression,
2524 ZoneList<Expression*>* arguments,
2525 int pos) {
2526 Call* call = new(zone_) Call(isolate_, expression, arguments, pos);
2527 VISIT_AND_RETURN(Call, call)
2528 }
2529
2530 CallNew* NewCallNew(Expression* expression,
2531 ZoneList<Expression*>* arguments,
2532 int pos) {
2533 CallNew* call = new(zone_) CallNew(isolate_, expression, arguments, pos);
2534 VISIT_AND_RETURN(CallNew, call)
2535 }
2536
2537 CallRuntime* NewCallRuntime(Handle<String> name,
2538 const Runtime::Function* function,
2539 ZoneList<Expression*>* arguments) {
2540 CallRuntime* call =
2541 new(zone_) CallRuntime(isolate_, name, function, arguments);
2542 VISIT_AND_RETURN(CallRuntime, call)
2543 }
2544
2545 UnaryOperation* NewUnaryOperation(Token::Value op,
2546 Expression* expression,
2547 int pos) {
2548 UnaryOperation* node =
2549 new(zone_) UnaryOperation(isolate_, op, expression, pos);
2550 VISIT_AND_RETURN(UnaryOperation, node)
2551 }
2552
2553 BinaryOperation* NewBinaryOperation(Token::Value op,
2554 Expression* left,
2555 Expression* right,
2556 int pos) {
2557 BinaryOperation* node =
2558 new(zone_) BinaryOperation(isolate_, op, left, right, pos);
2559 VISIT_AND_RETURN(BinaryOperation, node)
2560 }
2561
2562 CountOperation* NewCountOperation(Token::Value op,
2563 bool is_prefix,
2564 Expression* expr,
2565 int pos) {
2566 CountOperation* node =
2567 new(zone_) CountOperation(isolate_, op, is_prefix, expr, pos);
2568 VISIT_AND_RETURN(CountOperation, node)
2569 }
2570
2571 CompareOperation* NewCompareOperation(Token::Value op,
2572 Expression* left,
2573 Expression* right,
2574 int pos) {
2575 CompareOperation* node =
2576 new(zone_) CompareOperation(isolate_, op, left, right, pos);
2577 VISIT_AND_RETURN(CompareOperation, node)
2578 }
2579
2580 Conditional* NewConditional(Expression* condition,
2581 Expression* then_expression,
2582 Expression* else_expression,
2583 int then_expression_position,
2584 int else_expression_position) {
2585 Conditional* cond = new(zone_) Conditional(
2586 isolate_, condition, then_expression, else_expression,
2587 then_expression_position, else_expression_position);
2588 VISIT_AND_RETURN(Conditional, cond)
2589 }
2590
2591 Assignment* NewAssignment(Token::Value op,
2592 Expression* target,
2593 Expression* value,
2594 int pos) {
2595 Assignment* assign =
2596 new(zone_) Assignment(isolate_, op, target, value, pos, this);
2597 VISIT_AND_RETURN(Assignment, assign)
2598 }
2599
2600 Throw* NewThrow(Expression* exception, int pos) {
2601 Throw* t = new(zone_) Throw(isolate_, exception, pos);
2602 VISIT_AND_RETURN(Throw, t)
2603 }
2604
2605 FunctionLiteral* NewFunctionLiteral(
2606 Handle<String> name,
2607 Scope* scope,
2608 ZoneList<Statement*>* body,
2609 int materialized_literal_count,
2610 int expected_property_count,
2611 int handler_count,
2612 bool has_only_simple_this_property_assignments,
2613 Handle<FixedArray> this_property_assignments,
2614 int parameter_count,
2615 FunctionLiteral::Type type,
2616 bool has_duplicate_parameters,
2617 bool visit_with_visitor = true) {
Kevin Millikin (Chromium) 2012/02/06 15:14:23 No need for default value. Boolean default values
Jakob Kummerow 2012/02/07 12:38:37 Done.
2618 FunctionLiteral* lit = new(zone_) FunctionLiteral(
2619 isolate_, name, scope, body,
2620 materialized_literal_count, expected_property_count, handler_count,
2621 has_only_simple_this_property_assignments, this_property_assignments,
2622 parameter_count, type, has_duplicate_parameters);
2623 if (visit_with_visitor && visitor_ != NULL) {
2624 visitor_->VisitFunctionLiteral(lit);
2625 }
2626 return lit;
2627 }
2628
2629 SharedFunctionInfoLiteral* NewSharedFunctionInfoLiteral(
2630 Handle<SharedFunctionInfo> shared_function_info) {
2631 SharedFunctionInfoLiteral* lit =
2632 new(zone_) SharedFunctionInfoLiteral(isolate_, shared_function_info);
2633 VISIT_AND_RETURN(SharedFunctionInfoLiteral, lit)
2634 }
2635
2636 ThisFunction* NewThisFunction() {
2637 ThisFunction* fun = new(zone_) ThisFunction(isolate_);
2638 VISIT_AND_RETURN(ThisFunction, fun)
2639 }
2640
2641 #undef VISIT_AND_RETURN
2642
2643 private:
2644 Isolate* isolate_;
2645 Zone* zone_;
2646 AstConstructionVisitor* visitor_;
2647 };
2648
2649
2210 } } // namespace v8::internal 2650 } } // namespace v8::internal
2211 2651
2212 #endif // V8_AST_H_ 2652 #endif // V8_AST_H_
OLDNEW
« no previous file with comments | « no previous file | src/ast.cc » ('j') | src/ast.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698