| 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" |
| 11 #include "src/base/hashmap.h" | 11 #include "src/base/hashmap.h" |
| 12 #include "src/builtins/builtins.h" | 12 #include "src/builtins/builtins.h" |
| 13 #include "src/code-stubs.h" | 13 #include "src/code-stubs.h" |
| 14 #include "src/contexts.h" | 14 #include "src/contexts.h" |
| 15 #include "src/conversions.h" | 15 #include "src/conversions.h" |
| 16 #include "src/parsing/parser.h" | 16 #include "src/parsing/parser.h" |
| 17 #include "src/property-details.h" | 17 #include "src/property-details.h" |
| 18 #include "src/property.h" | 18 #include "src/property.h" |
| 19 #include "src/string-stream.h" | 19 #include "src/string-stream.h" |
| 20 #include "src/type-info.h" | 20 #include "src/type-info.h" |
| 21 | 21 |
| 22 namespace v8 { | 22 namespace v8 { |
| 23 namespace internal { | 23 namespace internal { |
| 24 | 24 |
| 25 // ---------------------------------------------------------------------------- | 25 // ---------------------------------------------------------------------------- |
| 26 // All the Accept member functions for each syntax tree node type. | |
| 27 | |
| 28 #define DECL_ACCEPT(type) \ | |
| 29 void type::Accept(AstVisitor* v) { v->Visit##type(this); } | |
| 30 AST_NODE_LIST(DECL_ACCEPT) | |
| 31 #undef DECL_ACCEPT | |
| 32 | |
| 33 | |
| 34 // ---------------------------------------------------------------------------- | |
| 35 // Implementation of other node functionality. | 26 // Implementation of other node functionality. |
| 36 | 27 |
| 37 #ifdef DEBUG | 28 #ifdef DEBUG |
| 38 | 29 |
| 39 void AstNode::Print(Isolate* isolate) { | 30 void AstNode::Print(Isolate* isolate) { |
| 40 AstPrinter::PrintOut(isolate, this); | 31 AstPrinter::PrintOut(isolate, this); |
| 41 } | 32 } |
| 42 | 33 |
| 43 | 34 |
| 44 #endif // DEBUG | 35 #endif // DEBUG |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 JUMP_NODE_LIST(GENERATE_CASE) | 166 JUMP_NODE_LIST(GENERATE_CASE) |
| 176 #undef GENERATE_CASE | 167 #undef GENERATE_CASE |
| 177 #undef JUMP_NODE_LIST | 168 #undef JUMP_NODE_LIST |
| 178 default: | 169 default: |
| 179 return false; | 170 return false; |
| 180 } | 171 } |
| 181 } | 172 } |
| 182 | 173 |
| 183 VariableProxy::VariableProxy(Zone* zone, Variable* var, int start_position, | 174 VariableProxy::VariableProxy(Zone* zone, Variable* var, int start_position, |
| 184 int end_position) | 175 int end_position) |
| 185 : Expression(zone, start_position), | 176 : Expression(zone, start_position, kVariableProxy), |
| 186 bit_field_(IsThisField::encode(var->is_this()) | | 177 bit_field_(IsThisField::encode(var->is_this()) | |
| 187 IsAssignedField::encode(false) | | 178 IsAssignedField::encode(false) | |
| 188 IsResolvedField::encode(false)), | 179 IsResolvedField::encode(false)), |
| 189 raw_name_(var->raw_name()), | 180 raw_name_(var->raw_name()), |
| 190 end_position_(end_position) { | 181 end_position_(end_position) { |
| 191 BindTo(var); | 182 BindTo(var); |
| 192 } | 183 } |
| 193 | 184 |
| 194 | |
| 195 VariableProxy::VariableProxy(Zone* zone, const AstRawString* name, | 185 VariableProxy::VariableProxy(Zone* zone, const AstRawString* name, |
| 196 Variable::Kind variable_kind, int start_position, | 186 Variable::Kind variable_kind, int start_position, |
| 197 int end_position) | 187 int end_position) |
| 198 : Expression(zone, start_position), | 188 : Expression(zone, start_position, kVariableProxy), |
| 199 bit_field_(IsThisField::encode(variable_kind == Variable::THIS) | | 189 bit_field_(IsThisField::encode(variable_kind == Variable::THIS) | |
| 200 IsAssignedField::encode(false) | | 190 IsAssignedField::encode(false) | |
| 201 IsResolvedField::encode(false)), | 191 IsResolvedField::encode(false)), |
| 202 raw_name_(name), | 192 raw_name_(name), |
| 203 end_position_(end_position) {} | 193 end_position_(end_position) {} |
| 204 | 194 |
| 205 | |
| 206 void VariableProxy::BindTo(Variable* var) { | 195 void VariableProxy::BindTo(Variable* var) { |
| 207 DCHECK((is_this() && var->is_this()) || raw_name() == var->raw_name()); | 196 DCHECK((is_this() && var->is_this()) || raw_name() == var->raw_name()); |
| 208 set_var(var); | 197 set_var(var); |
| 209 set_is_resolved(); | 198 set_is_resolved(); |
| 210 var->set_is_used(); | 199 var->set_is_used(); |
| 211 } | 200 } |
| 212 | 201 |
| 213 | 202 |
| 214 void VariableProxy::AssignFeedbackVectorSlots(Isolate* isolate, | 203 void VariableProxy::AssignFeedbackVectorSlots(Isolate* isolate, |
| 215 FeedbackVectorSpec* spec, | 204 FeedbackVectorSpec* spec, |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 248 } | 237 } |
| 249 } | 238 } |
| 250 | 239 |
| 251 void ForInStatement::AssignFeedbackVectorSlots(Isolate* isolate, | 240 void ForInStatement::AssignFeedbackVectorSlots(Isolate* isolate, |
| 252 FeedbackVectorSpec* spec, | 241 FeedbackVectorSpec* spec, |
| 253 FeedbackVectorSlotCache* cache) { | 242 FeedbackVectorSlotCache* cache) { |
| 254 AssignVectorSlots(each(), spec, &each_slot_); | 243 AssignVectorSlots(each(), spec, &each_slot_); |
| 255 for_in_feedback_slot_ = spec->AddGeneralSlot(); | 244 for_in_feedback_slot_ = spec->AddGeneralSlot(); |
| 256 } | 245 } |
| 257 | 246 |
| 258 | |
| 259 Assignment::Assignment(Zone* zone, Token::Value op, Expression* target, | 247 Assignment::Assignment(Zone* zone, Token::Value op, Expression* target, |
| 260 Expression* value, int pos) | 248 Expression* value, int pos) |
| 261 : Expression(zone, pos), | 249 : Expression(zone, pos, kAssignment), |
| 262 bit_field_( | 250 bit_field_( |
| 263 IsUninitializedField::encode(false) | KeyTypeField::encode(ELEMENT) | | 251 IsUninitializedField::encode(false) | KeyTypeField::encode(ELEMENT) | |
| 264 StoreModeField::encode(STANDARD_STORE) | TokenField::encode(op)), | 252 StoreModeField::encode(STANDARD_STORE) | TokenField::encode(op)), |
| 265 target_(target), | 253 target_(target), |
| 266 value_(value), | 254 value_(value), |
| 267 binary_operation_(NULL) {} | 255 binary_operation_(NULL) {} |
| 268 | 256 |
| 269 | |
| 270 void Assignment::AssignFeedbackVectorSlots(Isolate* isolate, | 257 void Assignment::AssignFeedbackVectorSlots(Isolate* isolate, |
| 271 FeedbackVectorSpec* spec, | 258 FeedbackVectorSpec* spec, |
| 272 FeedbackVectorSlotCache* cache) { | 259 FeedbackVectorSlotCache* cache) { |
| 273 AssignVectorSlots(target(), spec, &slot_); | 260 AssignVectorSlots(target(), spec, &slot_); |
| 274 } | 261 } |
| 275 | 262 |
| 276 | 263 |
| 277 void CountOperation::AssignFeedbackVectorSlots(Isolate* isolate, | 264 void CountOperation::AssignFeedbackVectorSlots(Isolate* isolate, |
| 278 FeedbackVectorSpec* spec, | 265 FeedbackVectorSpec* spec, |
| 279 FeedbackVectorSlotCache* cache) { | 266 FeedbackVectorSlotCache* cache) { |
| (...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 924 } else { | 911 } else { |
| 925 return is_super ? KEYED_SUPER_PROPERTY_CALL : KEYED_PROPERTY_CALL; | 912 return is_super ? KEYED_SUPER_PROPERTY_CALL : KEYED_PROPERTY_CALL; |
| 926 } | 913 } |
| 927 } | 914 } |
| 928 | 915 |
| 929 return OTHER_CALL; | 916 return OTHER_CALL; |
| 930 } | 917 } |
| 931 | 918 |
| 932 | 919 |
| 933 // ---------------------------------------------------------------------------- | 920 // ---------------------------------------------------------------------------- |
| 934 // Implementation of AstVisitor | |
| 935 | |
| 936 void AstVisitor::VisitDeclarations(ZoneList<Declaration*>* declarations) { | |
| 937 for (int i = 0; i < declarations->length(); i++) { | |
| 938 Visit(declarations->at(i)); | |
| 939 } | |
| 940 } | |
| 941 | |
| 942 | |
| 943 void AstVisitor::VisitStatements(ZoneList<Statement*>* statements) { | |
| 944 for (int i = 0; i < statements->length(); i++) { | |
| 945 Statement* stmt = statements->at(i); | |
| 946 Visit(stmt); | |
| 947 if (stmt->IsJump()) break; | |
| 948 } | |
| 949 } | |
| 950 | |
| 951 | |
| 952 void AstVisitor::VisitExpressions(ZoneList<Expression*>* expressions) { | |
| 953 for (int i = 0; i < expressions->length(); i++) { | |
| 954 // The variable statement visiting code may pass NULL expressions | |
| 955 // to this code. Maybe this should be handled by introducing an | |
| 956 // undefined expression or literal? Revisit this code if this | |
| 957 // changes | |
| 958 Expression* expression = expressions->at(i); | |
| 959 if (expression != NULL) Visit(expression); | |
| 960 } | |
| 961 } | |
| 962 | |
| 963 // ---------------------------------------------------------------------------- | |
| 964 // Implementation of AstTraversalVisitor | 921 // Implementation of AstTraversalVisitor |
| 965 | 922 |
| 966 #define RECURSE(call) \ | 923 #define RECURSE(call) \ |
| 967 do { \ | 924 do { \ |
| 968 DCHECK(!HasStackOverflow()); \ | 925 DCHECK(!HasStackOverflow()); \ |
| 969 call; \ | 926 call; \ |
| 970 if (HasStackOverflow()) return; \ | 927 if (HasStackOverflow()) return; \ |
| 971 } while (false) | 928 } while (false) |
| 972 | 929 |
| 973 #define RECURSE_EXPRESSION(call) \ | 930 #define RECURSE_EXPRESSION(call) \ |
| (...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1256 void AstTraversalVisitor::VisitRewritableExpression( | 1213 void AstTraversalVisitor::VisitRewritableExpression( |
| 1257 RewritableExpression* expr) { | 1214 RewritableExpression* expr) { |
| 1258 RECURSE(Visit(expr->expression())); | 1215 RECURSE(Visit(expr->expression())); |
| 1259 } | 1216 } |
| 1260 | 1217 |
| 1261 #undef RECURSE_EXPRESSION | 1218 #undef RECURSE_EXPRESSION |
| 1262 #undef RECURSE | 1219 #undef RECURSE |
| 1263 | 1220 |
| 1264 CaseClause::CaseClause(Zone* zone, Expression* label, | 1221 CaseClause::CaseClause(Zone* zone, Expression* label, |
| 1265 ZoneList<Statement*>* statements, int pos) | 1222 ZoneList<Statement*>* statements, int pos) |
| 1266 : Expression(zone, pos), | 1223 : Expression(zone, pos, kCaseClause), |
| 1267 label_(label), | 1224 label_(label), |
| 1268 statements_(statements), | 1225 statements_(statements), |
| 1269 compare_type_(Type::None()) {} | 1226 compare_type_(Type::None()) {} |
| 1270 | 1227 |
| 1271 uint32_t Literal::Hash() { | 1228 uint32_t Literal::Hash() { |
| 1272 return raw_value()->IsString() | 1229 return raw_value()->IsString() |
| 1273 ? raw_value()->AsString()->hash() | 1230 ? raw_value()->AsString()->hash() |
| 1274 : ComputeLongHash(double_to_uint64(raw_value()->AsNumber())); | 1231 : ComputeLongHash(double_to_uint64(raw_value()->AsNumber())); |
| 1275 } | 1232 } |
| 1276 | 1233 |
| 1277 | 1234 |
| 1278 // static | 1235 // static |
| 1279 bool Literal::Match(void* literal1, void* literal2) { | 1236 bool Literal::Match(void* literal1, void* literal2) { |
| 1280 const AstValue* x = static_cast<Literal*>(literal1)->raw_value(); | 1237 const AstValue* x = static_cast<Literal*>(literal1)->raw_value(); |
| 1281 const AstValue* y = static_cast<Literal*>(literal2)->raw_value(); | 1238 const AstValue* y = static_cast<Literal*>(literal2)->raw_value(); |
| 1282 return (x->IsString() && y->IsString() && x->AsString() == y->AsString()) || | 1239 return (x->IsString() && y->IsString() && x->AsString() == y->AsString()) || |
| 1283 (x->IsNumber() && y->IsNumber() && x->AsNumber() == y->AsNumber()); | 1240 (x->IsNumber() && y->IsNumber() && x->AsNumber() == y->AsNumber()); |
| 1284 } | 1241 } |
| 1285 | 1242 |
| 1286 | 1243 |
| 1287 } // namespace internal | 1244 } // namespace internal |
| 1288 } // namespace v8 | 1245 } // namespace v8 |
| OLD | NEW |