| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/ast/ast.h" | 5 #include "src/ast/ast.h" |
| 6 | 6 |
| 7 #include <cmath> // For isfinite. | 7 #include <cmath> // For isfinite. |
| 8 | 8 |
| 9 #include "src/ast/prettyprinter.h" | 9 #include "src/ast/prettyprinter.h" |
| 10 #include "src/ast/scopes.h" | 10 #include "src/ast/scopes.h" |
| (...skipping 798 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 809 // undefined expression or literal? Revisit this code if this | 809 // undefined expression or literal? Revisit this code if this |
| 810 // changes | 810 // changes |
| 811 Expression* expression = expressions->at(i); | 811 Expression* expression = expressions->at(i); |
| 812 if (expression != NULL) Visit(expression); | 812 if (expression != NULL) Visit(expression); |
| 813 } | 813 } |
| 814 } | 814 } |
| 815 | 815 |
| 816 // ---------------------------------------------------------------------------- | 816 // ---------------------------------------------------------------------------- |
| 817 // Implementation of AstTraversalVisitor | 817 // Implementation of AstTraversalVisitor |
| 818 | 818 |
| 819 AstTraversalVisitor::AstTraversalVisitor(Isolate* isolate) { | 819 #define RECURSE(call) \ |
| 820 do { \ |
| 821 DCHECK(!HasStackOverflow()); \ |
| 822 call; \ |
| 823 if (HasStackOverflow()) return; \ |
| 824 } while (false) |
| 825 |
| 826 #define RECURSE_EXPRESSION(call) \ |
| 827 do { \ |
| 828 DCHECK(!HasStackOverflow()); \ |
| 829 ++depth_; \ |
| 830 call; \ |
| 831 --depth_; \ |
| 832 if (HasStackOverflow()) return; \ |
| 833 } while (false) |
| 834 |
| 835 AstTraversalVisitor::AstTraversalVisitor(Isolate* isolate) : depth_(0) { |
| 820 InitializeAstVisitor(isolate); | 836 InitializeAstVisitor(isolate); |
| 821 } | 837 } |
| 822 | 838 |
| 839 AstTraversalVisitor::AstTraversalVisitor(uintptr_t stack_limit) : depth_(0) { |
| 840 InitializeAstVisitor(stack_limit); |
| 841 } |
| 842 |
| 843 void AstTraversalVisitor::VisitDeclarations(ZoneList<Declaration*>* decls) { |
| 844 for (int i = 0; i < decls->length(); ++i) { |
| 845 Declaration* decl = decls->at(i); |
| 846 RECURSE(Visit(decl)); |
| 847 } |
| 848 } |
| 849 |
| 850 void AstTraversalVisitor::VisitStatements(ZoneList<Statement*>* stmts) { |
| 851 for (int i = 0; i < stmts->length(); ++i) { |
| 852 Statement* stmt = stmts->at(i); |
| 853 RECURSE(Visit(stmt)); |
| 854 if (stmt->IsJump()) break; |
| 855 } |
| 856 } |
| 857 |
| 823 void AstTraversalVisitor::VisitVariableDeclaration(VariableDeclaration* decl) {} | 858 void AstTraversalVisitor::VisitVariableDeclaration(VariableDeclaration* decl) {} |
| 824 | 859 |
| 825 void AstTraversalVisitor::VisitFunctionDeclaration(FunctionDeclaration* decl) { | 860 void AstTraversalVisitor::VisitFunctionDeclaration(FunctionDeclaration* decl) { |
| 826 Visit(decl->fun()); | 861 RECURSE(Visit(decl->fun())); |
| 827 } | 862 } |
| 828 | 863 |
| 829 void AstTraversalVisitor::VisitImportDeclaration(ImportDeclaration* decl) {} | 864 void AstTraversalVisitor::VisitImportDeclaration(ImportDeclaration* decl) {} |
| 830 | 865 |
| 831 void AstTraversalVisitor::VisitExportDeclaration(ExportDeclaration* decl) {} | 866 void AstTraversalVisitor::VisitExportDeclaration(ExportDeclaration* decl) {} |
| 832 | 867 |
| 833 void AstTraversalVisitor::VisitStatements(ZoneList<Statement*>* stmts) { | |
| 834 for (int i = 0; i < stmts->length(); ++i) { | |
| 835 Statement* stmt = stmts->at(i); | |
| 836 Visit(stmt); | |
| 837 if (stmt->IsJump()) break; | |
| 838 } | |
| 839 } | |
| 840 | |
| 841 void AstTraversalVisitor::VisitExpressions(ZoneList<Expression*>* expressions) { | |
| 842 for (int i = 0; i < expressions->length(); i++) { | |
| 843 Expression* expression = expressions->at(i); | |
| 844 if (expression != NULL) Visit(expression); | |
| 845 } | |
| 846 } | |
| 847 | |
| 848 void AstTraversalVisitor::VisitBlock(Block* stmt) { | 868 void AstTraversalVisitor::VisitBlock(Block* stmt) { |
| 849 VisitStatements(stmt->statements()); | 869 RECURSE(VisitStatements(stmt->statements())); |
| 850 } | 870 } |
| 851 | 871 |
| 852 void AstTraversalVisitor::VisitExpressionStatement(ExpressionStatement* stmt) { | 872 void AstTraversalVisitor::VisitExpressionStatement(ExpressionStatement* stmt) { |
| 853 Visit(stmt->expression()); | 873 RECURSE(Visit(stmt->expression())); |
| 854 } | 874 } |
| 855 | 875 |
| 856 void AstTraversalVisitor::VisitEmptyStatement(EmptyStatement* stmt) {} | 876 void AstTraversalVisitor::VisitEmptyStatement(EmptyStatement* stmt) {} |
| 857 | 877 |
| 858 void AstTraversalVisitor::VisitSloppyBlockFunctionStatement( | 878 void AstTraversalVisitor::VisitSloppyBlockFunctionStatement( |
| 859 SloppyBlockFunctionStatement* stmt) { | 879 SloppyBlockFunctionStatement* stmt) { |
| 860 Visit(stmt->statement()); | 880 RECURSE(Visit(stmt->statement())); |
| 861 } | 881 } |
| 862 | 882 |
| 863 void AstTraversalVisitor::VisitIfStatement(IfStatement* stmt) { | 883 void AstTraversalVisitor::VisitIfStatement(IfStatement* stmt) { |
| 864 Visit(stmt->condition()); | 884 RECURSE(Visit(stmt->condition())); |
| 865 Visit(stmt->then_statement()); | 885 RECURSE(Visit(stmt->then_statement())); |
| 866 Visit(stmt->else_statement()); | 886 RECURSE(Visit(stmt->else_statement())); |
| 867 } | 887 } |
| 868 | 888 |
| 869 void AstTraversalVisitor::VisitContinueStatement(ContinueStatement* stmt) {} | 889 void AstTraversalVisitor::VisitContinueStatement(ContinueStatement* stmt) {} |
| 870 | 890 |
| 871 void AstTraversalVisitor::VisitBreakStatement(BreakStatement* stmt) {} | 891 void AstTraversalVisitor::VisitBreakStatement(BreakStatement* stmt) {} |
| 872 | 892 |
| 873 void AstTraversalVisitor::VisitReturnStatement(ReturnStatement* stmt) { | 893 void AstTraversalVisitor::VisitReturnStatement(ReturnStatement* stmt) { |
| 874 Visit(stmt->expression()); | 894 RECURSE(Visit(stmt->expression())); |
| 875 } | 895 } |
| 876 | 896 |
| 877 void AstTraversalVisitor::VisitWithStatement(WithStatement* stmt) { | 897 void AstTraversalVisitor::VisitWithStatement(WithStatement* stmt) { |
| 878 stmt->expression(); | 898 RECURSE(stmt->expression()); |
| 879 stmt->statement(); | 899 RECURSE(stmt->statement()); |
| 880 } | 900 } |
| 881 | 901 |
| 882 void AstTraversalVisitor::VisitSwitchStatement(SwitchStatement* stmt) { | 902 void AstTraversalVisitor::VisitSwitchStatement(SwitchStatement* stmt) { |
| 883 Visit(stmt->tag()); | 903 RECURSE(Visit(stmt->tag())); |
| 884 | 904 |
| 885 ZoneList<CaseClause*>* clauses = stmt->cases(); | 905 ZoneList<CaseClause*>* clauses = stmt->cases(); |
| 886 | 906 |
| 887 for (int i = 0; i < clauses->length(); ++i) { | 907 for (int i = 0; i < clauses->length(); ++i) { |
| 888 CaseClause* clause = clauses->at(i); | 908 CaseClause* clause = clauses->at(i); |
| 889 if (!clause->is_default()) { | 909 if (!clause->is_default()) { |
| 890 Expression* label = clause->label(); | 910 Expression* label = clause->label(); |
| 891 Visit(label); | 911 RECURSE(Visit(label)); |
| 892 } | 912 } |
| 893 ZoneList<Statement*>* stmts = clause->statements(); | 913 ZoneList<Statement*>* stmts = clause->statements(); |
| 894 VisitStatements(stmts); | 914 RECURSE(VisitStatements(stmts)); |
| 895 } | 915 } |
| 896 } | 916 } |
| 897 | 917 |
| 898 void AstTraversalVisitor::VisitCaseClause(CaseClause* clause) { UNREACHABLE(); } | 918 void AstTraversalVisitor::VisitCaseClause(CaseClause* clause) { UNREACHABLE(); } |
| 899 | 919 |
| 900 void AstTraversalVisitor::VisitDoWhileStatement(DoWhileStatement* stmt) { | 920 void AstTraversalVisitor::VisitDoWhileStatement(DoWhileStatement* stmt) { |
| 901 Visit(stmt->body()); | 921 RECURSE(Visit(stmt->body())); |
| 902 Visit(stmt->cond()); | 922 RECURSE(Visit(stmt->cond())); |
| 903 } | 923 } |
| 904 | 924 |
| 905 void AstTraversalVisitor::VisitWhileStatement(WhileStatement* stmt) { | 925 void AstTraversalVisitor::VisitWhileStatement(WhileStatement* stmt) { |
| 906 Visit(stmt->cond()); | 926 RECURSE(Visit(stmt->cond())); |
| 907 Visit(stmt->body()); | 927 RECURSE(Visit(stmt->body())); |
| 908 } | 928 } |
| 909 | 929 |
| 910 void AstTraversalVisitor::VisitForStatement(ForStatement* stmt) { | 930 void AstTraversalVisitor::VisitForStatement(ForStatement* stmt) { |
| 911 if (stmt->init() != NULL) { | 931 if (stmt->init() != NULL) { |
| 912 Visit(stmt->init()); | 932 RECURSE(Visit(stmt->init())); |
| 913 } | 933 } |
| 914 if (stmt->cond() != NULL) { | 934 if (stmt->cond() != NULL) { |
| 915 Visit(stmt->cond()); | 935 RECURSE(Visit(stmt->cond())); |
| 916 } | 936 } |
| 917 if (stmt->next() != NULL) { | 937 if (stmt->next() != NULL) { |
| 918 Visit(stmt->next()); | 938 RECURSE(Visit(stmt->next())); |
| 919 } | 939 } |
| 920 Visit(stmt->body()); | 940 RECURSE(Visit(stmt->body())); |
| 921 } | 941 } |
| 922 | 942 |
| 923 void AstTraversalVisitor::VisitForInStatement(ForInStatement* stmt) { | 943 void AstTraversalVisitor::VisitForInStatement(ForInStatement* stmt) { |
| 924 Visit(stmt->enumerable()); | 944 RECURSE(Visit(stmt->enumerable())); |
| 925 Visit(stmt->body()); | 945 RECURSE(Visit(stmt->body())); |
| 926 } | 946 } |
| 927 | 947 |
| 928 void AstTraversalVisitor::VisitForOfStatement(ForOfStatement* stmt) { | 948 void AstTraversalVisitor::VisitForOfStatement(ForOfStatement* stmt) { |
| 929 Visit(stmt->assign_iterator()); | 949 RECURSE(Visit(stmt->assign_iterator())); |
| 930 Visit(stmt->next_result()); | 950 RECURSE(Visit(stmt->next_result())); |
| 931 Visit(stmt->result_done()); | 951 RECURSE(Visit(stmt->result_done())); |
| 932 Visit(stmt->assign_each()); | 952 RECURSE(Visit(stmt->assign_each())); |
| 933 Visit(stmt->body()); | 953 RECURSE(Visit(stmt->body())); |
| 934 } | 954 } |
| 935 | 955 |
| 936 void AstTraversalVisitor::VisitTryCatchStatement(TryCatchStatement* stmt) { | 956 void AstTraversalVisitor::VisitTryCatchStatement(TryCatchStatement* stmt) { |
| 937 Visit(stmt->try_block()); | 957 RECURSE(Visit(stmt->try_block())); |
| 938 Visit(stmt->catch_block()); | 958 RECURSE(Visit(stmt->catch_block())); |
| 939 } | 959 } |
| 940 | 960 |
| 941 void AstTraversalVisitor::VisitTryFinallyStatement(TryFinallyStatement* stmt) { | 961 void AstTraversalVisitor::VisitTryFinallyStatement(TryFinallyStatement* stmt) { |
| 942 Visit(stmt->try_block()); | 962 RECURSE(Visit(stmt->try_block())); |
| 943 Visit(stmt->finally_block()); | 963 RECURSE(Visit(stmt->finally_block())); |
| 944 } | 964 } |
| 945 | 965 |
| 946 void AstTraversalVisitor::VisitDebuggerStatement(DebuggerStatement* stmt) {} | 966 void AstTraversalVisitor::VisitDebuggerStatement(DebuggerStatement* stmt) {} |
| 947 | 967 |
| 948 void AstTraversalVisitor::VisitFunctionLiteral(FunctionLiteral* expr) { | 968 void AstTraversalVisitor::VisitFunctionLiteral(FunctionLiteral* expr) { |
| 949 Scope* scope = expr->scope(); | 969 Scope* scope = expr->scope(); |
| 950 VisitDeclarations(scope->declarations()); | 970 RECURSE_EXPRESSION(VisitDeclarations(scope->declarations())); |
| 951 VisitStatements(expr->body()); | 971 RECURSE_EXPRESSION(VisitStatements(expr->body())); |
| 952 } | 972 } |
| 953 | 973 |
| 954 void AstTraversalVisitor::VisitNativeFunctionLiteral( | 974 void AstTraversalVisitor::VisitNativeFunctionLiteral( |
| 955 NativeFunctionLiteral* expr) {} | 975 NativeFunctionLiteral* expr) {} |
| 956 | 976 |
| 957 void AstTraversalVisitor::VisitDoExpression(DoExpression* expr) { | 977 void AstTraversalVisitor::VisitDoExpression(DoExpression* expr) { |
| 958 VisitBlock(expr->block()); | 978 RECURSE(VisitBlock(expr->block())); |
| 959 VisitVariableProxy(expr->result()); | 979 RECURSE(VisitVariableProxy(expr->result())); |
| 960 } | 980 } |
| 961 | 981 |
| 962 void AstTraversalVisitor::VisitConditional(Conditional* expr) { | 982 void AstTraversalVisitor::VisitConditional(Conditional* expr) { |
| 963 Visit(expr->condition()); | 983 RECURSE_EXPRESSION(Visit(expr->condition())); |
| 964 Visit(expr->then_expression()); | 984 RECURSE_EXPRESSION(Visit(expr->then_expression())); |
| 965 Visit(expr->else_expression()); | 985 RECURSE_EXPRESSION(Visit(expr->else_expression())); |
| 966 } | 986 } |
| 967 | 987 |
| 968 void AstTraversalVisitor::VisitVariableProxy(VariableProxy* expr) {} | 988 void AstTraversalVisitor::VisitVariableProxy(VariableProxy* expr) {} |
| 969 | 989 |
| 970 void AstTraversalVisitor::VisitLiteral(Literal* expr) {} | 990 void AstTraversalVisitor::VisitLiteral(Literal* expr) {} |
| 971 | 991 |
| 972 void AstTraversalVisitor::VisitRegExpLiteral(RegExpLiteral* expr) {} | 992 void AstTraversalVisitor::VisitRegExpLiteral(RegExpLiteral* expr) {} |
| 973 | 993 |
| 974 void AstTraversalVisitor::VisitObjectLiteral(ObjectLiteral* expr) { | 994 void AstTraversalVisitor::VisitObjectLiteral(ObjectLiteral* expr) { |
| 975 ZoneList<ObjectLiteralProperty*>* props = expr->properties(); | 995 ZoneList<ObjectLiteralProperty*>* props = expr->properties(); |
| 976 for (int i = 0; i < props->length(); ++i) { | 996 for (int i = 0; i < props->length(); ++i) { |
| 977 ObjectLiteralProperty* prop = props->at(i); | 997 ObjectLiteralProperty* prop = props->at(i); |
| 978 if (!prop->key()->IsLiteral()) { | 998 if (!prop->key()->IsLiteral()) { |
| 979 Visit(prop->key()); | 999 RECURSE_EXPRESSION(Visit(prop->key())); |
| 980 } | 1000 } |
| 981 Visit(prop->value()); | 1001 RECURSE_EXPRESSION(Visit(prop->value())); |
| 982 } | 1002 } |
| 983 } | 1003 } |
| 984 | 1004 |
| 985 void AstTraversalVisitor::VisitArrayLiteral(ArrayLiteral* expr) { | 1005 void AstTraversalVisitor::VisitArrayLiteral(ArrayLiteral* expr) { |
| 986 ZoneList<Expression*>* values = expr->values(); | 1006 ZoneList<Expression*>* values = expr->values(); |
| 987 for (int i = 0; i < values->length(); ++i) { | 1007 for (int i = 0; i < values->length(); ++i) { |
| 988 Expression* value = values->at(i); | 1008 Expression* value = values->at(i); |
| 989 Visit(value); | 1009 RECURSE_EXPRESSION(Visit(value)); |
| 990 } | 1010 } |
| 991 } | 1011 } |
| 992 | 1012 |
| 993 void AstTraversalVisitor::VisitAssignment(Assignment* expr) { | 1013 void AstTraversalVisitor::VisitAssignment(Assignment* expr) { |
| 994 Visit(expr->target()); | 1014 RECURSE_EXPRESSION(Visit(expr->target())); |
| 995 Visit(expr->value()); | 1015 RECURSE_EXPRESSION(Visit(expr->value())); |
| 996 } | 1016 } |
| 997 | 1017 |
| 998 void AstTraversalVisitor::VisitYield(Yield* expr) { | 1018 void AstTraversalVisitor::VisitYield(Yield* expr) { |
| 999 Visit(expr->generator_object()); | 1019 RECURSE_EXPRESSION(Visit(expr->generator_object())); |
| 1000 Visit(expr->expression()); | 1020 RECURSE_EXPRESSION(Visit(expr->expression())); |
| 1001 } | 1021 } |
| 1002 | 1022 |
| 1003 void AstTraversalVisitor::VisitThrow(Throw* expr) { Visit(expr->exception()); } | 1023 void AstTraversalVisitor::VisitThrow(Throw* expr) { |
| 1024 RECURSE_EXPRESSION(Visit(expr->exception())); |
| 1025 } |
| 1004 | 1026 |
| 1005 void AstTraversalVisitor::VisitProperty(Property* expr) { | 1027 void AstTraversalVisitor::VisitProperty(Property* expr) { |
| 1006 Visit(expr->obj()); | 1028 RECURSE_EXPRESSION(Visit(expr->obj())); |
| 1007 Visit(expr->key()); | 1029 RECURSE_EXPRESSION(Visit(expr->key())); |
| 1008 } | 1030 } |
| 1009 | 1031 |
| 1010 void AstTraversalVisitor::VisitCall(Call* expr) { | 1032 void AstTraversalVisitor::VisitCall(Call* expr) { |
| 1011 Visit(expr->expression()); | 1033 RECURSE_EXPRESSION(Visit(expr->expression())); |
| 1012 ZoneList<Expression*>* args = expr->arguments(); | 1034 ZoneList<Expression*>* args = expr->arguments(); |
| 1013 for (int i = 0; i < args->length(); ++i) { | 1035 for (int i = 0; i < args->length(); ++i) { |
| 1014 Expression* arg = args->at(i); | 1036 Expression* arg = args->at(i); |
| 1015 Visit(arg); | 1037 RECURSE_EXPRESSION(Visit(arg)); |
| 1016 } | 1038 } |
| 1017 } | 1039 } |
| 1018 | 1040 |
| 1019 void AstTraversalVisitor::VisitCallNew(CallNew* expr) { | 1041 void AstTraversalVisitor::VisitCallNew(CallNew* expr) { |
| 1020 Visit(expr->expression()); | 1042 RECURSE_EXPRESSION(Visit(expr->expression())); |
| 1021 ZoneList<Expression*>* args = expr->arguments(); | 1043 ZoneList<Expression*>* args = expr->arguments(); |
| 1022 for (int i = 0; i < args->length(); ++i) { | 1044 for (int i = 0; i < args->length(); ++i) { |
| 1023 Expression* arg = args->at(i); | 1045 Expression* arg = args->at(i); |
| 1024 Visit(arg); | 1046 RECURSE_EXPRESSION(Visit(arg)); |
| 1025 } | 1047 } |
| 1026 } | 1048 } |
| 1027 | 1049 |
| 1028 void AstTraversalVisitor::VisitCallRuntime(CallRuntime* expr) { | 1050 void AstTraversalVisitor::VisitCallRuntime(CallRuntime* expr) { |
| 1029 ZoneList<Expression*>* args = expr->arguments(); | 1051 ZoneList<Expression*>* args = expr->arguments(); |
| 1030 for (int i = 0; i < args->length(); ++i) { | 1052 for (int i = 0; i < args->length(); ++i) { |
| 1031 Expression* arg = args->at(i); | 1053 Expression* arg = args->at(i); |
| 1032 Visit(arg); | 1054 RECURSE_EXPRESSION(Visit(arg)); |
| 1033 } | 1055 } |
| 1034 } | 1056 } |
| 1035 | 1057 |
| 1036 void AstTraversalVisitor::VisitUnaryOperation(UnaryOperation* expr) { | 1058 void AstTraversalVisitor::VisitUnaryOperation(UnaryOperation* expr) { |
| 1037 Visit(expr->expression()); | 1059 RECURSE_EXPRESSION(Visit(expr->expression())); |
| 1038 } | 1060 } |
| 1039 | 1061 |
| 1040 void AstTraversalVisitor::VisitCountOperation(CountOperation* expr) { | 1062 void AstTraversalVisitor::VisitCountOperation(CountOperation* expr) { |
| 1041 Visit(expr->expression()); | 1063 RECURSE_EXPRESSION(Visit(expr->expression())); |
| 1042 } | 1064 } |
| 1043 | 1065 |
| 1044 void AstTraversalVisitor::VisitBinaryOperation(BinaryOperation* expr) { | 1066 void AstTraversalVisitor::VisitBinaryOperation(BinaryOperation* expr) { |
| 1045 Visit(expr->left()); | 1067 RECURSE_EXPRESSION(Visit(expr->left())); |
| 1046 Visit(expr->right()); | 1068 RECURSE_EXPRESSION(Visit(expr->right())); |
| 1047 } | 1069 } |
| 1048 | 1070 |
| 1049 void AstTraversalVisitor::VisitCompareOperation(CompareOperation* expr) { | 1071 void AstTraversalVisitor::VisitCompareOperation(CompareOperation* expr) { |
| 1050 Visit(expr->left()); | 1072 RECURSE_EXPRESSION(Visit(expr->left())); |
| 1051 Visit(expr->right()); | 1073 RECURSE_EXPRESSION(Visit(expr->right())); |
| 1052 } | 1074 } |
| 1053 | 1075 |
| 1054 void AstTraversalVisitor::VisitThisFunction(ThisFunction* expr) {} | 1076 void AstTraversalVisitor::VisitThisFunction(ThisFunction* expr) {} |
| 1055 | 1077 |
| 1056 void AstTraversalVisitor::VisitDeclarations(ZoneList<Declaration*>* decls) { | |
| 1057 for (int i = 0; i < decls->length(); ++i) { | |
| 1058 Declaration* decl = decls->at(i); | |
| 1059 Visit(decl); | |
| 1060 } | |
| 1061 } | |
| 1062 | |
| 1063 void AstTraversalVisitor::VisitClassLiteral(ClassLiteral* expr) { | 1078 void AstTraversalVisitor::VisitClassLiteral(ClassLiteral* expr) { |
| 1064 if (expr->extends() != nullptr) { | 1079 if (expr->extends() != nullptr) { |
| 1065 Visit(expr->extends()); | 1080 RECURSE_EXPRESSION(Visit(expr->extends())); |
| 1066 } | 1081 } |
| 1067 Visit(expr->constructor()); | 1082 RECURSE_EXPRESSION(Visit(expr->constructor())); |
| 1068 ZoneList<ObjectLiteralProperty*>* props = expr->properties(); | 1083 ZoneList<ObjectLiteralProperty*>* props = expr->properties(); |
| 1069 for (int i = 0; i < props->length(); ++i) { | 1084 for (int i = 0; i < props->length(); ++i) { |
| 1070 ObjectLiteralProperty* prop = props->at(i); | 1085 ObjectLiteralProperty* prop = props->at(i); |
| 1071 if (!prop->key()->IsLiteral()) { | 1086 if (!prop->key()->IsLiteral()) { |
| 1072 Visit(prop->key()); | 1087 RECURSE_EXPRESSION(Visit(prop->key())); |
| 1073 } | 1088 } |
| 1074 Visit(prop->value()); | 1089 RECURSE_EXPRESSION(Visit(prop->value())); |
| 1075 } | 1090 } |
| 1076 } | 1091 } |
| 1077 | 1092 |
| 1078 void AstTraversalVisitor::VisitSpread(Spread* expr) { | 1093 void AstTraversalVisitor::VisitSpread(Spread* expr) { |
| 1079 Visit(expr->expression()); | 1094 RECURSE_EXPRESSION(Visit(expr->expression())); |
| 1080 } | 1095 } |
| 1081 | 1096 |
| 1082 void AstTraversalVisitor::VisitEmptyParentheses(EmptyParentheses* expr) {} | 1097 void AstTraversalVisitor::VisitEmptyParentheses(EmptyParentheses* expr) {} |
| 1083 | 1098 |
| 1084 void AstTraversalVisitor::VisitSuperPropertyReference( | 1099 void AstTraversalVisitor::VisitSuperPropertyReference( |
| 1085 SuperPropertyReference* expr) { | 1100 SuperPropertyReference* expr) { |
| 1086 VisitVariableProxy(expr->this_var()); | 1101 RECURSE_EXPRESSION(VisitVariableProxy(expr->this_var())); |
| 1087 Visit(expr->home_object()); | 1102 RECURSE_EXPRESSION(Visit(expr->home_object())); |
| 1088 } | 1103 } |
| 1089 | 1104 |
| 1090 void AstTraversalVisitor::VisitSuperCallReference(SuperCallReference* expr) { | 1105 void AstTraversalVisitor::VisitSuperCallReference(SuperCallReference* expr) { |
| 1091 VisitVariableProxy(expr->this_var()); | 1106 RECURSE_EXPRESSION(VisitVariableProxy(expr->this_var())); |
| 1092 VisitVariableProxy(expr->new_target_var()); | 1107 RECURSE_EXPRESSION(VisitVariableProxy(expr->new_target_var())); |
| 1093 VisitVariableProxy(expr->this_function_var()); | 1108 RECURSE_EXPRESSION(VisitVariableProxy(expr->this_function_var())); |
| 1094 } | 1109 } |
| 1095 | 1110 |
| 1096 void AstTraversalVisitor::VisitRewritableExpression( | 1111 void AstTraversalVisitor::VisitRewritableExpression( |
| 1097 RewritableExpression* expr) { | 1112 RewritableExpression* expr) { |
| 1098 Visit(expr->expression()); | 1113 RECURSE(Visit(expr->expression())); |
| 1099 } | 1114 } |
| 1100 | 1115 |
| 1116 #undef RECURSE_EXPRESSION |
| 1117 #undef RECURSE |
| 1118 |
| 1101 CaseClause::CaseClause(Zone* zone, Expression* label, | 1119 CaseClause::CaseClause(Zone* zone, Expression* label, |
| 1102 ZoneList<Statement*>* statements, int pos) | 1120 ZoneList<Statement*>* statements, int pos) |
| 1103 : Expression(zone, pos), | 1121 : Expression(zone, pos), |
| 1104 label_(label), | 1122 label_(label), |
| 1105 statements_(statements), | 1123 statements_(statements), |
| 1106 compare_type_(Type::None()) {} | 1124 compare_type_(Type::None()) {} |
| 1107 | 1125 |
| 1108 uint32_t Literal::Hash() { | 1126 uint32_t Literal::Hash() { |
| 1109 return raw_value()->IsString() | 1127 return raw_value()->IsString() |
| 1110 ? raw_value()->AsString()->hash() | 1128 ? raw_value()->AsString()->hash() |
| 1111 : ComputeLongHash(double_to_uint64(raw_value()->AsNumber())); | 1129 : ComputeLongHash(double_to_uint64(raw_value()->AsNumber())); |
| 1112 } | 1130 } |
| 1113 | 1131 |
| 1114 | 1132 |
| 1115 // static | 1133 // static |
| 1116 bool Literal::Match(void* literal1, void* literal2) { | 1134 bool Literal::Match(void* literal1, void* literal2) { |
| 1117 const AstValue* x = static_cast<Literal*>(literal1)->raw_value(); | 1135 const AstValue* x = static_cast<Literal*>(literal1)->raw_value(); |
| 1118 const AstValue* y = static_cast<Literal*>(literal2)->raw_value(); | 1136 const AstValue* y = static_cast<Literal*>(literal2)->raw_value(); |
| 1119 return (x->IsString() && y->IsString() && x->AsString() == y->AsString()) || | 1137 return (x->IsString() && y->IsString() && x->AsString() == y->AsString()) || |
| 1120 (x->IsNumber() && y->IsNumber() && x->AsNumber() == y->AsNumber()); | 1138 (x->IsNumber() && y->IsNumber() && x->AsNumber() == y->AsNumber()); |
| 1121 } | 1139 } |
| 1122 | 1140 |
| 1123 | 1141 |
| 1124 } // namespace internal | 1142 } // namespace internal |
| 1125 } // namespace v8 | 1143 } // namespace v8 |
| OLD | NEW |