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 2107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2118 | 2118 |
2119 Handle<Object> argv[] = { exec_state, data }; | 2119 Handle<Object> argv[] = { exec_state, data }; |
2120 return Execution::Call( | 2120 return Execution::Call( |
2121 isolate_, | 2121 isolate_, |
2122 fun, | 2122 fun, |
2123 Handle<Object>(debug_context()->global_proxy(), isolate_), | 2123 Handle<Object>(debug_context()->global_proxy(), isolate_), |
2124 arraysize(argv), | 2124 arraysize(argv), |
2125 argv); | 2125 argv); |
2126 } | 2126 } |
2127 | 2127 |
2128 | 2128 void Debug::HandleDebugBreak(IgnoreBreakMode ignore_break_mode) { |
2129 void Debug::HandleDebugBreak() { | |
2130 // Initialize LiveEdit. | 2129 // Initialize LiveEdit. |
2131 LiveEdit::InitializeThreadLocal(this); | 2130 LiveEdit::InitializeThreadLocal(this); |
2132 // Ignore debug break during bootstrapping. | 2131 // Ignore debug break during bootstrapping. |
2133 if (isolate_->bootstrapper()->IsActive()) return; | 2132 if (isolate_->bootstrapper()->IsActive()) return; |
2134 // Just continue if breaks are disabled. | 2133 // Just continue if breaks are disabled. |
2135 if (break_disabled()) return; | 2134 if (break_disabled()) return; |
2136 // Ignore debug break if debugger is not active. | 2135 // Ignore debug break if debugger is not active. |
2137 if (!is_active()) return; | 2136 if (!is_active()) return; |
2138 | 2137 |
2139 StackLimitCheck check(isolate_); | 2138 StackLimitCheck check(isolate_); |
2140 if (check.HasOverflowed()) return; | 2139 if (check.HasOverflowed()) return; |
2141 | 2140 |
2142 { JavaScriptFrameIterator it(isolate_); | 2141 { JavaScriptFrameIterator it(isolate_); |
2143 DCHECK(!it.done()); | 2142 DCHECK(!it.done()); |
2144 Object* fun = it.frame()->function(); | 2143 Object* fun = it.frame()->function(); |
2145 if (fun && fun->IsJSFunction()) { | 2144 if (fun && fun->IsJSFunction()) { |
2146 HandleScope scope(isolate_); | 2145 HandleScope scope(isolate_); |
2147 // Don't stop in builtin and blackboxed functions. | 2146 // Don't stop in builtin and blackboxed functions. |
2148 Handle<SharedFunctionInfo> shared(JSFunction::cast(fun)->shared(), | 2147 Handle<SharedFunctionInfo> shared(JSFunction::cast(fun)->shared(), |
2149 isolate_); | 2148 isolate_); |
2150 if (IsBlackboxed(shared)) { | 2149 bool ignore_break = ignore_break_mode == kIgnoreIfTopFrameBlackboxed |
| 2150 ? IsBlackboxed(shared) |
| 2151 : AllFramesOnStackAreBlackboxed(); |
| 2152 if (ignore_break) { |
2151 // Inspector uses pause on next statement for asynchronous breakpoints. | 2153 // Inspector uses pause on next statement for asynchronous breakpoints. |
2152 // When breakpoint is fired we try to break on first not blackboxed | 2154 // When breakpoint is fired we try to break on first not blackboxed |
2153 // statement. To achieve this goal we need to deoptimize current | 2155 // statement. To achieve this goal we need to deoptimize current |
2154 // function and don't clear requested DebugBreak even if it's blackboxed | 2156 // function and don't clear requested DebugBreak even if it's blackboxed |
2155 // to be able to break on not blackboxed function call. | 2157 // to be able to break on not blackboxed function call. |
2156 // TODO(yangguo): introduce break_on_function_entry since current | 2158 // TODO(yangguo): introduce break_on_function_entry since current |
2157 // implementation is slow. | 2159 // implementation is slow. |
2158 if (isolate_->stack_guard()->CheckDebugBreak()) { | 2160 if (isolate_->stack_guard()->CheckDebugBreak()) { |
2159 Deoptimizer::DeoptimizeFunction(JSFunction::cast(fun)); | 2161 Deoptimizer::DeoptimizeFunction(JSFunction::cast(fun)); |
2160 } | 2162 } |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2448 isolate_->Throw(*isolate_->factory()->NewEvalError( | 2450 isolate_->Throw(*isolate_->factory()->NewEvalError( |
2449 MessageTemplate::kNoSideEffectDebugEvaluate)); | 2451 MessageTemplate::kNoSideEffectDebugEvaluate)); |
2450 } | 2452 } |
2451 isolate_->set_needs_side_effect_check(old_needs_side_effect_check_); | 2453 isolate_->set_needs_side_effect_check(old_needs_side_effect_check_); |
2452 isolate_->debug()->UpdateHookOnFunctionCall(); | 2454 isolate_->debug()->UpdateHookOnFunctionCall(); |
2453 isolate_->debug()->side_effect_check_failed_ = false; | 2455 isolate_->debug()->side_effect_check_failed_ = false; |
2454 } | 2456 } |
2455 | 2457 |
2456 } // namespace internal | 2458 } // namespace internal |
2457 } // namespace v8 | 2459 } // namespace v8 |
OLD | NEW |