| 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_);
|
| }
|
|
|
|
|