Index: src/lookup.h |
diff --git a/src/lookup.h b/src/lookup.h |
index a114bc5c0745d8fd42884dc9cd503244e119085d..a2e25c42470bb0c6d6fb9129c0a7cce755063040 100644 |
--- a/src/lookup.h |
+++ b/src/lookup.h |
@@ -46,13 +46,15 @@ class LookupIterator FINAL BASE_EMBEDDED { |
Configuration configuration = PROTOTYPE_CHAIN) |
: configuration_(ComputeConfiguration(configuration, name)), |
state_(NOT_FOUND), |
+ interceptor_state_(InterceptorState::kUninitialized), |
property_details_(NONE, v8::internal::DATA, 0), |
isolate_(name->GetIsolate()), |
name_(name), |
receiver_(receiver), |
+ holder_(GetRoot(receiver_, isolate_)), |
+ holder_map_(holder_->map(), isolate_), |
+ initial_holder_(holder_), |
number_(DescriptorArray::kNotFound) { |
- holder_ = GetRoot(); |
- holder_map_ = handle(holder_->map(), isolate_); |
Next(); |
} |
@@ -61,12 +63,14 @@ class LookupIterator FINAL BASE_EMBEDDED { |
Configuration configuration = PROTOTYPE_CHAIN) |
: configuration_(ComputeConfiguration(configuration, name)), |
state_(NOT_FOUND), |
+ interceptor_state_(InterceptorState::kUninitialized), |
property_details_(NONE, v8::internal::DATA, 0), |
isolate_(name->GetIsolate()), |
name_(name), |
- holder_map_(holder->map(), isolate_), |
receiver_(receiver), |
holder_(holder), |
+ holder_map_(holder_->map(), isolate_), |
+ initial_holder_(holder_), |
number_(DescriptorArray::kNotFound) { |
Next(); |
} |
@@ -95,7 +99,7 @@ class LookupIterator FINAL BASE_EMBEDDED { |
DCHECK(IsFound()); |
return Handle<T>::cast(holder_); |
} |
- Handle<JSReceiver> GetRoot() const; |
+ static Handle<JSReceiver> GetRoot(Handle<Object> receiver, Isolate* isolate); |
bool HolderIsReceiverOrHiddenPrototype() const; |
/* ACCESS_CHECK */ |
@@ -148,12 +152,21 @@ class LookupIterator FINAL BASE_EMBEDDED { |
void InternalizeName(); |
private: |
+ enum class InterceptorState { |
+ kUninitialized, |
+ kSkipNonMasking, |
+ kProcessNonMasking |
+ }; |
+ |
Handle<Map> GetReceiverMap() const; |
MUST_USE_RESULT inline JSReceiver* NextHolder(Map* map); |
inline State LookupInHolder(Map* map, JSReceiver* holder); |
+ void RestartLookupForNonMaskingInterceptors(); |
+ State LookupNonMaskingInterceptorInHolder(Map* map, JSReceiver* holder); |
Handle<Object> FetchValue() const; |
void ReloadPropertyInformation(); |
+ bool SkipInterceptor(JSObject* holder); |
bool IsBootstrapping() const; |
@@ -187,17 +200,18 @@ class LookupIterator FINAL BASE_EMBEDDED { |
// If configuration_ becomes mutable, update |
// HolderIsReceiverOrHiddenPrototype. |
- Configuration configuration_; |
+ const Configuration configuration_; |
State state_; |
bool has_property_; |
+ InterceptorState interceptor_state_; |
PropertyDetails property_details_; |
- Isolate* isolate_; |
+ Isolate* const isolate_; |
Handle<Name> name_; |
- Handle<Map> holder_map_; |
Handle<Object> transition_; |
- Handle<Object> receiver_; |
+ const Handle<Object> receiver_; |
Handle<JSReceiver> holder_; |
- |
+ Handle<Map> holder_map_; |
+ const Handle<JSReceiver> initial_holder_; |
int number_; |
}; |