| Index: src/code-stub-assembler.cc
|
| diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc
|
| index a6dc02cd7fc2b0f0309ec057aec336c3a8f0bd14..f707aa8ad08923b9255f08f2b4e2295bbb8df970 100644
|
| --- a/src/code-stub-assembler.cc
|
| +++ b/src/code-stub-assembler.cc
|
| @@ -5720,12 +5720,38 @@ void CodeStubAssembler::HandleLoadICProtoHandler(
|
|
|
| Bind(&array_handler);
|
| {
|
| - Node* handler_length = SmiUntag(maybe_holder_cell);
|
| - Node* holder = EmitLoadICProtoArrayCheck(p, handler, handler_length,
|
| - handler_flags, miss);
|
| - var_holder->Bind(holder);
|
| - var_smi_handler->Bind(smi_handler);
|
| - Goto(if_smi_handler);
|
| + typedef LoadICProtoArrayDescriptor Descriptor;
|
| + LoadICProtoArrayStub stub(isolate());
|
| + Node* target = HeapConstant(stub.GetCode());
|
| + TailCallStub(Descriptor(isolate()), target, p->context,
|
| + Arg(Descriptor::kReceiver, p->receiver),
|
| + Arg(Descriptor::kName, p->name),
|
| + Arg(Descriptor::kSlot, p->slot),
|
| + Arg(Descriptor::kVector, p->vector),
|
| + Arg(Descriptor::kHandler, handler));
|
| + }
|
| +}
|
| +
|
| +void CodeStubAssembler::LoadICProtoArray(const LoadICParameters* p,
|
| + Node* handler) {
|
| + Label miss(this);
|
| + CSA_ASSERT(this, Word32BinaryNot(TaggedIsSmi(handler)));
|
| + CSA_ASSERT(this, IsFixedArrayMap(LoadMap(handler)));
|
| +
|
| + Node* smi_handler = LoadObjectField(handler, LoadHandler::kSmiHandlerOffset);
|
| + Node* handler_flags = SmiUntag(smi_handler);
|
| +
|
| + Node* handler_length = LoadAndUntagFixedArrayBaseLength(handler);
|
| +
|
| + Node* holder = EmitLoadICProtoArrayCheck(p, handler, handler_length,
|
| + handler_flags, &miss);
|
| +
|
| + HandleLoadICSmiHandlerCase(p, holder, smi_handler, &miss, kOnlyProperties);
|
| +
|
| + Bind(&miss);
|
| + {
|
| + TailCallRuntime(Runtime::kLoadIC_Miss, p->context, p->receiver, p->name,
|
| + p->slot, p->vector);
|
| }
|
| }
|
|
|
|
|