Index: src/mips/macro-assembler-mips.cc |
diff --git a/src/mips/macro-assembler-mips.cc b/src/mips/macro-assembler-mips.cc |
index 36671fd43b699235625960ce3c8c4a5e1e3d35cb..304cce5c0bc178da8b4bb018606a543db2595a32 100644 |
--- a/src/mips/macro-assembler-mips.cc |
+++ b/src/mips/macro-assembler-mips.cc |
@@ -5985,19 +5985,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); |
+ lw(current, FieldMemOperand(current, HeapObject::kMapOffset)); |
+ lw(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); |
lw(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)); |
lw(current, FieldMemOperand(current, Map::kPrototypeOffset)); |
Branch(&loop_again, ne, current, Operand(factory->null_value())); |
+ |
+ bind(&end); |
} |