Index: src/lookup.h |
diff --git a/src/lookup.h b/src/lookup.h |
index 0d234abf04ced1afac064b053c18bbe0f41e45a4..e2237abd63ac3d6fdf0ae9a443008576be39c6c0 100644 |
--- a/src/lookup.h |
+++ b/src/lookup.h |
@@ -48,13 +48,15 @@ class LookupIterator FINAL BASE_EMBEDDED { |
: configuration_(ComputeConfiguration(configuration, name)), |
state_(NOT_FOUND), |
exotic_index_state_(ExoticIndexState::kUninitialized), |
+ interceptor_state_(InterceptorState::kUninitialized), |
property_details_(PropertyDetails::Empty()), |
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(); |
} |
@@ -64,12 +66,14 @@ class LookupIterator FINAL BASE_EMBEDDED { |
: configuration_(ComputeConfiguration(configuration, name)), |
state_(NOT_FOUND), |
exotic_index_state_(ExoticIndexState::kUninitialized), |
+ interceptor_state_(InterceptorState::kUninitialized), |
property_details_(PropertyDetails::Empty()), |
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(); |
} |
@@ -98,7 +102,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 */ |
@@ -146,12 +150,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; |
@@ -188,18 +201,19 @@ class LookupIterator FINAL BASE_EMBEDDED { |
// If configuration_ becomes mutable, update |
// HolderIsReceiverOrHiddenPrototype. |
- Configuration configuration_; |
+ const Configuration configuration_; |
State state_; |
bool has_property_; |
ExoticIndexState exotic_index_state_; |
+ 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_; |
}; |