| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; } | 162 virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; } |
| 163 virtual Slot* AsSlot() { return NULL; } | 163 virtual Slot* AsSlot() { return NULL; } |
| 164 | 164 |
| 165 // True if the node is simple enough for us to inline calls containing it. | 165 // True if the node is simple enough for us to inline calls containing it. |
| 166 virtual bool IsInlineable() const = 0; | 166 virtual bool IsInlineable() const = 0; |
| 167 | 167 |
| 168 static int Count() { return Isolate::Current()->ast_node_count(); } | 168 static int Count() { return Isolate::Current()->ast_node_count(); } |
| 169 static void ResetIds() { Isolate::Current()->set_ast_node_id(0); } | 169 static void ResetIds() { Isolate::Current()->set_ast_node_id(0); } |
| 170 | 170 |
| 171 protected: | 171 protected: |
| 172 static unsigned GetNextId() { return ReserveIdRange(1); } | 172 static unsigned GetNextId(Isolate* isolate) { |
| 173 static unsigned ReserveIdRange(int n) { | 173 return ReserveIdRange(isolate, 1); |
| 174 Isolate* isolate = Isolate::Current(); | 174 } |
| 175 |
| 176 static unsigned ReserveIdRange(Isolate* isolate, int n) { |
| 175 unsigned tmp = isolate->ast_node_id(); | 177 unsigned tmp = isolate->ast_node_id(); |
| 176 isolate->set_ast_node_id(tmp + n); | 178 isolate->set_ast_node_id(tmp + n); |
| 177 return tmp; | 179 return tmp; |
| 178 } | 180 } |
| 179 | 181 |
| 180 private: | 182 private: |
| 181 // Hidden to prevent accidental usage. It would have to load the | 183 // Hidden to prevent accidental usage. It would have to load the |
| 182 // current zone from the TLS. | 184 // current zone from the TLS. |
| 183 void* operator new(size_t size); | 185 void* operator new(size_t size); |
| 184 | 186 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 212 // code generation. | 214 // code generation. |
| 213 kUninitialized, | 215 kUninitialized, |
| 214 // Evaluated for its side effects. | 216 // Evaluated for its side effects. |
| 215 kEffect, | 217 kEffect, |
| 216 // Evaluated for its value (and side effects). | 218 // Evaluated for its value (and side effects). |
| 217 kValue, | 219 kValue, |
| 218 // Evaluated for control flow (and side effects). | 220 // Evaluated for control flow (and side effects). |
| 219 kTest | 221 kTest |
| 220 }; | 222 }; |
| 221 | 223 |
| 222 Expression() : id_(GetNextId()), test_id_(GetNextId()) {} | 224 explicit Expression(Isolate* isolate) |
| 225 : id_(GetNextId(isolate)), |
| 226 test_id_(GetNextId(isolate)) {} |
| 223 | 227 |
| 224 virtual int position() const { | 228 virtual int position() const { |
| 225 UNREACHABLE(); | 229 UNREACHABLE(); |
| 226 return 0; | 230 return 0; |
| 227 } | 231 } |
| 228 | 232 |
| 229 virtual Expression* AsExpression() { return this; } | 233 virtual Expression* AsExpression() { return this; } |
| 230 | 234 |
| 231 virtual bool IsTrivial() { return false; } | 235 virtual bool IsTrivial() { return false; } |
| 232 virtual bool IsValidLeftHandSide() { return false; } | 236 virtual bool IsValidLeftHandSide() { return false; } |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 }; | 283 }; |
| 280 | 284 |
| 281 | 285 |
| 282 /** | 286 /** |
| 283 * A sentinel used during pre parsing that represents some expression | 287 * A sentinel used during pre parsing that represents some expression |
| 284 * that is a valid left hand side without having to actually build | 288 * that is a valid left hand side without having to actually build |
| 285 * the expression. | 289 * the expression. |
| 286 */ | 290 */ |
| 287 class ValidLeftHandSideSentinel: public Expression { | 291 class ValidLeftHandSideSentinel: public Expression { |
| 288 public: | 292 public: |
| 293 explicit ValidLeftHandSideSentinel(Isolate* isolate) : Expression(isolate) {} |
| 289 virtual bool IsValidLeftHandSide() { return true; } | 294 virtual bool IsValidLeftHandSide() { return true; } |
| 290 virtual void Accept(AstVisitor* v) { UNREACHABLE(); } | 295 virtual void Accept(AstVisitor* v) { UNREACHABLE(); } |
| 291 virtual bool IsInlineable() const; | 296 virtual bool IsInlineable() const; |
| 292 }; | 297 }; |
| 293 | 298 |
| 294 | 299 |
| 295 class BreakableStatement: public Statement { | 300 class BreakableStatement: public Statement { |
| 296 public: | 301 public: |
| 297 enum Type { | 302 enum Type { |
| 298 TARGET_FOR_ANONYMOUS, | 303 TARGET_FOR_ANONYMOUS, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 310 Label* break_target() { return &break_target_; } | 315 Label* break_target() { return &break_target_; } |
| 311 | 316 |
| 312 // Testers. | 317 // Testers. |
| 313 bool is_target_for_anonymous() const { return type_ == TARGET_FOR_ANONYMOUS; } | 318 bool is_target_for_anonymous() const { return type_ == TARGET_FOR_ANONYMOUS; } |
| 314 | 319 |
| 315 // Bailout support. | 320 // Bailout support. |
| 316 int EntryId() const { return entry_id_; } | 321 int EntryId() const { return entry_id_; } |
| 317 int ExitId() const { return exit_id_; } | 322 int ExitId() const { return exit_id_; } |
| 318 | 323 |
| 319 protected: | 324 protected: |
| 320 inline BreakableStatement(ZoneStringList* labels, Type type); | 325 BreakableStatement(Isolate* isolate, ZoneStringList* labels, Type type); |
| 321 | 326 |
| 322 private: | 327 private: |
| 323 ZoneStringList* labels_; | 328 ZoneStringList* labels_; |
| 324 Type type_; | 329 Type type_; |
| 325 Label break_target_; | 330 Label break_target_; |
| 326 int entry_id_; | 331 int entry_id_; |
| 327 int exit_id_; | 332 int exit_id_; |
| 328 }; | 333 }; |
| 329 | 334 |
| 330 | 335 |
| 331 class Block: public BreakableStatement { | 336 class Block: public BreakableStatement { |
| 332 public: | 337 public: |
| 333 inline Block(ZoneStringList* labels, int capacity, bool is_initializer_block); | 338 inline Block(Isolate* isolate, |
| 339 ZoneStringList* labels, |
| 340 int capacity, |
| 341 bool is_initializer_block); |
| 334 | 342 |
| 335 DECLARE_NODE_TYPE(Block) | 343 DECLARE_NODE_TYPE(Block) |
| 336 | 344 |
| 337 virtual Assignment* StatementAsSimpleAssignment() { | 345 virtual Assignment* StatementAsSimpleAssignment() { |
| 338 if (statements_.length() != 1) return NULL; | 346 if (statements_.length() != 1) return NULL; |
| 339 return statements_[0]->StatementAsSimpleAssignment(); | 347 return statements_[0]->StatementAsSimpleAssignment(); |
| 340 } | 348 } |
| 341 | 349 |
| 342 virtual CountOperation* StatementAsCountOperation() { | 350 virtual CountOperation* StatementAsCountOperation() { |
| 343 if (statements_.length() != 1) return NULL; | 351 if (statements_.length() != 1) return NULL; |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 | 399 |
| 392 // Bailout support. | 400 // Bailout support. |
| 393 int OsrEntryId() const { return osr_entry_id_; } | 401 int OsrEntryId() const { return osr_entry_id_; } |
| 394 virtual int ContinueId() const = 0; | 402 virtual int ContinueId() const = 0; |
| 395 virtual int StackCheckId() const = 0; | 403 virtual int StackCheckId() const = 0; |
| 396 | 404 |
| 397 // Code generation | 405 // Code generation |
| 398 Label* continue_target() { return &continue_target_; } | 406 Label* continue_target() { return &continue_target_; } |
| 399 | 407 |
| 400 protected: | 408 protected: |
| 401 explicit inline IterationStatement(ZoneStringList* labels); | 409 inline IterationStatement(Isolate* isolate, ZoneStringList* labels); |
| 402 | 410 |
| 403 void Initialize(Statement* body) { | 411 void Initialize(Statement* body) { |
| 404 body_ = body; | 412 body_ = body; |
| 405 } | 413 } |
| 406 | 414 |
| 407 private: | 415 private: |
| 408 Statement* body_; | 416 Statement* body_; |
| 409 Label continue_target_; | 417 Label continue_target_; |
| 410 int osr_entry_id_; | 418 int osr_entry_id_; |
| 411 }; | 419 }; |
| 412 | 420 |
| 413 | 421 |
| 414 class DoWhileStatement: public IterationStatement { | 422 class DoWhileStatement: public IterationStatement { |
| 415 public: | 423 public: |
| 416 explicit inline DoWhileStatement(ZoneStringList* labels); | 424 inline DoWhileStatement(Isolate* isolate, ZoneStringList* labels); |
| 417 | 425 |
| 418 DECLARE_NODE_TYPE(DoWhileStatement) | 426 DECLARE_NODE_TYPE(DoWhileStatement) |
| 419 | 427 |
| 420 void Initialize(Expression* cond, Statement* body) { | 428 void Initialize(Expression* cond, Statement* body) { |
| 421 IterationStatement::Initialize(body); | 429 IterationStatement::Initialize(body); |
| 422 cond_ = cond; | 430 cond_ = cond; |
| 423 } | 431 } |
| 424 | 432 |
| 425 Expression* cond() const { return cond_; } | 433 Expression* cond() const { return cond_; } |
| 426 | 434 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 439 private: | 447 private: |
| 440 Expression* cond_; | 448 Expression* cond_; |
| 441 int condition_position_; | 449 int condition_position_; |
| 442 int continue_id_; | 450 int continue_id_; |
| 443 int back_edge_id_; | 451 int back_edge_id_; |
| 444 }; | 452 }; |
| 445 | 453 |
| 446 | 454 |
| 447 class WhileStatement: public IterationStatement { | 455 class WhileStatement: public IterationStatement { |
| 448 public: | 456 public: |
| 449 explicit inline WhileStatement(ZoneStringList* labels); | 457 inline WhileStatement(Isolate* isolate, ZoneStringList* labels); |
| 450 | 458 |
| 451 DECLARE_NODE_TYPE(WhileStatement) | 459 DECLARE_NODE_TYPE(WhileStatement) |
| 452 | 460 |
| 453 void Initialize(Expression* cond, Statement* body) { | 461 void Initialize(Expression* cond, Statement* body) { |
| 454 IterationStatement::Initialize(body); | 462 IterationStatement::Initialize(body); |
| 455 cond_ = cond; | 463 cond_ = cond; |
| 456 } | 464 } |
| 457 | 465 |
| 458 Expression* cond() const { return cond_; } | 466 Expression* cond() const { return cond_; } |
| 459 bool may_have_function_literal() const { | 467 bool may_have_function_literal() const { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 472 private: | 480 private: |
| 473 Expression* cond_; | 481 Expression* cond_; |
| 474 // True if there is a function literal subexpression in the condition. | 482 // True if there is a function literal subexpression in the condition. |
| 475 bool may_have_function_literal_; | 483 bool may_have_function_literal_; |
| 476 int body_id_; | 484 int body_id_; |
| 477 }; | 485 }; |
| 478 | 486 |
| 479 | 487 |
| 480 class ForStatement: public IterationStatement { | 488 class ForStatement: public IterationStatement { |
| 481 public: | 489 public: |
| 482 explicit inline ForStatement(ZoneStringList* labels); | 490 inline ForStatement(Isolate* isolate, ZoneStringList* labels); |
| 483 | 491 |
| 484 DECLARE_NODE_TYPE(ForStatement) | 492 DECLARE_NODE_TYPE(ForStatement) |
| 485 | 493 |
| 486 void Initialize(Statement* init, | 494 void Initialize(Statement* init, |
| 487 Expression* cond, | 495 Expression* cond, |
| 488 Statement* next, | 496 Statement* next, |
| 489 Statement* body) { | 497 Statement* body) { |
| 490 IterationStatement::Initialize(body); | 498 IterationStatement::Initialize(body); |
| 491 init_ = init; | 499 init_ = init; |
| 492 cond_ = cond; | 500 cond_ = cond; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 521 // True if there is a function literal subexpression in the condition. | 529 // True if there is a function literal subexpression in the condition. |
| 522 bool may_have_function_literal_; | 530 bool may_have_function_literal_; |
| 523 Variable* loop_variable_; | 531 Variable* loop_variable_; |
| 524 int continue_id_; | 532 int continue_id_; |
| 525 int body_id_; | 533 int body_id_; |
| 526 }; | 534 }; |
| 527 | 535 |
| 528 | 536 |
| 529 class ForInStatement: public IterationStatement { | 537 class ForInStatement: public IterationStatement { |
| 530 public: | 538 public: |
| 531 explicit inline ForInStatement(ZoneStringList* labels); | 539 inline ForInStatement(Isolate* isolate, ZoneStringList* labels); |
| 532 | 540 |
| 533 DECLARE_NODE_TYPE(ForInStatement) | 541 DECLARE_NODE_TYPE(ForInStatement) |
| 534 | 542 |
| 535 void Initialize(Expression* each, Expression* enumerable, Statement* body) { | 543 void Initialize(Expression* each, Expression* enumerable, Statement* body) { |
| 536 IterationStatement::Initialize(body); | 544 IterationStatement::Initialize(body); |
| 537 each_ = each; | 545 each_ = each; |
| 538 enumerable_ = enumerable; | 546 enumerable_ = enumerable; |
| 539 } | 547 } |
| 540 | 548 |
| 541 Expression* each() const { return each_; } | 549 Expression* each() const { return each_; } |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 638 class ExitContextStatement: public Statement { | 646 class ExitContextStatement: public Statement { |
| 639 public: | 647 public: |
| 640 virtual bool IsInlineable() const; | 648 virtual bool IsInlineable() const; |
| 641 | 649 |
| 642 DECLARE_NODE_TYPE(ExitContextStatement) | 650 DECLARE_NODE_TYPE(ExitContextStatement) |
| 643 }; | 651 }; |
| 644 | 652 |
| 645 | 653 |
| 646 class CaseClause: public ZoneObject { | 654 class CaseClause: public ZoneObject { |
| 647 public: | 655 public: |
| 648 CaseClause(Expression* label, ZoneList<Statement*>* statements, int pos); | 656 CaseClause(Isolate* isolate, |
| 657 Expression* label, |
| 658 ZoneList<Statement*>* statements, |
| 659 int pos); |
| 649 | 660 |
| 650 bool is_default() const { return label_ == NULL; } | 661 bool is_default() const { return label_ == NULL; } |
| 651 Expression* label() const { | 662 Expression* label() const { |
| 652 CHECK(!is_default()); | 663 CHECK(!is_default()); |
| 653 return label_; | 664 return label_; |
| 654 } | 665 } |
| 655 Label* body_target() { return &body_target_; } | 666 Label* body_target() { return &body_target_; } |
| 656 ZoneList<Statement*>* statements() const { return statements_; } | 667 ZoneList<Statement*>* statements() const { return statements_; } |
| 657 | 668 |
| 658 int position() const { return position_; } | 669 int position() const { return position_; } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 673 int position_; | 684 int position_; |
| 674 enum CompareTypeFeedback { NONE, SMI_ONLY, OBJECT_ONLY }; | 685 enum CompareTypeFeedback { NONE, SMI_ONLY, OBJECT_ONLY }; |
| 675 CompareTypeFeedback compare_type_; | 686 CompareTypeFeedback compare_type_; |
| 676 int compare_id_; | 687 int compare_id_; |
| 677 int entry_id_; | 688 int entry_id_; |
| 678 }; | 689 }; |
| 679 | 690 |
| 680 | 691 |
| 681 class SwitchStatement: public BreakableStatement { | 692 class SwitchStatement: public BreakableStatement { |
| 682 public: | 693 public: |
| 683 explicit inline SwitchStatement(ZoneStringList* labels); | 694 inline SwitchStatement(Isolate* isolate, ZoneStringList* labels); |
| 684 | 695 |
| 685 DECLARE_NODE_TYPE(SwitchStatement) | 696 DECLARE_NODE_TYPE(SwitchStatement) |
| 686 | 697 |
| 687 void Initialize(Expression* tag, ZoneList<CaseClause*>* cases) { | 698 void Initialize(Expression* tag, ZoneList<CaseClause*>* cases) { |
| 688 tag_ = tag; | 699 tag_ = tag; |
| 689 cases_ = cases; | 700 cases_ = cases; |
| 690 } | 701 } |
| 691 | 702 |
| 692 Expression* tag() const { return tag_; } | 703 Expression* tag() const { return tag_; } |
| 693 ZoneList<CaseClause*>* cases() const { return cases_; } | 704 ZoneList<CaseClause*>* cases() const { return cases_; } |
| 694 virtual bool IsInlineable() const; | 705 virtual bool IsInlineable() const; |
| 695 | 706 |
| 696 private: | 707 private: |
| 697 Expression* tag_; | 708 Expression* tag_; |
| 698 ZoneList<CaseClause*>* cases_; | 709 ZoneList<CaseClause*>* cases_; |
| 699 }; | 710 }; |
| 700 | 711 |
| 701 | 712 |
| 702 // If-statements always have non-null references to their then- and | 713 // If-statements always have non-null references to their then- and |
| 703 // else-parts. When parsing if-statements with no explicit else-part, | 714 // else-parts. When parsing if-statements with no explicit else-part, |
| 704 // the parser implicitly creates an empty statement. Use the | 715 // the parser implicitly creates an empty statement. Use the |
| 705 // HasThenStatement() and HasElseStatement() functions to check if a | 716 // HasThenStatement() and HasElseStatement() functions to check if a |
| 706 // given if-statement has a then- or an else-part containing code. | 717 // given if-statement has a then- or an else-part containing code. |
| 707 class IfStatement: public Statement { | 718 class IfStatement: public Statement { |
| 708 public: | 719 public: |
| 709 IfStatement(Expression* condition, | 720 IfStatement(Isolate* isolate, |
| 721 Expression* condition, |
| 710 Statement* then_statement, | 722 Statement* then_statement, |
| 711 Statement* else_statement) | 723 Statement* else_statement) |
| 712 : condition_(condition), | 724 : condition_(condition), |
| 713 then_statement_(then_statement), | 725 then_statement_(then_statement), |
| 714 else_statement_(else_statement), | 726 else_statement_(else_statement), |
| 715 if_id_(GetNextId()), | 727 if_id_(GetNextId(isolate)), |
| 716 then_id_(GetNextId()), | 728 then_id_(GetNextId(isolate)), |
| 717 else_id_(GetNextId()) { | 729 else_id_(GetNextId(isolate)) { |
| 718 } | 730 } |
| 719 | 731 |
| 720 DECLARE_NODE_TYPE(IfStatement) | 732 DECLARE_NODE_TYPE(IfStatement) |
| 721 | 733 |
| 722 virtual bool IsInlineable() const; | 734 virtual bool IsInlineable() const; |
| 723 | 735 |
| 724 bool HasThenStatement() const { return !then_statement()->IsEmpty(); } | 736 bool HasThenStatement() const { return !then_statement()->IsEmpty(); } |
| 725 bool HasElseStatement() const { return !else_statement()->IsEmpty(); } | 737 bool HasElseStatement() const { return !else_statement()->IsEmpty(); } |
| 726 | 738 |
| 727 Expression* condition() const { return condition_; } | 739 Expression* condition() const { return condition_; } |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 836 class EmptyStatement: public Statement { | 848 class EmptyStatement: public Statement { |
| 837 public: | 849 public: |
| 838 DECLARE_NODE_TYPE(EmptyStatement) | 850 DECLARE_NODE_TYPE(EmptyStatement) |
| 839 | 851 |
| 840 virtual bool IsInlineable() const; | 852 virtual bool IsInlineable() const; |
| 841 }; | 853 }; |
| 842 | 854 |
| 843 | 855 |
| 844 class Literal: public Expression { | 856 class Literal: public Expression { |
| 845 public: | 857 public: |
| 846 explicit Literal(Handle<Object> handle) : handle_(handle) { } | 858 Literal(Isolate* isolate, Handle<Object> handle) |
| 859 : Expression(isolate), handle_(handle) { } |
| 847 | 860 |
| 848 DECLARE_NODE_TYPE(Literal) | 861 DECLARE_NODE_TYPE(Literal) |
| 849 | 862 |
| 850 virtual bool IsTrivial() { return true; } | 863 virtual bool IsTrivial() { return true; } |
| 851 virtual bool IsSmiLiteral() { return handle_->IsSmi(); } | 864 virtual bool IsSmiLiteral() { return handle_->IsSmi(); } |
| 852 | 865 |
| 853 // Check if this literal is identical to the other literal. | 866 // Check if this literal is identical to the other literal. |
| 854 bool IsIdenticalTo(const Literal* other) const { | 867 bool IsIdenticalTo(const Literal* other) const { |
| 855 return handle_.is_identical_to(other->handle_); | 868 return handle_.is_identical_to(other->handle_); |
| 856 } | 869 } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 889 virtual bool IsInlineable() const; | 902 virtual bool IsInlineable() const; |
| 890 | 903 |
| 891 private: | 904 private: |
| 892 Handle<Object> handle_; | 905 Handle<Object> handle_; |
| 893 }; | 906 }; |
| 894 | 907 |
| 895 | 908 |
| 896 // Base class for literals that needs space in the corresponding JSFunction. | 909 // Base class for literals that needs space in the corresponding JSFunction. |
| 897 class MaterializedLiteral: public Expression { | 910 class MaterializedLiteral: public Expression { |
| 898 public: | 911 public: |
| 899 explicit MaterializedLiteral(int literal_index, bool is_simple, int depth) | 912 MaterializedLiteral(Isolate* isolate, |
| 900 : literal_index_(literal_index), is_simple_(is_simple), depth_(depth) {} | 913 int literal_index, |
| 914 bool is_simple, |
| 915 int depth) |
| 916 : Expression(isolate), |
| 917 literal_index_(literal_index), |
| 918 is_simple_(is_simple), |
| 919 depth_(depth) {} |
| 901 | 920 |
| 902 virtual MaterializedLiteral* AsMaterializedLiteral() { return this; } | 921 virtual MaterializedLiteral* AsMaterializedLiteral() { return this; } |
| 903 | 922 |
| 904 int literal_index() { return literal_index_; } | 923 int literal_index() { return literal_index_; } |
| 905 | 924 |
| 906 // A materialized literal is simple if the values consist of only | 925 // A materialized literal is simple if the values consist of only |
| 907 // constants and simple object and array literals. | 926 // constants and simple object and array literals. |
| 908 bool is_simple() const { return is_simple_; } | 927 bool is_simple() const { return is_simple_; } |
| 909 | 928 |
| 910 int depth() const { return depth_; } | 929 int depth() const { return depth_; } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 946 void set_emit_store(bool emit_store); | 965 void set_emit_store(bool emit_store); |
| 947 bool emit_store(); | 966 bool emit_store(); |
| 948 | 967 |
| 949 private: | 968 private: |
| 950 Literal* key_; | 969 Literal* key_; |
| 951 Expression* value_; | 970 Expression* value_; |
| 952 Kind kind_; | 971 Kind kind_; |
| 953 bool emit_store_; | 972 bool emit_store_; |
| 954 }; | 973 }; |
| 955 | 974 |
| 956 ObjectLiteral(Handle<FixedArray> constant_properties, | 975 ObjectLiteral(Isolate* isolate, |
| 976 Handle<FixedArray> constant_properties, |
| 957 ZoneList<Property*>* properties, | 977 ZoneList<Property*>* properties, |
| 958 int literal_index, | 978 int literal_index, |
| 959 bool is_simple, | 979 bool is_simple, |
| 960 bool fast_elements, | 980 bool fast_elements, |
| 961 int depth, | 981 int depth, |
| 962 bool has_function) | 982 bool has_function) |
| 963 : MaterializedLiteral(literal_index, is_simple, depth), | 983 : MaterializedLiteral(isolate, literal_index, is_simple, depth), |
| 964 constant_properties_(constant_properties), | 984 constant_properties_(constant_properties), |
| 965 properties_(properties), | 985 properties_(properties), |
| 966 fast_elements_(fast_elements), | 986 fast_elements_(fast_elements), |
| 967 has_function_(has_function) {} | 987 has_function_(has_function) {} |
| 968 | 988 |
| 969 DECLARE_NODE_TYPE(ObjectLiteral) | 989 DECLARE_NODE_TYPE(ObjectLiteral) |
| 970 | 990 |
| 971 Handle<FixedArray> constant_properties() const { | 991 Handle<FixedArray> constant_properties() const { |
| 972 return constant_properties_; | 992 return constant_properties_; |
| 973 } | 993 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 992 Handle<FixedArray> constant_properties_; | 1012 Handle<FixedArray> constant_properties_; |
| 993 ZoneList<Property*>* properties_; | 1013 ZoneList<Property*>* properties_; |
| 994 bool fast_elements_; | 1014 bool fast_elements_; |
| 995 bool has_function_; | 1015 bool has_function_; |
| 996 }; | 1016 }; |
| 997 | 1017 |
| 998 | 1018 |
| 999 // Node for capturing a regexp literal. | 1019 // Node for capturing a regexp literal. |
| 1000 class RegExpLiteral: public MaterializedLiteral { | 1020 class RegExpLiteral: public MaterializedLiteral { |
| 1001 public: | 1021 public: |
| 1002 RegExpLiteral(Handle<String> pattern, | 1022 RegExpLiteral(Isolate* isolate, |
| 1023 Handle<String> pattern, |
| 1003 Handle<String> flags, | 1024 Handle<String> flags, |
| 1004 int literal_index) | 1025 int literal_index) |
| 1005 : MaterializedLiteral(literal_index, false, 1), | 1026 : MaterializedLiteral(isolate, literal_index, false, 1), |
| 1006 pattern_(pattern), | 1027 pattern_(pattern), |
| 1007 flags_(flags) {} | 1028 flags_(flags) {} |
| 1008 | 1029 |
| 1009 DECLARE_NODE_TYPE(RegExpLiteral) | 1030 DECLARE_NODE_TYPE(RegExpLiteral) |
| 1010 | 1031 |
| 1011 Handle<String> pattern() const { return pattern_; } | 1032 Handle<String> pattern() const { return pattern_; } |
| 1012 Handle<String> flags() const { return flags_; } | 1033 Handle<String> flags() const { return flags_; } |
| 1013 | 1034 |
| 1014 private: | 1035 private: |
| 1015 Handle<String> pattern_; | 1036 Handle<String> pattern_; |
| 1016 Handle<String> flags_; | 1037 Handle<String> flags_; |
| 1017 }; | 1038 }; |
| 1018 | 1039 |
| 1019 // An array literal has a literals object that is used | 1040 // An array literal has a literals object that is used |
| 1020 // for minimizing the work when constructing it at runtime. | 1041 // for minimizing the work when constructing it at runtime. |
| 1021 class ArrayLiteral: public MaterializedLiteral { | 1042 class ArrayLiteral: public MaterializedLiteral { |
| 1022 public: | 1043 public: |
| 1023 ArrayLiteral(Handle<FixedArray> constant_elements, | 1044 ArrayLiteral(Isolate* isolate, |
| 1045 Handle<FixedArray> constant_elements, |
| 1024 ZoneList<Expression*>* values, | 1046 ZoneList<Expression*>* values, |
| 1025 int literal_index, | 1047 int literal_index, |
| 1026 bool is_simple, | 1048 bool is_simple, |
| 1027 int depth) | 1049 int depth) |
| 1028 : MaterializedLiteral(literal_index, is_simple, depth), | 1050 : MaterializedLiteral(isolate, literal_index, is_simple, depth), |
| 1029 constant_elements_(constant_elements), | 1051 constant_elements_(constant_elements), |
| 1030 values_(values), | 1052 values_(values), |
| 1031 first_element_id_(ReserveIdRange(values->length())) {} | 1053 first_element_id_(ReserveIdRange(isolate, values->length())) {} |
| 1032 | 1054 |
| 1033 DECLARE_NODE_TYPE(ArrayLiteral) | 1055 DECLARE_NODE_TYPE(ArrayLiteral) |
| 1034 | 1056 |
| 1035 Handle<FixedArray> constant_elements() const { return constant_elements_; } | 1057 Handle<FixedArray> constant_elements() const { return constant_elements_; } |
| 1036 ZoneList<Expression*>* values() const { return values_; } | 1058 ZoneList<Expression*>* values() const { return values_; } |
| 1037 | 1059 |
| 1038 // Return an AST id for an element that is used in simulate instructions. | 1060 // Return an AST id for an element that is used in simulate instructions. |
| 1039 int GetIdForElement(int i) { return first_element_id_ + i; } | 1061 int GetIdForElement(int i) { return first_element_id_ + i; } |
| 1040 | 1062 |
| 1041 private: | 1063 private: |
| 1042 Handle<FixedArray> constant_elements_; | 1064 Handle<FixedArray> constant_elements_; |
| 1043 ZoneList<Expression*>* values_; | 1065 ZoneList<Expression*>* values_; |
| 1044 int first_element_id_; | 1066 int first_element_id_; |
| 1045 }; | 1067 }; |
| 1046 | 1068 |
| 1047 | 1069 |
| 1048 class VariableProxy: public Expression { | 1070 class VariableProxy: public Expression { |
| 1049 public: | 1071 public: |
| 1050 explicit VariableProxy(Variable* var); | 1072 VariableProxy(Isolate* isolate, Variable* var); |
| 1051 | 1073 |
| 1052 DECLARE_NODE_TYPE(VariableProxy) | 1074 DECLARE_NODE_TYPE(VariableProxy) |
| 1053 | 1075 |
| 1054 // Type testing & conversion | 1076 // Type testing & conversion |
| 1055 Variable* AsVariable() { return (this == NULL) ? NULL : var_; } | 1077 Variable* AsVariable() { return (this == NULL) ? NULL : var_; } |
| 1056 | 1078 |
| 1057 virtual bool IsValidLeftHandSide() { | 1079 virtual bool IsValidLeftHandSide() { |
| 1058 return var_ == NULL ? true : var_->IsValidLeftHandSide(); | 1080 return var_ == NULL ? true : var_->IsValidLeftHandSide(); |
| 1059 } | 1081 } |
| 1060 | 1082 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1087 void BindTo(Variable* var); | 1109 void BindTo(Variable* var); |
| 1088 | 1110 |
| 1089 protected: | 1111 protected: |
| 1090 Handle<String> name_; | 1112 Handle<String> name_; |
| 1091 Variable* var_; // resolved variable, or NULL | 1113 Variable* var_; // resolved variable, or NULL |
| 1092 bool is_this_; | 1114 bool is_this_; |
| 1093 bool inside_with_; | 1115 bool inside_with_; |
| 1094 bool is_trivial_; | 1116 bool is_trivial_; |
| 1095 int position_; | 1117 int position_; |
| 1096 | 1118 |
| 1097 VariableProxy(Handle<String> name, | 1119 VariableProxy(Isolate* isolate, |
| 1120 Handle<String> name, |
| 1098 bool is_this, | 1121 bool is_this, |
| 1099 bool inside_with, | 1122 bool inside_with, |
| 1100 int position = RelocInfo::kNoPosition); | 1123 int position = RelocInfo::kNoPosition); |
| 1101 explicit VariableProxy(bool is_this); | 1124 VariableProxy(Isolate* isolate, bool is_this); |
| 1102 | 1125 |
| 1103 friend class Scope; | 1126 friend class Scope; |
| 1104 }; | 1127 }; |
| 1105 | 1128 |
| 1106 | 1129 |
| 1107 class VariableProxySentinel: public VariableProxy { | 1130 class VariableProxySentinel: public VariableProxy { |
| 1108 public: | 1131 public: |
| 1109 virtual bool IsValidLeftHandSide() { return !is_this(); } | 1132 virtual bool IsValidLeftHandSide() { return !is_this(); } |
| 1110 | 1133 |
| 1111 private: | 1134 private: |
| 1112 explicit VariableProxySentinel(bool is_this) : VariableProxy(is_this) { } | 1135 VariableProxySentinel(Isolate* isolate, bool is_this) |
| 1136 : VariableProxy(isolate, is_this) { } |
| 1113 | 1137 |
| 1114 friend class AstSentinels; | 1138 friend class AstSentinels; |
| 1115 }; | 1139 }; |
| 1116 | 1140 |
| 1117 | 1141 |
| 1118 class Slot: public Expression { | 1142 class Slot: public Expression { |
| 1119 public: | 1143 public: |
| 1120 enum Type { | 1144 enum Type { |
| 1121 // A slot in the parameter section on the stack. index() is | 1145 // A slot in the parameter section on the stack. index() is |
| 1122 // the parameter index, counting left-to-right, starting at 0. | 1146 // the parameter index, counting left-to-right, starting at 0. |
| 1123 PARAMETER, | 1147 PARAMETER, |
| 1124 | 1148 |
| 1125 // A slot in the local section on the stack. index() is | 1149 // A slot in the local section on the stack. index() is |
| 1126 // the variable index in the stack frame, starting at 0. | 1150 // the variable index in the stack frame, starting at 0. |
| 1127 LOCAL, | 1151 LOCAL, |
| 1128 | 1152 |
| 1129 // An indexed slot in a heap context. index() is the | 1153 // An indexed slot in a heap context. index() is the |
| 1130 // variable index in the context object on the heap, | 1154 // variable index in the context object on the heap, |
| 1131 // starting at 0. var()->scope() is the corresponding | 1155 // starting at 0. var()->scope() is the corresponding |
| 1132 // scope. | 1156 // scope. |
| 1133 CONTEXT, | 1157 CONTEXT, |
| 1134 | 1158 |
| 1135 // A named slot in a heap context. var()->name() is the | 1159 // A named slot in a heap context. var()->name() is the |
| 1136 // variable name in the context object on the heap, | 1160 // variable name in the context object on the heap, |
| 1137 // with lookup starting at the current context. index() | 1161 // with lookup starting at the current context. index() |
| 1138 // is invalid. | 1162 // is invalid. |
| 1139 LOOKUP | 1163 LOOKUP |
| 1140 }; | 1164 }; |
| 1141 | 1165 |
| 1142 Slot(Variable* var, Type type, int index) | 1166 Slot(Isolate* isolate, Variable* var, Type type, int index) |
| 1143 : var_(var), type_(type), index_(index) { | 1167 : Expression(isolate), var_(var), type_(type), index_(index) { |
| 1144 ASSERT(var != NULL); | 1168 ASSERT(var != NULL); |
| 1145 } | 1169 } |
| 1146 | 1170 |
| 1147 virtual void Accept(AstVisitor* v); | 1171 virtual void Accept(AstVisitor* v); |
| 1148 | 1172 |
| 1149 virtual Slot* AsSlot() { return this; } | 1173 virtual Slot* AsSlot() { return this; } |
| 1150 | 1174 |
| 1151 bool IsStackAllocated() { return type_ == PARAMETER || type_ == LOCAL; } | 1175 bool IsStackAllocated() { return type_ == PARAMETER || type_ == LOCAL; } |
| 1152 | 1176 |
| 1153 // Accessors | 1177 // Accessors |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1164 }; | 1188 }; |
| 1165 | 1189 |
| 1166 | 1190 |
| 1167 class Property: public Expression { | 1191 class Property: public Expression { |
| 1168 public: | 1192 public: |
| 1169 // Synthetic properties are property lookups introduced by the system, | 1193 // Synthetic properties are property lookups introduced by the system, |
| 1170 // to objects that aren't visible to the user. Function calls to synthetic | 1194 // to objects that aren't visible to the user. Function calls to synthetic |
| 1171 // properties should use the global object as receiver, not the base object | 1195 // properties should use the global object as receiver, not the base object |
| 1172 // of the resolved Reference. | 1196 // of the resolved Reference. |
| 1173 enum Type { NORMAL, SYNTHETIC }; | 1197 enum Type { NORMAL, SYNTHETIC }; |
| 1174 Property(Expression* obj, Expression* key, int pos, Type type = NORMAL) | 1198 Property(Isolate* isolate, |
| 1175 : obj_(obj), | 1199 Expression* obj, |
| 1200 Expression* key, |
| 1201 int pos, |
| 1202 Type type = NORMAL) |
| 1203 : Expression(isolate), |
| 1204 obj_(obj), |
| 1176 key_(key), | 1205 key_(key), |
| 1177 pos_(pos), | 1206 pos_(pos), |
| 1178 type_(type), | 1207 type_(type), |
| 1179 receiver_types_(NULL), | 1208 receiver_types_(NULL), |
| 1180 is_monomorphic_(false), | 1209 is_monomorphic_(false), |
| 1181 is_array_length_(false), | 1210 is_array_length_(false), |
| 1182 is_string_length_(false), | 1211 is_string_length_(false), |
| 1183 is_string_access_(false), | 1212 is_string_access_(false), |
| 1184 is_function_prototype_(false) { } | 1213 is_function_prototype_(false) { } |
| 1185 | 1214 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1217 bool is_array_length_ : 1; | 1246 bool is_array_length_ : 1; |
| 1218 bool is_string_length_ : 1; | 1247 bool is_string_length_ : 1; |
| 1219 bool is_string_access_ : 1; | 1248 bool is_string_access_ : 1; |
| 1220 bool is_function_prototype_ : 1; | 1249 bool is_function_prototype_ : 1; |
| 1221 Handle<Map> monomorphic_receiver_type_; | 1250 Handle<Map> monomorphic_receiver_type_; |
| 1222 }; | 1251 }; |
| 1223 | 1252 |
| 1224 | 1253 |
| 1225 class Call: public Expression { | 1254 class Call: public Expression { |
| 1226 public: | 1255 public: |
| 1227 Call(Expression* expression, ZoneList<Expression*>* arguments, int pos) | 1256 Call(Isolate* isolate, |
| 1228 : expression_(expression), | 1257 Expression* expression, |
| 1258 ZoneList<Expression*>* arguments, |
| 1259 int pos) |
| 1260 : Expression(isolate), |
| 1261 expression_(expression), |
| 1229 arguments_(arguments), | 1262 arguments_(arguments), |
| 1230 pos_(pos), | 1263 pos_(pos), |
| 1231 is_monomorphic_(false), | 1264 is_monomorphic_(false), |
| 1232 check_type_(RECEIVER_MAP_CHECK), | 1265 check_type_(RECEIVER_MAP_CHECK), |
| 1233 receiver_types_(NULL), | 1266 receiver_types_(NULL), |
| 1234 return_id_(GetNextId()) { | 1267 return_id_(GetNextId(isolate)) { |
| 1235 } | 1268 } |
| 1236 | 1269 |
| 1237 DECLARE_NODE_TYPE(Call) | 1270 DECLARE_NODE_TYPE(Call) |
| 1238 | 1271 |
| 1239 virtual bool IsInlineable() const; | 1272 virtual bool IsInlineable() const; |
| 1240 | 1273 |
| 1241 Expression* expression() const { return expression_; } | 1274 Expression* expression() const { return expression_; } |
| 1242 ZoneList<Expression*>* arguments() const { return arguments_; } | 1275 ZoneList<Expression*>* arguments() const { return arguments_; } |
| 1243 virtual int position() const { return pos_; } | 1276 virtual int position() const { return pos_; } |
| 1244 | 1277 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1303 EmptyStatement empty_statement_; | 1336 EmptyStatement empty_statement_; |
| 1304 | 1337 |
| 1305 friend class Isolate; | 1338 friend class Isolate; |
| 1306 | 1339 |
| 1307 DISALLOW_COPY_AND_ASSIGN(AstSentinels); | 1340 DISALLOW_COPY_AND_ASSIGN(AstSentinels); |
| 1308 }; | 1341 }; |
| 1309 | 1342 |
| 1310 | 1343 |
| 1311 class CallNew: public Expression { | 1344 class CallNew: public Expression { |
| 1312 public: | 1345 public: |
| 1313 CallNew(Expression* expression, ZoneList<Expression*>* arguments, int pos) | 1346 CallNew(Isolate* isolate, |
| 1314 : expression_(expression), arguments_(arguments), pos_(pos) { } | 1347 Expression* expression, |
| 1348 ZoneList<Expression*>* arguments, |
| 1349 int pos) |
| 1350 : Expression(isolate), |
| 1351 expression_(expression), |
| 1352 arguments_(arguments), |
| 1353 pos_(pos) { } |
| 1315 | 1354 |
| 1316 DECLARE_NODE_TYPE(CallNew) | 1355 DECLARE_NODE_TYPE(CallNew) |
| 1317 | 1356 |
| 1318 virtual bool IsInlineable() const; | 1357 virtual bool IsInlineable() const; |
| 1319 | 1358 |
| 1320 Expression* expression() const { return expression_; } | 1359 Expression* expression() const { return expression_; } |
| 1321 ZoneList<Expression*>* arguments() const { return arguments_; } | 1360 ZoneList<Expression*>* arguments() const { return arguments_; } |
| 1322 virtual int position() const { return pos_; } | 1361 virtual int position() const { return pos_; } |
| 1323 | 1362 |
| 1324 private: | 1363 private: |
| 1325 Expression* expression_; | 1364 Expression* expression_; |
| 1326 ZoneList<Expression*>* arguments_; | 1365 ZoneList<Expression*>* arguments_; |
| 1327 int pos_; | 1366 int pos_; |
| 1328 }; | 1367 }; |
| 1329 | 1368 |
| 1330 | 1369 |
| 1331 // The CallRuntime class does not represent any official JavaScript | 1370 // The CallRuntime class does not represent any official JavaScript |
| 1332 // language construct. Instead it is used to call a C or JS function | 1371 // language construct. Instead it is used to call a C or JS function |
| 1333 // with a set of arguments. This is used from the builtins that are | 1372 // with a set of arguments. This is used from the builtins that are |
| 1334 // implemented in JavaScript (see "v8natives.js"). | 1373 // implemented in JavaScript (see "v8natives.js"). |
| 1335 class CallRuntime: public Expression { | 1374 class CallRuntime: public Expression { |
| 1336 public: | 1375 public: |
| 1337 CallRuntime(Handle<String> name, | 1376 CallRuntime(Isolate* isolate, |
| 1377 Handle<String> name, |
| 1338 const Runtime::Function* function, | 1378 const Runtime::Function* function, |
| 1339 ZoneList<Expression*>* arguments) | 1379 ZoneList<Expression*>* arguments) |
| 1340 : name_(name), function_(function), arguments_(arguments) { } | 1380 : Expression(isolate), |
| 1381 name_(name), |
| 1382 function_(function), |
| 1383 arguments_(arguments) { } |
| 1341 | 1384 |
| 1342 DECLARE_NODE_TYPE(CallRuntime) | 1385 DECLARE_NODE_TYPE(CallRuntime) |
| 1343 | 1386 |
| 1344 virtual bool IsInlineable() const; | 1387 virtual bool IsInlineable() const; |
| 1345 | 1388 |
| 1346 Handle<String> name() const { return name_; } | 1389 Handle<String> name() const { return name_; } |
| 1347 const Runtime::Function* function() const { return function_; } | 1390 const Runtime::Function* function() const { return function_; } |
| 1348 ZoneList<Expression*>* arguments() const { return arguments_; } | 1391 ZoneList<Expression*>* arguments() const { return arguments_; } |
| 1349 bool is_jsruntime() const { return function_ == NULL; } | 1392 bool is_jsruntime() const { return function_ == NULL; } |
| 1350 | 1393 |
| 1351 private: | 1394 private: |
| 1352 Handle<String> name_; | 1395 Handle<String> name_; |
| 1353 const Runtime::Function* function_; | 1396 const Runtime::Function* function_; |
| 1354 ZoneList<Expression*>* arguments_; | 1397 ZoneList<Expression*>* arguments_; |
| 1355 }; | 1398 }; |
| 1356 | 1399 |
| 1357 | 1400 |
| 1358 class UnaryOperation: public Expression { | 1401 class UnaryOperation: public Expression { |
| 1359 public: | 1402 public: |
| 1360 UnaryOperation(Token::Value op, Expression* expression, int pos) | 1403 UnaryOperation(Isolate* isolate, |
| 1361 : op_(op), expression_(expression), pos_(pos) { | 1404 Token::Value op, |
| 1405 Expression* expression, |
| 1406 int pos) |
| 1407 : Expression(isolate), op_(op), expression_(expression), pos_(pos) { |
| 1362 ASSERT(Token::IsUnaryOp(op)); | 1408 ASSERT(Token::IsUnaryOp(op)); |
| 1363 } | 1409 } |
| 1364 | 1410 |
| 1365 DECLARE_NODE_TYPE(UnaryOperation) | 1411 DECLARE_NODE_TYPE(UnaryOperation) |
| 1366 | 1412 |
| 1367 virtual bool IsInlineable() const; | 1413 virtual bool IsInlineable() const; |
| 1368 | 1414 |
| 1369 virtual bool ResultOverwriteAllowed(); | 1415 virtual bool ResultOverwriteAllowed(); |
| 1370 | 1416 |
| 1371 Token::Value op() const { return op_; } | 1417 Token::Value op() const { return op_; } |
| 1372 Expression* expression() const { return expression_; } | 1418 Expression* expression() const { return expression_; } |
| 1373 virtual int position() const { return pos_; } | 1419 virtual int position() const { return pos_; } |
| 1374 | 1420 |
| 1375 private: | 1421 private: |
| 1376 Token::Value op_; | 1422 Token::Value op_; |
| 1377 Expression* expression_; | 1423 Expression* expression_; |
| 1378 int pos_; | 1424 int pos_; |
| 1379 }; | 1425 }; |
| 1380 | 1426 |
| 1381 | 1427 |
| 1382 class BinaryOperation: public Expression { | 1428 class BinaryOperation: public Expression { |
| 1383 public: | 1429 public: |
| 1384 BinaryOperation(Token::Value op, | 1430 BinaryOperation(Isolate* isolate, |
| 1431 Token::Value op, |
| 1385 Expression* left, | 1432 Expression* left, |
| 1386 Expression* right, | 1433 Expression* right, |
| 1387 int pos) | 1434 int pos) |
| 1388 : op_(op), left_(left), right_(right), pos_(pos) { | 1435 : Expression(isolate), op_(op), left_(left), right_(right), pos_(pos) { |
| 1389 ASSERT(Token::IsBinaryOp(op)); | 1436 ASSERT(Token::IsBinaryOp(op)); |
| 1390 right_id_ = (op == Token::AND || op == Token::OR) | 1437 right_id_ = (op == Token::AND || op == Token::OR) |
| 1391 ? static_cast<int>(GetNextId()) | 1438 ? static_cast<int>(GetNextId(isolate)) |
| 1392 : AstNode::kNoNumber; | 1439 : AstNode::kNoNumber; |
| 1393 } | 1440 } |
| 1394 | 1441 |
| 1395 DECLARE_NODE_TYPE(BinaryOperation) | 1442 DECLARE_NODE_TYPE(BinaryOperation) |
| 1396 | 1443 |
| 1397 virtual bool IsInlineable() const; | 1444 virtual bool IsInlineable() const; |
| 1398 | 1445 |
| 1399 virtual bool ResultOverwriteAllowed(); | 1446 virtual bool ResultOverwriteAllowed(); |
| 1400 | 1447 |
| 1401 Token::Value op() const { return op_; } | 1448 Token::Value op() const { return op_; } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1412 Expression* right_; | 1459 Expression* right_; |
| 1413 int pos_; | 1460 int pos_; |
| 1414 // The short-circuit logical operations have an AST ID for their | 1461 // The short-circuit logical operations have an AST ID for their |
| 1415 // right-hand subexpression. | 1462 // right-hand subexpression. |
| 1416 int right_id_; | 1463 int right_id_; |
| 1417 }; | 1464 }; |
| 1418 | 1465 |
| 1419 | 1466 |
| 1420 class CountOperation: public Expression { | 1467 class CountOperation: public Expression { |
| 1421 public: | 1468 public: |
| 1422 CountOperation(Token::Value op, bool is_prefix, Expression* expr, int pos) | 1469 CountOperation(Isolate* isolate, |
| 1423 : op_(op), | 1470 Token::Value op, |
| 1471 bool is_prefix, |
| 1472 Expression* expr, |
| 1473 int pos) |
| 1474 : Expression(isolate), |
| 1475 op_(op), |
| 1424 is_prefix_(is_prefix), | 1476 is_prefix_(is_prefix), |
| 1425 expression_(expr), | 1477 expression_(expr), |
| 1426 pos_(pos), | 1478 pos_(pos), |
| 1427 assignment_id_(GetNextId()), | 1479 assignment_id_(GetNextId(isolate)), |
| 1428 count_id_(GetNextId()), | 1480 count_id_(GetNextId(isolate)), |
| 1429 receiver_types_(NULL) { } | 1481 receiver_types_(NULL) { } |
| 1430 | 1482 |
| 1431 DECLARE_NODE_TYPE(CountOperation) | 1483 DECLARE_NODE_TYPE(CountOperation) |
| 1432 | 1484 |
| 1433 bool is_prefix() const { return is_prefix_; } | 1485 bool is_prefix() const { return is_prefix_; } |
| 1434 bool is_postfix() const { return !is_prefix_; } | 1486 bool is_postfix() const { return !is_prefix_; } |
| 1435 | 1487 |
| 1436 Token::Value op() const { return op_; } | 1488 Token::Value op() const { return op_; } |
| 1437 Token::Value binary_op() { | 1489 Token::Value binary_op() { |
| 1438 return (op() == Token::INC) ? Token::ADD : Token::SUB; | 1490 return (op() == Token::INC) ? Token::ADD : Token::SUB; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1464 int pos_; | 1516 int pos_; |
| 1465 int assignment_id_; | 1517 int assignment_id_; |
| 1466 int count_id_; | 1518 int count_id_; |
| 1467 Handle<Map> monomorphic_receiver_type_; | 1519 Handle<Map> monomorphic_receiver_type_; |
| 1468 ZoneMapList* receiver_types_; | 1520 ZoneMapList* receiver_types_; |
| 1469 }; | 1521 }; |
| 1470 | 1522 |
| 1471 | 1523 |
| 1472 class CompareOperation: public Expression { | 1524 class CompareOperation: public Expression { |
| 1473 public: | 1525 public: |
| 1474 CompareOperation(Token::Value op, | 1526 CompareOperation(Isolate* isolate, |
| 1527 Token::Value op, |
| 1475 Expression* left, | 1528 Expression* left, |
| 1476 Expression* right, | 1529 Expression* right, |
| 1477 int pos) | 1530 int pos) |
| 1478 : op_(op), left_(left), right_(right), pos_(pos), compare_type_(NONE) { | 1531 : Expression(isolate), |
| 1532 op_(op), |
| 1533 left_(left), |
| 1534 right_(right), |
| 1535 pos_(pos), |
| 1536 compare_type_(NONE) { |
| 1479 ASSERT(Token::IsCompareOp(op)); | 1537 ASSERT(Token::IsCompareOp(op)); |
| 1480 } | 1538 } |
| 1481 | 1539 |
| 1482 DECLARE_NODE_TYPE(CompareOperation) | 1540 DECLARE_NODE_TYPE(CompareOperation) |
| 1483 | 1541 |
| 1484 Token::Value op() const { return op_; } | 1542 Token::Value op() const { return op_; } |
| 1485 Expression* left() const { return left_; } | 1543 Expression* left() const { return left_; } |
| 1486 Expression* right() const { return right_; } | 1544 Expression* right() const { return right_; } |
| 1487 virtual int position() const { return pos_; } | 1545 virtual int position() const { return pos_; } |
| 1488 | 1546 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1503 Expression* right_; | 1561 Expression* right_; |
| 1504 int pos_; | 1562 int pos_; |
| 1505 | 1563 |
| 1506 enum CompareTypeFeedback { NONE, SMI_ONLY, OBJECT_ONLY }; | 1564 enum CompareTypeFeedback { NONE, SMI_ONLY, OBJECT_ONLY }; |
| 1507 CompareTypeFeedback compare_type_; | 1565 CompareTypeFeedback compare_type_; |
| 1508 }; | 1566 }; |
| 1509 | 1567 |
| 1510 | 1568 |
| 1511 class CompareToNull: public Expression { | 1569 class CompareToNull: public Expression { |
| 1512 public: | 1570 public: |
| 1513 CompareToNull(bool is_strict, Expression* expression) | 1571 CompareToNull(Isolate* isolate, bool is_strict, Expression* expression) |
| 1514 : is_strict_(is_strict), expression_(expression) { } | 1572 : Expression(isolate), is_strict_(is_strict), expression_(expression) { } |
| 1515 | 1573 |
| 1516 DECLARE_NODE_TYPE(CompareToNull) | 1574 DECLARE_NODE_TYPE(CompareToNull) |
| 1517 | 1575 |
| 1518 virtual bool IsInlineable() const; | 1576 virtual bool IsInlineable() const; |
| 1519 | 1577 |
| 1520 bool is_strict() const { return is_strict_; } | 1578 bool is_strict() const { return is_strict_; } |
| 1521 Token::Value op() const { return is_strict_ ? Token::EQ_STRICT : Token::EQ; } | 1579 Token::Value op() const { return is_strict_ ? Token::EQ_STRICT : Token::EQ; } |
| 1522 Expression* expression() const { return expression_; } | 1580 Expression* expression() const { return expression_; } |
| 1523 | 1581 |
| 1524 private: | 1582 private: |
| 1525 bool is_strict_; | 1583 bool is_strict_; |
| 1526 Expression* expression_; | 1584 Expression* expression_; |
| 1527 }; | 1585 }; |
| 1528 | 1586 |
| 1529 | 1587 |
| 1530 class Conditional: public Expression { | 1588 class Conditional: public Expression { |
| 1531 public: | 1589 public: |
| 1532 Conditional(Expression* condition, | 1590 Conditional(Isolate* isolate, |
| 1591 Expression* condition, |
| 1533 Expression* then_expression, | 1592 Expression* then_expression, |
| 1534 Expression* else_expression, | 1593 Expression* else_expression, |
| 1535 int then_expression_position, | 1594 int then_expression_position, |
| 1536 int else_expression_position) | 1595 int else_expression_position) |
| 1537 : condition_(condition), | 1596 : Expression(isolate), |
| 1597 condition_(condition), |
| 1538 then_expression_(then_expression), | 1598 then_expression_(then_expression), |
| 1539 else_expression_(else_expression), | 1599 else_expression_(else_expression), |
| 1540 then_expression_position_(then_expression_position), | 1600 then_expression_position_(then_expression_position), |
| 1541 else_expression_position_(else_expression_position), | 1601 else_expression_position_(else_expression_position), |
| 1542 then_id_(GetNextId()), | 1602 then_id_(GetNextId(isolate)), |
| 1543 else_id_(GetNextId()) { | 1603 else_id_(GetNextId(isolate)) { |
| 1544 } | 1604 } |
| 1545 | 1605 |
| 1546 DECLARE_NODE_TYPE(Conditional) | 1606 DECLARE_NODE_TYPE(Conditional) |
| 1547 | 1607 |
| 1548 virtual bool IsInlineable() const; | 1608 virtual bool IsInlineable() const; |
| 1549 | 1609 |
| 1550 Expression* condition() const { return condition_; } | 1610 Expression* condition() const { return condition_; } |
| 1551 Expression* then_expression() const { return then_expression_; } | 1611 Expression* then_expression() const { return then_expression_; } |
| 1552 Expression* else_expression() const { return else_expression_; } | 1612 Expression* else_expression() const { return else_expression_; } |
| 1553 | 1613 |
| 1554 int then_expression_position() const { return then_expression_position_; } | 1614 int then_expression_position() const { return then_expression_position_; } |
| 1555 int else_expression_position() const { return else_expression_position_; } | 1615 int else_expression_position() const { return else_expression_position_; } |
| 1556 | 1616 |
| 1557 int ThenId() const { return then_id_; } | 1617 int ThenId() const { return then_id_; } |
| 1558 int ElseId() const { return else_id_; } | 1618 int ElseId() const { return else_id_; } |
| 1559 | 1619 |
| 1560 private: | 1620 private: |
| 1561 Expression* condition_; | 1621 Expression* condition_; |
| 1562 Expression* then_expression_; | 1622 Expression* then_expression_; |
| 1563 Expression* else_expression_; | 1623 Expression* else_expression_; |
| 1564 int then_expression_position_; | 1624 int then_expression_position_; |
| 1565 int else_expression_position_; | 1625 int else_expression_position_; |
| 1566 int then_id_; | 1626 int then_id_; |
| 1567 int else_id_; | 1627 int else_id_; |
| 1568 }; | 1628 }; |
| 1569 | 1629 |
| 1570 | 1630 |
| 1571 class Assignment: public Expression { | 1631 class Assignment: public Expression { |
| 1572 public: | 1632 public: |
| 1573 Assignment(Token::Value op, Expression* target, Expression* value, int pos); | 1633 Assignment(Isolate* isolate, |
| 1634 Token::Value op, |
| 1635 Expression* target, |
| 1636 Expression* value, |
| 1637 int pos); |
| 1574 | 1638 |
| 1575 DECLARE_NODE_TYPE(Assignment) | 1639 DECLARE_NODE_TYPE(Assignment) |
| 1576 | 1640 |
| 1577 virtual bool IsInlineable() const; | 1641 virtual bool IsInlineable() const; |
| 1578 | 1642 |
| 1579 Assignment* AsSimpleAssignment() { return !is_compound() ? this : NULL; } | 1643 Assignment* AsSimpleAssignment() { return !is_compound() ? this : NULL; } |
| 1580 | 1644 |
| 1581 Token::Value binary_op() const; | 1645 Token::Value binary_op() const; |
| 1582 | 1646 |
| 1583 Token::Value op() const { return op_; } | 1647 Token::Value op() const { return op_; } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1623 bool block_end_; | 1687 bool block_end_; |
| 1624 | 1688 |
| 1625 bool is_monomorphic_; | 1689 bool is_monomorphic_; |
| 1626 ZoneMapList* receiver_types_; | 1690 ZoneMapList* receiver_types_; |
| 1627 Handle<Map> monomorphic_receiver_type_; | 1691 Handle<Map> monomorphic_receiver_type_; |
| 1628 }; | 1692 }; |
| 1629 | 1693 |
| 1630 | 1694 |
| 1631 class Throw: public Expression { | 1695 class Throw: public Expression { |
| 1632 public: | 1696 public: |
| 1633 Throw(Expression* exception, int pos) | 1697 Throw(Isolate* isolate, Expression* exception, int pos) |
| 1634 : exception_(exception), pos_(pos) {} | 1698 : Expression(isolate), exception_(exception), pos_(pos) {} |
| 1635 | 1699 |
| 1636 DECLARE_NODE_TYPE(Throw) | 1700 DECLARE_NODE_TYPE(Throw) |
| 1637 | 1701 |
| 1638 Expression* exception() const { return exception_; } | 1702 Expression* exception() const { return exception_; } |
| 1639 virtual int position() const { return pos_; } | 1703 virtual int position() const { return pos_; } |
| 1640 virtual bool IsInlineable() const; | 1704 virtual bool IsInlineable() const; |
| 1641 | 1705 |
| 1642 private: | 1706 private: |
| 1643 Expression* exception_; | 1707 Expression* exception_; |
| 1644 int pos_; | 1708 int pos_; |
| 1645 }; | 1709 }; |
| 1646 | 1710 |
| 1647 | 1711 |
| 1648 class FunctionLiteral: public Expression { | 1712 class FunctionLiteral: public Expression { |
| 1649 public: | 1713 public: |
| 1650 FunctionLiteral(Handle<String> name, | 1714 FunctionLiteral(Isolate* isolate, |
| 1715 Handle<String> name, |
| 1651 Scope* scope, | 1716 Scope* scope, |
| 1652 ZoneList<Statement*>* body, | 1717 ZoneList<Statement*>* body, |
| 1653 int materialized_literal_count, | 1718 int materialized_literal_count, |
| 1654 int expected_property_count, | 1719 int expected_property_count, |
| 1655 bool has_only_simple_this_property_assignments, | 1720 bool has_only_simple_this_property_assignments, |
| 1656 Handle<FixedArray> this_property_assignments, | 1721 Handle<FixedArray> this_property_assignments, |
| 1657 int num_parameters, | 1722 int num_parameters, |
| 1658 int start_position, | 1723 int start_position, |
| 1659 int end_position, | 1724 int end_position, |
| 1660 bool is_expression, | 1725 bool is_expression, |
| 1661 bool has_duplicate_parameters) | 1726 bool has_duplicate_parameters) |
| 1662 : name_(name), | 1727 : Expression(isolate), |
| 1728 name_(name), |
| 1663 scope_(scope), | 1729 scope_(scope), |
| 1664 body_(body), | 1730 body_(body), |
| 1665 materialized_literal_count_(materialized_literal_count), | 1731 materialized_literal_count_(materialized_literal_count), |
| 1666 expected_property_count_(expected_property_count), | 1732 expected_property_count_(expected_property_count), |
| 1667 has_only_simple_this_property_assignments_( | 1733 has_only_simple_this_property_assignments_( |
| 1668 has_only_simple_this_property_assignments), | 1734 has_only_simple_this_property_assignments), |
| 1669 this_property_assignments_(this_property_assignments), | 1735 this_property_assignments_(this_property_assignments), |
| 1670 num_parameters_(num_parameters), | 1736 num_parameters_(num_parameters), |
| 1671 start_position_(start_position), | 1737 start_position_(start_position), |
| 1672 end_position_(end_position), | 1738 end_position_(end_position), |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1731 int function_token_position_; | 1797 int function_token_position_; |
| 1732 Handle<String> inferred_name_; | 1798 Handle<String> inferred_name_; |
| 1733 bool is_expression_; | 1799 bool is_expression_; |
| 1734 bool pretenure_; | 1800 bool pretenure_; |
| 1735 bool has_duplicate_parameters_; | 1801 bool has_duplicate_parameters_; |
| 1736 }; | 1802 }; |
| 1737 | 1803 |
| 1738 | 1804 |
| 1739 class SharedFunctionInfoLiteral: public Expression { | 1805 class SharedFunctionInfoLiteral: public Expression { |
| 1740 public: | 1806 public: |
| 1741 explicit SharedFunctionInfoLiteral( | 1807 SharedFunctionInfoLiteral( |
| 1808 Isolate* isolate, |
| 1742 Handle<SharedFunctionInfo> shared_function_info) | 1809 Handle<SharedFunctionInfo> shared_function_info) |
| 1743 : shared_function_info_(shared_function_info) { } | 1810 : Expression(isolate), shared_function_info_(shared_function_info) { } |
| 1744 | 1811 |
| 1745 DECLARE_NODE_TYPE(SharedFunctionInfoLiteral) | 1812 DECLARE_NODE_TYPE(SharedFunctionInfoLiteral) |
| 1746 | 1813 |
| 1747 Handle<SharedFunctionInfo> shared_function_info() const { | 1814 Handle<SharedFunctionInfo> shared_function_info() const { |
| 1748 return shared_function_info_; | 1815 return shared_function_info_; |
| 1749 } | 1816 } |
| 1750 virtual bool IsInlineable() const; | 1817 virtual bool IsInlineable() const; |
| 1751 | 1818 |
| 1752 private: | 1819 private: |
| 1753 Handle<SharedFunctionInfo> shared_function_info_; | 1820 Handle<SharedFunctionInfo> shared_function_info_; |
| 1754 }; | 1821 }; |
| 1755 | 1822 |
| 1756 | 1823 |
| 1757 class ThisFunction: public Expression { | 1824 class ThisFunction: public Expression { |
| 1758 public: | 1825 public: |
| 1826 explicit ThisFunction(Isolate* isolate) : Expression(isolate) {} |
| 1759 DECLARE_NODE_TYPE(ThisFunction) | 1827 DECLARE_NODE_TYPE(ThisFunction) |
| 1760 virtual bool IsInlineable() const; | 1828 virtual bool IsInlineable() const; |
| 1761 }; | 1829 }; |
| 1762 | 1830 |
| 1763 | 1831 |
| 1764 // ---------------------------------------------------------------------------- | 1832 // ---------------------------------------------------------------------------- |
| 1765 // Regular expressions | 1833 // Regular expressions |
| 1766 | 1834 |
| 1767 | 1835 |
| 1768 class RegExpVisitor BASE_EMBEDDED { | 1836 class RegExpVisitor BASE_EMBEDDED { |
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2159 | 2227 |
| 2160 private: | 2228 private: |
| 2161 Isolate* isolate_; | 2229 Isolate* isolate_; |
| 2162 bool stack_overflow_; | 2230 bool stack_overflow_; |
| 2163 }; | 2231 }; |
| 2164 | 2232 |
| 2165 | 2233 |
| 2166 } } // namespace v8::internal | 2234 } } // namespace v8::internal |
| 2167 | 2235 |
| 2168 #endif // V8_AST_H_ | 2236 #endif // V8_AST_H_ |
| OLD | NEW |