Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(235)

Side by Side Diff: src/debug/debug.cc

Issue 2633803002: [inspector] implemented blackboxing inside v8 (Closed)
Patch Set: addressed comments Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/debug/debug.h ('k') | src/debug/debug-interface.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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/debug/debug.h" 5 #include "src/debug/debug.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "src/api.h" 9 #include "src/api.h"
10 #include "src/arguments.h" 10 #include "src/arguments.h"
(...skipping 822 matching lines...) Expand 10 before | Expand all | Expand 10 after
833 while (debug_info_list_ != NULL) { 833 while (debug_info_list_ != NULL) {
834 RemoveDebugInfoAndClearFromShared(debug_info_list_->debug_info()); 834 RemoveDebugInfoAndClearFromShared(debug_info_list_->debug_info());
835 } 835 }
836 } 836 }
837 837
838 void Debug::FloodWithOneShot(Handle<JSFunction> function, 838 void Debug::FloodWithOneShot(Handle<JSFunction> function,
839 BreakLocatorType type) { 839 BreakLocatorType type) {
840 // Debug utility functions are not subject to debugging. 840 // Debug utility functions are not subject to debugging.
841 if (function->native_context() == *debug_context()) return; 841 if (function->native_context() == *debug_context()) return;
842 842
843 if (!function->shared()->IsSubjectToDebugging()) { 843 if (!function->shared()->IsSubjectToDebugging() ||
844 IsBlackboxed(function->shared())) {
844 // Builtin functions are not subject to stepping, but need to be 845 // Builtin functions are not subject to stepping, but need to be
845 // deoptimized, because optimized code does not check for debug 846 // deoptimized, because optimized code does not check for debug
846 // step in at call sites. 847 // step in at call sites.
847 Deoptimizer::DeoptimizeFunction(*function); 848 Deoptimizer::DeoptimizeFunction(*function);
848 return; 849 return;
849 } 850 }
850 // Make sure the function is compiled and has set up the debug info. 851 // Make sure the function is compiled and has set up the debug info.
851 Handle<SharedFunctionInfo> shared(function->shared()); 852 Handle<SharedFunctionInfo> shared(function->shared());
852 if (!EnsureDebugInfo(shared, function)) { 853 if (!EnsureDebugInfo(shared, function)) {
853 // Return if we failed to retrieve the debug info. 854 // Return if we failed to retrieve the debug info.
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
952 if (last_step_action() == StepNext || last_step_action() == StepOut) { 953 if (last_step_action() == StepNext || last_step_action() == StepOut) {
953 while (!it.done()) { 954 while (!it.done()) {
954 Address current_fp = it.frame()->UnpaddedFP(); 955 Address current_fp = it.frame()->UnpaddedFP();
955 if (current_fp >= thread_local_.target_fp_) break; 956 if (current_fp >= thread_local_.target_fp_) break;
956 it.Advance(); 957 it.Advance();
957 } 958 }
958 } 959 }
959 960
960 // Find the closest Javascript frame we can flood with one-shots. 961 // Find the closest Javascript frame we can flood with one-shots.
961 while (!it.done() && 962 while (!it.done() &&
962 !it.frame()->function()->shared()->IsSubjectToDebugging()) { 963 (!it.frame()->function()->shared()->IsSubjectToDebugging() ||
964 IsBlackboxed(it.frame()->function()->shared()))) {
963 it.Advance(); 965 it.Advance();
964 } 966 }
965 967
966 if (it.done()) return; // No suitable Javascript catch handler. 968 if (it.done()) return; // No suitable Javascript catch handler.
967 969
968 FloodWithOneShot(Handle<JSFunction>(it.frame()->function())); 970 FloodWithOneShot(Handle<JSFunction>(it.frame()->function()));
969 } 971 }
970 972
971 973
972 void Debug::PrepareStep(StepAction step_action) { 974 void Debug::PrepareStep(StepAction step_action) {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1012 return; 1014 return;
1013 } 1015 }
1014 1016
1015 Handle<DebugInfo> debug_info(shared->GetDebugInfo()); 1017 Handle<DebugInfo> debug_info(shared->GetDebugInfo());
1016 BreakLocation location = BreakLocation::FromFrame(debug_info, frame); 1018 BreakLocation location = BreakLocation::FromFrame(debug_info, frame);
1017 1019
1018 // Any step at a return is a step-out. 1020 // Any step at a return is a step-out.
1019 if (location.IsReturn()) step_action = StepOut; 1021 if (location.IsReturn()) step_action = StepOut;
1020 // A step-next at a tail call is a step-out. 1022 // A step-next at a tail call is a step-out.
1021 if (location.IsTailCall() && step_action == StepNext) step_action = StepOut; 1023 if (location.IsTailCall() && step_action == StepNext) step_action = StepOut;
1024 // A step-next in blackboxed function is a step-out.
1025 if (step_action == StepNext && IsBlackboxed(shared)) step_action = StepOut;
1022 1026
1023 thread_local_.last_statement_position_ = 1027 thread_local_.last_statement_position_ =
1024 summary.abstract_code()->SourceStatementPosition(summary.code_offset()); 1028 summary.abstract_code()->SourceStatementPosition(summary.code_offset());
1025 thread_local_.last_fp_ = frame->UnpaddedFP(); 1029 thread_local_.last_fp_ = frame->UnpaddedFP();
1026 // No longer perform the current async step. 1030 // No longer perform the current async step.
1027 clear_suspended_generator(); 1031 clear_suspended_generator();
1028 1032
1029 switch (step_action) { 1033 switch (step_action) {
1030 case StepNone: 1034 case StepNone:
1031 UNREACHABLE(); 1035 UNREACHABLE();
1032 break; 1036 break;
1033 case StepOut: 1037 case StepOut:
1034 // Advance to caller frame. 1038 // Advance to caller frame.
1035 frames_it.Advance(); 1039 frames_it.Advance();
1036 // Skip native and extension functions on the stack. 1040 // Skip native and extension functions on the stack.
1037 while (!frames_it.done() && 1041 while (
1038 !frames_it.frame()->function()->shared()->IsSubjectToDebugging()) { 1042 !frames_it.done() &&
1043 (!frames_it.frame()->function()->shared()->IsSubjectToDebugging() ||
1044 IsBlackboxed(frames_it.frame()->function()->shared()))) {
1039 // Builtin functions are not subject to stepping, but need to be 1045 // Builtin functions are not subject to stepping, but need to be
1040 // deoptimized to include checks for step-in at call sites. 1046 // deoptimized to include checks for step-in at call sites.
1041 Deoptimizer::DeoptimizeFunction(frames_it.frame()->function()); 1047 Deoptimizer::DeoptimizeFunction(frames_it.frame()->function());
1042 frames_it.Advance(); 1048 frames_it.Advance();
1043 } 1049 }
1044 if (!frames_it.done()) { 1050 if (!frames_it.done()) {
1045 // Fill the caller function to return to with one-shot break points. 1051 // Fill the caller function to return to with one-shot break points.
1046 Handle<JSFunction> caller_function(frames_it.frame()->function()); 1052 Handle<JSFunction> caller_function(frames_it.frame()->function());
1047 FloodWithOneShot(caller_function); 1053 FloodWithOneShot(caller_function);
1048 thread_local_.target_fp_ = frames_it.frame()->UnpaddedFP(); 1054 thread_local_.target_fp_ = frames_it.frame()->UnpaddedFP();
(...skipping 695 matching lines...) Expand 10 before | Expand all | Expand 10 after
1744 // Bail out if exception breaks are not active 1750 // Bail out if exception breaks are not active
1745 if (uncaught) { 1751 if (uncaught) {
1746 // Uncaught exceptions are reported by either flags. 1752 // Uncaught exceptions are reported by either flags.
1747 if (!(break_on_uncaught_exception_ || break_on_exception_)) return; 1753 if (!(break_on_uncaught_exception_ || break_on_exception_)) return;
1748 } else { 1754 } else {
1749 // Caught exceptions are reported is activated. 1755 // Caught exceptions are reported is activated.
1750 if (!break_on_exception_) return; 1756 if (!break_on_exception_) return;
1751 } 1757 }
1752 1758
1753 { 1759 {
1754 // Check whether the break location is muted.
1755 JavaScriptFrameIterator it(isolate_); 1760 JavaScriptFrameIterator it(isolate_);
1756 if (!it.done() && IsMutedAtCurrentLocation(it.frame())) return; 1761 // Check whether the top frame is blackboxed or the break location is muted.
1762 if (!it.done() && (IsBlackboxed(it.frame()->function()->shared()) ||
1763 IsMutedAtCurrentLocation(it.frame()))) {
1764 return;
1765 }
1757 } 1766 }
1758 1767
1759 DebugScope debug_scope(this); 1768 DebugScope debug_scope(this);
1760 if (debug_scope.failed()) return; 1769 if (debug_scope.failed()) return;
1761 1770
1762 if (debug_event_listener_) { 1771 if (debug_delegate_) {
1763 HandleScope scope(isolate_); 1772 HandleScope scope(isolate_);
1764 1773
1765 // Create the execution state. 1774 // Create the execution state.
1766 Handle<Object> exec_state; 1775 Handle<Object> exec_state;
1767 // Bail out and don't call debugger if exception. 1776 // Bail out and don't call debugger if exception.
1768 if (!MakeExecutionState().ToHandle(&exec_state)) return; 1777 if (!MakeExecutionState().ToHandle(&exec_state)) return;
1769 1778
1770 debug_event_listener_->ExceptionThrown( 1779 debug_delegate_->ExceptionThrown(
1771 GetDebugEventContext(isolate_), 1780 GetDebugEventContext(isolate_),
1772 v8::Utils::ToLocal(Handle<JSObject>::cast(exec_state)), 1781 v8::Utils::ToLocal(Handle<JSObject>::cast(exec_state)),
1773 v8::Utils::ToLocal(exception), promise->IsJSObject(), uncaught); 1782 v8::Utils::ToLocal(exception), promise->IsJSObject(), uncaught);
1774 if (!non_inspector_listener_exists()) return; 1783 if (!non_inspector_listener_exists()) return;
1775 } 1784 }
1776 1785
1777 // Create the event data object. 1786 // Create the event data object.
1778 Handle<Object> event_data; 1787 Handle<Object> event_data;
1779 // Bail out and don't call debugger if exception. 1788 // Bail out and don't call debugger if exception.
1780 if (!MakeExceptionEvent( 1789 if (!MakeExceptionEvent(
1781 exception, uncaught, promise).ToHandle(&event_data)) { 1790 exception, uncaught, promise).ToHandle(&event_data)) {
1782 return; 1791 return;
1783 } 1792 }
1784 1793
1785 // Process debug event. 1794 // Process debug event.
1786 ProcessDebugEvent(v8::Exception, Handle<JSObject>::cast(event_data)); 1795 ProcessDebugEvent(v8::Exception, Handle<JSObject>::cast(event_data));
1787 // Return to continue execution from where the exception was thrown. 1796 // Return to continue execution from where the exception was thrown.
1788 } 1797 }
1789 1798
1790 void Debug::OnDebugBreak(Handle<Object> break_points_hit) { 1799 void Debug::OnDebugBreak(Handle<Object> break_points_hit) {
1791 // The caller provided for DebugScope. 1800 // The caller provided for DebugScope.
1792 AssertDebugContext(); 1801 AssertDebugContext();
1793 // Bail out if there is no listener for this event 1802 // Bail out if there is no listener for this event
1794 if (ignore_events()) return; 1803 if (ignore_events()) return;
1795 1804
1796 #ifdef DEBUG 1805 #ifdef DEBUG
1797 PrintBreakLocation(); 1806 PrintBreakLocation();
1798 #endif // DEBUG 1807 #endif // DEBUG
1799 1808
1800 if (debug_event_listener_) { 1809 if (debug_delegate_) {
1801 HandleScope scope(isolate_); 1810 HandleScope scope(isolate_);
1802 1811
1803 // Create the execution state. 1812 // Create the execution state.
1804 Handle<Object> exec_state; 1813 Handle<Object> exec_state;
1805 // Bail out and don't call debugger if exception. 1814 // Bail out and don't call debugger if exception.
1806 if (!MakeExecutionState().ToHandle(&exec_state)) return; 1815 if (!MakeExecutionState().ToHandle(&exec_state)) return;
1807 1816
1808 bool previous = in_debug_event_listener_; 1817 bool previous = in_debug_event_listener_;
1809 in_debug_event_listener_ = true; 1818 in_debug_event_listener_ = true;
1810 debug_event_listener_->BreakProgramRequested( 1819 debug_delegate_->BreakProgramRequested(
1811 GetDebugEventContext(isolate_), 1820 GetDebugEventContext(isolate_),
1812 v8::Utils::ToLocal(Handle<JSObject>::cast(exec_state)), 1821 v8::Utils::ToLocal(Handle<JSObject>::cast(exec_state)),
1813 v8::Utils::ToLocal(break_points_hit)); 1822 v8::Utils::ToLocal(break_points_hit));
1814 in_debug_event_listener_ = previous; 1823 in_debug_event_listener_ = previous;
1815 if (!non_inspector_listener_exists()) return; 1824 if (!non_inspector_listener_exists()) return;
1816 } 1825 }
1817 1826
1818 HandleScope scope(isolate_); 1827 HandleScope scope(isolate_);
1819 // Create the event data object. 1828 // Create the event data object.
1820 Handle<Object> event_data; 1829 Handle<Object> event_data;
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1884 // Since we holding promise when at least one microtask is scheduled (inside 1893 // Since we holding promise when at least one microtask is scheduled (inside
1885 // PromiseReactionJobInfo), we can send cancel event in weak callback. 1894 // PromiseReactionJobInfo), we can send cancel event in weak callback.
1886 GlobalHandles::MakeWeak( 1895 GlobalHandles::MakeWeak(
1887 global_handle.location(), 1896 global_handle.location(),
1888 new CollectedCallbackData(global_handle.location(), async_id->value(), 1897 new CollectedCallbackData(global_handle.location(), async_id->value(),
1889 this, isolate_), 1898 this, isolate_),
1890 &ResetPromiseHandle, v8::WeakCallbackType::kParameter); 1899 &ResetPromiseHandle, v8::WeakCallbackType::kParameter);
1891 return async_id->value(); 1900 return async_id->value();
1892 } 1901 }
1893 1902
1903 namespace {
1904 debug::Location GetDebugLocation(Handle<Script> script, int source_position) {
1905 Script::PositionInfo info;
1906 Script::GetPositionInfo(script, source_position, &info, Script::WITH_OFFSET);
1907 return debug::Location(info.line, info.column);
1908 }
1909 } // namespace
1910
1911 bool Debug::IsBlackboxed(SharedFunctionInfo* shared) {
1912 HandleScope scope(isolate_);
1913 Handle<SharedFunctionInfo> shared_function_info(shared);
1914 return IsBlackboxed(shared_function_info);
1915 }
1916
1917 bool Debug::IsBlackboxed(Handle<SharedFunctionInfo> shared) {
1918 if (!debug_delegate_) return false;
1919 if (!shared->computed_debug_is_blackboxed()) {
1920 bool is_blackboxed = false;
1921 if (shared->script()->IsScript()) {
1922 HandleScope handle_scope(isolate_);
1923 Handle<Script> script(Script::cast(shared->script()));
1924 if (script->type() == i::Script::TYPE_NORMAL) {
1925 debug::Location start =
1926 GetDebugLocation(script, shared->start_position());
1927 debug::Location end = GetDebugLocation(script, shared->end_position());
1928 is_blackboxed = debug_delegate_->IsFunctionBlackboxed(
1929 ToApiHandle<debug::Script>(script), start, end);
1930 }
1931 }
1932 shared->set_debug_is_blackboxed(is_blackboxed);
1933 shared->set_computed_debug_is_blackboxed(true);
1934 }
1935 return shared->debug_is_blackboxed();
1936 }
1937
1894 void Debug::OnAsyncTaskEvent(debug::PromiseDebugActionType type, int id) { 1938 void Debug::OnAsyncTaskEvent(debug::PromiseDebugActionType type, int id) {
1895 if (in_debug_scope() || ignore_events()) return; 1939 if (in_debug_scope() || ignore_events()) return;
1896 1940
1897 if (debug_event_listener_) { 1941 if (debug_delegate_) {
1898 debug_event_listener_->PromiseEventOccurred(type, id); 1942 debug_delegate_->PromiseEventOccurred(type, id);
1899 if (!non_inspector_listener_exists()) return; 1943 if (!non_inspector_listener_exists()) return;
1900 } 1944 }
1901 1945
1902 HandleScope scope(isolate_); 1946 HandleScope scope(isolate_);
1903 DebugScope debug_scope(this); 1947 DebugScope debug_scope(this);
1904 if (debug_scope.failed()) return; 1948 if (debug_scope.failed()) return;
1905 1949
1906 // Create the script collected state object. 1950 // Create the script collected state object.
1907 Handle<Object> event_data; 1951 Handle<Object> event_data;
1908 // Bail out and don't call debugger if exception. 1952 // Bail out and don't call debugger if exception.
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1960 void Debug::ProcessCompileEvent(v8::DebugEvent event, Handle<Script> script) { 2004 void Debug::ProcessCompileEvent(v8::DebugEvent event, Handle<Script> script) {
1961 if (ignore_events()) return; 2005 if (ignore_events()) return;
1962 if (script->type() != i::Script::TYPE_NORMAL && 2006 if (script->type() != i::Script::TYPE_NORMAL &&
1963 script->type() != i::Script::TYPE_WASM) { 2007 script->type() != i::Script::TYPE_WASM) {
1964 return; 2008 return;
1965 } 2009 }
1966 SuppressDebug while_processing(this); 2010 SuppressDebug while_processing(this);
1967 DebugScope debug_scope(this); 2011 DebugScope debug_scope(this);
1968 if (debug_scope.failed()) return; 2012 if (debug_scope.failed()) return;
1969 2013
1970 if (debug_event_listener_) { 2014 if (debug_delegate_) {
1971 debug_event_listener_->ScriptCompiled(ToApiHandle<debug::Script>(script), 2015 debug_delegate_->ScriptCompiled(ToApiHandle<debug::Script>(script),
1972 event != v8::AfterCompile); 2016 event != v8::AfterCompile);
1973 if (!non_inspector_listener_exists()) return; 2017 if (!non_inspector_listener_exists()) return;
1974 } 2018 }
1975 2019
1976 HandleScope scope(isolate_); 2020 HandleScope scope(isolate_);
1977 // Create the compile state object. 2021 // Create the compile state object.
1978 Handle<Object> event_data; 2022 Handle<Object> event_data;
1979 // Bail out and don't call debugger if exception. 2023 // Bail out and don't call debugger if exception.
1980 if (!MakeCompileEvent(script, event).ToHandle(&event_data)) return; 2024 if (!MakeCompileEvent(script, event).ToHandle(&event_data)) return;
1981 2025
1982 // Process debug event. 2026 // Process debug event.
(...skipping 23 matching lines...) Expand all
2006 // Set new entry. 2050 // Set new entry.
2007 if (!callback->IsNullOrUndefined(isolate_)) { 2051 if (!callback->IsNullOrUndefined(isolate_)) {
2008 event_listener_ = global_handles->Create(*callback); 2052 event_listener_ = global_handles->Create(*callback);
2009 if (data.is_null()) data = isolate_->factory()->undefined_value(); 2053 if (data.is_null()) data = isolate_->factory()->undefined_value();
2010 event_listener_data_ = global_handles->Create(*data); 2054 event_listener_data_ = global_handles->Create(*data);
2011 } 2055 }
2012 2056
2013 UpdateState(); 2057 UpdateState();
2014 } 2058 }
2015 2059
2016 2060 void Debug::SetDebugDelegate(debug::DebugDelegate* delegate) {
2017 void Debug::SetDebugEventListener(debug::DebugEventListener* listener) { 2061 debug_delegate_ = delegate;
2018 debug_event_listener_ = listener;
2019 UpdateState(); 2062 UpdateState();
2020 } 2063 }
2021 2064
2022 void Debug::UpdateState() { 2065 void Debug::UpdateState() {
2023 bool is_active = 2066 bool is_active = !event_listener_.is_null() || debug_delegate_ != nullptr;
2024 !event_listener_.is_null() || debug_event_listener_ != nullptr;
2025 if (is_active || in_debug_scope()) { 2067 if (is_active || in_debug_scope()) {
2026 // Note that the debug context could have already been loaded to 2068 // Note that the debug context could have already been loaded to
2027 // bootstrap test cases. 2069 // bootstrap test cases.
2028 isolate_->compilation_cache()->Disable(); 2070 isolate_->compilation_cache()->Disable();
2029 is_active = Load(); 2071 is_active = Load();
2030 } else if (is_loaded()) { 2072 } else if (is_loaded()) {
2031 isolate_->compilation_cache()->Enable(); 2073 isolate_->compilation_cache()->Enable();
2032 Unload(); 2074 Unload();
2033 } 2075 }
2034 is_active_ = is_active; 2076 is_active_ = is_active;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2071 2113
2072 StackLimitCheck check(isolate_); 2114 StackLimitCheck check(isolate_);
2073 if (check.HasOverflowed()) return; 2115 if (check.HasOverflowed()) return;
2074 2116
2075 { JavaScriptFrameIterator it(isolate_); 2117 { JavaScriptFrameIterator it(isolate_);
2076 DCHECK(!it.done()); 2118 DCHECK(!it.done());
2077 Object* fun = it.frame()->function(); 2119 Object* fun = it.frame()->function();
2078 if (fun && fun->IsJSFunction()) { 2120 if (fun && fun->IsJSFunction()) {
2079 // Don't stop in builtin functions. 2121 // Don't stop in builtin functions.
2080 if (!JSFunction::cast(fun)->shared()->IsSubjectToDebugging()) return; 2122 if (!JSFunction::cast(fun)->shared()->IsSubjectToDebugging()) return;
2123 if (isolate_->stack_guard()->CheckDebugBreak() &&
2124 IsBlackboxed(JSFunction::cast(fun)->shared())) {
2125 Deoptimizer::DeoptimizeFunction(JSFunction::cast(fun));
2126 return;
2127 }
2081 JSGlobalObject* global = 2128 JSGlobalObject* global =
2082 JSFunction::cast(fun)->context()->global_object(); 2129 JSFunction::cast(fun)->context()->global_object();
2083 // Don't stop in debugger functions. 2130 // Don't stop in debugger functions.
2084 if (IsDebugGlobal(global)) return; 2131 if (IsDebugGlobal(global)) return;
2085 // Don't stop if the break location is muted. 2132 // Don't stop if the break location is muted.
2086 if (IsMutedAtCurrentLocation(it.frame())) return; 2133 if (IsMutedAtCurrentLocation(it.frame())) return;
2087 } 2134 }
2088 } 2135 }
2089 2136
2090 isolate_->stack_guard()->ClearDebugBreak(); 2137 isolate_->stack_guard()->ClearDebugBreak();
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
2268 return v8::Utils::ToLocal(callback_data_); 2315 return v8::Utils::ToLocal(callback_data_);
2269 } 2316 }
2270 2317
2271 2318
2272 v8::Isolate* EventDetailsImpl::GetIsolate() const { 2319 v8::Isolate* EventDetailsImpl::GetIsolate() const {
2273 return reinterpret_cast<v8::Isolate*>(exec_state_->GetIsolate()); 2320 return reinterpret_cast<v8::Isolate*>(exec_state_->GetIsolate());
2274 } 2321 }
2275 2322
2276 } // namespace internal 2323 } // namespace internal
2277 } // namespace v8 2324 } // namespace v8
OLDNEW
« no previous file with comments | « src/debug/debug.h ('k') | src/debug/debug-interface.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698