Index: src/deoptimizer.cc |
diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc |
index 1151449eadb9277165f31d50eb550b75c22f806e..7eebef85d6cd60744110caf062cb61f5bf7bbba7 100644 |
--- a/src/deoptimizer.cc |
+++ b/src/deoptimizer.cc |
@@ -161,8 +161,7 @@ DeoptimizedFrameInfo* Deoptimizer::DebuggerInspectableFrame( |
// Get the "simulated" top and size for the requested frame. |
Address top = |
reinterpret_cast<Address>(deoptimizer->output_[frame_index]->GetTop()); |
- unsigned size = |
- deoptimizer->output_[frame_index]->GetFrameSize() / kPointerSize; |
+ unsigned size = deoptimizer->output_[frame_index]->GetFrameSize(); |
// Done with the GC-unsafe frame descriptions. This re-enables allocation. |
deoptimizer->DeleteFrameDescriptions(); |
@@ -557,17 +556,27 @@ void Deoptimizer::MaterializeHeapNumbersForDebuggerInspectableFrame( |
Address slot = d.slot_address(); |
if (top <= slot && slot < top + size) { |
Handle<Object> num = isolate_->factory()->NewNumber(d.value()); |
- int expression_index = static_cast<int>( |
+ // Calculate the index with the botton of the expression stack |
+ // at index 0, and the fixed part (including incoming arguments) |
+ // at negative indexes. |
+ int index = static_cast<int>( |
info->expression_count_ - (slot - top) / kPointerSize - 1); |
if (FLAG_trace_deopt) { |
PrintF("Materializing a new heap number %p [%e] in slot %p" |
- "for expression stack index %d\n", |
+ "for stack index %d\n", |
reinterpret_cast<void*>(*num), |
d.value(), |
d.slot_address(), |
- expression_index); |
+ index); |
+ } |
+ if (index >=0) { |
+ info->SetExpression(index, *num); |
+ } else { |
+ // Calculate parameter index subtracting one for the receiver. |
+ int parameter_index = |
+ index + size / kPointerSize - info->expression_count_ - 1; |
+ info->SetParameter(parameter_index, *num); |
} |
- info->SetExpression(expression_index, *num); |
} |
} |
} |
@@ -1126,6 +1135,22 @@ unsigned FrameDescription::GetOffsetFromSlotIndex(Deoptimizer* deoptimizer, |
} |
+int FrameDescription::ComputeParametersCount() { |
+ return function_->shared()->formal_parameter_count(); |
+} |
+ |
+ |
+Object* FrameDescription::GetParameter(Deoptimizer* deoptimizer, int index) { |
+ ASSERT_EQ(Code::FUNCTION, kind_); |
+ ASSERT(index >= 0); |
+ ASSERT(index < ComputeParametersCount()); |
+ // The slot indexes for incoming arguments are negative. |
+ unsigned offset = GetOffsetFromSlotIndex(deoptimizer, |
+ index - ComputeParametersCount()); |
+ return reinterpret_cast<Object*>(*GetFrameSlotPointer(offset)); |
+} |
+ |
+ |
unsigned FrameDescription::GetExpressionCount(Deoptimizer* deoptimizer) { |
ASSERT_EQ(Code::FUNCTION, kind_); |
unsigned size = GetFrameSize() - deoptimizer->ComputeFixedSize(GetFunction()); |
@@ -1417,6 +1442,11 @@ DeoptimizedFrameInfo::DeoptimizedFrameInfo( |
FrameDescription* output_frame = deoptimizer->output_[frame_index]; |
SetFunction(output_frame->GetFunction()); |
expression_count_ = output_frame->GetExpressionCount(deoptimizer); |
+ parameters_count_ = output_frame->ComputeParametersCount(); |
+ parameters_ = new Object*[expression_count_]; |
+ for (int i = 0; i < parameters_count_; i++) { |
+ SetParameter(i, output_frame->GetParameter(deoptimizer, i)); |
+ } |
expression_stack_ = new Object*[expression_count_]; |
for (int i = 0; i < expression_count_; i++) { |
SetExpression(i, output_frame->GetExpression(deoptimizer, i)); |
@@ -1430,6 +1460,7 @@ DeoptimizedFrameInfo::~DeoptimizedFrameInfo() { |
void DeoptimizedFrameInfo::Iterate(ObjectVisitor* v) { |
v->VisitPointer(reinterpret_cast<Object**>(&function_)); |
+ v->VisitPointers(parameters_, parameters_ + parameters_count_); |
v->VisitPointers(expression_stack_, expression_stack_ + expression_count_); |
} |