| Index: src/code-stub-assembler.cc
|
| diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc
|
| index ca2dce3c196be6fa84fa45bf5245788e15da28a4..ed07be577029c919d2f5359a3a119a5423c12e6b 100644
|
| --- a/src/code-stub-assembler.cc
|
| +++ b/src/code-stub-assembler.cc
|
| @@ -3179,6 +3179,10 @@ Node* CodeStubAssembler::IsPropertyCell(Node* object) {
|
| return IsPropertyCellMap(LoadMap(object));
|
| }
|
|
|
| +Node* CodeStubAssembler::IsAccessorInfo(Node* object) {
|
| + return IsAccessorInfoMap(LoadMap(object));
|
| +}
|
| +
|
| Node* CodeStubAssembler::IsAccessorPair(Node* object) {
|
| return IsAccessorPairMap(LoadMap(object));
|
| }
|
| @@ -5337,18 +5341,17 @@ Node* CodeStubAssembler::CallGetterIfAccessor(Node* value, Node* details,
|
| Node* context, Node* receiver,
|
| Label* if_bailout) {
|
| VARIABLE(var_value, MachineRepresentation::kTagged, value);
|
| - Label done(this);
|
| + Label done(this), if_accessor_info(this, Label::kDeferred);
|
|
|
| Node* kind = DecodeWord32<PropertyDetails::KindField>(details);
|
| GotoIf(Word32Equal(kind, Int32Constant(kData)), &done);
|
|
|
| // Accessor case.
|
| + GotoIfNot(IsAccessorPair(value), &if_accessor_info);
|
| +
|
| + // AccessorPair case.
|
| {
|
| Node* accessor_pair = value;
|
| - GotoIf(Word32Equal(LoadInstanceType(accessor_pair),
|
| - Int32Constant(ACCESSOR_INFO_TYPE)),
|
| - if_bailout);
|
| - CSA_ASSERT(this, IsAccessorPair(accessor_pair));
|
| Node* getter = LoadObjectField(accessor_pair, AccessorPair::kGetterOffset);
|
| Node* getter_map = LoadMap(getter);
|
| Node* instance_type = LoadMapInstanceType(getter_map);
|
| @@ -5368,6 +5371,21 @@ Node* CodeStubAssembler::CallGetterIfAccessor(Node* value, Node* details,
|
| Goto(&done);
|
| }
|
|
|
| + // AccessorInfo case.
|
| + BIND(&if_accessor_info);
|
| + {
|
| + // TODO(ishell): Consider doing this for the Function.prototype and the
|
| + // String.length accessor infos as well.
|
| + CSA_ASSERT(this, IsAccessorInfo(value));
|
| + CSA_ASSERT(this, TaggedIsNotSmi(receiver));
|
| + GotoIfNot(IsJSArray(receiver), if_bailout);
|
| + // The only AccessorInfo on JSArray is the "length" property.
|
| + CSA_ASSERT(this, IsLengthString(
|
| + LoadObjectField(value, AccessorInfo::kNameOffset)));
|
| + var_value.Bind(LoadJSArrayLength(receiver));
|
| + Goto(&done);
|
| + }
|
| +
|
| BIND(&done);
|
| return var_value.value();
|
| }
|
|
|