| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 27 | 27 |
| 28 #include "v8.h" | 28 #include "v8.h" |
| 29 | 29 |
| 30 #include "ast.h" | 30 #include "ast.h" |
| 31 #include "data-flow.h" | |
| 32 #include "parser.h" | 31 #include "parser.h" |
| 33 #include "scopes.h" | 32 #include "scopes.h" |
| 34 #include "string-stream.h" | 33 #include "string-stream.h" |
| 35 #include "ast-inl.h" | 34 #include "ast-inl.h" |
| 36 #include "jump-target-inl.h" | 35 #include "jump-target-inl.h" |
| 37 | 36 |
| 38 namespace v8 { | 37 namespace v8 { |
| 39 namespace internal { | 38 namespace internal { |
| 40 | 39 |
| 41 | 40 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 71 } | 70 } |
| 72 | 71 |
| 73 | 72 |
| 74 VariableProxy::VariableProxy(Handle<String> name, | 73 VariableProxy::VariableProxy(Handle<String> name, |
| 75 bool is_this, | 74 bool is_this, |
| 76 bool inside_with) | 75 bool inside_with) |
| 77 : name_(name), | 76 : name_(name), |
| 78 var_(NULL), | 77 var_(NULL), |
| 79 is_this_(is_this), | 78 is_this_(is_this), |
| 80 inside_with_(inside_with), | 79 inside_with_(inside_with), |
| 81 is_trivial_(false), | 80 is_trivial_(false) { |
| 82 reaching_definitions_(NULL), | |
| 83 is_primitive_(false) { | |
| 84 // names must be canonicalized for fast equality checks | 81 // names must be canonicalized for fast equality checks |
| 85 ASSERT(name->IsSymbol()); | 82 ASSERT(name->IsSymbol()); |
| 86 } | 83 } |
| 87 | 84 |
| 88 | 85 |
| 89 VariableProxy::VariableProxy(bool is_this) | 86 VariableProxy::VariableProxy(bool is_this) |
| 90 : is_this_(is_this), | 87 : is_this_(is_this) { |
| 91 reaching_definitions_(NULL), | |
| 92 is_primitive_(false) { | |
| 93 } | 88 } |
| 94 | 89 |
| 95 | 90 |
| 96 void VariableProxy::BindTo(Variable* var) { | 91 void VariableProxy::BindTo(Variable* var) { |
| 97 ASSERT(var_ == NULL); // must be bound only once | 92 ASSERT(var_ == NULL); // must be bound only once |
| 98 ASSERT(var != NULL); // must bind | 93 ASSERT(var != NULL); // must bind |
| 99 ASSERT((is_this() && var->is_this()) || name_.is_identical_to(var->name())); | 94 ASSERT((is_this() && var->is_this()) || name_.is_identical_to(var->name())); |
| 100 // Ideally CONST-ness should match. However, this is very hard to achieve | 95 // Ideally CONST-ness should match. However, this is very hard to achieve |
| 101 // because we don't know the exact semantics of conflicting (const and | 96 // because we don't know the exact semantics of conflicting (const and |
| 102 // non-const) multiple variable declarations, const vars introduced via | 97 // non-const) multiple variable declarations, const vars introduced via |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 return false; | 225 return false; |
| 231 break; | 226 break; |
| 232 } | 227 } |
| 233 default: | 228 default: |
| 234 UNREACHABLE(); | 229 UNREACHABLE(); |
| 235 break; | 230 break; |
| 236 } | 231 } |
| 237 return false; | 232 return false; |
| 238 } | 233 } |
| 239 | 234 |
| 235 |
| 236 void Expression::CopyAnalysisResultsFrom(Expression* other) { |
| 237 bitfields_ = other->bitfields_; |
| 238 type_ = other->type_; |
| 239 } |
| 240 |
| 241 |
| 240 // ---------------------------------------------------------------------------- | 242 // ---------------------------------------------------------------------------- |
| 241 // Implementation of AstVisitor | 243 // Implementation of AstVisitor |
| 242 | 244 |
| 243 bool AstVisitor::CheckStackOverflow() { | 245 bool AstVisitor::CheckStackOverflow() { |
| 244 if (stack_overflow_) return true; | 246 if (stack_overflow_) return true; |
| 245 StackLimitCheck check; | 247 StackLimitCheck check; |
| 246 if (!check.HasOverflowed()) return false; | 248 if (!check.HasOverflowed()) return false; |
| 247 return (stack_overflow_ = true); | 249 return (stack_overflow_ = true); |
| 248 } | 250 } |
| 249 | 251 |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 568 min_match_ += node->min_match(); | 570 min_match_ += node->min_match(); |
| 569 int node_max_match = node->max_match(); | 571 int node_max_match = node->max_match(); |
| 570 if (kInfinity - max_match_ < node_max_match) { | 572 if (kInfinity - max_match_ < node_max_match) { |
| 571 max_match_ = kInfinity; | 573 max_match_ = kInfinity; |
| 572 } else { | 574 } else { |
| 573 max_match_ += node->max_match(); | 575 max_match_ += node->max_match(); |
| 574 } | 576 } |
| 575 } | 577 } |
| 576 } | 578 } |
| 577 | 579 |
| 578 // IsPrimitive implementation. IsPrimitive is true if the value of an | |
| 579 // expression is known at compile-time to be any JS type other than Object | |
| 580 // (e.g, it is Undefined, Null, Boolean, String, or Number). | |
| 581 | |
| 582 // The following expression types are never primitive because they express | |
| 583 // Object values. | |
| 584 bool FunctionLiteral::IsPrimitive() { return false; } | |
| 585 bool SharedFunctionInfoLiteral::IsPrimitive() { return false; } | |
| 586 bool RegExpLiteral::IsPrimitive() { return false; } | |
| 587 bool ObjectLiteral::IsPrimitive() { return false; } | |
| 588 bool ArrayLiteral::IsPrimitive() { return false; } | |
| 589 bool CatchExtensionObject::IsPrimitive() { return false; } | |
| 590 bool CallNew::IsPrimitive() { return false; } | |
| 591 bool ThisFunction::IsPrimitive() { return false; } | |
| 592 | |
| 593 | |
| 594 // The following expression types are not always primitive because we do not | |
| 595 // have enough information to conclude that they are. | |
| 596 bool Property::IsPrimitive() { return false; } | |
| 597 bool Call::IsPrimitive() { return false; } | |
| 598 bool CallRuntime::IsPrimitive() { return false; } | |
| 599 | |
| 600 | |
| 601 // A variable use is not primitive unless the primitive-type analysis | |
| 602 // determines otherwise. | |
| 603 bool VariableProxy::IsPrimitive() { | |
| 604 ASSERT(!is_primitive_ || (var() != NULL && var()->IsStackAllocated())); | |
| 605 return is_primitive_; | |
| 606 } | |
| 607 | |
| 608 // The value of a conditional is the value of one of the alternatives. It's | |
| 609 // always primitive if both alternatives are always primitive. | |
| 610 bool Conditional::IsPrimitive() { | |
| 611 return then_expression()->IsPrimitive() && else_expression()->IsPrimitive(); | |
| 612 } | |
| 613 | |
| 614 | |
| 615 // A literal is primitive when it is not a JSObject. | |
| 616 bool Literal::IsPrimitive() { return !handle()->IsJSObject(); } | |
| 617 | |
| 618 | |
| 619 // The value of an assignment is the value of its right-hand side. | |
| 620 bool Assignment::IsPrimitive() { | |
| 621 switch (op()) { | |
| 622 case Token::INIT_VAR: | |
| 623 case Token::INIT_CONST: | |
| 624 case Token::ASSIGN: | |
| 625 return value()->IsPrimitive(); | |
| 626 | |
| 627 default: | |
| 628 // {|=, ^=, &=, <<=, >>=, >>>=, +=, -=, *=, /=, %=} | |
| 629 // Arithmetic operations are always primitive. They express Numbers | |
| 630 // with the exception of +, which expresses a Number or a String. | |
| 631 return true; | |
| 632 } | |
| 633 } | |
| 634 | |
| 635 | |
| 636 // Throw does not express a value, so it's trivially always primitive. | |
| 637 bool Throw::IsPrimitive() { return true; } | |
| 638 | |
| 639 | |
| 640 // Unary operations always express primitive values. delete and ! express | |
| 641 // Booleans, void Undefined, typeof String, +, -, and ~ Numbers. | |
| 642 bool UnaryOperation::IsPrimitive() { return true; } | |
| 643 | |
| 644 | |
| 645 // Count operations (pre- and post-fix increment and decrement) always | |
| 646 // express primitive values (Numbers). See ECMA-262-3, 11.3.1, 11.3.2, | |
| 647 // 11.4.4, ane 11.4.5. | |
| 648 bool CountOperation::IsPrimitive() { return true; } | |
| 649 | |
| 650 | |
| 651 // Binary operations depend on the operator. | |
| 652 bool BinaryOperation::IsPrimitive() { | |
| 653 switch (op()) { | |
| 654 case Token::COMMA: | |
| 655 // Value is the value of the right subexpression. | |
| 656 return right()->IsPrimitive(); | |
| 657 | |
| 658 case Token::OR: | |
| 659 case Token::AND: | |
| 660 // Value is the value one of the subexpressions. | |
| 661 return left()->IsPrimitive() && right()->IsPrimitive(); | |
| 662 | |
| 663 default: | |
| 664 // {|, ^, &, <<, >>, >>>, +, -, *, /, %} | |
| 665 // Arithmetic operations are always primitive. They express Numbers | |
| 666 // with the exception of +, which expresses a Number or a String. | |
| 667 return true; | |
| 668 } | |
| 669 } | |
| 670 | |
| 671 | |
| 672 // Compare operations always express Boolean values. | |
| 673 bool CompareOperation::IsPrimitive() { return true; } | |
| 674 | |
| 675 | |
| 676 // Overridden IsCritical member functions. IsCritical is true for AST nodes | |
| 677 // whose evaluation is absolutely required (they are never dead) because | |
| 678 // they are externally visible. | |
| 679 | |
| 680 // References to global variables or lookup slots are critical because they | |
| 681 // may have getters. All others, including parameters rewritten to explicit | |
| 682 // property references, are not critical. | |
| 683 bool VariableProxy::IsCritical() { | |
| 684 Variable* var = AsVariable(); | |
| 685 return var != NULL && | |
| 686 (var->slot() == NULL || var->slot()->type() == Slot::LOOKUP); | |
| 687 } | |
| 688 | |
| 689 | |
| 690 // Literals are never critical. | |
| 691 bool Literal::IsCritical() { return false; } | |
| 692 | |
| 693 | |
| 694 // Property assignments and throwing of reference errors are always | |
| 695 // critical. Assignments to escaping variables are also critical. In | |
| 696 // addition the operation of compound assignments is critical if either of | |
| 697 // its operands is non-primitive (the arithmetic operations all use one of | |
| 698 // ToPrimitive, ToNumber, ToInt32, or ToUint32 on each of their operands). | |
| 699 // In this case, we mark the entire AST node as critical because there is | |
| 700 // no binary operation node to mark. | |
| 701 bool Assignment::IsCritical() { | |
| 702 Variable* var = AssignedVariable(); | |
| 703 return var == NULL || | |
| 704 !var->IsStackAllocated() || | |
| 705 (is_compound() && (!target()->IsPrimitive() || !value()->IsPrimitive())); | |
| 706 } | |
| 707 | |
| 708 | |
| 709 // Property references are always critical, because they may have getters. | |
| 710 bool Property::IsCritical() { return true; } | |
| 711 | |
| 712 | |
| 713 // Calls are always critical. | |
| 714 bool Call::IsCritical() { return true; } | |
| 715 | |
| 716 | |
| 717 // +,- use ToNumber on the value of their operand. | |
| 718 bool UnaryOperation::IsCritical() { | |
| 719 ASSERT(op() == Token::ADD || op() == Token::SUB); | |
| 720 return !expression()->IsPrimitive(); | |
| 721 } | |
| 722 | |
| 723 | |
| 724 // Count operations targeting properties and reference errors are always | |
| 725 // critical. Count operations on escaping variables are critical. Count | |
| 726 // operations targeting non-primitives are also critical because they use | |
| 727 // ToNumber. | |
| 728 bool CountOperation::IsCritical() { | |
| 729 Variable* var = AssignedVariable(); | |
| 730 return var == NULL || | |
| 731 !var->IsStackAllocated() || | |
| 732 !expression()->IsPrimitive(); | |
| 733 } | |
| 734 | |
| 735 | |
| 736 // Arithmetic operations all use one of ToPrimitive, ToNumber, ToInt32, or | |
| 737 // ToUint32 on each of their operands. | |
| 738 bool BinaryOperation::IsCritical() { | |
| 739 ASSERT(op() != Token::COMMA); | |
| 740 ASSERT(op() != Token::OR); | |
| 741 ASSERT(op() != Token::AND); | |
| 742 return !left()->IsPrimitive() || !right()->IsPrimitive(); | |
| 743 } | |
| 744 | |
| 745 | |
| 746 // <, >, <=, and >= all use ToPrimitive on both their operands. | |
| 747 bool CompareOperation::IsCritical() { | |
| 748 ASSERT(op() != Token::EQ); | |
| 749 ASSERT(op() != Token::NE); | |
| 750 ASSERT(op() != Token::EQ_STRICT); | |
| 751 ASSERT(op() != Token::NE_STRICT); | |
| 752 ASSERT(op() != Token::INSTANCEOF); | |
| 753 ASSERT(op() != Token::IN); | |
| 754 return !left()->IsPrimitive() || !right()->IsPrimitive(); | |
| 755 } | |
| 756 | |
| 757 | |
| 758 // Implementation of a copy visitor. The visitor create a deep copy | |
| 759 // of ast nodes. Nodes that do not require a deep copy are copied | |
| 760 // with the default copy constructor. | |
| 761 | |
| 762 AstNode::AstNode(AstNode* other) : num_(kNoNumber) { | |
| 763 // AST node number should be unique. Assert that we only copy AstNodes | |
| 764 // before node numbers are assigned. | |
| 765 ASSERT(other->num_ == kNoNumber); | |
| 766 } | |
| 767 | |
| 768 | |
| 769 Statement::Statement(Statement* other) | |
| 770 : AstNode(other), statement_pos_(other->statement_pos_) {} | |
| 771 | |
| 772 | |
| 773 Expression::Expression(Expression* other) | |
| 774 : AstNode(other), | |
| 775 bitfields_(other->bitfields_), | |
| 776 type_(other->type_) {} | |
| 777 | |
| 778 | |
| 779 BreakableStatement::BreakableStatement(BreakableStatement* other) | |
| 780 : Statement(other), labels_(other->labels_), type_(other->type_) {} | |
| 781 | |
| 782 | |
| 783 Block::Block(Block* other, ZoneList<Statement*>* statements) | |
| 784 : BreakableStatement(other), | |
| 785 statements_(statements->length()), | |
| 786 is_initializer_block_(other->is_initializer_block_) { | |
| 787 statements_.AddAll(*statements); | |
| 788 } | |
| 789 | |
| 790 | 580 |
| 791 WhileStatement::WhileStatement(ZoneStringList* labels) | 581 WhileStatement::WhileStatement(ZoneStringList* labels) |
| 792 : IterationStatement(labels), | 582 : IterationStatement(labels), |
| 793 cond_(NULL), | 583 cond_(NULL), |
| 794 may_have_function_literal_(true) { | 584 may_have_function_literal_(true) { |
| 795 } | 585 } |
| 796 | 586 |
| 797 | 587 |
| 798 ExpressionStatement::ExpressionStatement(ExpressionStatement* other, | |
| 799 Expression* expression) | |
| 800 : Statement(other), expression_(expression) {} | |
| 801 | |
| 802 | |
| 803 IfStatement::IfStatement(IfStatement* other, | |
| 804 Expression* condition, | |
| 805 Statement* then_statement, | |
| 806 Statement* else_statement) | |
| 807 : Statement(other), | |
| 808 condition_(condition), | |
| 809 then_statement_(then_statement), | |
| 810 else_statement_(else_statement) {} | |
| 811 | |
| 812 | |
| 813 EmptyStatement::EmptyStatement(EmptyStatement* other) : Statement(other) {} | |
| 814 | |
| 815 | |
| 816 IterationStatement::IterationStatement(IterationStatement* other, | |
| 817 Statement* body) | |
| 818 : BreakableStatement(other), body_(body) {} | |
| 819 | |
| 820 | |
| 821 CaseClause::CaseClause(Expression* label, ZoneList<Statement*>* statements) | 588 CaseClause::CaseClause(Expression* label, ZoneList<Statement*>* statements) |
| 822 : label_(label), statements_(statements) { | 589 : label_(label), statements_(statements) { |
| 823 } | 590 } |
| 824 | 591 |
| 825 | |
| 826 ForStatement::ForStatement(ForStatement* other, | |
| 827 Statement* init, | |
| 828 Expression* cond, | |
| 829 Statement* next, | |
| 830 Statement* body) | |
| 831 : IterationStatement(other, body), | |
| 832 init_(init), | |
| 833 cond_(cond), | |
| 834 next_(next), | |
| 835 may_have_function_literal_(other->may_have_function_literal_), | |
| 836 loop_variable_(other->loop_variable_), | |
| 837 peel_this_loop_(other->peel_this_loop_) {} | |
| 838 | |
| 839 | |
| 840 Assignment::Assignment(Assignment* other, | |
| 841 Expression* target, | |
| 842 Expression* value) | |
| 843 : Expression(other), | |
| 844 op_(other->op_), | |
| 845 target_(target), | |
| 846 value_(value), | |
| 847 pos_(other->pos_), | |
| 848 block_start_(other->block_start_), | |
| 849 block_end_(other->block_end_) {} | |
| 850 | |
| 851 | |
| 852 Property::Property(Property* other, Expression* obj, Expression* key) | |
| 853 : Expression(other), | |
| 854 obj_(obj), | |
| 855 key_(key), | |
| 856 pos_(other->pos_), | |
| 857 type_(other->type_) {} | |
| 858 | |
| 859 | |
| 860 Call::Call(Call* other, | |
| 861 Expression* expression, | |
| 862 ZoneList<Expression*>* arguments) | |
| 863 : Expression(other), | |
| 864 expression_(expression), | |
| 865 arguments_(arguments), | |
| 866 pos_(other->pos_) {} | |
| 867 | |
| 868 | |
| 869 UnaryOperation::UnaryOperation(UnaryOperation* other, Expression* expression) | |
| 870 : Expression(other), op_(other->op_), expression_(expression) {} | |
| 871 | |
| 872 | |
| 873 BinaryOperation::BinaryOperation(Expression* other, | |
| 874 Token::Value op, | |
| 875 Expression* left, | |
| 876 Expression* right) | |
| 877 : Expression(other), op_(op), left_(left), right_(right) {} | |
| 878 | |
| 879 | |
| 880 CountOperation::CountOperation(CountOperation* other, Expression* expression) | |
| 881 : Expression(other), | |
| 882 is_prefix_(other->is_prefix_), | |
| 883 op_(other->op_), | |
| 884 expression_(expression) {} | |
| 885 | |
| 886 | |
| 887 CompareOperation::CompareOperation(CompareOperation* other, | |
| 888 Expression* left, | |
| 889 Expression* right) | |
| 890 : Expression(other), | |
| 891 op_(other->op_), | |
| 892 left_(left), | |
| 893 right_(right) {} | |
| 894 | |
| 895 | |
| 896 Expression* CopyAstVisitor::DeepCopyExpr(Expression* expr) { | |
| 897 expr_ = NULL; | |
| 898 if (expr != NULL) Visit(expr); | |
| 899 return expr_; | |
| 900 } | |
| 901 | |
| 902 | |
| 903 Statement* CopyAstVisitor::DeepCopyStmt(Statement* stmt) { | |
| 904 stmt_ = NULL; | |
| 905 if (stmt != NULL) Visit(stmt); | |
| 906 return stmt_; | |
| 907 } | |
| 908 | |
| 909 | |
| 910 ZoneList<Expression*>* CopyAstVisitor::DeepCopyExprList( | |
| 911 ZoneList<Expression*>* expressions) { | |
| 912 ZoneList<Expression*>* copy = | |
| 913 new ZoneList<Expression*>(expressions->length()); | |
| 914 for (int i = 0; i < expressions->length(); i++) { | |
| 915 copy->Add(DeepCopyExpr(expressions->at(i))); | |
| 916 } | |
| 917 return copy; | |
| 918 } | |
| 919 | |
| 920 | |
| 921 ZoneList<Statement*>* CopyAstVisitor::DeepCopyStmtList( | |
| 922 ZoneList<Statement*>* statements) { | |
| 923 ZoneList<Statement*>* copy = new ZoneList<Statement*>(statements->length()); | |
| 924 for (int i = 0; i < statements->length(); i++) { | |
| 925 copy->Add(DeepCopyStmt(statements->at(i))); | |
| 926 } | |
| 927 return copy; | |
| 928 } | |
| 929 | |
| 930 | |
| 931 void CopyAstVisitor::VisitBlock(Block* stmt) { | |
| 932 stmt_ = new Block(stmt, | |
| 933 DeepCopyStmtList(stmt->statements())); | |
| 934 } | |
| 935 | |
| 936 | |
| 937 void CopyAstVisitor::VisitExpressionStatement( | |
| 938 ExpressionStatement* stmt) { | |
| 939 stmt_ = new ExpressionStatement(stmt, DeepCopyExpr(stmt->expression())); | |
| 940 } | |
| 941 | |
| 942 | |
| 943 void CopyAstVisitor::VisitEmptyStatement(EmptyStatement* stmt) { | |
| 944 stmt_ = new EmptyStatement(stmt); | |
| 945 } | |
| 946 | |
| 947 | |
| 948 void CopyAstVisitor::VisitIfStatement(IfStatement* stmt) { | |
| 949 stmt_ = new IfStatement(stmt, | |
| 950 DeepCopyExpr(stmt->condition()), | |
| 951 DeepCopyStmt(stmt->then_statement()), | |
| 952 DeepCopyStmt(stmt->else_statement())); | |
| 953 } | |
| 954 | |
| 955 | |
| 956 void CopyAstVisitor::VisitContinueStatement(ContinueStatement* stmt) { | |
| 957 SetStackOverflow(); | |
| 958 } | |
| 959 | |
| 960 | |
| 961 void CopyAstVisitor::VisitBreakStatement(BreakStatement* stmt) { | |
| 962 SetStackOverflow(); | |
| 963 } | |
| 964 | |
| 965 | |
| 966 void CopyAstVisitor::VisitReturnStatement(ReturnStatement* stmt) { | |
| 967 SetStackOverflow(); | |
| 968 } | |
| 969 | |
| 970 | |
| 971 void CopyAstVisitor::VisitWithEnterStatement( | |
| 972 WithEnterStatement* stmt) { | |
| 973 SetStackOverflow(); | |
| 974 } | |
| 975 | |
| 976 | |
| 977 void CopyAstVisitor::VisitWithExitStatement(WithExitStatement* stmt) { | |
| 978 SetStackOverflow(); | |
| 979 } | |
| 980 | |
| 981 | |
| 982 void CopyAstVisitor::VisitSwitchStatement(SwitchStatement* stmt) { | |
| 983 SetStackOverflow(); | |
| 984 } | |
| 985 | |
| 986 | |
| 987 void CopyAstVisitor::VisitDoWhileStatement(DoWhileStatement* stmt) { | |
| 988 SetStackOverflow(); | |
| 989 } | |
| 990 | |
| 991 | |
| 992 void CopyAstVisitor::VisitWhileStatement(WhileStatement* stmt) { | |
| 993 SetStackOverflow(); | |
| 994 } | |
| 995 | |
| 996 | |
| 997 void CopyAstVisitor::VisitForStatement(ForStatement* stmt) { | |
| 998 stmt_ = new ForStatement(stmt, | |
| 999 DeepCopyStmt(stmt->init()), | |
| 1000 DeepCopyExpr(stmt->cond()), | |
| 1001 DeepCopyStmt(stmt->next()), | |
| 1002 DeepCopyStmt(stmt->body())); | |
| 1003 } | |
| 1004 | |
| 1005 | |
| 1006 void CopyAstVisitor::VisitForInStatement(ForInStatement* stmt) { | |
| 1007 SetStackOverflow(); | |
| 1008 } | |
| 1009 | |
| 1010 | |
| 1011 void CopyAstVisitor::VisitTryCatchStatement(TryCatchStatement* stmt) { | |
| 1012 SetStackOverflow(); | |
| 1013 } | |
| 1014 | |
| 1015 | |
| 1016 void CopyAstVisitor::VisitTryFinallyStatement( | |
| 1017 TryFinallyStatement* stmt) { | |
| 1018 SetStackOverflow(); | |
| 1019 } | |
| 1020 | |
| 1021 | |
| 1022 void CopyAstVisitor::VisitDebuggerStatement( | |
| 1023 DebuggerStatement* stmt) { | |
| 1024 SetStackOverflow(); | |
| 1025 } | |
| 1026 | |
| 1027 | |
| 1028 void CopyAstVisitor::VisitFunctionLiteral(FunctionLiteral* expr) { | |
| 1029 SetStackOverflow(); | |
| 1030 } | |
| 1031 | |
| 1032 | |
| 1033 void CopyAstVisitor::VisitSharedFunctionInfoLiteral( | |
| 1034 SharedFunctionInfoLiteral* expr) { | |
| 1035 SetStackOverflow(); | |
| 1036 } | |
| 1037 | |
| 1038 | |
| 1039 void CopyAstVisitor::VisitConditional(Conditional* expr) { | |
| 1040 SetStackOverflow(); | |
| 1041 } | |
| 1042 | |
| 1043 | |
| 1044 void CopyAstVisitor::VisitSlot(Slot* expr) { | |
| 1045 UNREACHABLE(); | |
| 1046 } | |
| 1047 | |
| 1048 | |
| 1049 void CopyAstVisitor::VisitVariableProxy(VariableProxy* expr) { | |
| 1050 expr_ = new VariableProxy(*expr); | |
| 1051 } | |
| 1052 | |
| 1053 | |
| 1054 void CopyAstVisitor::VisitLiteral(Literal* expr) { | |
| 1055 expr_ = new Literal(*expr); | |
| 1056 } | |
| 1057 | |
| 1058 | |
| 1059 void CopyAstVisitor::VisitRegExpLiteral(RegExpLiteral* expr) { | |
| 1060 SetStackOverflow(); | |
| 1061 } | |
| 1062 | |
| 1063 | |
| 1064 void CopyAstVisitor::VisitObjectLiteral(ObjectLiteral* expr) { | |
| 1065 SetStackOverflow(); | |
| 1066 } | |
| 1067 | |
| 1068 | |
| 1069 void CopyAstVisitor::VisitArrayLiteral(ArrayLiteral* expr) { | |
| 1070 SetStackOverflow(); | |
| 1071 } | |
| 1072 | |
| 1073 | |
| 1074 void CopyAstVisitor::VisitCatchExtensionObject( | |
| 1075 CatchExtensionObject* expr) { | |
| 1076 SetStackOverflow(); | |
| 1077 } | |
| 1078 | |
| 1079 | |
| 1080 void CopyAstVisitor::VisitAssignment(Assignment* expr) { | |
| 1081 expr_ = new Assignment(expr, | |
| 1082 DeepCopyExpr(expr->target()), | |
| 1083 DeepCopyExpr(expr->value())); | |
| 1084 } | |
| 1085 | |
| 1086 | |
| 1087 void CopyAstVisitor::VisitThrow(Throw* expr) { | |
| 1088 SetStackOverflow(); | |
| 1089 } | |
| 1090 | |
| 1091 | |
| 1092 void CopyAstVisitor::VisitProperty(Property* expr) { | |
| 1093 expr_ = new Property(expr, | |
| 1094 DeepCopyExpr(expr->obj()), | |
| 1095 DeepCopyExpr(expr->key())); | |
| 1096 } | |
| 1097 | |
| 1098 | |
| 1099 void CopyAstVisitor::VisitCall(Call* expr) { | |
| 1100 expr_ = new Call(expr, | |
| 1101 DeepCopyExpr(expr->expression()), | |
| 1102 DeepCopyExprList(expr->arguments())); | |
| 1103 } | |
| 1104 | |
| 1105 | |
| 1106 void CopyAstVisitor::VisitCallNew(CallNew* expr) { | |
| 1107 SetStackOverflow(); | |
| 1108 } | |
| 1109 | |
| 1110 | |
| 1111 void CopyAstVisitor::VisitCallRuntime(CallRuntime* expr) { | |
| 1112 SetStackOverflow(); | |
| 1113 } | |
| 1114 | |
| 1115 | |
| 1116 void CopyAstVisitor::VisitUnaryOperation(UnaryOperation* expr) { | |
| 1117 expr_ = new UnaryOperation(expr, DeepCopyExpr(expr->expression())); | |
| 1118 } | |
| 1119 | |
| 1120 | |
| 1121 void CopyAstVisitor::VisitCountOperation(CountOperation* expr) { | |
| 1122 expr_ = new CountOperation(expr, | |
| 1123 DeepCopyExpr(expr->expression())); | |
| 1124 } | |
| 1125 | |
| 1126 | |
| 1127 void CopyAstVisitor::VisitBinaryOperation(BinaryOperation* expr) { | |
| 1128 expr_ = new BinaryOperation(expr, | |
| 1129 expr->op(), | |
| 1130 DeepCopyExpr(expr->left()), | |
| 1131 DeepCopyExpr(expr->right())); | |
| 1132 } | |
| 1133 | |
| 1134 | |
| 1135 void CopyAstVisitor::VisitCompareOperation(CompareOperation* expr) { | |
| 1136 expr_ = new CompareOperation(expr, | |
| 1137 DeepCopyExpr(expr->left()), | |
| 1138 DeepCopyExpr(expr->right())); | |
| 1139 } | |
| 1140 | |
| 1141 | |
| 1142 void CopyAstVisitor::VisitThisFunction(ThisFunction* expr) { | |
| 1143 SetStackOverflow(); | |
| 1144 } | |
| 1145 | |
| 1146 | |
| 1147 void CopyAstVisitor::VisitDeclaration(Declaration* decl) { | |
| 1148 UNREACHABLE(); | |
| 1149 } | |
| 1150 | |
| 1151 | |
| 1152 } } // namespace v8::internal | 592 } } // namespace v8::internal |
| OLD | NEW |