| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index 2d4ab93015e4f8a749fc8f4b61fbfe3976933869..57d204fda40f89f3d191f0ff643bbd2328ad002a 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -11199,33 +11199,44 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFrameDetails) {
|
| ASSERT(*scope_info != ScopeInfo::Empty(isolate));
|
|
|
| // Get the locals names and values into a temporary array.
|
| - //
|
| - // TODO(1240907): Hide compiler-introduced stack variables
|
| - // (e.g. .result)? For users of the debugger, they will probably be
|
| - // confusing.
|
| + int local_count = scope_info->LocalCount();
|
| + for (int slot = 0; slot < scope_info->LocalCount(); ++slot) {
|
| + // Hide compiler-introduced temporary variables, whether on the stack or on
|
| + // the context.
|
| + if (scope_info->LocalIsSynthetic(slot))
|
| + local_count--;
|
| + }
|
| +
|
| Handle<FixedArray> locals =
|
| - isolate->factory()->NewFixedArray(scope_info->LocalCount() * 2);
|
| + isolate->factory()->NewFixedArray(local_count * 2);
|
|
|
| // Fill in the values of the locals.
|
| + int local = 0;
|
| int i = 0;
|
| for (; i < scope_info->StackLocalCount(); ++i) {
|
| // Use the value from the stack.
|
| - locals->set(i * 2, scope_info->LocalName(i));
|
| - locals->set(i * 2 + 1, frame_inspector.GetExpression(i));
|
| + if (scope_info->LocalIsSynthetic(i))
|
| + continue;
|
| + locals->set(local * 2, scope_info->LocalName(i));
|
| + locals->set(local * 2 + 1, frame_inspector.GetExpression(i));
|
| + local++;
|
| }
|
| - if (i < scope_info->LocalCount()) {
|
| + if (local < local_count) {
|
| // Get the context containing declarations.
|
| Handle<Context> context(
|
| Context::cast(it.frame()->context())->declaration_context());
|
| for (; i < scope_info->LocalCount(); ++i) {
|
| + if (scope_info->LocalIsSynthetic(i))
|
| + continue;
|
| Handle<String> name(scope_info->LocalName(i));
|
| VariableMode mode;
|
| InitializationFlag init_flag;
|
| - locals->set(i * 2, *name);
|
| + locals->set(local * 2, *name);
|
| int context_slot_index =
|
| scope_info->ContextSlotIndex(*name, &mode, &init_flag);
|
| Object* value = context->get(context_slot_index);
|
| - locals->set(i * 2 + 1, value);
|
| + locals->set(local * 2 + 1, value);
|
| + local++;
|
| }
|
| }
|
|
|
| @@ -11286,7 +11297,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFrameDetails) {
|
|
|
| // Calculate the size of the result.
|
| int details_size = kFrameDetailsFirstDynamicIndex +
|
| - 2 * (argument_count + scope_info->LocalCount()) +
|
| + 2 * (argument_count + local_count) +
|
| (at_return ? 1 : 0);
|
| Handle<FixedArray> details = isolate->factory()->NewFixedArray(details_size);
|
|
|
| @@ -11301,7 +11312,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFrameDetails) {
|
|
|
| // Add the locals count
|
| details->set(kFrameDetailsLocalCountIndex,
|
| - Smi::FromInt(scope_info->LocalCount()));
|
| + Smi::FromInt(local_count));
|
|
|
| // Add the source position.
|
| if (position != RelocInfo::kNoPosition) {
|
| @@ -11352,7 +11363,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFrameDetails) {
|
| }
|
|
|
| // Add locals name and value from the temporary copy from the function frame.
|
| - for (int i = 0; i < scope_info->LocalCount() * 2; i++) {
|
| + for (int i = 0; i < local_count * 2; i++) {
|
| details->set(details_index++, locals->get(i));
|
| }
|
|
|
| @@ -11433,6 +11444,7 @@ static MaybeHandle<JSObject> MaterializeStackLocalsWithFrameInspector(
|
|
|
| // Second fill all stack locals.
|
| for (int i = 0; i < scope_info->StackLocalCount(); ++i) {
|
| + if (scope_info->LocalIsSynthetic(i)) continue;
|
| Handle<String> name(scope_info->StackLocalName(i));
|
| Handle<Object> value(frame_inspector->GetExpression(i), isolate);
|
| if (value->IsTheHole()) continue;
|
| @@ -11477,6 +11489,7 @@ static void UpdateStackLocalsFromMaterializedObject(Isolate* isolate,
|
|
|
| // Stack locals.
|
| for (int i = 0; i < scope_info->StackLocalCount(); ++i) {
|
| + if (scope_info->LocalIsSynthetic(i)) continue;
|
| if (frame->GetExpression(i)->IsTheHole()) continue;
|
| HandleScope scope(isolate);
|
| Handle<Object> value = Object::GetPropertyOrElement(
|
|
|