Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/runtime/runtime-utils.h" | 5 #include "src/runtime/runtime-utils.h" |
| 6 | 6 |
| 7 #include "src/arguments.h" | 7 #include "src/arguments.h" |
| 8 #include "src/debug/debug-evaluate.h" | 8 #include "src/debug/debug-evaluate.h" |
| 9 #include "src/debug/debug-frames.h" | 9 #include "src/debug/debug-frames.h" |
| 10 #include "src/debug/debug-scopes.h" | 10 #include "src/debug/debug-scopes.h" |
| (...skipping 594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 605 // Get the locals names and values into a temporary array. | 605 // Get the locals names and values into a temporary array. |
| 606 int local_count = scope_info->LocalCount(); | 606 int local_count = scope_info->LocalCount(); |
| 607 for (int slot = 0; slot < scope_info->LocalCount(); ++slot) { | 607 for (int slot = 0; slot < scope_info->LocalCount(); ++slot) { |
| 608 // Hide compiler-introduced temporary variables, whether on the stack or on | 608 // Hide compiler-introduced temporary variables, whether on the stack or on |
| 609 // the context. | 609 // the context. |
| 610 if (ScopeInfo::VariableIsSynthetic(scope_info->LocalName(slot))) { | 610 if (ScopeInfo::VariableIsSynthetic(scope_info->LocalName(slot))) { |
| 611 local_count--; | 611 local_count--; |
| 612 } | 612 } |
| 613 } | 613 } |
| 614 | 614 |
| 615 Handle<FixedArray> locals = | 615 List<Handle<Object> > locals; |
|
jgruber
2016/07/11 13:59:48
Nit: We could use C++11 style List<Handle<Object>>
| |
| 616 isolate->factory()->NewFixedArray(local_count * 2); | |
| 617 | |
| 618 // Fill in the values of the locals. | 616 // Fill in the values of the locals. |
| 619 int local = 0; | |
| 620 int i = 0; | 617 int i = 0; |
| 621 for (; i < scope_info->StackLocalCount(); ++i) { | 618 for (; i < scope_info->StackLocalCount(); ++i) { |
| 622 // Use the value from the stack. | 619 // Use the value from the stack. |
| 623 if (ScopeInfo::VariableIsSynthetic(scope_info->LocalName(i))) continue; | 620 if (ScopeInfo::VariableIsSynthetic(scope_info->LocalName(i))) continue; |
| 624 locals->set(local * 2, scope_info->LocalName(i)); | 621 locals.Add(Handle<String>(scope_info->LocalName(i), isolate)); |
| 625 Handle<Object> value = | 622 Handle<Object> value = |
| 626 frame_inspector.GetExpression(scope_info->StackLocalIndex(i)); | 623 frame_inspector.GetExpression(scope_info->StackLocalIndex(i)); |
| 627 // TODO(yangguo): We convert optimized out values to {undefined} when they | 624 // TODO(yangguo): We convert optimized out values to {undefined} when they |
| 628 // are passed to the debugger. Eventually we should handle them somehow. | 625 // are passed to the debugger. Eventually we should handle them somehow. |
| 629 if (value->IsOptimizedOut(isolate)) { | 626 if (value->IsOptimizedOut(isolate)) { |
| 630 value = isolate->factory()->undefined_value(); | 627 value = isolate->factory()->undefined_value(); |
| 631 } | 628 } |
| 632 locals->set(local * 2 + 1, *value); | 629 locals.Add(value); |
| 633 local++; | |
| 634 } | 630 } |
| 635 if (local < local_count) { | 631 if (locals.length() < local_count * 2) { |
| 636 // Get the context containing declarations. | 632 // Get the context containing declarations. |
| 637 Handle<Context> context( | 633 Handle<Context> context( |
| 638 Handle<Context>::cast(frame_inspector.GetContext())->closure_context()); | 634 Handle<Context>::cast(frame_inspector.GetContext())->closure_context()); |
| 639 for (; i < scope_info->LocalCount(); ++i) { | 635 for (; i < scope_info->LocalCount(); ++i) { |
| 640 Handle<String> name(scope_info->LocalName(i)); | 636 Handle<String> name(scope_info->LocalName(i)); |
| 641 if (ScopeInfo::VariableIsSynthetic(*name)) continue; | 637 if (ScopeInfo::VariableIsSynthetic(*name)) continue; |
| 642 VariableMode mode; | 638 VariableMode mode; |
| 643 InitializationFlag init_flag; | 639 InitializationFlag init_flag; |
| 644 MaybeAssignedFlag maybe_assigned_flag; | 640 MaybeAssignedFlag maybe_assigned_flag; |
| 645 locals->set(local * 2, *name); | 641 locals.Add(name); |
| 646 int context_slot_index = ScopeInfo::ContextSlotIndex( | 642 int context_slot_index = ScopeInfo::ContextSlotIndex( |
| 647 scope_info, name, &mode, &init_flag, &maybe_assigned_flag); | 643 scope_info, name, &mode, &init_flag, &maybe_assigned_flag); |
| 648 Object* value = context->get(context_slot_index); | 644 Object* value = context->get(context_slot_index); |
| 649 locals->set(local * 2 + 1, value); | 645 locals.Add(Handle<Object>(value, isolate)); |
| 650 local++; | |
| 651 } | 646 } |
| 652 } | 647 } |
| 653 | 648 |
| 654 // Check whether this frame is positioned at return. If not top | 649 // Check whether this frame is positioned at return. If not top |
| 655 // frame or if the frame is optimized it cannot be at a return. | 650 // frame or if the frame is optimized it cannot be at a return. |
| 656 bool at_return = false; | 651 bool at_return = false; |
| 657 if (!is_optimized && index == 0) { | 652 if (!is_optimized && index == 0) { |
| 658 at_return = isolate->debug()->IsBreakAtReturn(it.javascript_frame()); | 653 at_return = isolate->debug()->IsBreakAtReturn(it.javascript_frame()); |
| 659 } | 654 } |
| 660 | 655 |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 746 // Parameter value. | 741 // Parameter value. |
| 747 if (i < frame_inspector.GetParametersCount()) { | 742 if (i < frame_inspector.GetParametersCount()) { |
| 748 // Get the value from the stack. | 743 // Get the value from the stack. |
| 749 details->set(details_index++, *(frame_inspector.GetParameter(i))); | 744 details->set(details_index++, *(frame_inspector.GetParameter(i))); |
| 750 } else { | 745 } else { |
| 751 details->set(details_index++, heap->undefined_value()); | 746 details->set(details_index++, heap->undefined_value()); |
| 752 } | 747 } |
| 753 } | 748 } |
| 754 | 749 |
| 755 // Add locals name and value from the temporary copy from the function frame. | 750 // Add locals name and value from the temporary copy from the function frame. |
| 756 for (int i = 0; i < local_count * 2; i++) { | 751 for (const auto& local : locals) details->set(details_index++, *local); |
| 757 details->set(details_index++, locals->get(i)); | |
| 758 } | |
| 759 | 752 |
| 760 // Add the value being returned. | 753 // Add the value being returned. |
| 761 if (at_return) { | 754 if (at_return) { |
| 762 details->set(details_index++, *return_value); | 755 details->set(details_index++, *return_value); |
| 763 } | 756 } |
| 764 | 757 |
| 765 // Add the receiver (same as in function frame). | 758 // Add the receiver (same as in function frame). |
| 766 Handle<Object> receiver(it.frame()->receiver(), isolate); | 759 Handle<Object> receiver(it.frame()->receiver(), isolate); |
| 767 DCHECK(!function->shared()->IsBuiltin()); | 760 DCHECK(!function->shared()->IsBuiltin()); |
| 768 DCHECK_IMPLIES(is_sloppy(shared->language_mode()), receiver->IsJSReceiver()); | 761 DCHECK_IMPLIES(is_sloppy(shared->language_mode()), receiver->IsJSReceiver()); |
| (...skipping 1050 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1819 Handle<Script> script = Handle<Script>(Script::cast(script_val->value())); | 1812 Handle<Script> script = Handle<Script>(Script::cast(script_val->value())); |
| 1820 | 1813 |
| 1821 Handle<wasm::WasmDebugInfo> debug_info = | 1814 Handle<wasm::WasmDebugInfo> debug_info = |
| 1822 wasm::GetDebugInfo(handle(script->wasm_object(), isolate)); | 1815 wasm::GetDebugInfo(handle(script->wasm_object(), isolate)); |
| 1823 return *wasm::WasmDebugInfo::DisassembleFunction( | 1816 return *wasm::WasmDebugInfo::DisassembleFunction( |
| 1824 debug_info, script->wasm_function_index()); | 1817 debug_info, script->wasm_function_index()); |
| 1825 } | 1818 } |
| 1826 | 1819 |
| 1827 } // namespace internal | 1820 } // namespace internal |
| 1828 } // namespace v8 | 1821 } // namespace v8 |
| OLD | NEW |