Index: src/crankshaft/hydrogen.cc |
diff --git a/src/crankshaft/hydrogen.cc b/src/crankshaft/hydrogen.cc |
index 16c3639a3d33dbaebaecfa71aeb90bbc11242ff2..79e78a53f5b32c2dce5ad4f9b95b4858e7d88100 100644 |
--- a/src/crankshaft/hydrogen.cc |
+++ b/src/crankshaft/hydrogen.cc |
@@ -6518,11 +6518,19 @@ void HOptimizedGraphBuilder::HandleGlobalVariableAssignment( |
access = access.WithRepresentation(Representation::Smi()); |
break; |
case PropertyCellConstantType::kStableMap: { |
- // The map may no longer be stable, deopt if it's ever different from |
- // what is currently there, which will allow for restablization. |
- Handle<Map> map(HeapObject::cast(cell->value())->map()); |
+ // First check that the previous value of the {cell} still has the |
+ // map that we are about to check the new {value} for. If not, then |
+ // the stable map assumption was invalidated and we cannot continue |
+ // with the optimized code. |
+ Handle<HeapObject> cell_value(HeapObject::cast(cell->value())); |
+ Handle<Map> cell_value_map(cell_value->map()); |
+ if (!cell_value_map->is_stable()) { |
+ return Bailout(kUnstableConstantTypeHeapObject); |
+ } |
+ top_info()->dependencies()->AssumeMapStable(cell_value_map); |
+ // Now check that the new {value} is a HeapObject with the same map. |
Add<HCheckHeapObject>(value); |
- value = Add<HCheckMaps>(value, map); |
+ value = Add<HCheckMaps>(value, cell_value_map); |
access = access.WithRepresentation(Representation::HeapObject()); |
break; |
} |