Index: src/arm/macro-assembler-arm.cc |
diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc |
index 8e187a49f331ea25eb8881eb1b337473d425549a..8f64f5df3df71d9a4571a02adb93e53e6e2def60 100644 |
--- a/src/arm/macro-assembler-arm.cc |
+++ b/src/arm/macro-assembler-arm.cc |
@@ -3928,6 +3928,34 @@ Register GetRegisterThatIsNotOneOf(Register reg1, |
} |
+void MacroAssembler::HasDictionaryInPrototypeChain( |
+ Register object, |
+ Register elements, |
+ Register scratch, |
+ Label* found) { |
+ Factory* factory = isolate()->factory(); |
+ Register temp = elements; |
+ Label loop_again; |
+ |
+ // scratch contained elements pointer. |
+ mov(temp, object); |
+ |
+ // Loop based on the map going up the prototype chain. |
+ bind(&loop_again); |
+ ldr(temp, FieldMemOperand(temp, HeapObject::kMapOffset)); |
+ ldr(scratch, FieldMemOperand(temp, Map::kBitField2Offset)); |
+ Ubfx(scratch, scratch, Map::kElementsKindShift, Map::kElementsKindBitCount); |
+ cmp(scratch, Operand(DICTIONARY_ELEMENTS)); |
+ b(eq, found); |
+ ldr(temp, FieldMemOperand(temp, Map::kPrototypeOffset)); |
+ cmp(temp, Operand(factory->null_value())); |
+ b(ne, &loop_again); |
+ |
+ // Restore elements |
+ ldr(elements, FieldMemOperand(object, JSObject::kElementsOffset)); |
+} |
+ |
+ |
#ifdef DEBUG |
bool AreAliased(Register reg1, |
Register reg2, |