Index: src/ic/ic.cc |
diff --git a/src/ic/ic.cc b/src/ic/ic.cc |
index 6c31429f1655ac55a11d958b0ab91da5176e36d8..62f82b0de9dfa8362d993666ec2caf141b04d6b4 100644 |
--- a/src/ic/ic.cc |
+++ b/src/ic/ic.cc |
@@ -316,8 +316,7 @@ bool IC::TryRemoveInvalidPrototypeDependentStub(Handle<Object> receiver, |
LookupIterator it(global, name, LookupIterator::OWN_SKIP_INTERCEPTOR); |
if (it.state() == LookupIterator::ACCESS_CHECK) return false; |
if (!it.IsFound()) return false; |
- Handle<PropertyCell> cell = it.GetPropertyCell(); |
- return cell->type()->IsConstant(); |
+ return it.property_details().cell_type() == PropertyCellType::kConstant; |
} |
return true; |
@@ -1717,9 +1716,8 @@ void StoreIC::UpdateCaches(LookupIterator* lookup, Handle<Object> value, |
static Handle<Code> PropertyCellStoreHandler( |
Isolate* isolate, Handle<JSObject> receiver, Handle<GlobalObject> holder, |
- Handle<Name> name, Handle<PropertyCell> cell, Handle<Object> value) { |
- auto union_type = PropertyCell::UpdatedType(cell, value); |
- StoreGlobalStub stub(isolate, union_type->IsConstant(), |
+ Handle<Name> name, Handle<PropertyCell> cell, PropertyCellType type) { |
+ StoreGlobalStub stub(isolate, type == PropertyCellType::kConstant, |
receiver->IsJSGlobalProxy()); |
auto code = stub.GetCodeCopyFromTemplate(holder, cell); |
// TODO(verwaest): Move caching of these NORMAL stubs outside as well. |
@@ -1742,10 +1740,14 @@ Handle<Code> StoreIC::CompileHandler(LookupIterator* lookup, |
case LookupIterator::TRANSITION: { |
auto store_target = lookup->GetStoreTarget(); |
if (store_target->IsGlobalObject()) { |
- auto cell = lookup->GetTransitionPropertyCell(); |
- return PropertyCellStoreHandler( |
+ // TODO(dcarney): this currently just deopts. Use the transition cell. |
+ auto cell = isolate()->factory()->NewPropertyCell(); |
+ cell->set_value(*value); |
+ auto code = PropertyCellStoreHandler( |
isolate(), store_target, Handle<GlobalObject>::cast(store_target), |
- lookup->name(), cell, value); |
+ lookup->name(), cell, PropertyCellType::kConstant); |
+ cell->set_value(isolate()->heap()->the_hole_value()); |
+ return code; |
} |
Handle<Map> transition = lookup->transition_map(); |
// Currently not handled by CompileStoreTransition. |
@@ -1816,9 +1818,11 @@ Handle<Code> StoreIC::CompileHandler(LookupIterator* lookup, |
DCHECK(holder.is_identical_to(receiver) || |
receiver->map()->prototype() == *holder); |
auto cell = lookup->GetPropertyCell(); |
+ auto union_type = PropertyCell::UpdatedType( |
+ cell, value, lookup->property_details()); |
return PropertyCellStoreHandler(isolate(), receiver, |
Handle<GlobalObject>::cast(holder), |
- lookup->name(), cell, value); |
+ lookup->name(), cell, union_type); |
} |
DCHECK(holder.is_identical_to(receiver)); |
return isolate()->builtins()->StoreIC_Normal(); |