Index: src/ic/accessor-assembler.cc |
diff --git a/src/ic/accessor-assembler.cc b/src/ic/accessor-assembler.cc |
index 1667b0dfda2383597be16b7f4909682771e27438..74333140aa0414955f35a78958a643e8d4d96576 100644 |
--- a/src/ic/accessor-assembler.cc |
+++ b/src/ic/accessor-assembler.cc |
@@ -1156,37 +1156,11 @@ void AccessorAssembler::GenericPropertyLoad(Node* receiver, Node* receiver_map, |
Variable var_value(this, MachineRepresentation::kTagged); |
// Receivers requiring non-standard accesses (interceptors, access |
- // checks, string wrappers, proxies) are handled in the runtime. |
- // We special-case strings here, to support loading <Symbol.split> etc. |
- Variable var_receiver(this, MachineRepresentation::kTagged); |
- Variable var_receiver_map(this, MachineRepresentation::kTagged); |
- Variable var_instance_type(this, MachineRepresentation::kWord32); |
- var_receiver.Bind(receiver); |
- var_receiver_map.Bind(receiver_map); |
- var_instance_type.Bind(instance_type); |
- Label normal_receiver(this); |
- GotoIf(Int32GreaterThan(instance_type, |
- Int32Constant(LAST_SPECIAL_RECEIVER_TYPE)), |
- &normal_receiver); |
- GotoIf(Int32GreaterThanOrEqual(instance_type, |
- Int32Constant(FIRST_NONSTRING_TYPE)), |
+ // checks, strings and string wrappers, proxies) are handled in the runtime. |
+ GotoIf(Int32LessThanOrEqual(instance_type, |
+ Int32Constant(LAST_SPECIAL_RECEIVER_TYPE)), |
slow); |
- CSA_ASSERT(this, WordEqual(LoadMapConstructorFunctionIndex(receiver_map), |
- IntPtrConstant(Context::STRING_FUNCTION_INDEX))); |
- Node* native_context = LoadNativeContext(p->context); |
- Node* constructor_function = |
- LoadContextElement(native_context, Context::STRING_FUNCTION_INDEX); |
- Node* initial_map = LoadObjectField(constructor_function, |
- JSFunction::kPrototypeOrInitialMapOffset); |
- var_receiver.Bind(LoadMapPrototype(initial_map)); |
- var_receiver_map.Bind(LoadMap(var_receiver.value())); |
- var_instance_type.Bind(LoadMapInstanceType(var_receiver_map.value())); |
- Goto(&normal_receiver); |
- |
- Bind(&normal_receiver); |
- receiver = var_receiver.value(); |
- receiver_map = var_receiver_map.value(); |
- instance_type = var_instance_type.value(); |
+ |
// Check if the receiver has fast or slow properties. |
Node* properties = LoadProperties(receiver); |
Node* properties_map = LoadMap(properties); |
@@ -1202,10 +1176,10 @@ void AccessorAssembler::GenericPropertyLoad(Node* receiver, Node* receiver_map, |
// See also TryLookupProperty() which has the same limitation. |
const int32_t kMaxLinear = 210; |
Label stub_cache(this); |
- Node* bitfield3 = LoadMapBitField3(var_receiver_map.value()); |
+ Node* bitfield3 = LoadMapBitField3(receiver_map); |
Node* nof = DecodeWordFromWord32<Map::NumberOfOwnDescriptorsBits>(bitfield3); |
GotoIf(UintPtrLessThan(IntPtrConstant(kMaxLinear), nof), &stub_cache); |
- Node* descriptors = LoadMapDescriptors(var_receiver_map.value()); |
+ Node* descriptors = LoadMapDescriptors(receiver_map); |
Variable var_name_index(this, MachineType::PointerRepresentation()); |
Label if_descriptor_found(this); |
DescriptorLookupLinear(key, descriptors, nof, &if_descriptor_found, |
@@ -1213,7 +1187,7 @@ void AccessorAssembler::GenericPropertyLoad(Node* receiver, Node* receiver_map, |
Bind(&if_descriptor_found); |
{ |
- LoadPropertyFromFastObject(receiver, var_receiver_map.value(), descriptors, |
+ LoadPropertyFromFastObject(receiver, receiver_map, descriptors, |
var_name_index.value(), &var_details, |
&var_value); |
Goto(&if_found_on_receiver); |
@@ -1261,7 +1235,7 @@ void AccessorAssembler::GenericPropertyLoad(Node* receiver, Node* receiver_map, |
Bind(&if_found_on_receiver); |
{ |
Node* value = CallGetterIfAccessor(var_value.value(), var_details.value(), |
- p->context, var_receiver.value(), slow); |
+ p->context, receiver, slow); |
IncrementCounter(isolate()->counters()->ic_keyed_load_generic_symbol(), 1); |
Return(value); |
} |
@@ -1274,8 +1248,8 @@ void AccessorAssembler::GenericPropertyLoad(Node* receiver, Node* receiver_map, |
Variable* merged_variables[] = {&var_holder_map, &var_holder_instance_type}; |
Label loop(this, arraysize(merged_variables), merged_variables); |
- var_holder_map.Bind(var_receiver_map.value()); |
- var_holder_instance_type.Bind(var_instance_type.value()); |
+ var_holder_map.Bind(receiver_map); |
+ var_holder_instance_type.Bind(instance_type); |
// Private symbols must not be looked up on the prototype chain. |
GotoIf(IsPrivateSymbol(key), &return_undefined); |
Goto(&loop); |
@@ -1292,7 +1266,7 @@ void AccessorAssembler::GenericPropertyLoad(Node* receiver, Node* receiver_map, |
var_holder_map.Bind(proto_map); |
var_holder_instance_type.Bind(proto_instance_type); |
Label next_proto(this), return_value(this, &var_value), goto_slow(this); |
- TryGetOwnProperty(p->context, var_receiver.value(), proto, proto_map, |
+ TryGetOwnProperty(p->context, receiver, proto, proto_map, |
proto_instance_type, key, &return_value, &var_value, |
&next_proto, &goto_slow); |