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_H_ | 5 #ifndef V8_LOOKUP_H_ |
6 #define V8_LOOKUP_H_ | 6 #define V8_LOOKUP_H_ |
7 | 7 |
8 #include "src/factory.h" | 8 #include "src/factory.h" |
9 #include "src/isolate.h" | 9 #include "src/isolate.h" |
10 #include "src/objects.h" | 10 #include "src/objects.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 BEFORE_PROPERTY = INTERCEPTOR | 44 BEFORE_PROPERTY = INTERCEPTOR |
45 }; | 45 }; |
46 | 46 |
47 LookupIterator(Handle<Object> receiver, Handle<Name> name, | 47 LookupIterator(Handle<Object> receiver, Handle<Name> name, |
48 Configuration configuration = DEFAULT) | 48 Configuration configuration = DEFAULT) |
49 : configuration_(ComputeConfiguration(configuration, name)), | 49 : configuration_(ComputeConfiguration(configuration, name)), |
50 interceptor_state_(InterceptorState::kUninitialized), | 50 interceptor_state_(InterceptorState::kUninitialized), |
51 property_details_(PropertyDetails::Empty()), | 51 property_details_(PropertyDetails::Empty()), |
52 isolate_(name->GetIsolate()), | 52 isolate_(name->GetIsolate()), |
53 name_(isolate_->factory()->InternalizeName(name)), | 53 name_(isolate_->factory()->InternalizeName(name)), |
| 54 receiver_(receiver), |
| 55 initial_holder_(GetRoot(isolate_, receiver)), |
54 // kMaxUInt32 isn't a valid index. | 56 // kMaxUInt32 isn't a valid index. |
55 index_(kMaxUInt32), | 57 index_(kMaxUInt32), |
56 receiver_(receiver), | 58 number_(DescriptorArray::kNotFound) { |
57 initial_holder_(GetRoot(isolate_, receiver)) { | |
58 #ifdef DEBUG | 59 #ifdef DEBUG |
59 uint32_t index; // Assert that the name is not an array index. | 60 uint32_t index; // Assert that the name is not an array index. |
60 DCHECK(!name->AsArrayIndex(&index)); | 61 DCHECK(!name->AsArrayIndex(&index)); |
61 #endif // DEBUG | 62 #endif // DEBUG |
62 Start<false>(); | 63 Start<false>(); |
63 } | 64 } |
64 | 65 |
65 LookupIterator(Handle<Object> receiver, Handle<Name> name, | 66 LookupIterator(Handle<Object> receiver, Handle<Name> name, |
66 Handle<JSReceiver> holder, | 67 Handle<JSReceiver> holder, |
67 Configuration configuration = DEFAULT) | 68 Configuration configuration = DEFAULT) |
68 : configuration_(ComputeConfiguration(configuration, name)), | 69 : configuration_(ComputeConfiguration(configuration, name)), |
69 interceptor_state_(InterceptorState::kUninitialized), | 70 interceptor_state_(InterceptorState::kUninitialized), |
70 property_details_(PropertyDetails::Empty()), | 71 property_details_(PropertyDetails::Empty()), |
71 isolate_(name->GetIsolate()), | 72 isolate_(name->GetIsolate()), |
72 name_(isolate_->factory()->InternalizeName(name)), | 73 name_(isolate_->factory()->InternalizeName(name)), |
| 74 receiver_(receiver), |
| 75 initial_holder_(holder), |
73 // kMaxUInt32 isn't a valid index. | 76 // kMaxUInt32 isn't a valid index. |
74 index_(kMaxUInt32), | 77 index_(kMaxUInt32), |
75 receiver_(receiver), | 78 number_(DescriptorArray::kNotFound) { |
76 initial_holder_(holder) { | |
77 #ifdef DEBUG | 79 #ifdef DEBUG |
78 uint32_t index; // Assert that the name is not an array index. | 80 uint32_t index; // Assert that the name is not an array index. |
79 DCHECK(!name->AsArrayIndex(&index)); | 81 DCHECK(!name->AsArrayIndex(&index)); |
80 #endif // DEBUG | 82 #endif // DEBUG |
81 Start<false>(); | 83 Start<false>(); |
82 } | 84 } |
83 | 85 |
84 LookupIterator(Isolate* isolate, Handle<Object> receiver, uint32_t index, | 86 LookupIterator(Isolate* isolate, Handle<Object> receiver, uint32_t index, |
85 Configuration configuration = DEFAULT) | 87 Configuration configuration = DEFAULT) |
86 : configuration_(configuration), | 88 : configuration_(configuration), |
87 interceptor_state_(InterceptorState::kUninitialized), | 89 interceptor_state_(InterceptorState::kUninitialized), |
88 property_details_(PropertyDetails::Empty()), | 90 property_details_(PropertyDetails::Empty()), |
89 isolate_(isolate), | 91 isolate_(isolate), |
90 name_(), | 92 receiver_(receiver), |
| 93 initial_holder_(GetRoot(isolate, receiver, index)), |
91 index_(index), | 94 index_(index), |
92 receiver_(receiver), | 95 number_(DescriptorArray::kNotFound) { |
93 initial_holder_(GetRoot(isolate, receiver, index)) { | |
94 // kMaxUInt32 isn't a valid index. | 96 // kMaxUInt32 isn't a valid index. |
95 DCHECK_NE(kMaxUInt32, index_); | 97 DCHECK_NE(kMaxUInt32, index_); |
96 Start<true>(); | 98 Start<true>(); |
97 } | 99 } |
98 | 100 |
99 LookupIterator(Isolate* isolate, Handle<Object> receiver, uint32_t index, | 101 LookupIterator(Isolate* isolate, Handle<Object> receiver, uint32_t index, |
100 Handle<JSReceiver> holder, | 102 Handle<JSReceiver> holder, |
101 Configuration configuration = DEFAULT) | 103 Configuration configuration = DEFAULT) |
102 : configuration_(configuration), | 104 : configuration_(configuration), |
103 interceptor_state_(InterceptorState::kUninitialized), | 105 interceptor_state_(InterceptorState::kUninitialized), |
104 property_details_(PropertyDetails::Empty()), | 106 property_details_(PropertyDetails::Empty()), |
105 isolate_(isolate), | 107 isolate_(isolate), |
106 name_(), | 108 receiver_(receiver), |
| 109 initial_holder_(holder), |
107 index_(index), | 110 index_(index), |
108 receiver_(receiver), | 111 number_(DescriptorArray::kNotFound) { |
109 initial_holder_(holder) { | |
110 // kMaxUInt32 isn't a valid index. | 112 // kMaxUInt32 isn't a valid index. |
111 DCHECK_NE(kMaxUInt32, index_); | 113 DCHECK_NE(kMaxUInt32, index_); |
112 Start<true>(); | 114 Start<true>(); |
113 } | 115 } |
114 | 116 |
115 static LookupIterator PropertyOrElement( | 117 static LookupIterator PropertyOrElement( |
116 Isolate* isolate, Handle<Object> receiver, Handle<Name> name, | 118 Isolate* isolate, Handle<Object> receiver, Handle<Name> name, |
117 Configuration configuration = DEFAULT) { | 119 Configuration configuration = DEFAULT) { |
118 uint32_t index; | 120 uint32_t index; |
119 if (name->AsArrayIndex(&index)) { | 121 if (name->AsArrayIndex(&index)) { |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 return property_details().representation(); | 248 return property_details().representation(); |
247 } | 249 } |
248 FieldIndex GetFieldIndex() const; | 250 FieldIndex GetFieldIndex() const; |
249 Handle<FieldType> GetFieldType() const; | 251 Handle<FieldType> GetFieldType() const; |
250 int GetAccessorIndex() const; | 252 int GetAccessorIndex() const; |
251 int GetConstantIndex() const; | 253 int GetConstantIndex() const; |
252 Handle<PropertyCell> GetPropertyCell() const; | 254 Handle<PropertyCell> GetPropertyCell() const; |
253 Handle<Object> GetAccessors() const; | 255 Handle<Object> GetAccessors() const; |
254 inline Handle<InterceptorInfo> GetInterceptor() const { | 256 inline Handle<InterceptorInfo> GetInterceptor() const { |
255 DCHECK_EQ(INTERCEPTOR, state_); | 257 DCHECK_EQ(INTERCEPTOR, state_); |
256 return handle(GetInterceptor(JSObject::cast(*holder_)), isolate_); | 258 InterceptorInfo* result = |
| 259 IsElement() ? GetInterceptor<true>(JSObject::cast(*holder_)) |
| 260 : GetInterceptor<false>(JSObject::cast(*holder_)); |
| 261 return handle(result, isolate_); |
257 } | 262 } |
258 Handle<Object> GetDataValue() const; | 263 Handle<Object> GetDataValue() const; |
259 void WriteDataValue(Handle<Object> value); | 264 void WriteDataValue(Handle<Object> value); |
260 inline void UpdateProtector() { | 265 inline void UpdateProtector() { |
261 if (FLAG_harmony_species && !IsElement() && | 266 if (FLAG_harmony_species && !IsElement() && |
262 (*name_ == heap()->constructor_string() || | 267 (*name_ == heap()->constructor_string() || |
263 *name_ == heap()->species_symbol())) { | 268 *name_ == heap()->species_symbol())) { |
264 InternalUpdateProtector(); | 269 InternalUpdateProtector(); |
265 } | 270 } |
266 } | 271 } |
(...skipping 28 matching lines...) Expand all Loading... |
295 template <bool is_element> | 300 template <bool is_element> |
296 void RestartLookupForNonMaskingInterceptors() { | 301 void RestartLookupForNonMaskingInterceptors() { |
297 RestartInternal<is_element>(InterceptorState::kProcessNonMasking); | 302 RestartInternal<is_element>(InterceptorState::kProcessNonMasking); |
298 } | 303 } |
299 template <bool is_element> | 304 template <bool is_element> |
300 void RestartInternal(InterceptorState interceptor_state); | 305 void RestartInternal(InterceptorState interceptor_state); |
301 Handle<Object> FetchValue() const; | 306 Handle<Object> FetchValue() const; |
302 template <bool is_element> | 307 template <bool is_element> |
303 void ReloadPropertyInformation(); | 308 void ReloadPropertyInformation(); |
304 | 309 |
305 inline bool SkipInterceptor(JSObject* holder); | 310 template <bool is_element> |
| 311 bool SkipInterceptor(JSObject* holder); |
| 312 template <bool is_element> |
306 inline InterceptorInfo* GetInterceptor(JSObject* holder) const { | 313 inline InterceptorInfo* GetInterceptor(JSObject* holder) const { |
307 if (IsElement()) return holder->GetIndexedInterceptor(); | 314 return is_element ? holder->GetIndexedInterceptor() |
308 return holder->GetNamedInterceptor(); | 315 : holder->GetNamedInterceptor(); |
309 } | 316 } |
310 | 317 |
311 bool check_hidden() const { return (configuration_ & kHidden) != 0; } | 318 bool check_hidden() const { return (configuration_ & kHidden) != 0; } |
312 bool check_interceptor() const { | 319 bool check_interceptor() const { |
313 return (configuration_ & kInterceptor) != 0; | 320 return (configuration_ & kInterceptor) != 0; |
314 } | 321 } |
315 int descriptor_number() const { | 322 int descriptor_number() const { |
316 DCHECK(!IsElement()); | 323 DCHECK(!IsElement()); |
317 DCHECK(has_property_); | 324 DCHECK(has_property_); |
318 DCHECK(holder_->HasFastProperties()); | 325 DCHECK(holder_->HasFastProperties()); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 | 357 |
351 // If configuration_ becomes mutable, update | 358 // If configuration_ becomes mutable, update |
352 // HolderIsReceiverOrHiddenPrototype. | 359 // HolderIsReceiverOrHiddenPrototype. |
353 const Configuration configuration_; | 360 const Configuration configuration_; |
354 State state_; | 361 State state_; |
355 bool has_property_; | 362 bool has_property_; |
356 InterceptorState interceptor_state_; | 363 InterceptorState interceptor_state_; |
357 PropertyDetails property_details_; | 364 PropertyDetails property_details_; |
358 Isolate* const isolate_; | 365 Isolate* const isolate_; |
359 Handle<Name> name_; | 366 Handle<Name> name_; |
360 uint32_t index_; | |
361 Handle<Object> transition_; | 367 Handle<Object> transition_; |
362 const Handle<Object> receiver_; | 368 const Handle<Object> receiver_; |
363 Handle<JSReceiver> holder_; | 369 Handle<JSReceiver> holder_; |
364 const Handle<JSReceiver> initial_holder_; | 370 const Handle<JSReceiver> initial_holder_; |
| 371 uint32_t index_; |
365 uint32_t number_; | 372 uint32_t number_; |
366 }; | 373 }; |
367 | 374 |
368 | 375 |
369 } // namespace internal | 376 } // namespace internal |
370 } // namespace v8 | 377 } // namespace v8 |
371 | 378 |
372 #endif // V8_LOOKUP_H_ | 379 #endif // V8_LOOKUP_H_ |
OLD | NEW |