| Index: src/code-stub-assembler.cc
|
| diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc
|
| index c2fc6c246151eb706c60f8a249bd16ba9af2ebcf..fdce0628723fbfa9c37d9189e7dc2e6b901439ba 100644
|
| --- a/src/code-stub-assembler.cc
|
| +++ b/src/code-stub-assembler.cc
|
| @@ -4836,7 +4836,7 @@ void CodeStubAssembler::HandleLoadICHandlerCase(
|
|
|
| Branch(TaggedIsSmi(handler), &if_smi_handler, &try_proto_cell_handler);
|
|
|
| - // |handler| is a Smi, encoding what to do. See handler-configuration.h
|
| + // |handler| is a Smi, encoding what to do. See SmiHandler methods
|
| // for the encoding format.
|
| Bind(&if_smi_handler);
|
| {
|
| @@ -4845,10 +4845,10 @@ void CodeStubAssembler::HandleLoadICHandlerCase(
|
|
|
| Node* holder = var_holder.value();
|
| Node* handler_word = SmiUntag(var_smi_handler.value());
|
| + Node* handler_type =
|
| + WordAnd(handler_word, IntPtrConstant(LoadHandlerTypeBits::kMask));
|
| if (support_elements == kSupportElements) {
|
| Label property(this);
|
| - Node* handler_type =
|
| - WordAnd(handler_word, IntPtrConstant(LoadHandlerTypeBit::kMask));
|
| GotoUnless(
|
| WordEqual(handler_type, IntPtrConstant(kLoadICHandlerForElements)),
|
| &property);
|
| @@ -4895,44 +4895,65 @@ void CodeStubAssembler::HandleLoadICHandlerCase(
|
| Comment("property_load");
|
| }
|
|
|
| - // |handler_word| is a field index as obtained by
|
| - // FieldIndex.GetLoadByFieldOffset():
|
| - Label inobject_double(this), out_of_object(this),
|
| - out_of_object_double(this);
|
| - Node* inobject_bit =
|
| - WordAnd(handler_word, IntPtrConstant(FieldOffsetIsInobject::kMask));
|
| - Node* double_bit =
|
| - WordAnd(handler_word, IntPtrConstant(FieldOffsetIsDouble::kMask));
|
| - Node* offset =
|
| - WordSar(handler_word, IntPtrConstant(FieldOffsetOffset::kShift));
|
| -
|
| - GotoIf(WordEqual(inobject_bit, IntPtrConstant(0)), &out_of_object);
|
| -
|
| - GotoUnless(WordEqual(double_bit, IntPtrConstant(0)), &inobject_double);
|
| - Return(LoadObjectField(holder, offset));
|
| -
|
| - Bind(&inobject_double);
|
| - if (FLAG_unbox_double_fields) {
|
| - var_double_value.Bind(
|
| - LoadObjectField(holder, offset, MachineType::Float64()));
|
| - } else {
|
| - Node* mutable_heap_number = LoadObjectField(holder, offset);
|
| - var_double_value.Bind(LoadHeapNumberValue(mutable_heap_number));
|
| - }
|
| - Goto(&rebox_double);
|
| + Label constant(this), field(this);
|
| + Branch(WordEqual(handler_type, IntPtrConstant(kLoadICHandlerForFields)),
|
| + &field, &constant);
|
|
|
| - Bind(&out_of_object);
|
| - Node* properties = LoadProperties(holder);
|
| - Node* value = LoadObjectField(properties, offset);
|
| - GotoUnless(WordEqual(double_bit, IntPtrConstant(0)), &out_of_object_double);
|
| - Return(value);
|
| + Bind(&field);
|
| + {
|
| + Comment("field_load");
|
| + Label inobject_double(this), out_of_object(this),
|
| + out_of_object_double(this);
|
| + Node* inobject_bit =
|
| + WordAnd(handler_word, IntPtrConstant(FieldOffsetIsInobject::kMask));
|
| + Node* double_bit =
|
| + WordAnd(handler_word, IntPtrConstant(FieldOffsetIsDouble::kMask));
|
| + Node* offset =
|
| + WordSar(handler_word, IntPtrConstant(FieldOffsetOffset::kShift));
|
| +
|
| + GotoIf(WordEqual(inobject_bit, IntPtrConstant(0)), &out_of_object);
|
| +
|
| + GotoUnless(WordEqual(double_bit, IntPtrConstant(0)), &inobject_double);
|
| + Return(LoadObjectField(holder, offset));
|
| +
|
| + Bind(&inobject_double);
|
| + if (FLAG_unbox_double_fields) {
|
| + var_double_value.Bind(
|
| + LoadObjectField(holder, offset, MachineType::Float64()));
|
| + } else {
|
| + Node* mutable_heap_number = LoadObjectField(holder, offset);
|
| + var_double_value.Bind(LoadHeapNumberValue(mutable_heap_number));
|
| + }
|
| + Goto(&rebox_double);
|
|
|
| - Bind(&out_of_object_double);
|
| - var_double_value.Bind(LoadHeapNumberValue(value));
|
| - Goto(&rebox_double);
|
| + Bind(&out_of_object);
|
| + Node* properties = LoadProperties(holder);
|
| + Node* value = LoadObjectField(properties, offset);
|
| + GotoUnless(WordEqual(double_bit, IntPtrConstant(0)),
|
| + &out_of_object_double);
|
| + Return(value);
|
|
|
| - Bind(&rebox_double);
|
| - Return(AllocateHeapNumberWithValue(var_double_value.value()));
|
| + Bind(&out_of_object_double);
|
| + var_double_value.Bind(LoadHeapNumberValue(value));
|
| + Goto(&rebox_double);
|
| +
|
| + Bind(&rebox_double);
|
| + Return(AllocateHeapNumberWithValue(var_double_value.value()));
|
| + }
|
| +
|
| + Bind(&constant);
|
| + {
|
| + Comment("constant_load");
|
| + Node* descriptors = LoadMapDescriptors(LoadMap(holder));
|
| + Node* descriptor = WordSar(
|
| + handler_word, IntPtrConstant(ValueIndexInDescriptorArray::kShift));
|
| +#if defined(DEBUG)
|
| + Assert(UintPtrLessThan(descriptor,
|
| + LoadAndUntagFixedArrayBaseLength(descriptors)));
|
| +#endif
|
| + Return(
|
| + LoadFixedArrayElement(descriptors, descriptor, 0, INTPTR_PARAMETERS));
|
| + }
|
| }
|
|
|
| Bind(&try_proto_cell_handler);
|
|
|