Reviewers: Toon Verwaest,

Message:
ptal

Description:
add transitions for global properties in ics

[email protected]

BUG=

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

Base URL: https://chromium.googlesource.com/v8/v8.git@master

Affected files (+41, -12 lines):
  M src/ic/ic.cc
  M src/lookup.h
  M src/lookup.cc
  M src/objects.cc


Index: src/ic/ic.cc
diff --git a/src/ic/ic.cc b/src/ic/ic.cc
index e8b2dbf9c98796d02a0e768466c4ab643d68d3dd..17e24614ebb00aa213e79514a4e6fe26f1d01e8a 100644
--- a/src/ic/ic.cc
+++ b/src/ic/ic.cc
@@ -1688,6 +1688,17 @@ Handle<Code> StoreIC::CompileHandler(LookupIterator* lookup,

   switch (lookup->state()) {
     case LookupIterator::TRANSITION: {
+      auto store_target = lookup->GetStoreTarget();
+      if (store_target->IsJSGlobalObject()) {
+        Handle<PropertyCell> cell = lookup->GetTransitionPropertyCell();
+ Handle<HeapType> union_type = PropertyCell::UpdatedType(cell, value);
+        StoreGlobalStub stub(isolate(), union_type->IsConstant(), false);
+        Handle<Code> code = stub.GetCodeCopyFromTemplate(
+            Handle<GlobalObject>::cast(store_target), cell);
+ // TODO(verwaest): Move caching of these NORMAL stubs outside as well.
+        HeapObject::UpdateMapCodeCache(store_target, lookup->name(), code);
+        return code;
+      }
       Handle<Map> transition = lookup->transition_map();
       // Currently not handled by CompileStoreTransition.
       if (!holder->HasFastProperties()) {
Index: src/lookup.cc
diff --git a/src/lookup.cc b/src/lookup.cc
index a2ae54df4324e47b2afd7d705b4cd680d27702e1..6f99c5de3298612ed623cfd924fcdacd8e16446b 100644
--- a/src/lookup.cc
+++ b/src/lookup.cc
@@ -131,9 +131,23 @@ void LookupIterator::PrepareTransitionToDataProperty(
     return;
   }

-  transition_map_ = Map::TransitionToDataProperty(
+  auto transition = Map::TransitionToDataProperty(
handle(receiver->map(), isolate_), name_, value, attributes, store_mode);
   state_ = TRANSITION;
+  transition_ = transition;
+
+  if (receiver->IsJSGlobalObject()) {
+    has_property_ = true;
+    // TODO(dcarney): what to do here?
+    // property_details_ = transition_map_->GetLastDescriptorDetails();
+    // Install a property cell.
+    InternalizeName();
+    transition_ = JSGlobalObject::EnsurePropertyCell(
+        Handle<JSGlobalObject>::cast(receiver), name());
+  } else if (transition->GetBackPointer()->IsMap()) {
+    property_details_ = transition->GetLastDescriptorDetails();
+    has_property_ = true;
+  }
 }


@@ -141,8 +155,9 @@ void LookupIterator::ApplyTransitionToDataProperty() {
   DCHECK_EQ(TRANSITION, state_);

   Handle<JSObject> receiver = GetStoreTarget();
+  if (receiver->IsJSGlobalObject()) return;
   holder_ = receiver;
-  holder_map_ = transition_map_;
+  holder_map_ = transition_map();
   JSObject::MigrateToMap(receiver, holder_map_);
   ReloadPropertyInformation();
 }
Index: src/lookup.h
diff --git a/src/lookup.h b/src/lookup.h
index 01fa766879a70102b6921ff86be40b0b5e0dcb25..5a5466ebe4e991193be0aa7d790d71f5faab1d44 100644
--- a/src/lookup.h
+++ b/src/lookup.h
@@ -88,7 +88,7 @@ class LookupIterator FINAL BASE_EMBEDDED {
bool is_dictionary_holder() const { return holder_map_->is_dictionary_map(); }
   Handle<Map> transition_map() const {
     DCHECK_EQ(TRANSITION, state_);
-    return transition_map_;
+    return Handle<Map>::cast(transition_);
   }
   template <class T>
   Handle<T> GetHolder() const {
@@ -107,13 +107,9 @@ class LookupIterator FINAL BASE_EMBEDDED {
                                        PropertyAttributes attributes,
                                        Object::StoreFromKeyed store_mode);
   bool IsCacheableTransition() {
-    bool cacheable =
- state_ == TRANSITION && transition_map()->GetBackPointer()->IsMap();
-    if (cacheable) {
-      property_details_ = transition_map_->GetLastDescriptorDetails();
-      has_property_ = true;
-    }
-    return cacheable;
+    if (state_ != TRANSITION) return false;
+    return transition_->IsPropertyCell() ||
+           transition_map()->GetBackPointer()->IsMap();
   }
   void ApplyTransitionToDataProperty();
   void ReconfigureDataProperty(Handle<Object> value,
@@ -135,6 +131,10 @@ class LookupIterator FINAL BASE_EMBEDDED {
   int GetAccessorIndex() const;
   int GetConstantIndex() const;
   Handle<PropertyCell> GetPropertyCell() const;
+  Handle<PropertyCell> GetTransitionPropertyCell() const {
+    DCHECK_EQ(TRANSITION, state_);
+    return Handle<PropertyCell>::cast(transition_);
+  }
   Handle<Object> GetAccessors() const;
   Handle<Object> GetDataValue() const;
   // Usually returns the value that was passed in, but may perform
@@ -194,7 +194,7 @@ class LookupIterator FINAL BASE_EMBEDDED {
   Isolate* isolate_;
   Handle<Name> name_;
   Handle<Map> holder_map_;
-  Handle<Map> transition_map_;
+  Handle<Object> transition_;
   Handle<Object> receiver_;
   Handle<JSReceiver> holder_;

Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index 20fd66b37eb90b1f1523627350edace29096bfa9..2e01e39cfd0224df8a8edb78db81235fe14bc60b 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -3055,7 +3055,10 @@ MaybeHandle<Object> Object::AddDataProperty(LookupIterator* it,
   // TODO(verwaest): Encapsulate dictionary handling better.
   if (receiver->map()->is_dictionary_map()) {
     // TODO(verwaest): Probably should ensure this is done beforehand.
-    it->InternalizeName();
+    if (!receiver->IsJSGlobalObject()) {
+      it->InternalizeName();
+    }
+ // TODO(dcarney): can we do something fancy with TransitionPropertyCell?
     JSObject::AddSlowProperty(receiver, it->name(), value, attributes);
   } else {
     // Write the property value.


--
--
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