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.