| Index: src/arm64/stub-cache-arm64.cc
|
| diff --git a/src/arm64/stub-cache-arm64.cc b/src/arm64/stub-cache-arm64.cc
|
| index c3b48a5815e6037c390e5367a7ad254eed9b4d39..d66224f3adf76d5eca37ed9f53eca17e5bd68998 100644
|
| --- a/src/arm64/stub-cache-arm64.cc
|
| +++ b/src/arm64/stub-cache-arm64.cc
|
| @@ -823,13 +823,14 @@ Register StubCompiler::CheckPrototypes(Handle<HeapType> type,
|
| reg = holder_reg; // From now on the object will be in holder_reg.
|
| __ Ldr(reg, FieldMemOperand(scratch1, Map::kPrototypeOffset));
|
| } else {
|
| - bool need_map = (depth != 1 || check == CHECK_ALL_MAPS) ||
|
| - heap()->InNewSpace(*prototype);
|
| - Register map_reg = NoReg;
|
| - if (need_map) {
|
| - map_reg = scratch1;
|
| - __ Ldr(map_reg, FieldMemOperand(reg, HeapObject::kMapOffset));
|
| - }
|
| + // Two possible reasons for loading the prototype from the map:
|
| + // (1) Can't store references to new space in code.
|
| + // (2) Handler is shared for all receivers with the same prototype
|
| + // map (but not necessarily the same prototype instance).
|
| + bool load_prototype_from_map =
|
| + heap()->InNewSpace(*prototype) || depth == 1;
|
| + Register map_reg = scratch1;
|
| + __ Ldr(map_reg, FieldMemOperand(reg, HeapObject::kMapOffset));
|
|
|
| if (depth != 1 || check == CHECK_ALL_MAPS) {
|
| __ CheckMap(map_reg, current_map, miss, DONT_DO_SMI_CHECK);
|
| @@ -849,12 +850,9 @@ Register StubCompiler::CheckPrototypes(Handle<HeapType> type,
|
|
|
| reg = holder_reg; // From now on the object will be in holder_reg.
|
|
|
| - if (heap()->InNewSpace(*prototype)) {
|
| - // The prototype is in new space; we cannot store a reference to it
|
| - // in the code. Load it from the map.
|
| + if (load_prototype_from_map) {
|
| __ Ldr(reg, FieldMemOperand(map_reg, Map::kPrototypeOffset));
|
| } else {
|
| - // The prototype is in old space; load it directly.
|
| __ Mov(reg, Operand(prototype));
|
| }
|
| }
|
|
|