Chromium Code Reviews| Index: src/deoptimizer.cc |
| diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc |
| index 4d5e60573d29fd2aee427642c4e609de6ad2b03d..2528b26ec9a2804ae02771ef8edf0a3b2aa23880 100644 |
| --- a/src/deoptimizer.cc |
| +++ b/src/deoptimizer.cc |
| @@ -1842,9 +1842,11 @@ Handle<Object> Deoptimizer::MaterializeNextHeapObject() { |
| Handle<Map> map = Map::GeneralizeAllFieldRepresentations( |
| Handle<Map>::cast(MaterializeNextValue()), Representation::Tagged()); |
| switch (map->instance_type()) { |
| + case MUTABLE_HEAP_NUMBER_TYPE: |
| case HEAP_NUMBER_TYPE: { |
| // Reuse the HeapNumber value directly as it is already properly |
| - // tagged and skip materializing the HeapNumber explicitly. |
| + // tagged and skip materializing the HeapNumber explicitly. Turn mutable |
| + // heap numbers immutable. |
| Handle<Object> object = MaterializeNextValue(); |
| if (object_index < prev_materialized_count_) { |
| materialized_objects_->Add(Handle<Object>( |
| @@ -1905,6 +1907,9 @@ Handle<Object> Deoptimizer::MaterializeNextHeapObject() { |
| Handle<Object> Deoptimizer::MaterializeNextValue() { |
| int value_index = materialization_value_index_++; |
| Handle<Object> value = materialized_values_->at(value_index); |
| + if (value->IsMutableHeapNumber()) { |
| + HeapNumber::cast(*value)->set_map(isolate_->heap()->heap_number_map()); |
|
Igor Sheludko
2014/03/27 11:30:16
I think it is worth adding a comment here about wh
|
| + } |
| if (*value == isolate_->heap()->arguments_marker()) { |
| value = MaterializeNextHeapObject(); |
| } |
| @@ -3346,6 +3351,7 @@ Handle<Object> SlotRefValueBuilder::GetNext(Isolate* isolate, int lvl) { |
| // TODO(jarin) this should be unified with the code in |
| // Deoptimizer::MaterializeNextHeapObject() |
| switch (map->instance_type()) { |
| + case MUTABLE_HEAP_NUMBER_TYPE: |
| case HEAP_NUMBER_TYPE: { |
| // Reuse the HeapNumber value directly as it is already properly |
| // tagged and skip materializing the HeapNumber explicitly. |