Index: src/ia32/macro-assembler-ia32.cc |
diff --git a/src/ia32/macro-assembler-ia32.cc b/src/ia32/macro-assembler-ia32.cc |
index ed69fd07686f8d1df9287782fc9f40459744a420..bc8ecead5adcec24527ea1a69532d2f013f4419e 100644 |
--- a/src/ia32/macro-assembler-ia32.cc |
+++ b/src/ia32/macro-assembler-ia32.cc |
@@ -3550,6 +3550,36 @@ void MacroAssembler::TestJSArrayForAllocationMemento( |
} |
+void MacroAssembler::HasElementCallbacksInPrototypeChain( |
+ Register object, |
+ Register elements, |
+ Label* found) { |
+ Factory* factory = isolate()->factory(); |
+ Register scratch = elements; |
+ Label loop, not_found; |
+ |
+ // ebx contained elements pointer. |
danno
2013/10/30 12:17:45
nit: comment is wrong above (no explicit register
mvstanton
2013/10/30 18:22:28
Done.
|
+ mov(scratch, FieldOperand(object, HeapObject::kMapOffset)); |
danno
2013/10/30 12:17:45
If you move object into scratch before entering th
mvstanton
2013/10/30 18:22:28
Done.
|
+ |
+ // Loop based on the map going up the prototype chain. |
+ bind(&loop); |
+ test(FieldOperand(scratch, Map::kBitField4Offset), |
+ Immediate(Smi::FromInt(Map::HasElementCallbacks::kMask))); |
+ j(not_zero, found); |
+ |
+ // Next map |
+ mov(scratch, FieldOperand(scratch, Map::kPrototypeOffset)); |
+ cmp(scratch, Immediate(factory->null_value())); |
+ j(equal, ¬_found); |
+ mov(scratch, FieldOperand(scratch, HeapObject::kMapOffset)); |
+ jmp(&loop); |
+ |
+ // Restore ebx |
+ bind(¬_found); |
+ mov(elements, FieldOperand(object, JSObject::kElementsOffset)); |
+} |
+ |
+ |
} } // namespace v8::internal |
#endif // V8_TARGET_ARCH_IA32 |