Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 1824 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1835 Handle<Object> value = MaterializeNextValue(); | 1835 Handle<Object> value = MaterializeNextValue(); |
| 1836 array->set(i, *value); | 1836 array->set(i, *value); |
| 1837 } | 1837 } |
| 1838 } else { | 1838 } else { |
| 1839 // Dispatch on the instance type of the object to be materialized. | 1839 // Dispatch on the instance type of the object to be materialized. |
| 1840 // We also need to make sure that the representation of all fields | 1840 // We also need to make sure that the representation of all fields |
| 1841 // in the given object are general enough to hold a tagged value. | 1841 // in the given object are general enough to hold a tagged value. |
| 1842 Handle<Map> map = Map::GeneralizeAllFieldRepresentations( | 1842 Handle<Map> map = Map::GeneralizeAllFieldRepresentations( |
| 1843 Handle<Map>::cast(MaterializeNextValue()), Representation::Tagged()); | 1843 Handle<Map>::cast(MaterializeNextValue()), Representation::Tagged()); |
| 1844 switch (map->instance_type()) { | 1844 switch (map->instance_type()) { |
| 1845 case MUTABLE_HEAP_NUMBER_TYPE: | |
| 1845 case HEAP_NUMBER_TYPE: { | 1846 case HEAP_NUMBER_TYPE: { |
| 1846 // Reuse the HeapNumber value directly as it is already properly | 1847 // Reuse the HeapNumber value directly as it is already properly |
| 1847 // tagged and skip materializing the HeapNumber explicitly. | 1848 // tagged and skip materializing the HeapNumber explicitly. Turn mutable |
| 1849 // heap numbers immutable. | |
| 1848 Handle<Object> object = MaterializeNextValue(); | 1850 Handle<Object> object = MaterializeNextValue(); |
| 1849 if (object_index < prev_materialized_count_) { | 1851 if (object_index < prev_materialized_count_) { |
| 1850 materialized_objects_->Add(Handle<Object>( | 1852 materialized_objects_->Add(Handle<Object>( |
| 1851 previously_materialized_objects_->get(object_index), isolate_)); | 1853 previously_materialized_objects_->get(object_index), isolate_)); |
| 1852 } else { | 1854 } else { |
| 1853 materialized_objects_->Add(object); | 1855 materialized_objects_->Add(object); |
| 1854 } | 1856 } |
| 1855 materialization_value_index_ += kDoubleSize / kPointerSize - 1; | 1857 materialization_value_index_ += kDoubleSize / kPointerSize - 1; |
| 1856 break; | 1858 break; |
| 1857 } | 1859 } |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1898 } | 1900 } |
| 1899 } | 1901 } |
| 1900 | 1902 |
| 1901 return materialized_objects_->at(object_index); | 1903 return materialized_objects_->at(object_index); |
| 1902 } | 1904 } |
| 1903 | 1905 |
| 1904 | 1906 |
| 1905 Handle<Object> Deoptimizer::MaterializeNextValue() { | 1907 Handle<Object> Deoptimizer::MaterializeNextValue() { |
| 1906 int value_index = materialization_value_index_++; | 1908 int value_index = materialization_value_index_++; |
| 1907 Handle<Object> value = materialized_values_->at(value_index); | 1909 Handle<Object> value = materialized_values_->at(value_index); |
| 1910 if (value->IsMutableHeapNumber()) { | |
| 1911 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
| |
| 1912 } | |
| 1908 if (*value == isolate_->heap()->arguments_marker()) { | 1913 if (*value == isolate_->heap()->arguments_marker()) { |
| 1909 value = MaterializeNextHeapObject(); | 1914 value = MaterializeNextHeapObject(); |
| 1910 } | 1915 } |
| 1911 return value; | 1916 return value; |
| 1912 } | 1917 } |
| 1913 | 1918 |
| 1914 | 1919 |
| 1915 void Deoptimizer::MaterializeHeapObjects(JavaScriptFrameIterator* it) { | 1920 void Deoptimizer::MaterializeHeapObjects(JavaScriptFrameIterator* it) { |
| 1916 ASSERT_NE(DEBUGGER, bailout_type_); | 1921 ASSERT_NE(DEBUGGER, bailout_type_); |
| 1917 | 1922 |
| (...skipping 1421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3339 return GetPreviouslyMaterialized(isolate, length); | 3344 return GetPreviouslyMaterialized(isolate, length); |
| 3340 } | 3345 } |
| 3341 | 3346 |
| 3342 Handle<Object> map_object = slot_refs_[current_slot_].GetValue(isolate); | 3347 Handle<Object> map_object = slot_refs_[current_slot_].GetValue(isolate); |
| 3343 Handle<Map> map = Map::GeneralizeAllFieldRepresentations( | 3348 Handle<Map> map = Map::GeneralizeAllFieldRepresentations( |
| 3344 Handle<Map>::cast(map_object), Representation::Tagged()); | 3349 Handle<Map>::cast(map_object), Representation::Tagged()); |
| 3345 current_slot_++; | 3350 current_slot_++; |
| 3346 // TODO(jarin) this should be unified with the code in | 3351 // TODO(jarin) this should be unified with the code in |
| 3347 // Deoptimizer::MaterializeNextHeapObject() | 3352 // Deoptimizer::MaterializeNextHeapObject() |
| 3348 switch (map->instance_type()) { | 3353 switch (map->instance_type()) { |
| 3354 case MUTABLE_HEAP_NUMBER_TYPE: | |
| 3349 case HEAP_NUMBER_TYPE: { | 3355 case HEAP_NUMBER_TYPE: { |
| 3350 // Reuse the HeapNumber value directly as it is already properly | 3356 // Reuse the HeapNumber value directly as it is already properly |
| 3351 // tagged and skip materializing the HeapNumber explicitly. | 3357 // tagged and skip materializing the HeapNumber explicitly. |
| 3352 Handle<Object> object = GetNext(isolate, lvl + 1); | 3358 Handle<Object> object = GetNext(isolate, lvl + 1); |
| 3353 materialized_objects_.Add(object); | 3359 materialized_objects_.Add(object); |
| 3354 // On 32-bit architectures, there is an extra slot there because | 3360 // On 32-bit architectures, there is an extra slot there because |
| 3355 // the escape analysis calculates the number of slots as | 3361 // the escape analysis calculates the number of slots as |
| 3356 // object-size/pointer-size. To account for this, we read out | 3362 // object-size/pointer-size. To account for this, we read out |
| 3357 // any extra slots. | 3363 // any extra slots. |
| 3358 for (int i = 0; i < length - 2; i++) { | 3364 for (int i = 0; i < length - 2; i++) { |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3546 | 3552 |
| 3547 void DeoptimizedFrameInfo::Iterate(ObjectVisitor* v) { | 3553 void DeoptimizedFrameInfo::Iterate(ObjectVisitor* v) { |
| 3548 v->VisitPointer(BitCast<Object**>(&function_)); | 3554 v->VisitPointer(BitCast<Object**>(&function_)); |
| 3549 v->VisitPointers(parameters_, parameters_ + parameters_count_); | 3555 v->VisitPointers(parameters_, parameters_ + parameters_count_); |
| 3550 v->VisitPointers(expression_stack_, expression_stack_ + expression_count_); | 3556 v->VisitPointers(expression_stack_, expression_stack_ + expression_count_); |
| 3551 } | 3557 } |
| 3552 | 3558 |
| 3553 #endif // ENABLE_DEBUGGER_SUPPORT | 3559 #endif // ENABLE_DEBUGGER_SUPPORT |
| 3554 | 3560 |
| 3555 } } // namespace v8::internal | 3561 } } // namespace v8::internal |
| OLD | NEW |