| 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 822 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |