| 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 905 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 916 return is_super ? NAMED_SUPER_PROPERTY_CALL : NAMED_PROPERTY_CALL; | 916 return is_super ? NAMED_SUPER_PROPERTY_CALL : NAMED_PROPERTY_CALL; |
| 917 } else { | 917 } else { |
| 918 return is_super ? KEYED_SUPER_PROPERTY_CALL : KEYED_PROPERTY_CALL; | 918 return is_super ? KEYED_SUPER_PROPERTY_CALL : KEYED_PROPERTY_CALL; |
| 919 } | 919 } |
| 920 } | 920 } |
| 921 | 921 |
| 922 return OTHER_CALL; | 922 return OTHER_CALL; |
| 923 } | 923 } |
| 924 | 924 |
| 925 | 925 |
| 926 // ---------------------------------------------------------------------------- | |
| 927 // Implementation of AstTraversalVisitor | |
| 928 | |
| 929 #define RECURSE(call) \ | |
| 930 do { \ | |
| 931 DCHECK(!HasStackOverflow()); \ | |
| 932 call; \ | |
| 933 if (HasStackOverflow()) return; \ | |
| 934 } while (false) | |
| 935 | |
| 936 #define RECURSE_EXPRESSION(call) \ | |
| 937 do { \ | |
| 938 DCHECK(!HasStackOverflow()); \ | |
| 939 ++depth_; \ | |
| 940 call; \ | |
| 941 --depth_; \ | |
| 942 if (HasStackOverflow()) return; \ | |
| 943 } while (false) | |
| 944 | |
| 945 AstTraversalVisitor::AstTraversalVisitor(Isolate* isolate) : depth_(0) { | |
| 946 InitializeAstVisitor(isolate); | |
| 947 } | |
| 948 | |
| 949 AstTraversalVisitor::AstTraversalVisitor(uintptr_t stack_limit) : depth_(0) { | |
| 950 InitializeAstVisitor(stack_limit); | |
| 951 } | |
| 952 | |
| 953 void AstTraversalVisitor::VisitDeclarations(ZoneList<Declaration*>* decls) { | |
| 954 for (int i = 0; i < decls->length(); ++i) { | |
| 955 Declaration* decl = decls->at(i); | |
| 956 RECURSE(Visit(decl)); | |
| 957 } | |
| 958 } | |
| 959 | |
| 960 void AstTraversalVisitor::VisitStatements(ZoneList<Statement*>* stmts) { | |
| 961 for (int i = 0; i < stmts->length(); ++i) { | |
| 962 Statement* stmt = stmts->at(i); | |
| 963 RECURSE(Visit(stmt)); | |
| 964 if (stmt->IsJump()) break; | |
| 965 } | |
| 966 } | |
| 967 | |
| 968 void AstTraversalVisitor::VisitVariableDeclaration(VariableDeclaration* decl) {} | |
| 969 | |
| 970 void AstTraversalVisitor::VisitFunctionDeclaration(FunctionDeclaration* decl) { | |
| 971 RECURSE(Visit(decl->fun())); | |
| 972 } | |
| 973 | |
| 974 void AstTraversalVisitor::VisitBlock(Block* stmt) { | |
| 975 RECURSE(VisitStatements(stmt->statements())); | |
| 976 } | |
| 977 | |
| 978 void AstTraversalVisitor::VisitExpressionStatement(ExpressionStatement* stmt) { | |
| 979 RECURSE(Visit(stmt->expression())); | |
| 980 } | |
| 981 | |
| 982 void AstTraversalVisitor::VisitEmptyStatement(EmptyStatement* stmt) {} | |
| 983 | |
| 984 void AstTraversalVisitor::VisitSloppyBlockFunctionStatement( | |
| 985 SloppyBlockFunctionStatement* stmt) { | |
| 986 RECURSE(Visit(stmt->statement())); | |
| 987 } | |
| 988 | |
| 989 void AstTraversalVisitor::VisitIfStatement(IfStatement* stmt) { | |
| 990 RECURSE(Visit(stmt->condition())); | |
| 991 RECURSE(Visit(stmt->then_statement())); | |
| 992 RECURSE(Visit(stmt->else_statement())); | |
| 993 } | |
| 994 | |
| 995 void AstTraversalVisitor::VisitContinueStatement(ContinueStatement* stmt) {} | |
| 996 | |
| 997 void AstTraversalVisitor::VisitBreakStatement(BreakStatement* stmt) {} | |
| 998 | |
| 999 void AstTraversalVisitor::VisitReturnStatement(ReturnStatement* stmt) { | |
| 1000 RECURSE(Visit(stmt->expression())); | |
| 1001 } | |
| 1002 | |
| 1003 void AstTraversalVisitor::VisitWithStatement(WithStatement* stmt) { | |
| 1004 RECURSE(stmt->expression()); | |
| 1005 RECURSE(stmt->statement()); | |
| 1006 } | |
| 1007 | |
| 1008 void AstTraversalVisitor::VisitSwitchStatement(SwitchStatement* stmt) { | |
| 1009 RECURSE(Visit(stmt->tag())); | |
| 1010 | |
| 1011 ZoneList<CaseClause*>* clauses = stmt->cases(); | |
| 1012 | |
| 1013 for (int i = 0; i < clauses->length(); ++i) { | |
| 1014 CaseClause* clause = clauses->at(i); | |
| 1015 if (!clause->is_default()) { | |
| 1016 Expression* label = clause->label(); | |
| 1017 RECURSE(Visit(label)); | |
| 1018 } | |
| 1019 ZoneList<Statement*>* stmts = clause->statements(); | |
| 1020 RECURSE(VisitStatements(stmts)); | |
| 1021 } | |
| 1022 } | |
| 1023 | |
| 1024 void AstTraversalVisitor::VisitCaseClause(CaseClause* clause) { UNREACHABLE(); } | |
| 1025 | |
| 1026 void AstTraversalVisitor::VisitDoWhileStatement(DoWhileStatement* stmt) { | |
| 1027 RECURSE(Visit(stmt->body())); | |
| 1028 RECURSE(Visit(stmt->cond())); | |
| 1029 } | |
| 1030 | |
| 1031 void AstTraversalVisitor::VisitWhileStatement(WhileStatement* stmt) { | |
| 1032 RECURSE(Visit(stmt->cond())); | |
| 1033 RECURSE(Visit(stmt->body())); | |
| 1034 } | |
| 1035 | |
| 1036 void AstTraversalVisitor::VisitForStatement(ForStatement* stmt) { | |
| 1037 if (stmt->init() != NULL) { | |
| 1038 RECURSE(Visit(stmt->init())); | |
| 1039 } | |
| 1040 if (stmt->cond() != NULL) { | |
| 1041 RECURSE(Visit(stmt->cond())); | |
| 1042 } | |
| 1043 if (stmt->next() != NULL) { | |
| 1044 RECURSE(Visit(stmt->next())); | |
| 1045 } | |
| 1046 RECURSE(Visit(stmt->body())); | |
| 1047 } | |
| 1048 | |
| 1049 void AstTraversalVisitor::VisitForInStatement(ForInStatement* stmt) { | |
| 1050 RECURSE(Visit(stmt->enumerable())); | |
| 1051 RECURSE(Visit(stmt->body())); | |
| 1052 } | |
| 1053 | |
| 1054 void AstTraversalVisitor::VisitForOfStatement(ForOfStatement* stmt) { | |
| 1055 RECURSE(Visit(stmt->assign_iterator())); | |
| 1056 RECURSE(Visit(stmt->next_result())); | |
| 1057 RECURSE(Visit(stmt->result_done())); | |
| 1058 RECURSE(Visit(stmt->assign_each())); | |
| 1059 RECURSE(Visit(stmt->body())); | |
| 1060 } | |
| 1061 | |
| 1062 void AstTraversalVisitor::VisitTryCatchStatement(TryCatchStatement* stmt) { | |
| 1063 RECURSE(Visit(stmt->try_block())); | |
| 1064 RECURSE(Visit(stmt->catch_block())); | |
| 1065 } | |
| 1066 | |
| 1067 void AstTraversalVisitor::VisitTryFinallyStatement(TryFinallyStatement* stmt) { | |
| 1068 RECURSE(Visit(stmt->try_block())); | |
| 1069 RECURSE(Visit(stmt->finally_block())); | |
| 1070 } | |
| 1071 | |
| 1072 void AstTraversalVisitor::VisitDebuggerStatement(DebuggerStatement* stmt) {} | |
| 1073 | |
| 1074 void AstTraversalVisitor::VisitFunctionLiteral(FunctionLiteral* expr) { | |
| 1075 Scope* scope = expr->scope(); | |
| 1076 RECURSE_EXPRESSION(VisitDeclarations(scope->declarations())); | |
| 1077 RECURSE_EXPRESSION(VisitStatements(expr->body())); | |
| 1078 } | |
| 1079 | |
| 1080 void AstTraversalVisitor::VisitNativeFunctionLiteral( | |
| 1081 NativeFunctionLiteral* expr) {} | |
| 1082 | |
| 1083 void AstTraversalVisitor::VisitDoExpression(DoExpression* expr) { | |
| 1084 RECURSE(VisitBlock(expr->block())); | |
| 1085 RECURSE(VisitVariableProxy(expr->result())); | |
| 1086 } | |
| 1087 | |
| 1088 void AstTraversalVisitor::VisitConditional(Conditional* expr) { | |
| 1089 RECURSE_EXPRESSION(Visit(expr->condition())); | |
| 1090 RECURSE_EXPRESSION(Visit(expr->then_expression())); | |
| 1091 RECURSE_EXPRESSION(Visit(expr->else_expression())); | |
| 1092 } | |
| 1093 | |
| 1094 void AstTraversalVisitor::VisitVariableProxy(VariableProxy* expr) {} | |
| 1095 | |
| 1096 void AstTraversalVisitor::VisitLiteral(Literal* expr) {} | |
| 1097 | |
| 1098 void AstTraversalVisitor::VisitRegExpLiteral(RegExpLiteral* expr) {} | |
| 1099 | |
| 1100 void AstTraversalVisitor::VisitObjectLiteral(ObjectLiteral* expr) { | |
| 1101 ZoneList<ObjectLiteralProperty*>* props = expr->properties(); | |
| 1102 for (int i = 0; i < props->length(); ++i) { | |
| 1103 ObjectLiteralProperty* prop = props->at(i); | |
| 1104 if (!prop->key()->IsLiteral()) { | |
| 1105 RECURSE_EXPRESSION(Visit(prop->key())); | |
| 1106 } | |
| 1107 RECURSE_EXPRESSION(Visit(prop->value())); | |
| 1108 } | |
| 1109 } | |
| 1110 | |
| 1111 void AstTraversalVisitor::VisitArrayLiteral(ArrayLiteral* expr) { | |
| 1112 ZoneList<Expression*>* values = expr->values(); | |
| 1113 for (int i = 0; i < values->length(); ++i) { | |
| 1114 Expression* value = values->at(i); | |
| 1115 RECURSE_EXPRESSION(Visit(value)); | |
| 1116 } | |
| 1117 } | |
| 1118 | |
| 1119 void AstTraversalVisitor::VisitAssignment(Assignment* expr) { | |
| 1120 RECURSE_EXPRESSION(Visit(expr->target())); | |
| 1121 RECURSE_EXPRESSION(Visit(expr->value())); | |
| 1122 } | |
| 1123 | |
| 1124 void AstTraversalVisitor::VisitYield(Yield* expr) { | |
| 1125 RECURSE_EXPRESSION(Visit(expr->generator_object())); | |
| 1126 RECURSE_EXPRESSION(Visit(expr->expression())); | |
| 1127 } | |
| 1128 | |
| 1129 void AstTraversalVisitor::VisitThrow(Throw* expr) { | |
| 1130 RECURSE_EXPRESSION(Visit(expr->exception())); | |
| 1131 } | |
| 1132 | |
| 1133 void AstTraversalVisitor::VisitProperty(Property* expr) { | |
| 1134 RECURSE_EXPRESSION(Visit(expr->obj())); | |
| 1135 RECURSE_EXPRESSION(Visit(expr->key())); | |
| 1136 } | |
| 1137 | |
| 1138 void AstTraversalVisitor::VisitCall(Call* expr) { | |
| 1139 RECURSE_EXPRESSION(Visit(expr->expression())); | |
| 1140 ZoneList<Expression*>* args = expr->arguments(); | |
| 1141 for (int i = 0; i < args->length(); ++i) { | |
| 1142 Expression* arg = args->at(i); | |
| 1143 RECURSE_EXPRESSION(Visit(arg)); | |
| 1144 } | |
| 1145 } | |
| 1146 | |
| 1147 void AstTraversalVisitor::VisitCallNew(CallNew* expr) { | |
| 1148 RECURSE_EXPRESSION(Visit(expr->expression())); | |
| 1149 ZoneList<Expression*>* args = expr->arguments(); | |
| 1150 for (int i = 0; i < args->length(); ++i) { | |
| 1151 Expression* arg = args->at(i); | |
| 1152 RECURSE_EXPRESSION(Visit(arg)); | |
| 1153 } | |
| 1154 } | |
| 1155 | |
| 1156 void AstTraversalVisitor::VisitCallRuntime(CallRuntime* expr) { | |
| 1157 ZoneList<Expression*>* args = expr->arguments(); | |
| 1158 for (int i = 0; i < args->length(); ++i) { | |
| 1159 Expression* arg = args->at(i); | |
| 1160 RECURSE_EXPRESSION(Visit(arg)); | |
| 1161 } | |
| 1162 } | |
| 1163 | |
| 1164 void AstTraversalVisitor::VisitUnaryOperation(UnaryOperation* expr) { | |
| 1165 RECURSE_EXPRESSION(Visit(expr->expression())); | |
| 1166 } | |
| 1167 | |
| 1168 void AstTraversalVisitor::VisitCountOperation(CountOperation* expr) { | |
| 1169 RECURSE_EXPRESSION(Visit(expr->expression())); | |
| 1170 } | |
| 1171 | |
| 1172 void AstTraversalVisitor::VisitBinaryOperation(BinaryOperation* expr) { | |
| 1173 RECURSE_EXPRESSION(Visit(expr->left())); | |
| 1174 RECURSE_EXPRESSION(Visit(expr->right())); | |
| 1175 } | |
| 1176 | |
| 1177 void AstTraversalVisitor::VisitCompareOperation(CompareOperation* expr) { | |
| 1178 RECURSE_EXPRESSION(Visit(expr->left())); | |
| 1179 RECURSE_EXPRESSION(Visit(expr->right())); | |
| 1180 } | |
| 1181 | |
| 1182 void AstTraversalVisitor::VisitThisFunction(ThisFunction* expr) {} | |
| 1183 | |
| 1184 void AstTraversalVisitor::VisitClassLiteral(ClassLiteral* expr) { | |
| 1185 if (expr->extends() != nullptr) { | |
| 1186 RECURSE_EXPRESSION(Visit(expr->extends())); | |
| 1187 } | |
| 1188 RECURSE_EXPRESSION(Visit(expr->constructor())); | |
| 1189 ZoneList<ObjectLiteralProperty*>* props = expr->properties(); | |
| 1190 for (int i = 0; i < props->length(); ++i) { | |
| 1191 ObjectLiteralProperty* prop = props->at(i); | |
| 1192 if (!prop->key()->IsLiteral()) { | |
| 1193 RECURSE_EXPRESSION(Visit(prop->key())); | |
| 1194 } | |
| 1195 RECURSE_EXPRESSION(Visit(prop->value())); | |
| 1196 } | |
| 1197 } | |
| 1198 | |
| 1199 void AstTraversalVisitor::VisitSpread(Spread* expr) { | |
| 1200 RECURSE_EXPRESSION(Visit(expr->expression())); | |
| 1201 } | |
| 1202 | |
| 1203 void AstTraversalVisitor::VisitEmptyParentheses(EmptyParentheses* expr) {} | |
| 1204 | |
| 1205 void AstTraversalVisitor::VisitSuperPropertyReference( | |
| 1206 SuperPropertyReference* expr) { | |
| 1207 RECURSE_EXPRESSION(VisitVariableProxy(expr->this_var())); | |
| 1208 RECURSE_EXPRESSION(Visit(expr->home_object())); | |
| 1209 } | |
| 1210 | |
| 1211 void AstTraversalVisitor::VisitSuperCallReference(SuperCallReference* expr) { | |
| 1212 RECURSE_EXPRESSION(VisitVariableProxy(expr->this_var())); | |
| 1213 RECURSE_EXPRESSION(VisitVariableProxy(expr->new_target_var())); | |
| 1214 RECURSE_EXPRESSION(VisitVariableProxy(expr->this_function_var())); | |
| 1215 } | |
| 1216 | |
| 1217 void AstTraversalVisitor::VisitRewritableExpression( | |
| 1218 RewritableExpression* expr) { | |
| 1219 RECURSE(Visit(expr->expression())); | |
| 1220 } | |
| 1221 | |
| 1222 #undef RECURSE_EXPRESSION | |
| 1223 #undef RECURSE | |
| 1224 | |
| 1225 CaseClause::CaseClause(Zone* zone, Expression* label, | 926 CaseClause::CaseClause(Zone* zone, Expression* label, |
| 1226 ZoneList<Statement*>* statements, int pos) | 927 ZoneList<Statement*>* statements, int pos) |
| 1227 : Expression(zone, pos, kCaseClause), | 928 : Expression(zone, pos, kCaseClause), |
| 1228 label_(label), | 929 label_(label), |
| 1229 statements_(statements), | 930 statements_(statements), |
| 1230 compare_type_(Type::None()) {} | 931 compare_type_(Type::None()) {} |
| 1231 | 932 |
| 1232 uint32_t Literal::Hash() { | 933 uint32_t Literal::Hash() { |
| 1233 return raw_value()->IsString() | 934 return raw_value()->IsString() |
| 1234 ? raw_value()->AsString()->hash() | 935 ? raw_value()->AsString()->hash() |
| 1235 : ComputeLongHash(double_to_uint64(raw_value()->AsNumber())); | 936 : ComputeLongHash(double_to_uint64(raw_value()->AsNumber())); |
| 1236 } | 937 } |
| 1237 | 938 |
| 1238 | 939 |
| 1239 // static | 940 // static |
| 1240 bool Literal::Match(void* literal1, void* literal2) { | 941 bool Literal::Match(void* literal1, void* literal2) { |
| 1241 const AstValue* x = static_cast<Literal*>(literal1)->raw_value(); | 942 const AstValue* x = static_cast<Literal*>(literal1)->raw_value(); |
| 1242 const AstValue* y = static_cast<Literal*>(literal2)->raw_value(); | 943 const AstValue* y = static_cast<Literal*>(literal2)->raw_value(); |
| 1243 return (x->IsString() && y->IsString() && x->AsString() == y->AsString()) || | 944 return (x->IsString() && y->IsString() && x->AsString() == y->AsString()) || |
| 1244 (x->IsNumber() && y->IsNumber() && x->AsNumber() == y->AsNumber()); | 945 (x->IsNumber() && y->IsNumber() && x->AsNumber() == y->AsNumber()); |
| 1245 } | 946 } |
| 1246 | 947 |
| 1247 | 948 |
| 1248 } // namespace internal | 949 } // namespace internal |
| 1249 } // namespace v8 | 950 } // namespace v8 |
| OLD | NEW |