Index: src/arm/codegen-arm.cc |
diff --git a/src/arm/codegen-arm.cc b/src/arm/codegen-arm.cc |
index cfc9dfec4dc6a3e1d905a3182ceb4635887a9596..d4c4098120cb98708df7aee2bc2a1b55cdeb115f 100644 |
--- a/src/arm/codegen-arm.cc |
+++ b/src/arm/codegen-arm.cc |
@@ -562,7 +562,7 @@ void ElementsTransitionGenerator::GenerateDoubleToObject( |
// -- r3 : target map, scratch for subsequent call |
// -- r4 : scratch (elements) |
// ----------------------------------- |
- Label entry, loop, convert_hole, gc_required, only_change_map; |
+ Label entry, loop, convert_hole, gc_required, gc_cleanup, only_change_map; |
if (mode == TRACK_ALLOCATION_SITE) { |
__ JumpIfJSArrayHasAllocationMemento(r2, r4, fail); |
@@ -604,6 +604,15 @@ void ElementsTransitionGenerator::GenerateDoubleToObject( |
// r9: heap number map |
__ b(&entry); |
+ __ bind(&gc_cleanup); |
+#ifdef VERIFY_HEAP |
+ // Make sure new space is iterable if we are verifying the heap. |
+ __ mov(r0, Operand(masm->isolate()->factory()->one_pointer_filler_map())); |
+ __ str(r0, MemOperand(r3, 4, PostIndex)); |
+ __ cmp(r3, r5); |
+ __ b(lt, &gc_cleanup); |
+#endif |
+ |
// Call into runtime if GC is required. |
__ bind(&gc_required); |
__ Pop(r3, r2, r1, r0); |
@@ -618,7 +627,7 @@ void ElementsTransitionGenerator::GenerateDoubleToObject( |
__ b(eq, &convert_hole); |
// Non-hole double, copy value into a heap number. |
- __ AllocateHeapNumber(r2, r0, lr, r9, &gc_required); |
+ __ AllocateHeapNumber(r2, r0, lr, r9, &gc_cleanup); |
// r2: new heap number |
__ ldr(r0, MemOperand(r4, 12, NegOffset)); |
__ Strd(r0, r1, FieldMemOperand(r2, HeapNumber::kValueOffset)); |