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); |
} |
} |