1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2008 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifndef V8_V8_DEBUG_H_
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_V8_DEBUG_H_
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "v8.h"
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Debugger support for the V8 JavaScript engine.
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 {
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Debug events which can occur in the V8 JavaScript engine.
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockenum DebugEvent {
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Break = 1,
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Exception = 2,
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  NewFunction = 3,
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  BeforeCompile = 4,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  AfterCompile  = 5,
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CompileError = 6,
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PromiseEvent = 7,
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AsyncTaskEvent = 8,
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BreakForCommand = 9
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Debug {
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  /**
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block   * A client object passed to the v8 debugger whose ownership will be taken by
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block   * it. v8 is always responsible for deleting the object.
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block   */
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  class ClientData {
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block   public:
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    virtual ~ClientData() {}
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  };
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  /**
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block   * A message object passed to the debug message handler.
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block   */
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  class Message {
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block   public:
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    /**
47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block     * Check type of message.
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block     */
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    virtual bool IsEvent() const = 0;
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    virtual bool IsResponse() const = 0;
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    virtual DebugEvent GetEvent() const = 0;
52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    /**
54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block     * Indicate whether this is a response to a continue command which will
55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block     * start the VM running after this is processed.
56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block     */
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    virtual bool WillStartRunning() const = 0;
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    /**
60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block     * Access to execution state and event data. Don't store these cross
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block     * callbacks as their content becomes invalid. These objects are from the
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block     * debugger event that started the debug message loop.
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block     */
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    virtual Handle<Object> GetExecutionState() const = 0;
65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    virtual Handle<Object> GetEventData() const = 0;
66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    /**
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block     * Get the debugger protocol JSON.
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block     */
70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    virtual Handle<String> GetJSON() const = 0;
71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    /**
73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block     * Get the context active when the debug event happened. Note this is not
74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block     * the current active context as the JavaScript part of the debugger is
75257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch     * running in its own context which is entered at this point.
76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block     */
77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    virtual Handle<Context> GetEventContext() const = 0;
78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    /**
80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block     * Client data passed with the corresponding request if any. This is the
81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block     * client_data data value passed into Debug::SendCommand along with the
82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block     * request that led to the message or NULL if the message is an event. The
83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block     * debugger takes ownership of the data and will delete it even if there is
84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block     * no message handler.
85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block     */
86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    virtual ClientData* GetClientData() const = 0;
87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    virtual Isolate* GetIsolate() const = 0;
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    virtual ~Message() {}
91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  };
923e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu
93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  /**
95f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke   * An event details object passed to the debug event listener.
96f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke   */
97f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  class EventDetails {
98f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke   public:
99f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke    /**
100f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke     * Event type.
101f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke     */
102f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke    virtual DebugEvent GetEvent() const = 0;
103f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
104f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke    /**
105f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke     * Access to execution state and event data of the debug event. Don't store
106f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke     * these cross callbacks as their content becomes invalid.
107f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke     */
108f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke    virtual Handle<Object> GetExecutionState() const = 0;
109f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke    virtual Handle<Object> GetEventData() const = 0;
110f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
111f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke    /**
112f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke     * Get the context active when the debug event happened. Note this is not
113f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke     * the current active context as the JavaScript part of the debugger is
114257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch     * running in its own context which is entered at this point.
115f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke     */
116f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke    virtual Handle<Context> GetEventContext() const = 0;
117f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
118f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke    /**
119257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch     * Client data passed with the corresponding callback when it was
120257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch     * registered.
121f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke     */
122f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke    virtual Handle<Value> GetCallbackData() const = 0;
123f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
1243bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch    /**
1253bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch     * Client data passed to DebugBreakForCommand function. The
1263bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch     * debugger takes ownership of the data and will delete it even if
1273bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch     * there is no message handler.
1283bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch     */
1293bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch    virtual ClientData* GetClientData() const = 0;
1303bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
131f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke    virtual ~EventDetails() {}
132f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  };
133f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
134f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  /**
135f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke   * Debug event callback function.
136f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke   *
137f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke   * \param event_details object providing information about the debug event
138f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke   *
139f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke   * A EventCallback2 does not take possession of the event data,
140f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke   * and must not rely on the data persisting after the handler returns.
141f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke   */
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  typedef void (*EventCallback)(const EventDetails& event_details);
143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  /**
145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block   * Debug message callback function.
146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block   *
147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block   * \param message the debug message handler message object
14844f0eee88ff00398ff7f715fab053374d808c90dSteve Block   *
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   * A MessageHandler2 does not take possession of the message data,
150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block   * and must not rely on the data persisting after the handler returns.
151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block   */
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  typedef void (*MessageHandler)(const Message& message);
153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
154d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  /**
155d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block   * Callback function for the host to ensure debug messages are processed.
156d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block   */
157d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  typedef void (*DebugMessageDispatchHandler)();
158d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static bool SetDebugEventListener(EventCallback that,
160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                    Handle<Value> data = Handle<Value>());
161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
16244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Schedule a debugger break to happen when JavaScript code is run
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // in the given isolate.
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static void DebugBreak(Isolate* isolate);
165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
16644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Remove scheduled debugger break in given isolate if it has not
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // happened yet.
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static void CancelDebugBreak(Isolate* isolate);
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Check if a debugger break is scheduled in the given isolate.
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static bool CheckDebugBreak(Isolate* isolate);
172f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
17344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Break execution of JavaScript in the given isolate (this method
17444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // can be invoked from a non-VM thread) for further client command
17544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // execution on a VM thread. Client data is then passed in
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // EventDetails to EventCallback2 at the moment when the VM actually
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // stops.
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static void DebugBreakForCommand(Isolate* isolate, ClientData* data);
179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Message based interface. The message protocol is JSON.
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static void SetMessageHandler(MessageHandler handler);
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static void SendCommand(Isolate* isolate,
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const uint16_t* command, int length,
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          ClientData* client_data = NULL);
186d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /**
188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  * Run a JavaScript function in the debugger.
189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  * \param fun the function to call
190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  * \param data passed as second argument to the function
191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  * With this call the debugger is entered and the function specified is called
192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  * with the execution state as the first argument. This makes it possible to
193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  * get access to information otherwise not available during normal JavaScript
1946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  * execution e.g. details on stack frames. Receiver of the function call will
1956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  * be the debugger context global object, however this is a subject to change.
196257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  * The following example shows a JavaScript function which when passed to
1976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  * v8::Debug::Call will return the current line of JavaScript execution.
198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  *
199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  * \code
200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  *   function frame_source_line(exec_state) {
201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  *     return exec_state.frame(0).sourceLine();
202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  *   }
203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  * \endcode
204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  */
205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static Local<Value> Call(v8::Handle<v8::Function> fun,
206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           Handle<Value> data = Handle<Value>());
207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  /**
209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block   * Returns a mirror object for the given object.
210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block   */
211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static Local<Value> GetMirror(v8::Handle<v8::Value> obj);
212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  /**
214e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   * Makes V8 process all pending debug messages.
215e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   *
216e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   * From V8 point of view all debug messages come asynchronously (e.g. from
217e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   * remote debugger) but they all must be handled synchronously: V8 cannot
218e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   * do 2 things at one time so normal script execution must be interrupted
219e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   * for a while.
220e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   *
221e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   * Generally when message arrives V8 may be in one of 3 states:
222e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   * 1. V8 is running script; V8 will automatically interrupt and process all
223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   * pending messages;
224e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   * 2. V8 is suspended on debug breakpoint; in this state V8 is dedicated
225e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   * to reading and processing debug messages;
226e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   * 3. V8 is not running at all or has called some long-working C++ function;
227257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch   * by default it means that processing of all debug messages will be deferred
228e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   * until V8 gets control again; however, embedding application may improve
229e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   * this by manually calling this method.
230e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   *
231e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   * Technically this method in many senses is equivalent to executing empty
232e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   * script:
233e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   * 1. It does nothing except for processing all pending debug messages.
234e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   * 2. It should be invoked with the same precautions and from the same context
235e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   * as V8 script would be invoked from, because:
236e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   *   a. with "evaluate" command it can do whatever normal script can do,
237e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   *   including all native calls;
238e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   *   b. no other thread should call V8 while this method is running
239e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   *   (v8::Locker may be used here).
240e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   *
241e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   * "Evaluate" debug command behavior currently is not specified in scope
242e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   * of this method.
243e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke   */
244e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  static void ProcessDebugMessages();
2456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  /**
247257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch   * Debugger is running in its own context which is entered while debugger
2486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block   * messages are being dispatched. This is an explicit getter for this
2496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block   * debugger context. Note that the content of the debugger context is subject
2506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block   * to change.
2516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block   */
2526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static Local<Context> GetDebugContext();
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  /**
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   * Enable/disable LiveEdit functionality for the given Isolate
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   * (default Isolate if not provided). V8 will abort if LiveEdit is
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   * unexpectedly used. LiveEdit is enabled by default.
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   */
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static void SetLiveEditEnabled(Isolate* isolate, bool enable);
261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}  // namespace v8
265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef EXPORT
268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif  // V8_V8_DEBUG_H_
271