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 #ifndef V8_LOOKUP_INL_H_ | 5 #ifndef V8_LOOKUP_INL_H_ |
6 #define V8_LOOKUP_INL_H_ | 6 #define V8_LOOKUP_INL_H_ |
7 | 7 |
8 #include "src/lookup.h" | 8 #include "src/lookup.h" |
9 | 9 |
10 namespace v8 { | 10 namespace v8 { |
(...skipping 24 matching lines...) Expand all Loading... |
35 JSReceiver* const holder) { | 35 JSReceiver* const holder) { |
36 STATIC_ASSERT(INTERCEPTOR == BEFORE_PROPERTY); | 36 STATIC_ASSERT(INTERCEPTOR == BEFORE_PROPERTY); |
37 DisallowHeapAllocation no_gc; | 37 DisallowHeapAllocation no_gc; |
38 if (interceptor_state_ == InterceptorState::kProcessNonMasking) { | 38 if (interceptor_state_ == InterceptorState::kProcessNonMasking) { |
39 return LookupNonMaskingInterceptorInHolder(map, holder); | 39 return LookupNonMaskingInterceptorInHolder(map, holder); |
40 } | 40 } |
41 switch (state_) { | 41 switch (state_) { |
42 case NOT_FOUND: | 42 case NOT_FOUND: |
43 if (map->IsJSProxyMap()) return JSPROXY; | 43 if (map->IsJSProxyMap()) return JSPROXY; |
44 if (map->is_access_check_needed() && | 44 if (map->is_access_check_needed() && |
45 !isolate_->IsInternallyUsedPropertyName(name_)) { | 45 (IsElement() || !isolate_->IsInternallyUsedPropertyName(name_))) { |
46 return ACCESS_CHECK; | 46 return ACCESS_CHECK; |
47 } | 47 } |
48 // Fall through. | 48 // Fall through. |
49 case ACCESS_CHECK: | 49 case ACCESS_CHECK: |
50 if (exotic_index_state_ != ExoticIndexState::kNoIndex && | 50 if (exotic_index_state_ != ExoticIndexState::kNotExotic && |
51 IsIntegerIndexedExotic(holder)) { | 51 IsIntegerIndexedExotic(holder)) { |
52 return INTEGER_INDEXED_EXOTIC; | 52 return INTEGER_INDEXED_EXOTIC; |
53 } | 53 } |
54 if (check_interceptor() && map->has_named_interceptor() && | 54 if (check_interceptor() && HasInterceptor(map) && |
55 !SkipInterceptor(JSObject::cast(holder))) { | 55 !SkipInterceptor(JSObject::cast(holder))) { |
56 return INTERCEPTOR; | 56 return INTERCEPTOR; |
57 } | 57 } |
58 // Fall through. | 58 // Fall through. |
59 case INTERCEPTOR: | 59 case INTERCEPTOR: |
60 if (map->is_dictionary_map()) { | 60 if (IsElement()) { |
| 61 JSObject* js_object = JSObject::cast(holder); |
| 62 ElementsAccessor* accessor = js_object->GetElementsAccessor(); |
| 63 FixedArrayBase* backing_store = js_object->elements(); |
| 64 number_ = accessor->GetIndexForKey(backing_store, index_); |
| 65 if (number_ == kMaxUInt32) return NOT_FOUND; |
| 66 property_details_ = accessor->GetDetails(backing_store, number_); |
| 67 } else if (map->is_dictionary_map()) { |
61 NameDictionary* dict = JSObject::cast(holder)->property_dictionary(); | 68 NameDictionary* dict = JSObject::cast(holder)->property_dictionary(); |
62 number_ = dict->FindEntry(name_); | 69 int number = dict->FindEntry(name_); |
63 if (number_ == NameDictionary::kNotFound) return NOT_FOUND; | 70 if (number == NameDictionary::kNotFound) return NOT_FOUND; |
| 71 number_ = static_cast<uint32_t>(number); |
64 if (holder->IsGlobalObject()) { | 72 if (holder->IsGlobalObject()) { |
65 DCHECK(dict->ValueAt(number_)->IsPropertyCell()); | 73 DCHECK(dict->ValueAt(number_)->IsPropertyCell()); |
66 PropertyCell* cell = PropertyCell::cast(dict->ValueAt(number_)); | 74 PropertyCell* cell = PropertyCell::cast(dict->ValueAt(number_)); |
67 if (cell->value()->IsTheHole()) return NOT_FOUND; | 75 if (cell->value()->IsTheHole()) return NOT_FOUND; |
68 } | 76 } |
69 property_details_ = dict->DetailsAt(number_); | 77 property_details_ = dict->DetailsAt(number_); |
70 } else { | 78 } else { |
71 DescriptorArray* descriptors = map->instance_descriptors(); | 79 DescriptorArray* descriptors = map->instance_descriptors(); |
72 number_ = descriptors->SearchWithCache(*name_, map); | 80 int number = descriptors->SearchWithCache(*name_, map); |
73 if (number_ == DescriptorArray::kNotFound) return NOT_FOUND; | 81 if (number == DescriptorArray::kNotFound) return NOT_FOUND; |
| 82 number_ = static_cast<uint32_t>(number); |
74 property_details_ = descriptors->GetDetails(number_); | 83 property_details_ = descriptors->GetDetails(number_); |
75 } | 84 } |
76 has_property_ = true; | 85 has_property_ = true; |
77 switch (property_details_.kind()) { | 86 switch (property_details_.kind()) { |
78 case v8::internal::kData: | 87 case v8::internal::kData: |
79 return DATA; | 88 return DATA; |
80 case v8::internal::kAccessor: | 89 case v8::internal::kAccessor: |
81 return ACCESSOR; | 90 return ACCESSOR; |
82 } | 91 } |
83 case ACCESSOR: | 92 case ACCESSOR: |
84 case DATA: | 93 case DATA: |
85 return NOT_FOUND; | 94 return NOT_FOUND; |
86 case INTEGER_INDEXED_EXOTIC: | 95 case INTEGER_INDEXED_EXOTIC: |
87 case JSPROXY: | 96 case JSPROXY: |
88 case TRANSITION: | 97 case TRANSITION: |
89 UNREACHABLE(); | 98 UNREACHABLE(); |
90 } | 99 } |
91 UNREACHABLE(); | 100 UNREACHABLE(); |
92 return state_; | 101 return state_; |
93 } | 102 } |
94 | 103 |
95 | 104 |
96 LookupIterator::State LookupIterator::LookupNonMaskingInterceptorInHolder( | 105 LookupIterator::State LookupIterator::LookupNonMaskingInterceptorInHolder( |
97 Map* const map, JSReceiver* const holder) { | 106 Map* const map, JSReceiver* const holder) { |
98 switch (state_) { | 107 switch (state_) { |
99 case NOT_FOUND: | 108 case NOT_FOUND: |
100 if (check_interceptor() && map->has_named_interceptor() && | 109 if (check_interceptor() && HasInterceptor(map) && |
101 !SkipInterceptor(JSObject::cast(holder))) { | 110 !SkipInterceptor(JSObject::cast(holder))) { |
102 return INTERCEPTOR; | 111 return INTERCEPTOR; |
103 } | 112 } |
104 // Fall through. | 113 // Fall through. |
105 default: | 114 default: |
106 return NOT_FOUND; | 115 return NOT_FOUND; |
107 } | 116 } |
108 UNREACHABLE(); | 117 UNREACHABLE(); |
109 return state_; | 118 return state_; |
110 } | 119 } |
111 } | 120 } |
112 } // namespace v8::internal | 121 } // namespace v8::internal |
113 | 122 |
114 #endif // V8_LOOKUP_INL_H_ | 123 #endif // V8_LOOKUP_INL_H_ |
OLD | NEW |