Index: src/mips64/macro-assembler-mips64.cc |
diff --git a/src/mips64/macro-assembler-mips64.cc b/src/mips64/macro-assembler-mips64.cc |
index 1b0b1e9eafb7df77f55af6b971b04b6231a5260b..83f1a783ff43889a66423c1e3702e1eda187ffd4 100644 |
--- a/src/mips64/macro-assembler-mips64.cc |
+++ b/src/mips64/macro-assembler-mips64.cc |
@@ -6216,19 +6216,28 @@ void MacroAssembler::JumpIfDictionaryInPrototypeChain( |
DCHECK(!scratch1.is(scratch0)); |
Factory* factory = isolate()->factory(); |
Register current = scratch0; |
- Label loop_again; |
+ Label loop_again, end; |
// Scratch contained elements pointer. |
Move(current, object); |
+ ld(current, FieldMemOperand(current, HeapObject::kMapOffset)); |
+ ld(current, FieldMemOperand(current, Map::kPrototypeOffset)); |
+ Branch(&end, eq, current, Operand(factory->null_value())); |
// Loop based on the map going up the prototype chain. |
bind(&loop_again); |
ld(current, FieldMemOperand(current, HeapObject::kMapOffset)); |
+ lbu(scratch1, FieldMemOperand(current, Map::kInstanceTypeOffset)); |
+ STATIC_ASSERT(JS_VALUE_TYPE < JS_OBJECT_TYPE); |
+ STATIC_ASSERT(JS_PROXY_TYPE < JS_OBJECT_TYPE); |
+ Branch(found, lo, scratch1, Operand(JS_OBJECT_TYPE)); |
lb(scratch1, FieldMemOperand(current, Map::kBitField2Offset)); |
DecodeField<Map::ElementsKindBits>(scratch1); |
Branch(found, eq, scratch1, Operand(DICTIONARY_ELEMENTS)); |
ld(current, FieldMemOperand(current, Map::kPrototypeOffset)); |
Branch(&loop_again, ne, current, Operand(factory->null_value())); |
+ |
+ bind(&end); |
} |