OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/lookup.h" | 5 #include "src/lookup.h" |
6 | 6 |
7 #include "src/bootstrapper.h" | 7 #include "src/bootstrapper.h" |
8 #include "src/deoptimizer.h" | 8 #include "src/deoptimizer.h" |
9 #include "src/elements.h" | 9 #include "src/elements.h" |
10 #include "src/isolate-inl.h" | 10 #include "src/isolate-inl.h" |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
115 | 115 |
116 | 116 |
117 Handle<Map> LookupIterator::GetReceiverMap() const { | 117 Handle<Map> LookupIterator::GetReceiverMap() const { |
118 if (receiver_->IsNumber()) return factory()->heap_number_map(); | 118 if (receiver_->IsNumber()) return factory()->heap_number_map(); |
119 return handle(Handle<HeapObject>::cast(receiver_)->map(), isolate_); | 119 return handle(Handle<HeapObject>::cast(receiver_)->map(), isolate_); |
120 } | 120 } |
121 | 121 |
122 | 122 |
123 Handle<JSObject> LookupIterator::GetStoreTarget() const { | 123 Handle<JSObject> LookupIterator::GetStoreTarget() const { |
124 if (receiver_->IsJSGlobalProxy()) { | 124 if (receiver_->IsJSGlobalProxy()) { |
125 PrototypeIterator iter(isolate(), receiver_); | 125 PrototypeIterator iter(isolate(), Handle<JSGlobalProxy>::cast(receiver_)); |
126 if (iter.IsAtEnd()) return Handle<JSGlobalProxy>::cast(receiver_); | 126 if (iter.IsAtEnd()) return Handle<JSGlobalProxy>::cast(receiver_); |
127 return PrototypeIterator::GetCurrent<JSGlobalObject>(iter); | 127 return PrototypeIterator::GetCurrent<JSGlobalObject>(iter); |
128 } | 128 } |
129 return Handle<JSObject>::cast(receiver_); | 129 return Handle<JSObject>::cast(receiver_); |
130 } | 130 } |
131 | 131 |
132 | 132 |
133 bool LookupIterator::HasAccess() const { | 133 bool LookupIterator::HasAccess() const { |
134 DCHECK_EQ(ACCESS_CHECK, state_); | 134 DCHECK_EQ(ACCESS_CHECK, state_); |
135 return isolate_->MayAccess(handle(isolate_->context()), | 135 return isolate_->MayAccess(handle(isolate_->context()), |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 | 391 |
392 bool LookupIterator::HolderIsReceiverOrHiddenPrototype() const { | 392 bool LookupIterator::HolderIsReceiverOrHiddenPrototype() const { |
393 DCHECK(has_property_ || state_ == INTERCEPTOR || state_ == JSPROXY); | 393 DCHECK(has_property_ || state_ == INTERCEPTOR || state_ == JSPROXY); |
394 // Optimization that only works if configuration_ is not mutable. | 394 // Optimization that only works if configuration_ is not mutable. |
395 if (!check_prototype_chain()) return true; | 395 if (!check_prototype_chain()) return true; |
396 DisallowHeapAllocation no_gc; | 396 DisallowHeapAllocation no_gc; |
397 if (!receiver_->IsJSReceiver()) return false; | 397 if (!receiver_->IsJSReceiver()) return false; |
398 JSReceiver* current = JSReceiver::cast(*receiver_); | 398 JSReceiver* current = JSReceiver::cast(*receiver_); |
399 JSReceiver* object = *holder_; | 399 JSReceiver* object = *holder_; |
400 if (current == object) return true; | 400 if (current == object) return true; |
401 if (!object->map()->is_hidden_prototype()) return false; | 401 if (!current->map()->has_hidden_prototype()) return false; |
402 // JSProxy do not occur as hidden prototypes. | 402 // JSProxy do not occur as hidden prototypes. |
403 if (current->IsJSProxy()) return false; | 403 if (current->IsJSProxy()) return false; |
404 PrototypeIterator iter(isolate(), current); | 404 PrototypeIterator iter(isolate(), current, |
405 while (!iter.IsAtEnd(PrototypeIterator::END_AT_NON_HIDDEN)) { | 405 PrototypeIterator::START_AT_PROTOTYPE, |
| 406 PrototypeIterator::END_AT_NON_HIDDEN); |
| 407 while (!iter.IsAtEnd()) { |
406 if (iter.GetCurrent<JSReceiver>() == object) return true; | 408 if (iter.GetCurrent<JSReceiver>() == object) return true; |
407 iter.Advance(); | 409 iter.Advance(); |
408 } | 410 } |
409 return false; | 411 return false; |
410 } | 412 } |
411 | 413 |
412 | 414 |
413 Handle<Object> LookupIterator::FetchValue() const { | 415 Handle<Object> LookupIterator::FetchValue() const { |
414 Object* result = NULL; | 416 Object* result = NULL; |
415 if (IsElement()) { | 417 if (IsElement()) { |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
546 } | 548 } |
547 } | 549 } |
548 return interceptor_state_ == InterceptorState::kProcessNonMasking; | 550 return interceptor_state_ == InterceptorState::kProcessNonMasking; |
549 } | 551 } |
550 | 552 |
551 | 553 |
552 JSReceiver* LookupIterator::NextHolder(Map* map) { | 554 JSReceiver* LookupIterator::NextHolder(Map* map) { |
553 DisallowHeapAllocation no_gc; | 555 DisallowHeapAllocation no_gc; |
554 if (!map->prototype()->IsJSReceiver()) return NULL; | 556 if (!map->prototype()->IsJSReceiver()) return NULL; |
555 | 557 |
556 JSReceiver* next = JSReceiver::cast(map->prototype()); | 558 DCHECK(!map->IsJSGlobalProxyMap() || map->has_hidden_prototype()); |
557 DCHECK(!next->map()->IsJSGlobalObjectMap() || | |
558 next->map()->is_hidden_prototype()); | |
559 | 559 |
560 if (!check_prototype_chain() && | 560 if (!check_prototype_chain() && |
561 !(check_hidden() && next->map()->is_hidden_prototype()) && | 561 !(check_hidden() && map->has_hidden_prototype()) && |
562 // Always lookup behind the JSGlobalProxy into the JSGlobalObject, even | 562 // Always lookup behind the JSGlobalProxy into the JSGlobalObject, even |
563 // when not checking other hidden prototypes. | 563 // when not checking other hidden prototypes. |
564 !map->IsJSGlobalProxyMap()) { | 564 !map->IsJSGlobalProxyMap()) { |
565 return NULL; | 565 return NULL; |
566 } | 566 } |
567 | 567 |
568 return next; | 568 return JSReceiver::cast(map->prototype()); |
569 } | 569 } |
570 | 570 |
571 LookupIterator::State LookupIterator::NotFound(JSReceiver* const holder) const { | 571 LookupIterator::State LookupIterator::NotFound(JSReceiver* const holder) const { |
572 DCHECK(!IsElement()); | 572 DCHECK(!IsElement()); |
573 if (!holder->IsJSTypedArray() || !name_->IsString()) return NOT_FOUND; | 573 if (!holder->IsJSTypedArray() || !name_->IsString()) return NOT_FOUND; |
574 | 574 |
575 Handle<String> name_string = Handle<String>::cast(name_); | 575 Handle<String> name_string = Handle<String>::cast(name_); |
576 if (name_string->length() == 0) return NOT_FOUND; | 576 if (name_string->length() == 0) return NOT_FOUND; |
577 | 577 |
578 return IsSpecialIndex(isolate_->unicode_cache(), *name_string) | 578 return IsSpecialIndex(isolate_->unicode_cache(), *name_string) |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
669 // Fall through. | 669 // Fall through. |
670 default: | 670 default: |
671 return NOT_FOUND; | 671 return NOT_FOUND; |
672 } | 672 } |
673 UNREACHABLE(); | 673 UNREACHABLE(); |
674 return state_; | 674 return state_; |
675 } | 675 } |
676 | 676 |
677 } // namespace internal | 677 } // namespace internal |
678 } // namespace v8 | 678 } // namespace v8 |
OLD | NEW |