| Index: src/deoptimizer.cc
|
| diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc
|
| index b532e927dda2aad6be18395db6af83c44beb07b7..84e80b9d9a0c86fa8c859f7bb068fbce68f4d121 100644
|
| --- a/src/deoptimizer.cc
|
| +++ b/src/deoptimizer.cc
|
| @@ -1494,7 +1494,7 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator,
|
| }
|
|
|
| intptr_t caller_arg_count = 0;
|
| - bool arg_count_known = descriptor->stack_parameter_count_ == NULL;
|
| + bool arg_count_known = !descriptor->stack_parameter_count_.is_valid();
|
|
|
| // Build the Arguments object for the caller's parameters and a pointer to it.
|
| output_frame_offset -= kPointerSize;
|
| @@ -1614,7 +1614,10 @@ Handle<Object> Deoptimizer::MaterializeNextHeapObject() {
|
| }
|
| } else {
|
| // Dispatch on the instance type of the object to be materialized.
|
| - Handle<Map> map = Handle<Map>::cast(MaterializeNextValue());
|
| + // We also need to make sure that the representation of all fields
|
| + // in the given object are general enough to hold a tagged value.
|
| + Handle<Map> map = Map::GeneralizeAllFieldRepresentations(
|
| + Handle<Map>::cast(MaterializeNextValue()), Representation::Tagged());
|
| switch (map->instance_type()) {
|
| case HEAP_NUMBER_TYPE: {
|
| Handle<HeapNumber> object = isolate_->factory()->NewHeapNumber(0.0);
|
| @@ -1694,29 +1697,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 +1775,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 +1791,7 @@ void Deoptimizer::MaterializeHeapNumbersForDebuggerInspectableFrame(
|
| "for parameter slot #%d\n",
|
| reinterpret_cast<void*>(*num),
|
| d.value(),
|
| - d.slot_address(),
|
| + d.destination(),
|
| index);
|
| }
|
|
|
| @@ -1798,7 +1807,7 @@ void Deoptimizer::MaterializeHeapNumbersForDebuggerInspectableFrame(
|
| "for expression slot #%d\n",
|
| reinterpret_cast<void*>(*num),
|
| d.value(),
|
| - d.slot_address(),
|
| + d.destination(),
|
| index);
|
| }
|
|
|
| @@ -2406,18 +2415,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);
|
| }
|
|
|