Index: src/arm/stub-cache-arm.cc |
diff --git a/src/arm/stub-cache-arm.cc b/src/arm/stub-cache-arm.cc |
index efe4feebd31f6eadb6472ff65dd3e83c0f77e1d4..1e99e606942b715942406a8307980e6470555815 100644 |
--- a/src/arm/stub-cache-arm.cc |
+++ b/src/arm/stub-cache-arm.cc |
@@ -2649,9 +2649,18 @@ MaybeObject* StoreStubCompiler::CompileStoreGlobal(GlobalObject* object, |
__ cmp(r3, Operand(Handle<Map>(object->map()))); |
__ b(ne, &miss); |
+ // Check that the value in the cell is not the hole. If it is, this |
+ // cell could have been deleted and reintroducing the global needs |
+ // to update the property details in the property dictionary of the |
+ // global object. We bail out to the runtime system to do that. |
+ __ mov(r4, Operand(Handle<JSGlobalPropertyCell>(cell))); |
+ __ LoadRoot(r5, Heap::kTheHoleValueRootIndex); |
+ __ ldr(r6, FieldMemOperand(r4, JSGlobalPropertyCell::kValueOffset)); |
+ __ cmp(r5, r6); |
+ __ b(eq, &miss); |
+ |
// Store the value in the cell. |
- __ mov(r2, Operand(Handle<JSGlobalPropertyCell>(cell))); |
- __ str(r0, FieldMemOperand(r2, JSGlobalPropertyCell::kValueOffset)); |
+ __ str(r0, FieldMemOperand(r4, JSGlobalPropertyCell::kValueOffset)); |
__ IncrementCounter(&Counters::named_store_global_inline, 1, r4, r3); |
__ Ret(); |