Index: src/arm64/macro-assembler-arm64.cc |
diff --git a/src/arm64/macro-assembler-arm64.cc b/src/arm64/macro-assembler-arm64.cc |
index c30f619215517a53c36d1f3b84847fda53ea403c..b3331b3a34d37a56d3f92a386f9004dc14cfe574 100644 |
--- a/src/arm64/macro-assembler-arm64.cc |
+++ b/src/arm64/macro-assembler-arm64.cc |
@@ -4399,19 +4399,28 @@ void MacroAssembler::JumpIfDictionaryInPrototypeChain( |
DCHECK(!AreAliased(object, scratch0, scratch1)); |
Factory* factory = isolate()->factory(); |
Register current = scratch0; |
- Label loop_again; |
+ Label loop_again, end; |
// Scratch contains elements pointer. |
Mov(current, object); |
+ Ldr(current, FieldMemOperand(current, HeapObject::kMapOffset)); |
+ Ldr(current, FieldMemOperand(current, Map::kPrototypeOffset)); |
+ CompareAndBranch(current, Operand(factory->null_value()), eq, &end); |
// Loop based on the map going up the prototype chain. |
Bind(&loop_again); |
Ldr(current, FieldMemOperand(current, HeapObject::kMapOffset)); |
+ DCHECK(JS_PROXY_TYPE < JS_OBJECT_TYPE); |
+ DCHECK(JS_VALUE_TYPE < JS_OBJECT_TYPE); |
+ CompareInstanceType(current, scratch1, JS_OBJECT_TYPE); |
+ B(lt, found); |
Ldrb(scratch1, FieldMemOperand(current, Map::kBitField2Offset)); |
DecodeField<Map::ElementsKindBits>(scratch1); |
CompareAndBranch(scratch1, DICTIONARY_ELEMENTS, eq, found); |
Ldr(current, FieldMemOperand(current, Map::kPrototypeOffset)); |
CompareAndBranch(current, Operand(factory->null_value()), ne, &loop_again); |
+ |
+ Bind(&end); |
} |