Index: src/deoptimizer.cc |
diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc |
index b532e927dda2aad6be18395db6af83c44beb07b7..819b5e94a30a1753ee4c035cb81724e2c8d6bbee 100644 |
--- a/src/deoptimizer.cc |
+++ b/src/deoptimizer.cc |
@@ -1694,29 +1694,35 @@ void Deoptimizer::MaterializeHeapObjects(JavaScriptFrameIterator* it) { |
// output frames are used to materialize arguments objects later on they need |
// to already contain valid heap numbers. |
for (int i = 0; i < deferred_heap_numbers_.length(); i++) { |
- HeapNumberMaterializationDescriptor d = deferred_heap_numbers_[i]; |
+ HeapNumberMaterializationDescriptor<Address> d = deferred_heap_numbers_[i]; |
Handle<Object> num = isolate_->factory()->NewNumber(d.value()); |
if (trace_) { |
PrintF("Materialized a new heap number %p [%e] in slot %p\n", |
reinterpret_cast<void*>(*num), |
d.value(), |
- d.slot_address()); |
+ d.destination()); |
} |
- Memory::Object_at(d.slot_address()) = *num; |
+ Memory::Object_at(d.destination()) = *num; |
} |
// Materialize all heap numbers required for arguments/captured objects. |
- for (int i = 0; i < values.length(); i++) { |
- if (!values.at(i)->IsTheHole()) continue; |
- double double_value = deferred_objects_double_values_[i]; |
- Handle<Object> num = isolate_->factory()->NewNumber(double_value); |
+ for (int i = 0; i < deferred_objects_double_values_.length(); i++) { |
+ HeapNumberMaterializationDescriptor<int> d = |
+ deferred_objects_double_values_[i]; |
+ Handle<Object> num = isolate_->factory()->NewNumber(d.value()); |
if (trace_) { |
- PrintF("Materialized a new heap number %p [%e] for object\n", |
- reinterpret_cast<void*>(*num), double_value); |
+ PrintF("Materialized a new heap number %p [%e] for object at %d\n", |
+ reinterpret_cast<void*>(*num), |
+ d.value(), |
+ d.destination()); |
} |
- values.Set(i, num); |
+ ASSERT(values.at(d.destination())->IsTheHole()); |
+ values.Set(d.destination(), num); |
} |
+ // Play it safe and clear all object double values before we continue. |
+ deferred_objects_double_values_.Clear(); |
+ |
// Materialize arguments/captured objects. |
if (!deferred_objects_.is_empty()) { |
List<Handle<Object> > materialized_objects(deferred_objects_.length()); |
@@ -1766,11 +1772,11 @@ void Deoptimizer::MaterializeHeapNumbersForDebuggerInspectableFrame( |
Address parameters_bottom = parameters_top + parameters_size; |
Address expressions_bottom = expressions_top + expressions_size; |
for (int i = 0; i < deferred_heap_numbers_.length(); i++) { |
- HeapNumberMaterializationDescriptor d = deferred_heap_numbers_[i]; |
+ HeapNumberMaterializationDescriptor<Address> d = deferred_heap_numbers_[i]; |
// Check of the heap number to materialize actually belong to the frame |
// being extracted. |
- Address slot = d.slot_address(); |
+ Address slot = d.destination(); |
if (parameters_top <= slot && slot < parameters_bottom) { |
Handle<Object> num = isolate_->factory()->NewNumber(d.value()); |
@@ -1782,7 +1788,7 @@ void Deoptimizer::MaterializeHeapNumbersForDebuggerInspectableFrame( |
"for parameter slot #%d\n", |
reinterpret_cast<void*>(*num), |
d.value(), |
- d.slot_address(), |
+ d.destination(), |
index); |
} |
@@ -1798,7 +1804,7 @@ void Deoptimizer::MaterializeHeapNumbersForDebuggerInspectableFrame( |
"for expression slot #%d\n", |
reinterpret_cast<void*>(*num), |
d.value(), |
- d.slot_address(), |
+ d.destination(), |
index); |
} |
@@ -2406,18 +2412,19 @@ void Deoptimizer::AddObjectDuplication(intptr_t slot, int object_index) { |
void Deoptimizer::AddObjectTaggedValue(intptr_t value) { |
deferred_objects_tagged_values_.Add(reinterpret_cast<Object*>(value)); |
- deferred_objects_double_values_.Add(isolate()->heap()->nan_value()->value()); |
} |
void Deoptimizer::AddObjectDoubleValue(double value) { |
deferred_objects_tagged_values_.Add(isolate()->heap()->the_hole_value()); |
- deferred_objects_double_values_.Add(value); |
+ HeapNumberMaterializationDescriptor<int> value_desc( |
+ deferred_objects_tagged_values_.length() - 1, value); |
+ deferred_objects_double_values_.Add(value_desc); |
} |
void Deoptimizer::AddDoubleValue(intptr_t slot_address, double value) { |
- HeapNumberMaterializationDescriptor value_desc( |
+ HeapNumberMaterializationDescriptor<Address> value_desc( |
reinterpret_cast<Address>(slot_address), value); |
deferred_heap_numbers_.Add(value_desc); |
} |