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 #ifndef V8_DEBUG_DEBUG_H_ | 5 #ifndef V8_DEBUG_DEBUG_H_ |
6 #define V8_DEBUG_DEBUG_H_ | 6 #define V8_DEBUG_DEBUG_H_ |
7 | 7 |
8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
9 #include "src/arguments.h" | 9 #include "src/arguments.h" |
10 #include "src/assembler.h" | 10 #include "src/assembler.h" |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
224 Handle<DebugInfo> debug_info() { return Handle<DebugInfo>(debug_info_); } | 224 Handle<DebugInfo> debug_info() { return Handle<DebugInfo>(debug_info_); } |
225 | 225 |
226 private: | 226 private: |
227 // Global (weak) handle to the debug info object. | 227 // Global (weak) handle to the debug info object. |
228 DebugInfo** debug_info_; | 228 DebugInfo** debug_info_; |
229 | 229 |
230 // Next pointer for linked list. | 230 // Next pointer for linked list. |
231 DebugInfoListNode* next_; | 231 DebugInfoListNode* next_; |
232 }; | 232 }; |
233 | 233 |
234 // Details of the debug event delivered to the debug event listener. | |
235 class EventDetailsImpl : public v8::Debug::EventDetails { | |
236 public: | |
237 EventDetailsImpl(DebugEvent event, Handle<JSObject> exec_state, | |
238 Handle<JSObject> event_data, Handle<Object> callback_data); | |
239 virtual DebugEvent GetEvent() const; | |
240 virtual v8::Local<v8::Object> GetExecutionState() const; | |
241 virtual v8::Local<v8::Object> GetEventData() const; | |
242 virtual v8::Local<v8::Context> GetEventContext() const; | |
243 virtual v8::Local<v8::Value> GetCallbackData() const; | |
244 virtual v8::Debug::ClientData* GetClientData() const { return nullptr; } | |
245 virtual v8::Isolate* GetIsolate() const; | |
246 | |
247 private: | |
248 DebugEvent event_; // Debug event causing the break. | |
249 Handle<JSObject> exec_state_; // Current execution state. | |
250 Handle<JSObject> event_data_; // Data associated with the event. | |
251 Handle<Object> callback_data_; // User data passed with the callback | |
252 // when it was registered. | |
253 }; | |
254 | |
255 | |
256 class DebugFeatureTracker { | 234 class DebugFeatureTracker { |
257 public: | 235 public: |
258 enum Feature { | 236 enum Feature { |
259 kActive = 1, | 237 kActive = 1, |
260 kBreakPoint = 2, | 238 kBreakPoint = 2, |
261 kStepping = 3, | 239 kStepping = 3, |
262 kHeapSnapshot = 4, | 240 kHeapSnapshot = 4, |
263 kAllocationTracking = 5, | 241 kAllocationTracking = 5, |
264 kProfiler = 6, | 242 kProfiler = 6, |
265 kLiveEdit = 7, | 243 kLiveEdit = 7, |
(...skipping 18 matching lines...) Expand all Loading... | |
284 // DebugInfo. | 262 // DebugInfo. |
285 class Debug { | 263 class Debug { |
286 public: | 264 public: |
287 // Debug event triggers. | 265 // Debug event triggers. |
288 void OnDebugBreak(Handle<Object> break_points_hit); | 266 void OnDebugBreak(Handle<Object> break_points_hit); |
289 | 267 |
290 void OnThrow(Handle<Object> exception); | 268 void OnThrow(Handle<Object> exception); |
291 void OnPromiseReject(Handle<Object> promise, Handle<Object> value); | 269 void OnPromiseReject(Handle<Object> promise, Handle<Object> value); |
292 void OnCompileError(Handle<Script> script); | 270 void OnCompileError(Handle<Script> script); |
293 void OnAfterCompile(Handle<Script> script); | 271 void OnAfterCompile(Handle<Script> script); |
294 void OnAsyncTaskEvent(debug::PromiseDebugActionType type, int id); | 272 void OnAsyncTaskEvent(debug::PromiseDebugActionType type, int id, |
273 int parent_id); | |
295 | 274 |
296 // API facing. | |
297 void SetEventListener(Handle<Object> callback, Handle<Object> data); | |
298 MUST_USE_RESULT MaybeHandle<Object> Call(Handle<Object> fun, | 275 MUST_USE_RESULT MaybeHandle<Object> Call(Handle<Object> fun, |
299 Handle<Object> data); | 276 Handle<Object> data); |
300 Handle<Context> GetDebugContext(); | 277 Handle<Context> GetDebugContext(); |
301 void HandleDebugBreak(); | 278 void HandleDebugBreak(); |
302 | 279 |
303 // Internal logic | 280 // Internal logic |
304 bool Load(); | 281 bool Load(); |
305 void Break(JavaScriptFrame* frame); | 282 void Break(JavaScriptFrame* frame); |
306 | 283 |
307 // Scripts handling. | 284 // Scripts handling. |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
340 | 317 |
341 void RecordGenerator(Handle<JSGeneratorObject> generator_object); | 318 void RecordGenerator(Handle<JSGeneratorObject> generator_object); |
342 | 319 |
343 void RunPromiseHook(PromiseHookType type, Handle<JSPromise> promise, | 320 void RunPromiseHook(PromiseHookType type, Handle<JSPromise> promise, |
344 Handle<Object> parent); | 321 Handle<Object> parent); |
345 | 322 |
346 int NextAsyncTaskId(Handle<JSObject> promise); | 323 int NextAsyncTaskId(Handle<JSObject> promise); |
347 | 324 |
348 bool IsBlackboxed(Handle<SharedFunctionInfo> shared); | 325 bool IsBlackboxed(Handle<SharedFunctionInfo> shared); |
349 | 326 |
350 void SetDebugDelegate(debug::DebugDelegate* delegate); | 327 void SetDebugDelegate(debug::DebugDelegate* delegate, bool pass_ownership); |
351 | 328 |
352 // Returns whether the operation succeeded. | 329 // Returns whether the operation succeeded. |
353 bool EnsureDebugInfo(Handle<SharedFunctionInfo> shared); | 330 bool EnsureDebugInfo(Handle<SharedFunctionInfo> shared); |
354 void CreateDebugInfo(Handle<SharedFunctionInfo> shared); | 331 void CreateDebugInfo(Handle<SharedFunctionInfo> shared); |
355 static Handle<DebugInfo> GetDebugInfo(Handle<SharedFunctionInfo> shared); | 332 static Handle<DebugInfo> GetDebugInfo(Handle<SharedFunctionInfo> shared); |
356 | 333 |
357 template <typename C> | 334 template <typename C> |
358 bool CompileToRevealInnerFunctions(C* compilable); | 335 bool CompileToRevealInnerFunctions(C* compilable); |
359 | 336 |
360 // This function is used in FunctionNameUsing* tests. | 337 // This function is used in FunctionNameUsing* tests. |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
440 Address restart_fp_address() { | 417 Address restart_fp_address() { |
441 return reinterpret_cast<Address>(&thread_local_.restart_fp_); | 418 return reinterpret_cast<Address>(&thread_local_.restart_fp_); |
442 } | 419 } |
443 | 420 |
444 StepAction last_step_action() { return thread_local_.last_step_action_; } | 421 StepAction last_step_action() { return thread_local_.last_step_action_; } |
445 | 422 |
446 DebugFeatureTracker* feature_tracker() { return &feature_tracker_; } | 423 DebugFeatureTracker* feature_tracker() { return &feature_tracker_; } |
447 | 424 |
448 private: | 425 private: |
449 explicit Debug(Isolate* isolate); | 426 explicit Debug(Isolate* isolate); |
427 ~Debug() { DCHECK_NULL(debug_delegate_); } | |
450 | 428 |
451 void UpdateState(); | 429 void UpdateState(); |
452 void UpdateHookOnFunctionCall(); | 430 void UpdateHookOnFunctionCall(); |
431 void RemoveDebugDelegate(); | |
453 void Unload(); | 432 void Unload(); |
454 void SetNextBreakId() { | 433 void SetNextBreakId() { |
455 thread_local_.break_id_ = ++thread_local_.break_count_; | 434 thread_local_.break_id_ = ++thread_local_.break_count_; |
456 } | 435 } |
457 | 436 |
458 // Return the number of virtual frames below debugger entry. | 437 // Return the number of virtual frames below debugger entry. |
459 int CurrentFrameCount(); | 438 int CurrentFrameCount(); |
460 | 439 |
461 inline bool ignore_events() const { | 440 inline bool ignore_events() const { |
462 return is_suppressed_ || !is_active_ || isolate_->needs_side_effect_check(); | 441 return is_suppressed_ || !is_active_ || isolate_->needs_side_effect_check(); |
463 } | 442 } |
464 inline bool break_disabled() const { | 443 inline bool break_disabled() const { return break_disabled_; } |
465 return break_disabled_ || in_debug_event_listener_; | |
466 } | |
467 | 444 |
468 void clear_suspended_generator() { | 445 void clear_suspended_generator() { |
469 thread_local_.suspended_generator_ = Smi::kZero; | 446 thread_local_.suspended_generator_ = Smi::kZero; |
470 } | 447 } |
471 | 448 |
472 bool has_suspended_generator() const { | 449 bool has_suspended_generator() const { |
473 return thread_local_.suspended_generator_ != Smi::kZero; | 450 return thread_local_.suspended_generator_ != Smi::kZero; |
474 } | 451 } |
475 | 452 |
476 // There are three types of event listeners: C++ message_handler, | |
477 // JavaScript event listener and C++ event listener. | |
478 // Currently inspector still uses C++ event listener and installs | |
479 // more specific event listeners for part of events. Calling of | |
480 // C++ event listener is redundant when more specific event listener | |
481 // is presented. Other clients can install JavaScript event listener | |
482 // (e.g. some of NodeJS module). | |
483 bool non_inspector_listener_exists() const { | |
484 return !event_listener_.is_null() && !event_listener_->IsForeign(); | |
485 } | |
486 | |
487 bool IsExceptionBlackboxed(bool uncaught); | 453 bool IsExceptionBlackboxed(bool uncaught); |
488 | 454 |
489 void OnException(Handle<Object> exception, Handle<Object> promise); | 455 void OnException(Handle<Object> exception, Handle<Object> promise); |
490 | 456 |
491 // Constructors for debug event objects. | 457 // Constructors for debug event objects. |
492 MUST_USE_RESULT MaybeHandle<Object> MakeExecutionState(); | 458 MUST_USE_RESULT MaybeHandle<Object> MakeExecutionState(); |
493 MUST_USE_RESULT MaybeHandle<Object> MakeBreakEvent( | 459 MUST_USE_RESULT MaybeHandle<Object> MakeBreakEvent( |
494 Handle<Object> break_points_hit); | 460 Handle<Object> break_points_hit); |
495 MUST_USE_RESULT MaybeHandle<Object> MakeExceptionEvent( | 461 MUST_USE_RESULT MaybeHandle<Object> MakeExceptionEvent( |
496 Handle<Object> exception, | 462 Handle<Object> exception, |
497 bool uncaught, | 463 bool uncaught, |
498 Handle<Object> promise); | 464 Handle<Object> promise); |
499 MUST_USE_RESULT MaybeHandle<Object> MakeCompileEvent( | 465 MUST_USE_RESULT MaybeHandle<Object> MakeCompileEvent( |
500 Handle<Script> script, v8::DebugEvent type); | 466 Handle<Script> script, v8::DebugEvent type); |
501 MUST_USE_RESULT MaybeHandle<Object> MakeAsyncTaskEvent(Handle<Smi> type, | 467 MUST_USE_RESULT MaybeHandle<Object> MakeAsyncTaskEvent( |
502 Handle<Smi> id); | 468 v8::debug::PromiseDebugActionType type, int id); |
503 | 469 |
504 void ProcessCompileEvent(v8::DebugEvent event, Handle<Script> script); | 470 void ProcessCompileEvent(v8::DebugEvent event, Handle<Script> script); |
505 void ProcessDebugEvent(v8::DebugEvent event, Handle<JSObject> event_data); | 471 void ProcessDebugEvent(v8::DebugEvent event, Handle<JSObject> event_data); |
506 | 472 |
507 // Find the closest source position for a break point for a given position. | 473 // Find the closest source position for a break point for a given position. |
508 int FindBreakablePosition(Handle<DebugInfo> debug_info, int source_position, | 474 int FindBreakablePosition(Handle<DebugInfo> debug_info, int source_position, |
509 BreakPositionAlignment alignment); | 475 BreakPositionAlignment alignment); |
510 // Instrument code to break at break points. | 476 // Instrument code to break at break points. |
511 void ApplyBreakPoints(Handle<DebugInfo> debug_info); | 477 void ApplyBreakPoints(Handle<DebugInfo> debug_info); |
512 // Clear code from instrumentation. | 478 // Clear code from instrumentation. |
(...skipping 20 matching lines...) Expand all Loading... | |
533 DCHECK(in_debug_scope()); | 499 DCHECK(in_debug_scope()); |
534 } | 500 } |
535 | 501 |
536 void ThreadInit(); | 502 void ThreadInit(); |
537 | 503 |
538 void PrintBreakLocation(); | 504 void PrintBreakLocation(); |
539 | 505 |
540 // Global handles. | 506 // Global handles. |
541 Handle<Context> debug_context_; | 507 Handle<Context> debug_context_; |
542 Handle<Object> event_listener_; | 508 Handle<Object> event_listener_; |
543 Handle<Object> event_listener_data_; | 509 Handle<Object> event_listener_data_; |
jgruber
2017/02/09 10:33:28
Can we remove event_listener{,_data}_?
| |
544 | 510 |
545 debug::DebugDelegate* debug_delegate_ = nullptr; | 511 debug::DebugDelegate* debug_delegate_ = nullptr; |
512 bool owns_debug_delegate_ = false; | |
546 | 513 |
547 // Debugger is active, i.e. there is a debug event listener attached. | 514 // Debugger is active, i.e. there is a debug event listener attached. |
548 bool is_active_; | 515 bool is_active_; |
549 // Debugger needs to be notified on every new function call. | 516 // Debugger needs to be notified on every new function call. |
550 // Used for stepping and read-only checks | 517 // Used for stepping and read-only checks |
551 bool hook_on_function_call_; | 518 bool hook_on_function_call_; |
552 // Suppress debug events. | 519 // Suppress debug events. |
553 bool is_suppressed_; | 520 bool is_suppressed_; |
554 // LiveEdit is enabled. | 521 // LiveEdit is enabled. |
555 bool live_edit_enabled_; | 522 bool live_edit_enabled_; |
556 // Do not trigger debug break events. | 523 // Do not trigger debug break events. |
557 bool break_disabled_; | 524 bool break_disabled_; |
558 // Do not break on break points. | 525 // Do not break on break points. |
559 bool break_points_active_; | 526 bool break_points_active_; |
560 // Nested inside a debug event listener. | |
561 bool in_debug_event_listener_; | |
562 // Trigger debug break events for all exceptions. | 527 // Trigger debug break events for all exceptions. |
563 bool break_on_exception_; | 528 bool break_on_exception_; |
564 // Trigger debug break events for uncaught exceptions. | 529 // Trigger debug break events for uncaught exceptions. |
565 bool break_on_uncaught_exception_; | 530 bool break_on_uncaught_exception_; |
566 // Termination exception because side effect check has failed. | 531 // Termination exception because side effect check has failed. |
567 bool side_effect_check_failed_; | 532 bool side_effect_check_failed_; |
568 | 533 |
569 // List of active debug info objects. | 534 // List of active debug info objects. |
570 DebugInfoListNode* debug_info_list_; | 535 DebugInfoListNode* debug_info_list_; |
571 | 536 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
615 ThreadLocal thread_local_; | 580 ThreadLocal thread_local_; |
616 | 581 |
617 Isolate* isolate_; | 582 Isolate* isolate_; |
618 | 583 |
619 friend class Isolate; | 584 friend class Isolate; |
620 friend class DebugScope; | 585 friend class DebugScope; |
621 friend class DisableBreak; | 586 friend class DisableBreak; |
622 friend class LiveEdit; | 587 friend class LiveEdit; |
623 friend class SuppressDebug; | 588 friend class SuppressDebug; |
624 friend class NoSideEffectScope; | 589 friend class NoSideEffectScope; |
590 friend class LegacyDebugDelegate; | |
625 | 591 |
626 friend Handle<FixedArray> GetDebuggedFunctions(); // In test-debug.cc | 592 friend Handle<FixedArray> GetDebuggedFunctions(); // In test-debug.cc |
627 friend void CheckDebuggerUnloaded(bool check_functions); // In test-debug.cc | 593 friend void CheckDebuggerUnloaded(bool check_functions); // In test-debug.cc |
628 | 594 |
629 DISALLOW_COPY_AND_ASSIGN(Debug); | 595 DISALLOW_COPY_AND_ASSIGN(Debug); |
630 }; | 596 }; |
631 | 597 |
598 class LegacyDebugDelegate : public v8::debug::DebugDelegate { | |
599 public: | |
600 explicit LegacyDebugDelegate(Isolate* isolate) : isolate_(isolate) {} | |
601 void PromiseEventOccurred(v8::debug::PromiseDebugActionType type, int id, | |
602 int parent_id) override; | |
603 void ScriptCompiled(v8::Local<v8::debug::Script> script, | |
604 bool has_compile_error) override; | |
605 void BreakProgramRequested(v8::Local<v8::Context> paused_context, | |
606 v8::Local<v8::Object> exec_state, | |
607 v8::Local<v8::Value> break_points_hit) override; | |
608 void ExceptionThrown(v8::Local<v8::Context> paused_context, | |
609 v8::Local<v8::Object> exec_state, | |
610 v8::Local<v8::Value> exception, | |
611 v8::Local<v8::Value> promise, bool is_uncaught) override; | |
612 bool IsFunctionBlackboxed(v8::Local<v8::debug::Script> script, | |
613 const v8::debug::Location& start, | |
614 const v8::debug::Location& end) override { | |
615 return false; | |
616 } | |
617 | |
618 protected: | |
619 Isolate* isolate_; | |
620 | |
621 private: | |
622 void ProcessDebugEvent(v8::DebugEvent event, Handle<JSObject> event_data); | |
623 virtual void ProcessDebugEvent(v8::DebugEvent event, | |
624 Handle<JSObject> event_data, | |
625 Handle<JSObject> exec_state) = 0; | |
626 }; | |
627 | |
628 class JavaScriptDebugDelegate : public LegacyDebugDelegate { | |
629 public: | |
630 JavaScriptDebugDelegate(Isolate* isolate, Handle<JSFunction> listener, | |
631 Handle<Object> data); | |
632 virtual ~JavaScriptDebugDelegate(); | |
633 | |
634 private: | |
635 void ProcessDebugEvent(v8::DebugEvent event, Handle<JSObject> event_data, | |
636 Handle<JSObject> exec_state) override; | |
637 | |
638 Handle<JSFunction> listener_; | |
639 Handle<Object> data_; | |
640 }; | |
641 | |
642 class NativeDebugDelegate : public LegacyDebugDelegate { | |
643 public: | |
644 NativeDebugDelegate(Isolate* isolate, v8::Debug::EventCallback callback, | |
645 Handle<Object> data); | |
646 virtual ~NativeDebugDelegate(); | |
647 | |
648 private: | |
649 // Details of the debug event delivered to the debug event listener. | |
650 class EventDetails : public v8::Debug::EventDetails { | |
651 public: | |
652 EventDetails(DebugEvent event, Handle<JSObject> exec_state, | |
653 Handle<JSObject> event_data, Handle<Object> callback_data); | |
654 virtual DebugEvent GetEvent() const; | |
655 virtual v8::Local<v8::Object> GetExecutionState() const; | |
656 virtual v8::Local<v8::Object> GetEventData() const; | |
657 virtual v8::Local<v8::Context> GetEventContext() const; | |
658 virtual v8::Local<v8::Value> GetCallbackData() const; | |
659 virtual v8::Debug::ClientData* GetClientData() const { return nullptr; } | |
660 virtual v8::Isolate* GetIsolate() const; | |
661 | |
662 private: | |
663 DebugEvent event_; // Debug event causing the break. | |
664 Handle<JSObject> exec_state_; // Current execution state. | |
665 Handle<JSObject> event_data_; // Data associated with the event. | |
666 Handle<Object> callback_data_; // User data passed with the callback | |
667 // when it was registered. | |
668 }; | |
669 | |
670 void ProcessDebugEvent(v8::DebugEvent event, Handle<JSObject> event_data, | |
671 Handle<JSObject> exec_state) override; | |
672 | |
673 v8::Debug::EventCallback callback_; | |
674 Handle<Object> data_; | |
675 }; | |
632 | 676 |
633 // This scope is used to load and enter the debug context and create a new | 677 // This scope is used to load and enter the debug context and create a new |
634 // break state. Leaving the scope will restore the previous state. | 678 // break state. Leaving the scope will restore the previous state. |
635 // On failure to load, FailedToEnter returns true. | 679 // On failure to load, FailedToEnter returns true. |
636 class DebugScope BASE_EMBEDDED { | 680 class DebugScope BASE_EMBEDDED { |
637 public: | 681 public: |
638 explicit DebugScope(Debug* debug); | 682 explicit DebugScope(Debug* debug); |
639 ~DebugScope(); | 683 ~DebugScope(); |
640 | 684 |
641 // Check whether loading was successful. | 685 // Check whether loading was successful. |
(...skipping 13 matching lines...) Expand all Loading... | |
655 bool failed_; // Did the debug context fail to load? | 699 bool failed_; // Did the debug context fail to load? |
656 SaveContext save_; // Saves previous context. | 700 SaveContext save_; // Saves previous context. |
657 PostponeInterruptsScope no_termination_exceptons_; | 701 PostponeInterruptsScope no_termination_exceptons_; |
658 }; | 702 }; |
659 | 703 |
660 | 704 |
661 // Stack allocated class for disabling break. | 705 // Stack allocated class for disabling break. |
662 class DisableBreak BASE_EMBEDDED { | 706 class DisableBreak BASE_EMBEDDED { |
663 public: | 707 public: |
664 explicit DisableBreak(Debug* debug) | 708 explicit DisableBreak(Debug* debug) |
665 : debug_(debug), | 709 : debug_(debug), previous_break_disabled_(debug->break_disabled_) { |
666 previous_break_disabled_(debug->break_disabled_), | |
667 previous_in_debug_event_listener_(debug->in_debug_event_listener_) { | |
668 debug_->break_disabled_ = true; | 710 debug_->break_disabled_ = true; |
669 debug_->in_debug_event_listener_ = true; | |
670 } | 711 } |
671 ~DisableBreak() { | 712 ~DisableBreak() { |
672 debug_->break_disabled_ = previous_break_disabled_; | 713 debug_->break_disabled_ = previous_break_disabled_; |
673 debug_->in_debug_event_listener_ = previous_in_debug_event_listener_; | |
674 } | 714 } |
675 | 715 |
676 private: | 716 private: |
677 Debug* debug_; | 717 Debug* debug_; |
678 bool previous_break_disabled_; | 718 bool previous_break_disabled_; |
679 bool previous_in_debug_event_listener_; | |
680 DISALLOW_COPY_AND_ASSIGN(DisableBreak); | 719 DISALLOW_COPY_AND_ASSIGN(DisableBreak); |
681 }; | 720 }; |
682 | 721 |
683 | 722 |
684 class SuppressDebug BASE_EMBEDDED { | 723 class SuppressDebug BASE_EMBEDDED { |
685 public: | 724 public: |
686 explicit SuppressDebug(Debug* debug) | 725 explicit SuppressDebug(Debug* debug) |
687 : debug_(debug), old_state_(debug->is_suppressed_) { | 726 : debug_(debug), old_state_(debug->is_suppressed_) { |
688 debug_->is_suppressed_ = true; | 727 debug_->is_suppressed_ = true; |
689 } | 728 } |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
737 Handle<Code> code); | 776 Handle<Code> code); |
738 static bool DebugBreakSlotIsPatched(Address pc); | 777 static bool DebugBreakSlotIsPatched(Address pc); |
739 static void ClearDebugBreakSlot(Isolate* isolate, Address pc); | 778 static void ClearDebugBreakSlot(Isolate* isolate, Address pc); |
740 }; | 779 }; |
741 | 780 |
742 | 781 |
743 } // namespace internal | 782 } // namespace internal |
744 } // namespace v8 | 783 } // namespace v8 |
745 | 784 |
746 #endif // V8_DEBUG_DEBUG_H_ | 785 #endif // V8_DEBUG_DEBUG_H_ |
OLD | NEW |