| OLD | NEW |
| 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 825 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 836 while (debug_info_list_ != NULL) { | 836 while (debug_info_list_ != NULL) { |
| 837 RemoveDebugInfoAndClearFromShared(debug_info_list_->debug_info()); | 837 RemoveDebugInfoAndClearFromShared(debug_info_list_->debug_info()); |
| 838 } | 838 } |
| 839 } | 839 } |
| 840 | 840 |
| 841 void Debug::FloodWithOneShot(Handle<JSFunction> function, | 841 void Debug::FloodWithOneShot(Handle<JSFunction> function, |
| 842 BreakLocatorType type) { | 842 BreakLocatorType type) { |
| 843 // Debug utility functions are not subject to debugging. | 843 // Debug utility functions are not subject to debugging. |
| 844 if (function->native_context() == *debug_context()) return; | 844 if (function->native_context() == *debug_context()) return; |
| 845 | 845 |
| 846 if (!function->shared()->IsSubjectToDebugging()) { | 846 if (!function->shared()->IsSubjectToDebugging() || |
| 847 function->shared()->DebugIsBlackboxed()) { |
| 847 // Builtin functions are not subject to stepping, but need to be | 848 // Builtin functions are not subject to stepping, but need to be |
| 848 // deoptimized, because optimized code does not check for debug | 849 // deoptimized, because optimized code does not check for debug |
| 849 // step in at call sites. | 850 // step in at call sites. |
| 850 Deoptimizer::DeoptimizeFunction(*function); | 851 Deoptimizer::DeoptimizeFunction(*function); |
| 851 return; | 852 return; |
| 852 } | 853 } |
| 853 // Make sure the function is compiled and has set up the debug info. | 854 // Make sure the function is compiled and has set up the debug info. |
| 854 Handle<SharedFunctionInfo> shared(function->shared()); | 855 Handle<SharedFunctionInfo> shared(function->shared()); |
| 855 if (!EnsureDebugInfo(shared, function)) { | 856 if (!EnsureDebugInfo(shared, function)) { |
| 856 // Return if we failed to retrieve the debug info. | 857 // Return if we failed to retrieve the debug info. |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 955 if (last_step_action() == StepNext || last_step_action() == StepOut) { | 956 if (last_step_action() == StepNext || last_step_action() == StepOut) { |
| 956 while (!it.done()) { | 957 while (!it.done()) { |
| 957 Address current_fp = it.frame()->UnpaddedFP(); | 958 Address current_fp = it.frame()->UnpaddedFP(); |
| 958 if (current_fp >= thread_local_.target_fp_) break; | 959 if (current_fp >= thread_local_.target_fp_) break; |
| 959 it.Advance(); | 960 it.Advance(); |
| 960 } | 961 } |
| 961 } | 962 } |
| 962 | 963 |
| 963 // Find the closest Javascript frame we can flood with one-shots. | 964 // Find the closest Javascript frame we can flood with one-shots. |
| 964 while (!it.done() && | 965 while (!it.done() && |
| 965 !it.frame()->function()->shared()->IsSubjectToDebugging()) { | 966 (!it.frame()->function()->shared()->IsSubjectToDebugging() || |
| 967 it.frame()->function()->shared()->DebugIsBlackboxed())) { |
| 966 it.Advance(); | 968 it.Advance(); |
| 967 } | 969 } |
| 968 | 970 |
| 969 if (it.done()) return; // No suitable Javascript catch handler. | 971 if (it.done()) return; // No suitable Javascript catch handler. |
| 970 | 972 |
| 971 FloodWithOneShot(Handle<JSFunction>(it.frame()->function())); | 973 FloodWithOneShot(Handle<JSFunction>(it.frame()->function())); |
| 972 } | 974 } |
| 973 | 975 |
| 974 | 976 |
| 975 void Debug::PrepareStep(StepAction step_action) { | 977 void Debug::PrepareStep(StepAction step_action) { |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1015 return; | 1017 return; |
| 1016 } | 1018 } |
| 1017 | 1019 |
| 1018 Handle<DebugInfo> debug_info(shared->GetDebugInfo()); | 1020 Handle<DebugInfo> debug_info(shared->GetDebugInfo()); |
| 1019 BreakLocation location = BreakLocation::FromFrame(debug_info, frame); | 1021 BreakLocation location = BreakLocation::FromFrame(debug_info, frame); |
| 1020 | 1022 |
| 1021 // Any step at a return is a step-out. | 1023 // Any step at a return is a step-out. |
| 1022 if (location.IsReturn()) step_action = StepOut; | 1024 if (location.IsReturn()) step_action = StepOut; |
| 1023 // A step-next at a tail call is a step-out. | 1025 // A step-next at a tail call is a step-out. |
| 1024 if (location.IsTailCall() && step_action == StepNext) step_action = StepOut; | 1026 if (location.IsTailCall() && step_action == StepNext) step_action = StepOut; |
| 1027 // A step-next in blackboxed function is a step-out. |
| 1028 if (step_action == StepNext && shared->DebugIsBlackboxed()) { |
| 1029 step_action = StepOut; |
| 1030 } |
| 1025 | 1031 |
| 1026 thread_local_.last_statement_position_ = | 1032 thread_local_.last_statement_position_ = |
| 1027 summary.abstract_code()->SourceStatementPosition(summary.code_offset()); | 1033 summary.abstract_code()->SourceStatementPosition(summary.code_offset()); |
| 1028 thread_local_.last_fp_ = frame->UnpaddedFP(); | 1034 thread_local_.last_fp_ = frame->UnpaddedFP(); |
| 1029 // No longer perform the current async step. | 1035 // No longer perform the current async step. |
| 1030 clear_suspended_generator(); | 1036 clear_suspended_generator(); |
| 1031 | 1037 |
| 1032 switch (step_action) { | 1038 switch (step_action) { |
| 1033 case StepNone: | 1039 case StepNone: |
| 1034 UNREACHABLE(); | 1040 UNREACHABLE(); |
| 1035 break; | 1041 break; |
| 1036 case StepOut: | 1042 case StepOut: |
| 1037 // Advance to caller frame. | 1043 // Advance to caller frame. |
| 1038 frames_it.Advance(); | 1044 frames_it.Advance(); |
| 1039 // Skip native and extension functions on the stack. | 1045 // Skip native and extension functions on the stack. |
| 1040 while (!frames_it.done() && | 1046 while ( |
| 1041 !frames_it.frame()->function()->shared()->IsSubjectToDebugging()) { | 1047 !frames_it.done() && |
| 1048 (!frames_it.frame()->function()->shared()->IsSubjectToDebugging() || |
| 1049 frames_it.frame()->function()->shared()->DebugIsBlackboxed())) { |
| 1042 // Builtin functions are not subject to stepping, but need to be | 1050 // Builtin functions are not subject to stepping, but need to be |
| 1043 // deoptimized to include checks for step-in at call sites. | 1051 // deoptimized to include checks for step-in at call sites. |
| 1044 Deoptimizer::DeoptimizeFunction(frames_it.frame()->function()); | 1052 Deoptimizer::DeoptimizeFunction(frames_it.frame()->function()); |
| 1045 frames_it.Advance(); | 1053 frames_it.Advance(); |
| 1046 } | 1054 } |
| 1047 if (!frames_it.done()) { | 1055 if (!frames_it.done()) { |
| 1048 // Fill the caller function to return to with one-shot break points. | 1056 // Fill the caller function to return to with one-shot break points. |
| 1049 Handle<JSFunction> caller_function(frames_it.frame()->function()); | 1057 Handle<JSFunction> caller_function(frames_it.frame()->function()); |
| 1050 FloodWithOneShot(caller_function); | 1058 FloodWithOneShot(caller_function); |
| 1051 thread_local_.target_fp_ = frames_it.frame()->UnpaddedFP(); | 1059 thread_local_.target_fp_ = frames_it.frame()->UnpaddedFP(); |
| (...skipping 695 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1747 // Bail out if exception breaks are not active | 1755 // Bail out if exception breaks are not active |
| 1748 if (uncaught) { | 1756 if (uncaught) { |
| 1749 // Uncaught exceptions are reported by either flags. | 1757 // Uncaught exceptions are reported by either flags. |
| 1750 if (!(break_on_uncaught_exception_ || break_on_exception_)) return; | 1758 if (!(break_on_uncaught_exception_ || break_on_exception_)) return; |
| 1751 } else { | 1759 } else { |
| 1752 // Caught exceptions are reported is activated. | 1760 // Caught exceptions are reported is activated. |
| 1753 if (!break_on_exception_) return; | 1761 if (!break_on_exception_) return; |
| 1754 } | 1762 } |
| 1755 | 1763 |
| 1756 { | 1764 { |
| 1757 // Check whether the break location is muted. | |
| 1758 JavaScriptFrameIterator it(isolate_); | 1765 JavaScriptFrameIterator it(isolate_); |
| 1759 if (!it.done() && IsMutedAtCurrentLocation(it.frame())) return; | 1766 // Check whether the top frame is blackboxed or the break location is muted. |
| 1767 if (!it.done() && (it.frame()->function()->shared()->DebugIsBlackboxed() || |
| 1768 IsMutedAtCurrentLocation(it.frame()))) { |
| 1769 return; |
| 1770 } |
| 1760 } | 1771 } |
| 1761 | 1772 |
| 1762 DebugScope debug_scope(this); | 1773 DebugScope debug_scope(this); |
| 1763 if (debug_scope.failed()) return; | 1774 if (debug_scope.failed()) return; |
| 1764 | 1775 |
| 1765 if (debug_event_listener_) { | 1776 if (debug_delegate_) { |
| 1766 HandleScope scope(isolate_); | 1777 HandleScope scope(isolate_); |
| 1767 | 1778 |
| 1768 // Create the execution state. | 1779 // Create the execution state. |
| 1769 Handle<Object> exec_state; | 1780 Handle<Object> exec_state; |
| 1770 // Bail out and don't call debugger if exception. | 1781 // Bail out and don't call debugger if exception. |
| 1771 if (!MakeExecutionState().ToHandle(&exec_state)) return; | 1782 if (!MakeExecutionState().ToHandle(&exec_state)) return; |
| 1772 | 1783 |
| 1773 debug_event_listener_->ExceptionThrown( | 1784 debug_delegate_->ExceptionThrown( |
| 1774 GetDebugEventContext(isolate_), | 1785 GetDebugEventContext(isolate_), |
| 1775 v8::Utils::ToLocal(Handle<JSObject>::cast(exec_state)), | 1786 v8::Utils::ToLocal(Handle<JSObject>::cast(exec_state)), |
| 1776 v8::Utils::ToLocal(exception), promise->IsJSObject(), uncaught); | 1787 v8::Utils::ToLocal(exception), promise->IsJSObject(), uncaught); |
| 1777 if (!non_inspector_listener_exists()) return; | 1788 if (!non_inspector_listener_exists()) return; |
| 1778 } | 1789 } |
| 1779 | 1790 |
| 1780 // Create the event data object. | 1791 // Create the event data object. |
| 1781 Handle<Object> event_data; | 1792 Handle<Object> event_data; |
| 1782 // Bail out and don't call debugger if exception. | 1793 // Bail out and don't call debugger if exception. |
| 1783 if (!MakeExceptionEvent( | 1794 if (!MakeExceptionEvent( |
| 1784 exception, uncaught, promise).ToHandle(&event_data)) { | 1795 exception, uncaught, promise).ToHandle(&event_data)) { |
| 1785 return; | 1796 return; |
| 1786 } | 1797 } |
| 1787 | 1798 |
| 1788 // Process debug event. | 1799 // Process debug event. |
| 1789 ProcessDebugEvent(v8::Exception, Handle<JSObject>::cast(event_data), false); | 1800 ProcessDebugEvent(v8::Exception, Handle<JSObject>::cast(event_data), false); |
| 1790 // Return to continue execution from where the exception was thrown. | 1801 // Return to continue execution from where the exception was thrown. |
| 1791 } | 1802 } |
| 1792 | 1803 |
| 1793 void Debug::OnDebugBreak(Handle<Object> break_points_hit, bool auto_continue) { | 1804 void Debug::OnDebugBreak(Handle<Object> break_points_hit, bool auto_continue) { |
| 1794 // The caller provided for DebugScope. | 1805 // The caller provided for DebugScope. |
| 1795 AssertDebugContext(); | 1806 AssertDebugContext(); |
| 1796 // Bail out if there is no listener for this event | 1807 // Bail out if there is no listener for this event |
| 1797 if (ignore_events()) return; | 1808 if (ignore_events()) return; |
| 1798 | 1809 |
| 1799 #ifdef DEBUG | 1810 #ifdef DEBUG |
| 1800 PrintBreakLocation(); | 1811 PrintBreakLocation(); |
| 1801 #endif // DEBUG | 1812 #endif // DEBUG |
| 1802 | 1813 |
| 1803 if (debug_event_listener_) { | 1814 if (debug_delegate_) { |
| 1804 HandleScope scope(isolate_); | 1815 HandleScope scope(isolate_); |
| 1805 | 1816 |
| 1806 // Create the execution state. | 1817 // Create the execution state. |
| 1807 Handle<Object> exec_state; | 1818 Handle<Object> exec_state; |
| 1808 // Bail out and don't call debugger if exception. | 1819 // Bail out and don't call debugger if exception. |
| 1809 if (!MakeExecutionState().ToHandle(&exec_state)) return; | 1820 if (!MakeExecutionState().ToHandle(&exec_state)) return; |
| 1810 | 1821 |
| 1811 bool previous = in_debug_event_listener_; | 1822 bool previous = in_debug_event_listener_; |
| 1812 in_debug_event_listener_ = true; | 1823 in_debug_event_listener_ = true; |
| 1813 debug_event_listener_->BreakProgramRequested( | 1824 debug_delegate_->BreakProgramRequested( |
| 1814 GetDebugEventContext(isolate_), | 1825 GetDebugEventContext(isolate_), |
| 1815 v8::Utils::ToLocal(Handle<JSObject>::cast(exec_state)), | 1826 v8::Utils::ToLocal(Handle<JSObject>::cast(exec_state)), |
| 1816 v8::Utils::ToLocal(break_points_hit)); | 1827 v8::Utils::ToLocal(break_points_hit)); |
| 1817 in_debug_event_listener_ = previous; | 1828 in_debug_event_listener_ = previous; |
| 1818 if (!non_inspector_listener_exists()) return; | 1829 if (!non_inspector_listener_exists()) return; |
| 1819 } | 1830 } |
| 1820 | 1831 |
| 1821 HandleScope scope(isolate_); | 1832 HandleScope scope(isolate_); |
| 1822 // Create the event data object. | 1833 // Create the event data object. |
| 1823 Handle<Object> event_data; | 1834 Handle<Object> event_data; |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1888 // Since we holding promise when at least one microtask is scheduled (inside | 1899 // Since we holding promise when at least one microtask is scheduled (inside |
| 1889 // PromiseReactionJobInfo), we can send cancel event in weak callback. | 1900 // PromiseReactionJobInfo), we can send cancel event in weak callback. |
| 1890 GlobalHandles::MakeWeak( | 1901 GlobalHandles::MakeWeak( |
| 1891 global_handle.location(), | 1902 global_handle.location(), |
| 1892 new CollectedCallbackData(global_handle.location(), async_id->value(), | 1903 new CollectedCallbackData(global_handle.location(), async_id->value(), |
| 1893 this, isolate_), | 1904 this, isolate_), |
| 1894 &ResetPromiseHandle, v8::WeakCallbackType::kParameter); | 1905 &ResetPromiseHandle, v8::WeakCallbackType::kParameter); |
| 1895 return async_id->value(); | 1906 return async_id->value(); |
| 1896 } | 1907 } |
| 1897 | 1908 |
| 1909 namespace { |
| 1910 debug::Location GetDebugLocation(Handle<Script> script, int source_position) { |
| 1911 Script::PositionInfo info; |
| 1912 Script::GetPositionInfo(script, source_position, &info, Script::WITH_OFFSET); |
| 1913 return debug::Location(info.line, info.column); |
| 1914 } |
| 1915 } // namespace |
| 1916 |
| 1917 bool Debug::IsBlackboxed(Handle<SharedFunctionInfo> shared) { |
| 1918 if (!debug_delegate_) return false; |
| 1919 if (!shared->script()->IsScript()) return false; |
| 1920 Handle<Script> script(Script::cast(shared->script())); |
| 1921 if (script->type() != i::Script::TYPE_NORMAL) return false; |
| 1922 debug::Location start = GetDebugLocation(script, shared->start_position()); |
| 1923 debug::Location end = GetDebugLocation(script, shared->end_position()); |
| 1924 return debug_delegate_->IsBlackboxed(ToApiHandle<debug::Script>(script), |
| 1925 start, end); |
| 1926 } |
| 1927 |
| 1898 void Debug::OnAsyncTaskEvent(debug::PromiseDebugActionType type, int id) { | 1928 void Debug::OnAsyncTaskEvent(debug::PromiseDebugActionType type, int id) { |
| 1899 if (in_debug_scope() || ignore_events()) return; | 1929 if (in_debug_scope() || ignore_events()) return; |
| 1900 | 1930 |
| 1901 if (debug_event_listener_) { | 1931 if (debug_delegate_) { |
| 1902 debug_event_listener_->PromiseEventOccurred(type, id); | 1932 debug_delegate_->PromiseEventOccurred(type, id); |
| 1903 if (!non_inspector_listener_exists()) return; | 1933 if (!non_inspector_listener_exists()) return; |
| 1904 } | 1934 } |
| 1905 | 1935 |
| 1906 HandleScope scope(isolate_); | 1936 HandleScope scope(isolate_); |
| 1907 DebugScope debug_scope(this); | 1937 DebugScope debug_scope(this); |
| 1908 if (debug_scope.failed()) return; | 1938 if (debug_scope.failed()) return; |
| 1909 | 1939 |
| 1910 // Create the script collected state object. | 1940 // Create the script collected state object. |
| 1911 Handle<Object> event_data; | 1941 Handle<Object> event_data; |
| 1912 // Bail out and don't call debugger if exception. | 1942 // Bail out and don't call debugger if exception. |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1983 if (ignore_events()) return; | 2013 if (ignore_events()) return; |
| 1984 if (script->type() != i::Script::TYPE_NORMAL && | 2014 if (script->type() != i::Script::TYPE_NORMAL && |
| 1985 script->type() != i::Script::TYPE_WASM) { | 2015 script->type() != i::Script::TYPE_WASM) { |
| 1986 return; | 2016 return; |
| 1987 } | 2017 } |
| 1988 SuppressDebug while_processing(this); | 2018 SuppressDebug while_processing(this); |
| 1989 bool in_nested_debug_scope = in_debug_scope(); | 2019 bool in_nested_debug_scope = in_debug_scope(); |
| 1990 DebugScope debug_scope(this); | 2020 DebugScope debug_scope(this); |
| 1991 if (debug_scope.failed()) return; | 2021 if (debug_scope.failed()) return; |
| 1992 | 2022 |
| 1993 if (debug_event_listener_) { | 2023 if (debug_delegate_) { |
| 1994 debug_event_listener_->ScriptCompiled(ToApiHandle<debug::Script>(script), | 2024 debug_delegate_->ScriptCompiled(ToApiHandle<debug::Script>(script), |
| 1995 event != v8::AfterCompile); | 2025 event != v8::AfterCompile); |
| 1996 if (!non_inspector_listener_exists()) return; | 2026 if (!non_inspector_listener_exists()) return; |
| 1997 } | 2027 } |
| 1998 | 2028 |
| 1999 HandleScope scope(isolate_); | 2029 HandleScope scope(isolate_); |
| 2000 // Create the compile state object. | 2030 // Create the compile state object. |
| 2001 Handle<Object> event_data; | 2031 Handle<Object> event_data; |
| 2002 // Bail out and don't call debugger if exception. | 2032 // Bail out and don't call debugger if exception. |
| 2003 if (!MakeCompileEvent(script, event).ToHandle(&event_data)) return; | 2033 if (!MakeCompileEvent(script, event).ToHandle(&event_data)) return; |
| 2004 | 2034 |
| 2005 // Don't call NotifyMessageHandler if already in debug scope to avoid running | 2035 // Don't call NotifyMessageHandler if already in debug scope to avoid running |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2181 void Debug::SetMessageHandler(v8::Debug::MessageHandler handler) { | 2211 void Debug::SetMessageHandler(v8::Debug::MessageHandler handler) { |
| 2182 message_handler_ = handler; | 2212 message_handler_ = handler; |
| 2183 UpdateState(); | 2213 UpdateState(); |
| 2184 if (handler == NULL && in_debug_scope()) { | 2214 if (handler == NULL && in_debug_scope()) { |
| 2185 // Send an empty command to the debugger if in a break to make JavaScript | 2215 // Send an empty command to the debugger if in a break to make JavaScript |
| 2186 // run again if the debugger is closed. | 2216 // run again if the debugger is closed. |
| 2187 EnqueueCommandMessage(Vector<const uint16_t>::empty()); | 2217 EnqueueCommandMessage(Vector<const uint16_t>::empty()); |
| 2188 } | 2218 } |
| 2189 } | 2219 } |
| 2190 | 2220 |
| 2191 void Debug::SetDebugEventListener(debug::DebugEventListener* listener) { | 2221 void Debug::SetDebugDelegate(debug::DebugDelegate* delegate) { |
| 2192 debug_event_listener_ = listener; | 2222 debug_delegate_ = delegate; |
| 2193 UpdateState(); | 2223 UpdateState(); |
| 2194 } | 2224 } |
| 2195 | 2225 |
| 2196 void Debug::UpdateState() { | 2226 void Debug::UpdateState() { |
| 2197 bool is_active = message_handler_ != nullptr || !event_listener_.is_null() || | 2227 bool is_active = message_handler_ != nullptr || !event_listener_.is_null() || |
| 2198 debug_event_listener_ != nullptr; | 2228 debug_delegate_ != nullptr; |
| 2199 if (is_active || in_debug_scope()) { | 2229 if (is_active || in_debug_scope()) { |
| 2200 // Note that the debug context could have already been loaded to | 2230 // Note that the debug context could have already been loaded to |
| 2201 // bootstrap test cases. | 2231 // bootstrap test cases. |
| 2202 isolate_->compilation_cache()->Disable(); | 2232 isolate_->compilation_cache()->Disable(); |
| 2203 is_active = Load(); | 2233 is_active = Load(); |
| 2204 } else if (is_loaded()) { | 2234 } else if (is_loaded()) { |
| 2205 isolate_->compilation_cache()->Enable(); | 2235 isolate_->compilation_cache()->Enable(); |
| 2206 Unload(); | 2236 Unload(); |
| 2207 } | 2237 } |
| 2208 is_active_ = is_active; | 2238 is_active_ = is_active; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2270 | 2300 |
| 2271 StackLimitCheck check(isolate_); | 2301 StackLimitCheck check(isolate_); |
| 2272 if (check.HasOverflowed()) return; | 2302 if (check.HasOverflowed()) return; |
| 2273 | 2303 |
| 2274 { JavaScriptFrameIterator it(isolate_); | 2304 { JavaScriptFrameIterator it(isolate_); |
| 2275 DCHECK(!it.done()); | 2305 DCHECK(!it.done()); |
| 2276 Object* fun = it.frame()->function(); | 2306 Object* fun = it.frame()->function(); |
| 2277 if (fun && fun->IsJSFunction()) { | 2307 if (fun && fun->IsJSFunction()) { |
| 2278 // Don't stop in builtin functions. | 2308 // Don't stop in builtin functions. |
| 2279 if (!JSFunction::cast(fun)->shared()->IsSubjectToDebugging()) return; | 2309 if (!JSFunction::cast(fun)->shared()->IsSubjectToDebugging()) return; |
| 2310 if (isolate_->stack_guard()->CheckDebugBreak() && |
| 2311 JSFunction::cast(fun)->shared()->DebugIsBlackboxed()) { |
| 2312 Deoptimizer::DeoptimizeFunction(JSFunction::cast(fun)); |
| 2313 return; |
| 2314 } |
| 2280 JSGlobalObject* global = | 2315 JSGlobalObject* global = |
| 2281 JSFunction::cast(fun)->context()->global_object(); | 2316 JSFunction::cast(fun)->context()->global_object(); |
| 2282 // Don't stop in debugger functions. | 2317 // Don't stop in debugger functions. |
| 2283 if (IsDebugGlobal(global)) return; | 2318 if (IsDebugGlobal(global)) return; |
| 2284 // Don't stop if the break location is muted. | 2319 // Don't stop if the break location is muted. |
| 2285 if (IsMutedAtCurrentLocation(it.frame())) return; | 2320 if (IsMutedAtCurrentLocation(it.frame())) return; |
| 2286 } | 2321 } |
| 2287 } | 2322 } |
| 2288 | 2323 |
| 2289 // Collect the break state before clearing the flags. | 2324 // Collect the break state before clearing the flags. |
| (...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2665 logger_->DebugEvent("Put", message.text()); | 2700 logger_->DebugEvent("Put", message.text()); |
| 2666 } | 2701 } |
| 2667 | 2702 |
| 2668 void LockingCommandMessageQueue::Clear() { | 2703 void LockingCommandMessageQueue::Clear() { |
| 2669 base::LockGuard<base::Mutex> lock_guard(&mutex_); | 2704 base::LockGuard<base::Mutex> lock_guard(&mutex_); |
| 2670 queue_.Clear(); | 2705 queue_.Clear(); |
| 2671 } | 2706 } |
| 2672 | 2707 |
| 2673 } // namespace internal | 2708 } // namespace internal |
| 2674 } // namespace v8 | 2709 } // namespace v8 |
| OLD | NEW |