OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 void type::Accept(AstVisitor* v) { v->Visit##type(this); } | 50 void type::Accept(AstVisitor* v) { v->Visit##type(this); } |
51 AST_NODE_LIST(DECL_ACCEPT) | 51 AST_NODE_LIST(DECL_ACCEPT) |
52 #undef DECL_ACCEPT | 52 #undef DECL_ACCEPT |
53 | 53 |
54 | 54 |
55 // ---------------------------------------------------------------------------- | 55 // ---------------------------------------------------------------------------- |
56 // Implementation of other node functionality. | 56 // Implementation of other node functionality. |
57 | 57 |
58 | 58 |
59 bool Expression::IsSmiLiteral() { | 59 bool Expression::IsSmiLiteral() { |
60 return AsLiteral() != NULL && AsLiteral()->handle()->IsSmi(); | 60 return AsLiteral() != NULL && AsLiteral()->value()->IsSmi(); |
61 } | 61 } |
62 | 62 |
63 | 63 |
64 bool Expression::IsStringLiteral() { | 64 bool Expression::IsStringLiteral() { |
65 return AsLiteral() != NULL && AsLiteral()->handle()->IsString(); | 65 return AsLiteral() != NULL && AsLiteral()->value()->IsString(); |
66 } | 66 } |
67 | 67 |
68 | 68 |
69 bool Expression::IsNullLiteral() { | 69 bool Expression::IsNullLiteral() { |
70 return AsLiteral() != NULL && AsLiteral()->handle()->IsNull(); | 70 return AsLiteral() != NULL && AsLiteral()->value()->IsNull(); |
71 } | 71 } |
72 | 72 |
73 | 73 |
74 bool Expression::IsUndefinedLiteral() { | 74 bool Expression::IsUndefinedLiteral() { |
75 return AsLiteral() != NULL && AsLiteral()->handle()->IsUndefined(); | 75 return AsLiteral() != NULL && AsLiteral()->value()->IsUndefined(); |
76 } | 76 } |
77 | 77 |
78 | 78 |
79 VariableProxy::VariableProxy(Isolate* isolate, Variable* var) | 79 VariableProxy::VariableProxy(Isolate* isolate, Variable* var) |
80 : Expression(isolate), | 80 : Expression(isolate), |
81 name_(var->name()), | 81 name_(var->name()), |
82 var_(NULL), // Will be set by the call to BindTo. | 82 var_(NULL), // Will be set by the call to BindTo. |
83 is_this_(var->is_this()), | 83 is_this_(var->is_this()), |
84 is_trivial_(false), | 84 is_trivial_(false), |
85 is_lvalue_(false), | 85 is_lvalue_(false), |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 return scope()->language_mode(); | 182 return scope()->language_mode(); |
183 } | 183 } |
184 | 184 |
185 | 185 |
186 ObjectLiteralProperty::ObjectLiteralProperty(Literal* key, | 186 ObjectLiteralProperty::ObjectLiteralProperty(Literal* key, |
187 Expression* value, | 187 Expression* value, |
188 Isolate* isolate) { | 188 Isolate* isolate) { |
189 emit_store_ = true; | 189 emit_store_ = true; |
190 key_ = key; | 190 key_ = key; |
191 value_ = value; | 191 value_ = value; |
192 Object* k = *key->handle(); | 192 Object* k = *key->value(); |
193 if (k->IsInternalizedString() && | 193 if (k->IsInternalizedString() && |
194 isolate->heap()->proto_string()->Equals(String::cast(k))) { | 194 isolate->heap()->proto_string()->Equals(String::cast(k))) { |
195 kind_ = PROTOTYPE; | 195 kind_ = PROTOTYPE; |
196 } else if (value_->AsMaterializedLiteral() != NULL) { | 196 } else if (value_->AsMaterializedLiteral() != NULL) { |
197 kind_ = MATERIALIZED_LITERAL; | 197 kind_ = MATERIALIZED_LITERAL; |
198 } else if (value_->AsLiteral() != NULL) { | 198 } else if (value_->AsLiteral() != NULL) { |
199 kind_ = CONSTANT; | 199 kind_ = CONSTANT; |
200 } else { | 200 } else { |
201 kind_ = COMPUTED; | 201 kind_ = COMPUTED; |
202 } | 202 } |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
256 | 256 |
257 | 257 |
258 void ObjectLiteral::CalculateEmitStore(Zone* zone) { | 258 void ObjectLiteral::CalculateEmitStore(Zone* zone) { |
259 ZoneAllocationPolicy allocator(zone); | 259 ZoneAllocationPolicy allocator(zone); |
260 | 260 |
261 ZoneHashMap table(Literal::Match, ZoneHashMap::kDefaultHashMapCapacity, | 261 ZoneHashMap table(Literal::Match, ZoneHashMap::kDefaultHashMapCapacity, |
262 allocator); | 262 allocator); |
263 for (int i = properties()->length() - 1; i >= 0; i--) { | 263 for (int i = properties()->length() - 1; i >= 0; i--) { |
264 ObjectLiteral::Property* property = properties()->at(i); | 264 ObjectLiteral::Property* property = properties()->at(i); |
265 Literal* literal = property->key(); | 265 Literal* literal = property->key(); |
266 if (literal->handle()->IsNull()) continue; | 266 if (literal->value()->IsNull()) continue; |
267 uint32_t hash = literal->Hash(); | 267 uint32_t hash = literal->Hash(); |
268 // If the key of a computed property is in the table, do not emit | 268 // If the key of a computed property is in the table, do not emit |
269 // a store for the property later. | 269 // a store for the property later. |
270 if (property->kind() == ObjectLiteral::Property::COMPUTED && | 270 if (property->kind() == ObjectLiteral::Property::COMPUTED && |
271 table.Lookup(literal, hash, false, allocator) != NULL) { | 271 table.Lookup(literal, hash, false, allocator) != NULL) { |
272 property->set_emit_store(false); | 272 property->set_emit_store(false); |
273 } else { | 273 } else { |
274 // Add key to the table. | 274 // Add key to the table. |
275 table.Lookup(literal, hash, true, allocator); | 275 table.Lookup(literal, hash, true, allocator); |
276 } | 276 } |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 | 331 |
332 | 332 |
333 // Check for the pattern: typeof <expression> equals <string literal>. | 333 // Check for the pattern: typeof <expression> equals <string literal>. |
334 static bool MatchLiteralCompareTypeof(Expression* left, | 334 static bool MatchLiteralCompareTypeof(Expression* left, |
335 Token::Value op, | 335 Token::Value op, |
336 Expression* right, | 336 Expression* right, |
337 Expression** expr, | 337 Expression** expr, |
338 Handle<String>* check) { | 338 Handle<String>* check) { |
339 if (IsTypeof(left) && right->IsStringLiteral() && Token::IsEqualityOp(op)) { | 339 if (IsTypeof(left) && right->IsStringLiteral() && Token::IsEqualityOp(op)) { |
340 *expr = left->AsUnaryOperation()->expression(); | 340 *expr = left->AsUnaryOperation()->expression(); |
341 *check = Handle<String>::cast(right->AsLiteral()->handle()); | 341 *check = Handle<String>::cast(right->AsLiteral()->value()); |
342 return true; | 342 return true; |
343 } | 343 } |
344 return false; | 344 return false; |
345 } | 345 } |
346 | 346 |
347 | 347 |
348 bool CompareOperation::IsLiteralCompareTypeof(Expression** expr, | 348 bool CompareOperation::IsLiteralCompareTypeof(Expression** expr, |
349 Handle<String>* check) { | 349 Handle<String>* check) { |
350 return MatchLiteralCompareTypeof(left_, op_, right_, expr, check) || | 350 return MatchLiteralCompareTypeof(left_, op_, right_, expr, check) || |
351 MatchLiteralCompareTypeof(right_, op_, left_, expr, check); | 351 MatchLiteralCompareTypeof(right_, op_, left_, expr, check); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
442 receiver_types_.Clear(); | 442 receiver_types_.Clear(); |
443 if (key()->IsPropertyName()) { | 443 if (key()->IsPropertyName()) { |
444 FunctionPrototypeStub proto_stub(Code::LOAD_IC); | 444 FunctionPrototypeStub proto_stub(Code::LOAD_IC); |
445 StringLengthStub string_stub(Code::LOAD_IC, false); | 445 StringLengthStub string_stub(Code::LOAD_IC, false); |
446 if (oracle->LoadIsStub(this, &string_stub)) { | 446 if (oracle->LoadIsStub(this, &string_stub)) { |
447 is_string_length_ = true; | 447 is_string_length_ = true; |
448 } else if (oracle->LoadIsStub(this, &proto_stub)) { | 448 } else if (oracle->LoadIsStub(this, &proto_stub)) { |
449 is_function_prototype_ = true; | 449 is_function_prototype_ = true; |
450 } else { | 450 } else { |
451 Literal* lit_key = key()->AsLiteral(); | 451 Literal* lit_key = key()->AsLiteral(); |
452 ASSERT(lit_key != NULL && lit_key->handle()->IsString()); | 452 ASSERT(lit_key != NULL && lit_key->value()->IsString()); |
453 Handle<String> name = Handle<String>::cast(lit_key->handle()); | 453 Handle<String> name = Handle<String>::cast(lit_key->value()); |
454 oracle->LoadReceiverTypes(this, name, &receiver_types_); | 454 oracle->LoadReceiverTypes(this, name, &receiver_types_); |
455 } | 455 } |
456 } else if (oracle->LoadIsBuiltin(this, Builtins::kKeyedLoadIC_String)) { | 456 } else if (oracle->LoadIsBuiltin(this, Builtins::kKeyedLoadIC_String)) { |
457 is_string_access_ = true; | 457 is_string_access_ = true; |
458 } else if (is_monomorphic_) { | 458 } else if (is_monomorphic_) { |
459 receiver_types_.Add(oracle->LoadMonomorphicReceiverType(this), | 459 receiver_types_.Add(oracle->LoadMonomorphicReceiverType(this), |
460 zone); | 460 zone); |
461 } else if (oracle->LoadIsPolymorphic(this)) { | 461 } else if (oracle->LoadIsPolymorphic(this)) { |
462 receiver_types_.Reserve(kMaxKeyedPolymorphism, zone); | 462 receiver_types_.Reserve(kMaxKeyedPolymorphism, zone); |
463 oracle->CollectKeyedReceiverTypes(PropertyFeedbackId(), &receiver_types_); | 463 oracle->CollectKeyedReceiverTypes(PropertyFeedbackId(), &receiver_types_); |
464 } | 464 } |
465 } | 465 } |
466 | 466 |
467 | 467 |
468 void Assignment::RecordTypeFeedback(TypeFeedbackOracle* oracle, | 468 void Assignment::RecordTypeFeedback(TypeFeedbackOracle* oracle, |
469 Zone* zone) { | 469 Zone* zone) { |
470 Property* prop = target()->AsProperty(); | 470 Property* prop = target()->AsProperty(); |
471 ASSERT(prop != NULL); | 471 ASSERT(prop != NULL); |
472 TypeFeedbackId id = AssignmentFeedbackId(); | 472 TypeFeedbackId id = AssignmentFeedbackId(); |
473 is_uninitialized_ = oracle->StoreIsUninitialized(id); | 473 is_uninitialized_ = oracle->StoreIsUninitialized(id); |
474 if (is_uninitialized_) return; | 474 if (is_uninitialized_) return; |
475 is_monomorphic_ = oracle->StoreIsMonomorphicNormal(id); | 475 is_monomorphic_ = oracle->StoreIsMonomorphicNormal(id); |
476 receiver_types_.Clear(); | 476 receiver_types_.Clear(); |
477 if (prop->key()->IsPropertyName()) { | 477 if (prop->key()->IsPropertyName()) { |
478 Literal* lit_key = prop->key()->AsLiteral(); | 478 Literal* lit_key = prop->key()->AsLiteral(); |
479 ASSERT(lit_key != NULL && lit_key->handle()->IsString()); | 479 ASSERT(lit_key != NULL && lit_key->value()->IsString()); |
480 Handle<String> name = Handle<String>::cast(lit_key->handle()); | 480 Handle<String> name = Handle<String>::cast(lit_key->value()); |
481 oracle->StoreReceiverTypes(this, name, &receiver_types_); | 481 oracle->StoreReceiverTypes(this, name, &receiver_types_); |
482 } else if (is_monomorphic_) { | 482 } else if (is_monomorphic_) { |
483 // Record receiver type for monomorphic keyed stores. | 483 // Record receiver type for monomorphic keyed stores. |
484 receiver_types_.Add(oracle->StoreMonomorphicReceiverType(id), zone); | 484 receiver_types_.Add(oracle->StoreMonomorphicReceiverType(id), zone); |
485 store_mode_ = oracle->GetStoreMode(id); | 485 store_mode_ = oracle->GetStoreMode(id); |
486 } else if (oracle->StoreIsPolymorphic(id)) { | 486 } else if (oracle->StoreIsPolymorphic(id)) { |
487 receiver_types_.Reserve(kMaxKeyedPolymorphism, zone); | 487 receiver_types_.Reserve(kMaxKeyedPolymorphism, zone); |
488 oracle->CollectKeyedReceiverTypes(id, &receiver_types_); | 488 oracle->CollectKeyedReceiverTypes(id, &receiver_types_); |
489 store_mode_ = oracle->GetStoreMode(id); | 489 store_mode_ = oracle->GetStoreMode(id); |
490 } | 490 } |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
612 void Call::RecordTypeFeedback(TypeFeedbackOracle* oracle, | 612 void Call::RecordTypeFeedback(TypeFeedbackOracle* oracle, |
613 CallKind call_kind) { | 613 CallKind call_kind) { |
614 is_monomorphic_ = oracle->CallIsMonomorphic(this); | 614 is_monomorphic_ = oracle->CallIsMonomorphic(this); |
615 Property* property = expression()->AsProperty(); | 615 Property* property = expression()->AsProperty(); |
616 if (property == NULL) { | 616 if (property == NULL) { |
617 // Function call. Specialize for monomorphic calls. | 617 // Function call. Specialize for monomorphic calls. |
618 if (is_monomorphic_) target_ = oracle->GetCallTarget(this); | 618 if (is_monomorphic_) target_ = oracle->GetCallTarget(this); |
619 } else { | 619 } else { |
620 // Method call. Specialize for the receiver types seen at runtime. | 620 // Method call. Specialize for the receiver types seen at runtime. |
621 Literal* key = property->key()->AsLiteral(); | 621 Literal* key = property->key()->AsLiteral(); |
622 ASSERT(key != NULL && key->handle()->IsString()); | 622 ASSERT(key != NULL && key->value()->IsString()); |
623 Handle<String> name = Handle<String>::cast(key->handle()); | 623 Handle<String> name = Handle<String>::cast(key->value()); |
624 receiver_types_.Clear(); | 624 receiver_types_.Clear(); |
625 oracle->CallReceiverTypes(this, name, call_kind, &receiver_types_); | 625 oracle->CallReceiverTypes(this, name, call_kind, &receiver_types_); |
626 #ifdef DEBUG | 626 #ifdef DEBUG |
627 if (FLAG_enable_slow_asserts) { | 627 if (FLAG_enable_slow_asserts) { |
628 int length = receiver_types_.length(); | 628 int length = receiver_types_.length(); |
629 for (int i = 0; i < length; i++) { | 629 for (int i = 0; i < length; i++) { |
630 Handle<Map> map = receiver_types_.at(i); | 630 Handle<Map> map = receiver_types_.at(i); |
631 ASSERT(!map.is_null() && *map != NULL); | 631 ASSERT(!map.is_null() && *map != NULL); |
632 } | 632 } |
633 } | 633 } |
(...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1145 } | 1145 } |
1146 } | 1146 } |
1147 | 1147 |
1148 #undef REGULAR_NODE | 1148 #undef REGULAR_NODE |
1149 #undef DONT_OPTIMIZE_NODE | 1149 #undef DONT_OPTIMIZE_NODE |
1150 #undef DONT_SELFOPTIMIZE_NODE | 1150 #undef DONT_SELFOPTIMIZE_NODE |
1151 #undef DONT_CACHE_NODE | 1151 #undef DONT_CACHE_NODE |
1152 | 1152 |
1153 | 1153 |
1154 Handle<String> Literal::ToString() { | 1154 Handle<String> Literal::ToString() { |
1155 if (handle_->IsString()) return Handle<String>::cast(handle_); | 1155 if (value_->IsString()) return Handle<String>::cast(value_); |
1156 Factory* factory = Isolate::Current()->factory(); | 1156 Factory* factory = Isolate::Current()->factory(); |
1157 ASSERT(handle_->IsNumber()); | 1157 ASSERT(value_->IsNumber()); |
1158 char arr[100]; | 1158 char arr[100]; |
1159 Vector<char> buffer(arr, ARRAY_SIZE(arr)); | 1159 Vector<char> buffer(arr, ARRAY_SIZE(arr)); |
1160 const char* str; | 1160 const char* str; |
1161 if (handle_->IsSmi()) { | 1161 if (value_->IsSmi()) { |
1162 // Optimization only, the heap number case would subsume this. | 1162 // Optimization only, the heap number case would subsume this. |
1163 OS::SNPrintF(buffer, "%d", Smi::cast(*handle_)->value()); | 1163 OS::SNPrintF(buffer, "%d", Smi::cast(*value_)->value()); |
1164 str = arr; | 1164 str = arr; |
1165 } else { | 1165 } else { |
1166 str = DoubleToCString(handle_->Number(), buffer); | 1166 str = DoubleToCString(value_->Number(), buffer); |
1167 } | 1167 } |
1168 return factory->NewStringFromAscii(CStrVector(str)); | 1168 return factory->NewStringFromAscii(CStrVector(str)); |
1169 } | 1169 } |
1170 | 1170 |
1171 | 1171 |
1172 } } // namespace v8::internal | 1172 } } // namespace v8::internal |
OLD | NEW |