Commit 88643ae3 authored by Marja Hölttä's avatar Marja Hölttä Committed by Commit Bot

[in-place weak refs] Use in-place weak refs in ICs

BUG=v8:7308

Change-Id: I3de8160b28d2fccda895069c85a03f033152b1f6
Reviewed-on: https://chromium-review.googlesource.com/1140054
Commit-Queue: Marja Hölttä <marja@chromium.org>
Reviewed-by: 's avatarUlan Degenbaev <ulan@chromium.org>
Reviewed-by: 's avatarJakob Kummerow <jkummerow@chromium.org>
Cr-Commit-Position: refs/heads/master@{#54549}
parent 605f94b7
...@@ -479,12 +479,15 @@ void AccessorAssembler::HandleLoadICSmiHandlerCase( ...@@ -479,12 +479,15 @@ void AccessorAssembler::HandleLoadICSmiHandlerCase(
// Context is stored either in data2 or data3 field depending on whether // Context is stored either in data2 or data3 field depending on whether
// the access check is enabled for this handler or not. // the access check is enabled for this handler or not.
TNode<Object> context_cell = Select<Object>( TNode<MaybeObject> maybe_context = Select<MaybeObject>(
IsSetWord<LoadHandler::DoAccessCheckOnReceiverBits>(handler_word), IsSetWord<LoadHandler::DoAccessCheckOnReceiverBits>(handler_word),
[=] { return CAST(LoadHandlerDataField(handler, 3)); }, [=] { return LoadHandlerDataField(handler, 3); },
[=] { return CAST(LoadHandlerDataField(handler, 2)); }); [=] { return LoadHandlerDataField(handler, 2); });
Node* context = LoadWeakCellValueUnchecked(CAST(context_cell)); CSA_ASSERT(this, IsWeakOrClearedHeapObject(maybe_context));
TNode<Object> context = Select<Object>(
IsClearedWeakHeapObject(maybe_context), [=] { return SmiConstant(0); },
[=] { return ToWeakHeapObject(maybe_context); });
Node* foreign = Node* foreign =
LoadObjectField(call_handler_info, CallHandlerInfo::kJsCallbackOffset); LoadObjectField(call_handler_info, CallHandlerInfo::kJsCallbackOffset);
Node* callback = LoadObjectField(foreign, Foreign::kForeignAddressOffset, Node* callback = LoadObjectField(foreign, Foreign::kForeignAddressOffset,
...@@ -670,8 +673,9 @@ Node* AccessorAssembler::HandleProtoHandler( ...@@ -670,8 +673,9 @@ Node* AccessorAssembler::HandleProtoHandler(
BIND(&if_do_access_check); BIND(&if_do_access_check);
{ {
TNode<WeakCell> data2 = CAST(LoadHandlerDataField(handler, 2)); TNode<MaybeObject> data2 = LoadHandlerDataField(handler, 2);
Node* expected_native_context = LoadWeakCellValue(data2, miss); CSA_ASSERT(this, IsWeakOrClearedHeapObject(data2));
TNode<Object> expected_native_context = ToWeakHeapObject(data2, miss);
EmitAccessCheck(expected_native_context, p->context, p->receiver, &done, EmitAccessCheck(expected_native_context, p->context, p->receiver, &done,
miss); miss);
} }
...@@ -731,18 +735,20 @@ void AccessorAssembler::HandleLoadICProtoHandler( ...@@ -731,18 +735,20 @@ void AccessorAssembler::HandleLoadICProtoHandler(
}, },
miss, ic_mode); miss, ic_mode);
TNode<Object> maybe_holder_cell = CAST(LoadHandlerDataField(handler, 1)); TNode<MaybeObject> maybe_holder = LoadHandlerDataField(handler, 1);
Label load_from_cached_holder(this), done(this); Label load_from_cached_holder(this), done(this);
Branch(IsNull(maybe_holder_cell), &done, &load_from_cached_holder); Branch(IsStrongReferenceTo(maybe_holder, NullConstant()), &done,
&load_from_cached_holder);
BIND(&load_from_cached_holder); BIND(&load_from_cached_holder);
{ {
// For regular holders, having passed the receiver map check and the // For regular holders, having passed the receiver map check and the
// validity cell check implies that |holder| is alive. However, for // validity cell check implies that |holder| is alive. However, for global
// global object receivers, the |maybe_holder_cell| may be cleared. // object receivers, |maybe_holder| may be cleared.
Node* holder = LoadWeakCellValue(CAST(maybe_holder_cell), miss); CSA_ASSERT(this, IsWeakOrClearedHeapObject(maybe_holder));
Node* holder = ToWeakHeapObject(maybe_holder, miss);
var_holder->Bind(holder); var_holder->Bind(holder);
Goto(&done); Goto(&done);
...@@ -1277,8 +1283,9 @@ void AccessorAssembler::HandleStoreICProtoHandler( ...@@ -1277,8 +1283,9 @@ void AccessorAssembler::HandleStoreICProtoHandler(
GotoIf(WordEqual(handler_kind, IntPtrConstant(StoreHandler::kNormal)), GotoIf(WordEqual(handler_kind, IntPtrConstant(StoreHandler::kNormal)),
&if_add_normal); &if_add_normal);
TNode<WeakCell> holder_cell = CAST(LoadHandlerDataField(handler, 1)); TNode<MaybeObject> maybe_holder = LoadHandlerDataField(handler, 1);
Node* holder = LoadWeakCellValue(holder_cell, miss); CSA_ASSERT(this, IsWeakOrClearedHeapObject(maybe_holder));
TNode<Object> holder = ToWeakHeapObject(maybe_holder, miss);
GotoIf(WordEqual(handler_kind, IntPtrConstant(StoreHandler::kGlobalProxy)), GotoIf(WordEqual(handler_kind, IntPtrConstant(StoreHandler::kGlobalProxy)),
&if_store_global_proxy); &if_store_global_proxy);
...@@ -1334,12 +1341,16 @@ void AccessorAssembler::HandleStoreICProtoHandler( ...@@ -1334,12 +1341,16 @@ void AccessorAssembler::HandleStoreICProtoHandler(
// Context is stored either in data2 or data3 field depending on whether // Context is stored either in data2 or data3 field depending on whether
// the access check is enabled for this handler or not. // the access check is enabled for this handler or not.
TNode<Object> context_cell = Select<Object>( TNode<MaybeObject> maybe_context = Select<MaybeObject>(
IsSetWord<LoadHandler::DoAccessCheckOnReceiverBits>(handler_word), IsSetWord<LoadHandler::DoAccessCheckOnReceiverBits>(handler_word),
[=] { return CAST(LoadHandlerDataField(handler, 3)); }, [=] { return LoadHandlerDataField(handler, 3); },
[=] { return CAST(LoadHandlerDataField(handler, 2)); }); [=] { return LoadHandlerDataField(handler, 2); });
Node* context = LoadWeakCellValueUnchecked(CAST(context_cell)); CSA_ASSERT(this, IsWeakOrClearedHeapObject(maybe_context));
TNode<Object> context =
Select<Object>(IsClearedWeakHeapObject(maybe_context),
[=] { return SmiConstant(0); },
[=] { return ToWeakHeapObject(maybe_context); });
Node* foreign = LoadObjectField(call_handler_info, Node* foreign = LoadObjectField(call_handler_info,
CallHandlerInfo::kJsCallbackOffset); CallHandlerInfo::kJsCallbackOffset);
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "src/code-stubs.h" #include "src/code-stubs.h"
#include "src/ic/handler-configuration-inl.h" #include "src/ic/handler-configuration-inl.h"
#include "src/objects/maybe-object.h"
#include "src/transitions.h" #include "src/transitions.h"
namespace v8 { namespace v8 {
...@@ -26,8 +27,8 @@ Handle<Smi> SetBitFieldValue(Isolate* isolate, Handle<Smi> smi_handler, ...@@ -26,8 +27,8 @@ Handle<Smi> SetBitFieldValue(Isolate* isolate, Handle<Smi> smi_handler,
template <typename ICHandler, bool fill_handler = true> template <typename ICHandler, bool fill_handler = true>
int InitPrototypeChecksImpl(Isolate* isolate, Handle<ICHandler> handler, int InitPrototypeChecksImpl(Isolate* isolate, Handle<ICHandler> handler,
Handle<Smi>* smi_handler, Handle<Map> receiver_map, Handle<Smi>* smi_handler, Handle<Map> receiver_map,
Handle<JSReceiver> holder, Handle<Object> data1, Handle<JSReceiver> holder, MaybeObjectHandle data1,
MaybeHandle<Object> maybe_data2) { MaybeObjectHandle maybe_data2) {
int checks_count = 0; int checks_count = 0;
// Holder-is-receiver case itself does not add entries unless there is an // Holder-is-receiver case itself does not add entries unless there is an
// optional data2 value provided. // optional data2 value provided.
...@@ -43,7 +44,7 @@ int InitPrototypeChecksImpl(Isolate* isolate, Handle<ICHandler> handler, ...@@ -43,7 +44,7 @@ int InitPrototypeChecksImpl(Isolate* isolate, Handle<ICHandler> handler,
// corresponds. // corresponds.
if (fill_handler) { if (fill_handler) {
Handle<Context> native_context = isolate->native_context(); Handle<Context> native_context = isolate->native_context();
handler->set_data2(native_context->self_weak_cell()); handler->set_data2(HeapObjectReference::Weak(*native_context));
} else { } else {
// Enable access checks on receiver. // Enable access checks on receiver.
typedef typename ICHandler::DoAccessCheckOnReceiverBits Bit; typedef typename ICHandler::DoAccessCheckOnReceiverBits Bit;
...@@ -59,18 +60,17 @@ int InitPrototypeChecksImpl(Isolate* isolate, Handle<ICHandler> handler, ...@@ -59,18 +60,17 @@ int InitPrototypeChecksImpl(Isolate* isolate, Handle<ICHandler> handler,
} }
} }
if (fill_handler) { if (fill_handler) {
handler->set_data1(MaybeObject::FromObject(*data1)); handler->set_data1(*data1);
} }
Handle<Object> data2; if (!maybe_data2.is_null()) {
if (maybe_data2.ToHandle(&data2)) {
if (fill_handler) { if (fill_handler) {
// This value will go either to data2 or data3 slot depending on whether // This value will go either to data2 or data3 slot depending on whether
// data2 slot is already occupied by native context. // data2 slot is already occupied by native context.
if (checks_count == 0) { if (checks_count == 0) {
handler->set_data2(*data2); handler->set_data2(*maybe_data2);
} else { } else {
DCHECK_EQ(1, checks_count); DCHECK_EQ(1, checks_count);
handler->set_data3(*data2); handler->set_data3(*maybe_data2);
} }
} }
checks_count++; checks_count++;
...@@ -87,8 +87,8 @@ int InitPrototypeChecksImpl(Isolate* isolate, Handle<ICHandler> handler, ...@@ -87,8 +87,8 @@ int InitPrototypeChecksImpl(Isolate* isolate, Handle<ICHandler> handler,
template <typename ICHandler> template <typename ICHandler>
int GetPrototypeCheckCount( int GetPrototypeCheckCount(
Isolate* isolate, Handle<Smi>* smi_handler, Handle<Map> receiver_map, Isolate* isolate, Handle<Smi>* smi_handler, Handle<Map> receiver_map,
Handle<JSReceiver> holder, Handle<Object> data1, Handle<JSReceiver> holder, MaybeObjectHandle data1,
MaybeHandle<Object> maybe_data2 = MaybeHandle<Object>()) { MaybeObjectHandle maybe_data2 = MaybeObjectHandle()) {
DCHECK_NOT_NULL(smi_handler); DCHECK_NOT_NULL(smi_handler);
return InitPrototypeChecksImpl<ICHandler, false>(isolate, Handle<ICHandler>(), return InitPrototypeChecksImpl<ICHandler, false>(isolate, Handle<ICHandler>(),
smi_handler, receiver_map, smi_handler, receiver_map,
...@@ -96,10 +96,10 @@ int GetPrototypeCheckCount( ...@@ -96,10 +96,10 @@ int GetPrototypeCheckCount(
} }
template <typename ICHandler> template <typename ICHandler>
void InitPrototypeChecks( void InitPrototypeChecks(Isolate* isolate, Handle<ICHandler> handler,
Isolate* isolate, Handle<ICHandler> handler, Handle<Map> receiver_map, Handle<Map> receiver_map, Handle<JSReceiver> holder,
Handle<JSReceiver> holder, Handle<Object> data1, MaybeObjectHandle data1,
MaybeHandle<Object> maybe_data2 = MaybeHandle<Object>()) { MaybeObjectHandle maybe_data2 = MaybeObjectHandle()) {
InitPrototypeChecksImpl<ICHandler, true>( InitPrototypeChecksImpl<ICHandler, true>(
isolate, handler, nullptr, receiver_map, holder, data1, maybe_data2); isolate, handler, nullptr, receiver_map, holder, data1, maybe_data2);
} }
...@@ -111,11 +111,13 @@ Handle<Object> LoadHandler::LoadFromPrototype(Isolate* isolate, ...@@ -111,11 +111,13 @@ Handle<Object> LoadHandler::LoadFromPrototype(Isolate* isolate,
Handle<Map> receiver_map, Handle<Map> receiver_map,
Handle<JSReceiver> holder, Handle<JSReceiver> holder,
Handle<Smi> smi_handler, Handle<Smi> smi_handler,
MaybeHandle<Object> maybe_data1, MaybeObjectHandle maybe_data1,
MaybeHandle<Object> maybe_data2) { MaybeObjectHandle maybe_data2) {
Handle<Object> data1; MaybeObjectHandle data1;
if (!maybe_data1.ToHandle(&data1)) { if (maybe_data1.is_null()) {
data1 = Map::GetOrCreatePrototypeWeakCell(holder, isolate); data1 = MaybeObjectHandle::Weak(holder);
} else {
data1 = maybe_data1;
} }
int checks_count = GetPrototypeCheckCount<LoadHandler>( int checks_count = GetPrototypeCheckCount<LoadHandler>(
...@@ -137,10 +139,10 @@ Handle<Object> LoadHandler::LoadFromPrototype(Isolate* isolate, ...@@ -137,10 +139,10 @@ Handle<Object> LoadHandler::LoadFromPrototype(Isolate* isolate,
// static // static
Handle<Object> LoadHandler::LoadFullChain(Isolate* isolate, Handle<Object> LoadHandler::LoadFullChain(Isolate* isolate,
Handle<Map> receiver_map, Handle<Map> receiver_map,
Handle<Object> holder, MaybeObjectHandle holder,
Handle<Smi> smi_handler) { Handle<Smi> smi_handler) {
Handle<JSReceiver> end; // null handle, means full prototype chain lookup. Handle<JSReceiver> end; // null handle, means full prototype chain lookup.
Handle<Object> data1 = holder; MaybeObjectHandle data1 = holder;
int checks_count = GetPrototypeCheckCount<LoadHandler>( int checks_count = GetPrototypeCheckCount<LoadHandler>(
isolate, &smi_handler, receiver_map, end, data1); isolate, &smi_handler, receiver_map, end, data1);
...@@ -243,11 +245,13 @@ MaybeObjectHandle StoreHandler::StoreTransition(Isolate* isolate, ...@@ -243,11 +245,13 @@ MaybeObjectHandle StoreHandler::StoreTransition(Isolate* isolate,
// static // static
Handle<Object> StoreHandler::StoreThroughPrototype( Handle<Object> StoreHandler::StoreThroughPrototype(
Isolate* isolate, Handle<Map> receiver_map, Handle<JSReceiver> holder, Isolate* isolate, Handle<Map> receiver_map, Handle<JSReceiver> holder,
Handle<Smi> smi_handler, MaybeHandle<Object> maybe_data1, Handle<Smi> smi_handler, MaybeObjectHandle maybe_data1,
MaybeHandle<Object> maybe_data2) { MaybeObjectHandle maybe_data2) {
Handle<Object> data1; MaybeObjectHandle data1;
if (!maybe_data1.ToHandle(&data1)) { if (maybe_data1.is_null()) {
data1 = Map::GetOrCreatePrototypeWeakCell(holder, isolate); data1 = MaybeObjectHandle::Weak(holder);
} else {
data1 = maybe_data1;
} }
int checks_count = GetPrototypeCheckCount<StoreHandler>( int checks_count = GetPrototypeCheckCount<StoreHandler>(
...@@ -280,9 +284,8 @@ Handle<Object> StoreHandler::StoreProxy(Isolate* isolate, ...@@ -280,9 +284,8 @@ Handle<Object> StoreHandler::StoreProxy(Isolate* isolate,
Handle<JSReceiver> receiver) { Handle<JSReceiver> receiver) {
Handle<Smi> smi_handler = StoreProxy(isolate); Handle<Smi> smi_handler = StoreProxy(isolate);
if (receiver.is_identical_to(proxy)) return smi_handler; if (receiver.is_identical_to(proxy)) return smi_handler;
Handle<WeakCell> holder_cell = isolate->factory()->NewWeakCell(proxy);
return StoreThroughPrototype(isolate, receiver_map, proxy, smi_handler, return StoreThroughPrototype(isolate, receiver_map, proxy, smi_handler,
holder_cell); MaybeObjectHandle::Weak(proxy));
} }
} // namespace internal } // namespace internal
......
...@@ -149,7 +149,7 @@ class LoadHandler final : public DataHandler { ...@@ -149,7 +149,7 @@ class LoadHandler final : public DataHandler {
// needed (e.g., for "nonexistent"), null_value() may be passed in. // needed (e.g., for "nonexistent"), null_value() may be passed in.
static Handle<Object> LoadFullChain(Isolate* isolate, static Handle<Object> LoadFullChain(Isolate* isolate,
Handle<Map> receiver_map, Handle<Map> receiver_map,
Handle<Object> holder, MaybeObjectHandle holder,
Handle<Smi> smi_handler); Handle<Smi> smi_handler);
// Creates a data handler that represents a prototype chain check followed // Creates a data handler that represents a prototype chain check followed
...@@ -158,8 +158,8 @@ class LoadHandler final : public DataHandler { ...@@ -158,8 +158,8 @@ class LoadHandler final : public DataHandler {
static Handle<Object> LoadFromPrototype( static Handle<Object> LoadFromPrototype(
Isolate* isolate, Handle<Map> receiver_map, Handle<JSReceiver> holder, Isolate* isolate, Handle<Map> receiver_map, Handle<JSReceiver> holder,
Handle<Smi> smi_handler, Handle<Smi> smi_handler,
MaybeHandle<Object> maybe_data1 = MaybeHandle<Object>(), MaybeObjectHandle maybe_data1 = MaybeObjectHandle(),
MaybeHandle<Object> maybe_data2 = MaybeHandle<Object>()); MaybeObjectHandle maybe_data2 = MaybeObjectHandle());
// Creates a Smi-handler for loading a non-existent property. Works only as // Creates a Smi-handler for loading a non-existent property. Works only as
// a part of prototype chain check. // a part of prototype chain check.
...@@ -268,8 +268,8 @@ class StoreHandler final : public DataHandler { ...@@ -268,8 +268,8 @@ class StoreHandler final : public DataHandler {
static Handle<Object> StoreThroughPrototype( static Handle<Object> StoreThroughPrototype(
Isolate* isolate, Handle<Map> receiver_map, Handle<JSReceiver> holder, Isolate* isolate, Handle<Map> receiver_map, Handle<JSReceiver> holder,
Handle<Smi> smi_handler, Handle<Smi> smi_handler,
MaybeHandle<Object> maybe_data1 = MaybeHandle<Object>(), MaybeObjectHandle maybe_data1 = MaybeObjectHandle(),
MaybeHandle<Object> maybe_data2 = MaybeHandle<Object>()); MaybeObjectHandle maybe_data2 = MaybeObjectHandle());
static Handle<Object> StoreElementTransition(Isolate* isolate, static Handle<Object> StoreElementTransition(Isolate* isolate,
Handle<Map> receiver_map, Handle<Map> receiver_map,
......
...@@ -687,9 +687,9 @@ void LoadIC::UpdateCaches(LookupIterator* lookup) { ...@@ -687,9 +687,9 @@ void LoadIC::UpdateCaches(LookupIterator* lookup) {
} else if (!lookup->IsFound()) { } else if (!lookup->IsFound()) {
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNonexistentDH); TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNonexistentDH);
Handle<Smi> smi_handler = LoadHandler::LoadNonExistent(isolate()); Handle<Smi> smi_handler = LoadHandler::LoadNonExistent(isolate());
code = LoadHandler::LoadFullChain(isolate(), receiver_map(), code = LoadHandler::LoadFullChain(
isolate()->factory()->null_value(), isolate(), receiver_map(),
smi_handler); MaybeObjectHandle(isolate()->factory()->null_value()), smi_handler);
} else { } else {
if (IsLoadGlobalIC()) { if (IsLoadGlobalIC()) {
if (lookup->TryLookupCachedProperty()) { if (lookup->TryLookupCachedProperty()) {
...@@ -771,9 +771,9 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) { ...@@ -771,9 +771,9 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) {
Handle<Smi> smi_handler = LoadHandler::LoadInterceptor(isolate()); Handle<Smi> smi_handler = LoadHandler::LoadInterceptor(isolate());
if (holder->GetNamedInterceptor()->non_masking()) { if (holder->GetNamedInterceptor()->non_masking()) {
Handle<Object> holder_ref = isolate()->factory()->null_value(); MaybeObjectHandle holder_ref(isolate()->factory()->null_value());
if (!receiver_is_holder || IsLoadGlobalIC()) { if (!receiver_is_holder || IsLoadGlobalIC()) {
holder_ref = Map::GetOrCreatePrototypeWeakCell(holder, isolate()); holder_ref = MaybeObjectHandle::Weak(holder);
} }
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNonMaskingInterceptorDH); TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNonMaskingInterceptorDH);
return LoadHandler::LoadFullChain(isolate(), map, holder_ref, return LoadHandler::LoadFullChain(isolate(), map, holder_ref,
...@@ -852,14 +852,12 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) { ...@@ -852,14 +852,12 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) {
Handle<Context> context( Handle<Context> context(
call_optimization.GetAccessorContext(holder->map()), isolate()); call_optimization.GetAccessorContext(holder->map()), isolate());
Handle<WeakCell> context_cell =
isolate()->factory()->NewWeakCell(context);
Handle<WeakCell> data_cell = isolate()->factory()->NewWeakCell(
call_optimization.api_call_info());
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadApiGetterFromPrototypeDH); TRACE_HANDLER_STATS(isolate(), LoadIC_LoadApiGetterFromPrototypeDH);
return LoadHandler::LoadFromPrototype( return LoadHandler::LoadFromPrototype(
isolate(), map, holder, smi_handler, data_cell, context_cell); isolate(), map, holder, smi_handler,
MaybeObjectHandle::Weak(call_optimization.api_call_info()),
MaybeObjectHandle::Weak(context));
} }
if (holder->HasFastProperties()) { if (holder->HasFastProperties()) {
...@@ -872,10 +870,9 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) { ...@@ -872,10 +870,9 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) {
} else if (holder->IsJSGlobalObject()) { } else if (holder->IsJSGlobalObject()) {
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadGlobalFromPrototypeDH); TRACE_HANDLER_STATS(isolate(), LoadIC_LoadGlobalFromPrototypeDH);
smi_handler = LoadHandler::LoadGlobal(isolate()); smi_handler = LoadHandler::LoadGlobal(isolate());
Handle<WeakCell> cell = return LoadHandler::LoadFromPrototype(
isolate()->factory()->NewWeakCell(lookup->GetPropertyCell()); isolate(), map, holder, smi_handler,
return LoadHandler::LoadFromPrototype(isolate(), map, holder, MaybeObjectHandle::Weak(lookup->GetPropertyCell()));
smi_handler, cell);
} else { } else {
smi_handler = LoadHandler::LoadNormal(isolate()); smi_handler = LoadHandler::LoadNormal(isolate());
...@@ -917,10 +914,9 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) { ...@@ -917,10 +914,9 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) {
// workaround for code that leaks the global object. // workaround for code that leaks the global object.
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadGlobalDH); TRACE_HANDLER_STATS(isolate(), LoadIC_LoadGlobalDH);
smi_handler = LoadHandler::LoadGlobal(isolate()); smi_handler = LoadHandler::LoadGlobal(isolate());
Handle<WeakCell> cell = return LoadHandler::LoadFromPrototype(
isolate()->factory()->NewWeakCell(lookup->GetPropertyCell()); isolate(), map, holder, smi_handler,
return LoadHandler::LoadFromPrototype(isolate(), map, holder, MaybeObjectHandle::Weak(lookup->GetPropertyCell()));
smi_handler, cell);
} }
smi_handler = LoadHandler::LoadNormal(isolate()); smi_handler = LoadHandler::LoadNormal(isolate());
...@@ -1486,10 +1482,9 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) { ...@@ -1486,10 +1482,9 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) {
} }
Handle<Smi> smi_handler = StoreHandler::StoreGlobalProxy(isolate()); Handle<Smi> smi_handler = StoreHandler::StoreGlobalProxy(isolate());
Handle<WeakCell> cell =
isolate()->factory()->NewWeakCell(lookup->transition_cell());
Handle<Object> handler = StoreHandler::StoreThroughPrototype( Handle<Object> handler = StoreHandler::StoreThroughPrototype(
isolate(), receiver_map(), store_target, smi_handler, cell); isolate(), receiver_map(), store_target, smi_handler,
MaybeObjectHandle::Weak(lookup->transition_cell()));
return MaybeObjectHandle(handler); return MaybeObjectHandle(handler);
} }
// Dictionary-to-fast transitions are not expected and not supported. // Dictionary-to-fast transitions are not expected and not supported.
...@@ -1582,14 +1577,11 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) { ...@@ -1582,14 +1577,11 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) {
Handle<Context> context( Handle<Context> context(
call_optimization.GetAccessorContext(holder->map()), isolate()); call_optimization.GetAccessorContext(holder->map()), isolate());
Handle<WeakCell> context_cell =
isolate()->factory()->NewWeakCell(context);
Handle<WeakCell> data_cell = isolate()->factory()->NewWeakCell(
call_optimization.api_call_info());
TRACE_HANDLER_STATS(isolate(), StoreIC_StoreApiSetterOnPrototypeDH); TRACE_HANDLER_STATS(isolate(), StoreIC_StoreApiSetterOnPrototypeDH);
return MaybeObjectHandle(StoreHandler::StoreThroughPrototype( return MaybeObjectHandle(StoreHandler::StoreThroughPrototype(
isolate(), receiver_map(), holder, smi_handler, data_cell, isolate(), receiver_map(), holder, smi_handler,
context_cell)); MaybeObjectHandle::Weak(call_optimization.api_call_info()),
MaybeObjectHandle::Weak(context)));
} }
set_slow_stub_reason("incompatible receiver"); set_slow_stub_reason("incompatible receiver");
TRACE_HANDLER_STATS(isolate(), StoreIC_SlowStub); TRACE_HANDLER_STATS(isolate(), StoreIC_SlowStub);
......
...@@ -616,10 +616,7 @@ class DataHandler::BodyDescriptor final : public BodyDescriptorBase { ...@@ -616,10 +616,7 @@ class DataHandler::BodyDescriptor final : public BodyDescriptorBase {
static_assert(kData1Offset < kSizeWithData1, static_assert(kData1Offset < kSizeWithData1,
"Field order must be in sync with this iteration code"); "Field order must be in sync with this iteration code");
IteratePointers(obj, kSmiHandlerOffset, kData1Offset, v); IteratePointers(obj, kSmiHandlerOffset, kData1Offset, v);
if (object_size >= kSizeWithData1) { IterateMaybeWeakPointers(obj, kData1Offset, object_size, v);
IterateMaybeWeakPointer(obj, kData1Offset, v);
IteratePointers(obj, kData1Offset + kPointerSize, object_size, v);
}
} }
static inline int SizeOf(Map* map, HeapObject* object) { static inline int SizeOf(Map* map, HeapObject* object) {
......
...@@ -1664,10 +1664,10 @@ void DataHandler::DataHandlerVerify(Isolate* isolate) { ...@@ -1664,10 +1664,10 @@ void DataHandler::DataHandlerVerify(Isolate* isolate) {
VerifyMaybeObjectField(isolate, kData1Offset); VerifyMaybeObjectField(isolate, kData1Offset);
} }
if (data_count >= 2) { if (data_count >= 2) {
VerifyObjectField(isolate, kData2Offset); VerifyMaybeObjectField(isolate, kData2Offset);
} }
if (data_count >= 3) { if (data_count >= 3) {
VerifyObjectField(isolate, kData3Offset); VerifyMaybeObjectField(isolate, kData3Offset);
} }
} }
......
...@@ -1783,10 +1783,10 @@ void LoadHandler::LoadHandlerPrint(std::ostream& os) { // NOLINT ...@@ -1783,10 +1783,10 @@ void LoadHandler::LoadHandlerPrint(std::ostream& os) { // NOLINT
os << "\n - data1: " << MaybeObjectBrief(data1()); os << "\n - data1: " << MaybeObjectBrief(data1());
} }
if (data_count >= 2) { if (data_count >= 2) {
os << "\n - data2: " << Brief(data2()); os << "\n - data2: " << MaybeObjectBrief(data2());
} }
if (data_count >= 3) { if (data_count >= 3) {
os << "\n - data3: " << Brief(data3()); os << "\n - data3: " << MaybeObjectBrief(data3());
} }
os << "\n"; os << "\n";
} }
...@@ -1801,10 +1801,10 @@ void StoreHandler::StoreHandlerPrint(std::ostream& os) { // NOLINT ...@@ -1801,10 +1801,10 @@ void StoreHandler::StoreHandlerPrint(std::ostream& os) { // NOLINT
os << "\n - data1: " << MaybeObjectBrief(data1()); os << "\n - data1: " << MaybeObjectBrief(data1());
} }
if (data_count >= 2) { if (data_count >= 2) {
os << "\n - data2: " << Brief(data2()); os << "\n - data2: " << MaybeObjectBrief(data2());
} }
if (data_count >= 3) { if (data_count >= 3) {
os << "\n - data3: " << Brief(data3()); os << "\n - data3: " << MaybeObjectBrief(data3());
} }
os << "\n"; os << "\n";
} }
......
...@@ -28,10 +28,10 @@ int DataHandler::data_field_count() const { ...@@ -28,10 +28,10 @@ int DataHandler::data_field_count() const {
WEAK_ACCESSORS_CHECKED(DataHandler, data1, kData1Offset, WEAK_ACCESSORS_CHECKED(DataHandler, data1, kData1Offset,
map()->instance_size() >= kSizeWithData1) map()->instance_size() >= kSizeWithData1)
ACCESSORS_CHECKED(DataHandler, data2, Object, kData2Offset, WEAK_ACCESSORS_CHECKED(DataHandler, data2, kData2Offset,
map()->instance_size() >= kSizeWithData2) map()->instance_size() >= kSizeWithData2)
ACCESSORS_CHECKED(DataHandler, data3, Object, kData3Offset, WEAK_ACCESSORS_CHECKED(DataHandler, data3, kData3Offset,
map()->instance_size() >= kSizeWithData3) map()->instance_size() >= kSizeWithData3)
} // namespace internal } // namespace internal
} // namespace v8 } // namespace v8
......
...@@ -32,8 +32,8 @@ class DataHandler : public Struct { ...@@ -32,8 +32,8 @@ class DataHandler : public Struct {
// [data1-3]: These are optional general-purpose fields whose content and // [data1-3]: These are optional general-purpose fields whose content and
// presence depends on the handler kind. // presence depends on the handler kind.
DECL_ACCESSORS(data1, MaybeObject) DECL_ACCESSORS(data1, MaybeObject)
DECL_ACCESSORS(data2, Object) DECL_ACCESSORS(data2, MaybeObject)
DECL_ACCESSORS(data3, Object) DECL_ACCESSORS(data3, MaybeObject)
// Layout description. // Layout description.
#define DATA_HANDLER_FIELDS(V) \ #define DATA_HANDLER_FIELDS(V) \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment