Reviewers: Igor Sheludko,

Message:
PTAL

Description:
Simplify the LookupIterator

BUG=

Please review this at https://codereview.chromium.org/570293002/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+28, -64 lines):
  M src/hydrogen.cc
  M src/ic/handler-compiler.cc
  M src/ic/ic.cc
  M src/lookup.h
  M src/lookup.cc
  M src/lookup-inl.h
  M src/objects.cc
  M src/runtime.cc


Index: src/hydrogen.cc
diff --git a/src/hydrogen.cc b/src/hydrogen.cc
index 8dbe46490318ed6c0f68452383824fd88e9e9245..4af1d2bf9e48a72b7951f1e32f60ea801f7655fb 100644
--- a/src/hydrogen.cc
+++ b/src/hydrogen.cc
@@ -5307,7 +5307,6 @@ HOptimizedGraphBuilder::LookupGlobalProperty(Variable* var, LookupIterator* it,
       return kUseCell;
     case LookupIterator::JSPROXY:
     case LookupIterator::TRANSITION:
-    case LookupIterator::UNKNOWN:
       UNREACHABLE();
   }
   UNREACHABLE();
Index: src/ic/handler-compiler.cc
diff --git a/src/ic/handler-compiler.cc b/src/ic/handler-compiler.cc
index 21a653e7b61e126bb9a477a65a729aa5d29a5422..dd5a067e9fb1f0d189352e4ba63c085fbf110aa5 100644
--- a/src/ic/handler-compiler.cc
+++ b/src/ic/handler-compiler.cc
@@ -228,7 +228,6 @@ Handle<Code> NamedLoadHandlerCompiler::CompileLoadInterceptor(
   bool inline_followup = false;
   switch (it->state()) {
     case LookupIterator::TRANSITION:
-    case LookupIterator::UNKNOWN:
       UNREACHABLE();
     case LookupIterator::ACCESS_CHECK:
     case LookupIterator::INTERCEPTOR:
@@ -276,7 +275,6 @@ void NamedLoadHandlerCompiler::GenerateLoadPostInterceptor(
     case LookupIterator::JSPROXY:
     case LookupIterator::NOT_FOUND:
     case LookupIterator::TRANSITION:
-    case LookupIterator::UNKNOWN:
       UNREACHABLE();
     case LookupIterator::DATA: {
       DCHECK_EQ(FIELD, it->property_details().type());
Index: src/ic/ic.cc
diff --git a/src/ic/ic.cc b/src/ic/ic.cc
index 69954a8d183dea998a92a5d59ef87d570a9f8da6..374b5aa8e358cc9a903304f7f855442aa644c370 100644
--- a/src/ic/ic.cc
+++ b/src/ic/ic.cc
@@ -215,7 +215,6 @@ static void LookupForRead(LookupIterator* it) {
     switch (it->state()) {
       case LookupIterator::NOT_FOUND:
       case LookupIterator::TRANSITION:
-      case LookupIterator::UNKNOWN:
         UNREACHABLE();
       case LookupIterator::JSPROXY:
         return;
@@ -1082,7 +1081,6 @@ Handle<Code> LoadIC::CompileHandler(LookupIterator* lookup,
     case LookupIterator::JSPROXY:
     case LookupIterator::NOT_FOUND:
     case LookupIterator::TRANSITION:
-    case LookupIterator::UNKNOWN:
       UNREACHABLE();
   }

@@ -1232,7 +1230,6 @@ bool StoreIC::LookupForWrite(LookupIterator* it, Handle<Object> value,
     switch (it->state()) {
       case LookupIterator::NOT_FOUND:
       case LookupIterator::TRANSITION:
-      case LookupIterator::UNKNOWN:
         UNREACHABLE();
       case LookupIterator::JSPROXY:
         return false;
@@ -1503,7 +1500,6 @@ Handle<Code> StoreIC::CompileHandler(LookupIterator* lookup,
     case LookupIterator::ACCESS_CHECK:
     case LookupIterator::JSPROXY:
     case LookupIterator::NOT_FOUND:
-    case LookupIterator::UNKNOWN:
       UNREACHABLE();
   }
   return slow_stub();
Index: src/lookup-inl.h
diff --git a/src/lookup-inl.h b/src/lookup-inl.h
index cc7378892562afda7bda425973d2ee699917cccc..d4777a0baa80282e742c6d086250851e909f2cdc 100644
--- a/src/lookup-inl.h
+++ b/src/lookup-inl.h
@@ -47,7 +47,6 @@ LookupIterator::State LookupIterator::LookupInHolder(Map* map,
     // Fall through.
     case INTERCEPTOR:
       if (map->is_dictionary_map()) {
-        if (holder == NULL) return UNKNOWN;
NameDictionary* dict = JSObject::cast(holder)->property_dictionary();
         number_ = dict->FindEntry(name_);
         if (number_ == NameDictionary::kNotFound) return NOT_FOUND;
@@ -74,7 +73,6 @@ LookupIterator::State LookupIterator::LookupInHolder(Map* map,
       }
     case ACCESSOR:
     case DATA:
-    case UNKNOWN:
       return NOT_FOUND;
     case JSPROXY:
     case TRANSITION:
Index: src/lookup.cc
diff --git a/src/lookup.cc b/src/lookup.cc
index 752cd7063fe983dee9b88387bfeb8f87082805ba..b855abe97fdb47fba3821215e36310c1e2365553 100644
--- a/src/lookup.cc
+++ b/src/lookup.cc
@@ -19,8 +19,7 @@ void LookupIterator::Next() {
   DisallowHeapAllocation no_gc;
   has_property_ = false;

-  JSReceiver* holder =
-      maybe_holder_.is_null() ? NULL : *maybe_holder_.ToHandleChecked();
+  JSReceiver* holder = *holder_;
   Map* map = *holder_map_;

   // Perform lookup on current holder.
@@ -36,39 +35,35 @@ void LookupIterator::Next() {
     state_ = LookupInHolder(map, holder);
   } while (!IsFound());

-  if (holder == NULL) return;
-
-  maybe_holder_ = handle(holder, isolate_);
-  holder_map_ = handle(map, isolate_);
+  if (holder != *holder_) {
+    holder_ = handle(holder, isolate_);
+    holder_map_ = handle(map, isolate_);
+  }
 }


 Handle<JSReceiver> LookupIterator::GetRoot() const {
-  Handle<Object> receiver = GetReceiver();
-  if (receiver->IsJSReceiver()) return Handle<JSReceiver>::cast(receiver);
+ if (receiver_->IsJSReceiver()) return Handle<JSReceiver>::cast(receiver_);
   Handle<Object> root =
-      handle(receiver->GetRootMap(isolate_)->prototype(), isolate_);
+      handle(receiver_->GetRootMap(isolate_)->prototype(), isolate_);
   CHECK(!root->IsNull());
   return Handle<JSReceiver>::cast(root);
 }


 Handle<Map> LookupIterator::GetReceiverMap() const {
-  Handle<Object> receiver = GetReceiver();
-  if (receiver->IsNumber()) return isolate_->factory()->heap_number_map();
-  return handle(Handle<HeapObject>::cast(receiver)->map(), isolate_);
+  if (receiver_->IsNumber()) return isolate_->factory()->heap_number_map();
+  return handle(Handle<HeapObject>::cast(receiver_)->map(), isolate_);
 }


 Handle<JSObject> LookupIterator::GetStoreTarget() const {
-  Handle<JSObject> receiver = Handle<JSObject>::cast(GetReceiver());
-
-  if (receiver->IsJSGlobalProxy()) {
-    PrototypeIterator iter(isolate(), receiver);
-    if (iter.IsAtEnd()) return receiver;
+  if (receiver_->IsJSGlobalProxy()) {
+    PrototypeIterator iter(isolate(), receiver_);
+    if (iter.IsAtEnd()) return Handle<JSGlobalProxy>::cast(receiver_);
return Handle<JSGlobalObject>::cast(PrototypeIterator::GetCurrent(iter));
   }
-  return receiver;
+  return Handle<JSObject>::cast(receiver_);
 }


@@ -79,14 +74,13 @@ bool LookupIterator::IsBootstrapping() const {

 bool LookupIterator::HasAccess(v8::AccessType access_type) const {
   DCHECK_EQ(ACCESS_CHECK, state_);
-  DCHECK(is_guaranteed_to_have_holder());
return isolate_->MayNamedAccess(GetHolder<JSObject>(), name_, access_type);
 }


 void LookupIterator::ReloadPropertyInformation() {
   state_ = BEFORE_PROPERTY;
-  state_ = LookupInHolder(*holder_map_, *maybe_holder_.ToHandleChecked());
+  state_ = LookupInHolder(*holder_map_, *holder_);
   DCHECK(IsFound() || holder_map_->is_dictionary_map());
 }

@@ -148,7 +142,7 @@ void LookupIterator::ApplyTransitionToDataProperty() {
   DCHECK_EQ(TRANSITION, state_);

   Handle<JSObject> receiver = GetStoreTarget();
-  maybe_holder_ = receiver;
+  holder_ = receiver;
   holder_map_ = transition_map_;
   JSObject::MigrateToMap(receiver, holder_map_);
   ReloadPropertyInformation();
@@ -163,7 +157,7 @@ void LookupIterator::TransitionToAccessorProperty(
   // handled via a trap. Adding properties to primitive values is not
   // observable.
   Handle<JSObject> receiver = GetStoreTarget();
-  maybe_holder_ = receiver;
+  holder_ = receiver;
   holder_map_ =
       Map::TransitionToAccessorProperty(handle(receiver->map(), isolate_),
name_, component, accessor, attributes); @@ -208,10 +202,9 @@ bool LookupIterator::HolderIsReceiverOrHiddenPrototype() const {
   // Optimization that only works if configuration_ is not mutable.
   if (!check_prototype_chain()) return true;
   DisallowHeapAllocation no_gc;
-  Handle<Object> receiver = GetReceiver();
-  if (!receiver->IsJSReceiver()) return false;
-  Object* current = *receiver;
-  JSReceiver* holder = *maybe_holder_.ToHandleChecked();
+  if (!receiver_->IsJSReceiver()) return false;
+  Object* current = *receiver_;
+  JSReceiver* holder = *holder_;
   // JSProxy do not occur as hidden prototypes.
   if (current->IsJSProxy()) {
     return JSReceiver::cast(current) == holder;
@@ -297,7 +290,6 @@ Handle<Object> LookupIterator::GetDataValue() const {


 void LookupIterator::WriteDataValue(Handle<Object> value) {
-  DCHECK(is_guaranteed_to_have_holder());
   DCHECK_EQ(DATA, state_);
   Handle<JSObject> holder = GetHolder<JSObject>();
   if (holder_map_->is_dictionary_map()) {
Index: src/lookup.h
diff --git a/src/lookup.h b/src/lookup.h
index ac5c27db5dd54832ef4053daccf1df9619a15e91..14ca010d31d8477d531b0215aef03dd4073f1d61 100644
--- a/src/lookup.h
+++ b/src/lookup.h
@@ -34,7 +34,6 @@ class LookupIterator FINAL BASE_EMBEDDED {
     INTERCEPTOR,
     JSPROXY,
     NOT_FOUND,
-    UNKNOWN,  // Dictionary-mode holder map without a holder.
     ACCESSOR,
     DATA,
     TRANSITION,
@@ -50,11 +49,10 @@ class LookupIterator FINAL BASE_EMBEDDED {
         property_details_(NONE, NORMAL, Representation::None()),
         isolate_(name->GetIsolate()),
         name_(name),
-        maybe_receiver_(receiver),
+        receiver_(receiver),
         number_(DescriptorArray::kNotFound) {
-    Handle<JSReceiver> root = GetRoot();
-    holder_map_ = handle(root->map(), isolate_);
-    maybe_holder_ = root;
+    holder_ = GetRoot();
+    holder_map_ = handle(holder_->map(), isolate_);
     Next();
   }

@@ -67,8 +65,8 @@ class LookupIterator FINAL BASE_EMBEDDED {
         isolate_(name->GetIsolate()),
         name_(name),
         holder_map_(holder->map(), isolate_),
-        maybe_receiver_(receiver),
-        maybe_holder_(holder),
+        receiver_(receiver),
+        holder_(holder),
         number_(DescriptorArray::kNotFound) {
     Next();
   }
@@ -85,9 +83,7 @@ class LookupIterator FINAL BASE_EMBEDDED {
   }

   Factory* factory() const { return isolate_->factory(); }
-  Handle<Object> GetReceiver() const {
-    return maybe_receiver_.ToHandleChecked();
-  }
+  Handle<Object> GetReceiver() const { return receiver_; }
   Handle<JSObject> GetStoreTarget() const;
bool is_dictionary_holder() const { return holder_map_->is_dictionary_map(); }
   Handle<Map> transition_map() const {
@@ -97,7 +93,7 @@ class LookupIterator FINAL BASE_EMBEDDED {
   template <class T>
   Handle<T> GetHolder() const {
     DCHECK(IsFound());
-    return Handle<T>::cast(maybe_holder_.ToHandleChecked());
+    return Handle<T>::cast(holder_);
   }
   Handle<JSReceiver> GetRoot() const;
   bool HolderIsReceiverOrHiddenPrototype() const;
@@ -154,13 +150,6 @@ class LookupIterator FINAL BASE_EMBEDDED {

   bool IsBootstrapping() const;

- // Methods that fetch data from the holder ensure they always have a holder. - // This means the receiver needs to be present as opposed to just the receiver - // map. Other objects in the prototype chain are transitively guaranteed to be
-  // present via the receiver map.
-  bool is_guaranteed_to_have_holder() const {
-    return !maybe_receiver_.is_null();
-  }
   bool check_hidden() const { return (configuration_ & kHidden) != 0; }
   bool check_interceptor() const {
     return !IsBootstrapping() && (configuration_ & kInterceptor) != 0;
@@ -198,8 +187,8 @@ class LookupIterator FINAL BASE_EMBEDDED {
   Handle<Name> name_;
   Handle<Map> holder_map_;
   Handle<Map> transition_map_;
-  MaybeHandle<Object> maybe_receiver_;
-  MaybeHandle<JSReceiver> maybe_holder_;
+  Handle<Object> receiver_;
+  Handle<JSReceiver> holder_;

   int number_;
 };
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index 13688c780792c7f723c2d2767df7be7b704c2703..783999ff2e185bb28e2d3d086a517006db365fe1 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -110,7 +110,6 @@ MaybeHandle<Object> Object::GetProperty(LookupIterator* it) {
     switch (it->state()) {
       case LookupIterator::NOT_FOUND:
       case LookupIterator::TRANSITION:
-      case LookupIterator::UNKNOWN:
         UNREACHABLE();
       case LookupIterator::JSPROXY:
         return JSProxy::GetPropertyWithHandler(it->GetHolder<JSProxy>(),
@@ -151,7 +150,6 @@ Handle<Object> JSObject::GetDataProperty(LookupIterator* it) {
       case LookupIterator::INTERCEPTOR:
       case LookupIterator::NOT_FOUND:
       case LookupIterator::TRANSITION:
-      case LookupIterator::UNKNOWN:
         UNREACHABLE();
       case LookupIterator::ACCESS_CHECK:
         if (it->HasAccess(v8::ACCESS_GET)) continue;
@@ -2806,7 +2804,6 @@ MaybeHandle<Object> Object::SetProperty(LookupIterator* it,
   for (; it->IsFound(); it->Next()) {
     switch (it->state()) {
       case LookupIterator::NOT_FOUND:
-      case LookupIterator::UNKNOWN:
         UNREACHABLE();

       case LookupIterator::ACCESS_CHECK:
@@ -3801,7 +3798,6 @@ MaybeHandle<Object> JSObject::SetOwnPropertyIgnoreAttributes(
       case LookupIterator::JSPROXY:
       case LookupIterator::NOT_FOUND:
       case LookupIterator::TRANSITION:
-      case LookupIterator::UNKNOWN:
         UNREACHABLE();

       case LookupIterator::ACCESS_CHECK:
@@ -3978,7 +3974,6 @@ Maybe<PropertyAttributes> JSReceiver::GetPropertyAttributes(
   for (; it->IsFound(); it->Next()) {
     switch (it->state()) {
       case LookupIterator::NOT_FOUND:
-      case LookupIterator::UNKNOWN:
       case LookupIterator::TRANSITION:
         UNREACHABLE();
       case LookupIterator::JSPROXY:
@@ -4918,7 +4913,6 @@ MaybeHandle<Object> JSObject::DeleteProperty(Handle<JSObject> object,
       case LookupIterator::JSPROXY:
       case LookupIterator::NOT_FOUND:
       case LookupIterator::TRANSITION:
-      case LookupIterator::UNKNOWN:
         UNREACHABLE();
       case LookupIterator::ACCESS_CHECK:
         if (it.HasAccess(v8::ACCESS_DELETE)) break;
@@ -6297,7 +6291,6 @@ MaybeHandle<Object> JSObject::GetAccessor(Handle<JSObject> object,
         case LookupIterator::INTERCEPTOR:
         case LookupIterator::NOT_FOUND:
         case LookupIterator::TRANSITION:
-        case LookupIterator::UNKNOWN:
           UNREACHABLE();

         case LookupIterator::ACCESS_CHECK:
Index: src/runtime.cc
diff --git a/src/runtime.cc b/src/runtime.cc
index 67f749b27024fd7df478934a5a3acf492f43a4bc..6a11e91eaccddc234facefca2c0b87c5c5e26e39 100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -10927,7 +10927,6 @@ static Handle<Object> DebugGetProperty(LookupIterator* it,
     switch (it->state()) {
       case LookupIterator::NOT_FOUND:
       case LookupIterator::TRANSITION:
-      case LookupIterator::UNKNOWN:
         UNREACHABLE();
       case LookupIterator::ACCESS_CHECK:
         // Ignore access checks.


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to