blob: 6520cbe0cda70d8302784d5bce75e4e6b8c8d7e8 [file] [log] [blame]
Steve Blocka7e24c12009-10-30 11:49:00 +00001// Copyright 2008 the V8 project authors. All rights reserved.
Ben Murdochb8a8cc12014-11-26 15:28:44 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
Steve Blocka7e24c12009-10-30 11:49:00 +00004
5#ifndef V8_V8_DEBUG_H_
6#define V8_V8_DEBUG_H_
7
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00008#include "v8.h" // NOLINT(build/include)
Steve Blocka7e24c12009-10-30 11:49:00 +00009
Steve Blocka7e24c12009-10-30 11:49:00 +000010/**
11 * Debugger support for the V8 JavaScript engine.
12 */
13namespace v8 {
14
15// Debug events which can occur in the V8 JavaScript engine.
16enum DebugEvent {
17 Break = 1,
18 Exception = 2,
19 NewFunction = 3,
20 BeforeCompile = 4,
Ben Murdochda12d292016-06-02 14:46:10 +010021 AfterCompile = 5,
Ben Murdochb8a8cc12014-11-26 15:28:44 +000022 CompileError = 6,
Ben Murdochda12d292016-06-02 14:46:10 +010023 AsyncTaskEvent = 7,
Steve Blocka7e24c12009-10-30 11:49:00 +000024};
25
Ben Murdochb8a8cc12014-11-26 15:28:44 +000026class V8_EXPORT Debug {
Steve Blocka7e24c12009-10-30 11:49:00 +000027 public:
28 /**
29 * A client object passed to the v8 debugger whose ownership will be taken by
30 * it. v8 is always responsible for deleting the object.
31 */
32 class ClientData {
33 public:
34 virtual ~ClientData() {}
35 };
36
37
38 /**
39 * A message object passed to the debug message handler.
40 */
41 class Message {
42 public:
43 /**
44 * Check type of message.
45 */
46 virtual bool IsEvent() const = 0;
47 virtual bool IsResponse() const = 0;
48 virtual DebugEvent GetEvent() const = 0;
49
50 /**
51 * Indicate whether this is a response to a continue command which will
52 * start the VM running after this is processed.
53 */
54 virtual bool WillStartRunning() const = 0;
55
56 /**
57 * Access to execution state and event data. Don't store these cross
58 * callbacks as their content becomes invalid. These objects are from the
59 * debugger event that started the debug message loop.
60 */
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000061 virtual Local<Object> GetExecutionState() const = 0;
62 virtual Local<Object> GetEventData() const = 0;
Steve Blocka7e24c12009-10-30 11:49:00 +000063
64 /**
65 * Get the debugger protocol JSON.
66 */
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000067 virtual Local<String> GetJSON() const = 0;
Steve Blocka7e24c12009-10-30 11:49:00 +000068
69 /**
70 * Get the context active when the debug event happened. Note this is not
71 * the current active context as the JavaScript part of the debugger is
Ben Murdoch257744e2011-11-30 15:57:28 +000072 * running in its own context which is entered at this point.
Steve Blocka7e24c12009-10-30 11:49:00 +000073 */
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000074 virtual Local<Context> GetEventContext() const = 0;
Steve Blocka7e24c12009-10-30 11:49:00 +000075
76 /**
77 * Client data passed with the corresponding request if any. This is the
78 * client_data data value passed into Debug::SendCommand along with the
79 * request that led to the message or NULL if the message is an event. The
80 * debugger takes ownership of the data and will delete it even if there is
81 * no message handler.
82 */
83 virtual ClientData* GetClientData() const = 0;
84
Ben Murdochb8a8cc12014-11-26 15:28:44 +000085 virtual Isolate* GetIsolate() const = 0;
86
Steve Blocka7e24c12009-10-30 11:49:00 +000087 virtual ~Message() {}
88 };
Teng-Hui Zhu3e5fa292010-11-09 16:16:48 -080089
Steve Blocka7e24c12009-10-30 11:49:00 +000090
91 /**
Leon Clarkef7060e22010-06-03 12:02:55 +010092 * An event details object passed to the debug event listener.
93 */
94 class EventDetails {
95 public:
96 /**
97 * Event type.
98 */
99 virtual DebugEvent GetEvent() const = 0;
100
101 /**
102 * Access to execution state and event data of the debug event. Don't store
103 * these cross callbacks as their content becomes invalid.
104 */
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000105 virtual Local<Object> GetExecutionState() const = 0;
106 virtual Local<Object> GetEventData() const = 0;
Leon Clarkef7060e22010-06-03 12:02:55 +0100107
108 /**
109 * Get the context active when the debug event happened. Note this is not
110 * the current active context as the JavaScript part of the debugger is
Ben Murdoch257744e2011-11-30 15:57:28 +0000111 * running in its own context which is entered at this point.
Leon Clarkef7060e22010-06-03 12:02:55 +0100112 */
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000113 virtual Local<Context> GetEventContext() const = 0;
Leon Clarkef7060e22010-06-03 12:02:55 +0100114
115 /**
Ben Murdoch257744e2011-11-30 15:57:28 +0000116 * Client data passed with the corresponding callback when it was
117 * registered.
Leon Clarkef7060e22010-06-03 12:02:55 +0100118 */
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000119 virtual Local<Value> GetCallbackData() const = 0;
Leon Clarkef7060e22010-06-03 12:02:55 +0100120
Ben Murdoch3bec4d22010-07-22 14:51:16 +0100121 /**
122 * Client data passed to DebugBreakForCommand function. The
123 * debugger takes ownership of the data and will delete it even if
124 * there is no message handler.
125 */
126 virtual ClientData* GetClientData() const = 0;
127
Ben Murdoch61f157c2016-09-16 13:49:30 +0100128 virtual Isolate* GetIsolate() const = 0;
129
Leon Clarkef7060e22010-06-03 12:02:55 +0100130 virtual ~EventDetails() {}
131 };
132
Leon Clarkef7060e22010-06-03 12:02:55 +0100133 /**
134 * Debug event callback function.
135 *
136 * \param event_details object providing information about the debug event
137 *
138 * A EventCallback2 does not take possession of the event data,
139 * and must not rely on the data persisting after the handler returns.
140 */
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000141 typedef void (*EventCallback)(const EventDetails& event_details);
Steve Blocka7e24c12009-10-30 11:49:00 +0000142
143 /**
144 * Debug message callback function.
145 *
146 * \param message the debug message handler message object
Steve Block44f0eee2011-05-26 01:26:41 +0100147 *
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000148 * A MessageHandler2 does not take possession of the message data,
Steve Blocka7e24c12009-10-30 11:49:00 +0000149 * and must not rely on the data persisting after the handler returns.
150 */
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000151 typedef void (*MessageHandler)(const Message& message);
Steve Blocka7e24c12009-10-30 11:49:00 +0000152
Steve Blockd0582a62009-12-15 09:54:21 +0000153 /**
154 * Callback function for the host to ensure debug messages are processed.
155 */
156 typedef void (*DebugMessageDispatchHandler)();
157
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000158 static bool SetDebugEventListener(Isolate* isolate, EventCallback that,
159 Local<Value> data = Local<Value>());
160 V8_DEPRECATED("Use version with an Isolate",
161 static bool SetDebugEventListener(
162 EventCallback that, Local<Value> data = Local<Value>()));
Steve Blocka7e24c12009-10-30 11:49:00 +0000163
Steve Block44f0eee2011-05-26 01:26:41 +0100164 // Schedule a debugger break to happen when JavaScript code is run
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000165 // in the given isolate.
166 static void DebugBreak(Isolate* isolate);
Steve Blocka7e24c12009-10-30 11:49:00 +0000167
Steve Block44f0eee2011-05-26 01:26:41 +0100168 // Remove scheduled debugger break in given isolate if it has not
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000169 // happened yet.
170 static void CancelDebugBreak(Isolate* isolate);
171
172 // Check if a debugger break is scheduled in the given isolate.
173 static bool CheckDebugBreak(Isolate* isolate);
Ben Murdochf87a2032010-10-22 12:50:53 +0100174
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000175 // Message based interface. The message protocol is JSON.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000176 static void SetMessageHandler(Isolate* isolate, MessageHandler handler);
177 V8_DEPRECATED("Use version with an Isolate",
178 static void SetMessageHandler(MessageHandler handler));
Steve Block44f0eee2011-05-26 01:26:41 +0100179
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000180 static void SendCommand(Isolate* isolate,
181 const uint16_t* command, int length,
182 ClientData* client_data = NULL);
Steve Blockd0582a62009-12-15 09:54:21 +0000183
Steve Blocka7e24c12009-10-30 11:49:00 +0000184 /**
185 * Run a JavaScript function in the debugger.
186 * \param fun the function to call
187 * \param data passed as second argument to the function
188 * With this call the debugger is entered and the function specified is called
189 * with the execution state as the first argument. This makes it possible to
190 * get access to information otherwise not available during normal JavaScript
Steve Block6ded16b2010-05-10 14:33:55 +0100191 * execution e.g. details on stack frames. Receiver of the function call will
192 * be the debugger context global object, however this is a subject to change.
Ben Murdoch257744e2011-11-30 15:57:28 +0000193 * The following example shows a JavaScript function which when passed to
Steve Block6ded16b2010-05-10 14:33:55 +0100194 * v8::Debug::Call will return the current line of JavaScript execution.
Steve Blocka7e24c12009-10-30 11:49:00 +0000195 *
196 * \code
197 * function frame_source_line(exec_state) {
198 * return exec_state.frame(0).sourceLine();
199 * }
200 * \endcode
201 */
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000202 static V8_DEPRECATED("Use maybe version",
203 Local<Value> Call(v8::Local<v8::Function> fun,
204 Local<Value> data = Local<Value>()));
205 // TODO(dcarney): data arg should be a MaybeLocal
206 static MaybeLocal<Value> Call(Local<Context> context,
207 v8::Local<v8::Function> fun,
208 Local<Value> data = Local<Value>());
Steve Blocka7e24c12009-10-30 11:49:00 +0000209
210 /**
211 * Returns a mirror object for the given object.
212 */
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000213 static V8_DEPRECATED("Use maybe version",
214 Local<Value> GetMirror(v8::Local<v8::Value> obj));
215 static MaybeLocal<Value> GetMirror(Local<Context> context,
216 v8::Local<v8::Value> obj);
Steve Blocka7e24c12009-10-30 11:49:00 +0000217
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100218 /**
Leon Clarkee46be812010-01-19 14:06:41 +0000219 * Makes V8 process all pending debug messages.
220 *
221 * From V8 point of view all debug messages come asynchronously (e.g. from
222 * remote debugger) but they all must be handled synchronously: V8 cannot
223 * do 2 things at one time so normal script execution must be interrupted
224 * for a while.
225 *
226 * Generally when message arrives V8 may be in one of 3 states:
227 * 1. V8 is running script; V8 will automatically interrupt and process all
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000228 * pending messages;
Leon Clarkee46be812010-01-19 14:06:41 +0000229 * 2. V8 is suspended on debug breakpoint; in this state V8 is dedicated
230 * to reading and processing debug messages;
231 * 3. V8 is not running at all or has called some long-working C++ function;
Ben Murdoch257744e2011-11-30 15:57:28 +0000232 * by default it means that processing of all debug messages will be deferred
Leon Clarkee46be812010-01-19 14:06:41 +0000233 * until V8 gets control again; however, embedding application may improve
234 * this by manually calling this method.
235 *
Leon Clarkee46be812010-01-19 14:06:41 +0000236 * Technically this method in many senses is equivalent to executing empty
237 * script:
238 * 1. It does nothing except for processing all pending debug messages.
239 * 2. It should be invoked with the same precautions and from the same context
240 * as V8 script would be invoked from, because:
241 * a. with "evaluate" command it can do whatever normal script can do,
242 * including all native calls;
243 * b. no other thread should call V8 while this method is running
244 * (v8::Locker may be used here).
245 *
246 * "Evaluate" debug command behavior currently is not specified in scope
247 * of this method.
248 */
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000249 static void ProcessDebugMessages(Isolate* isolate);
250 V8_DEPRECATED("Use version with an Isolate",
251 static void ProcessDebugMessages());
Steve Block6ded16b2010-05-10 14:33:55 +0100252
253 /**
Ben Murdoch257744e2011-11-30 15:57:28 +0000254 * Debugger is running in its own context which is entered while debugger
Steve Block6ded16b2010-05-10 14:33:55 +0100255 * messages are being dispatched. This is an explicit getter for this
256 * debugger context. Note that the content of the debugger context is subject
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000257 * to change. The Context exists only when the debugger is active, i.e. at
258 * least one DebugEventListener or MessageHandler is set.
Steve Block6ded16b2010-05-10 14:33:55 +0100259 */
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000260 static Local<Context> GetDebugContext(Isolate* isolate);
261 V8_DEPRECATED("Use version with an Isolate",
262 static Local<Context> GetDebugContext());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000263
Ben Murdoch61f157c2016-09-16 13:49:30 +0100264 /**
265 * While in the debug context, this method returns the top-most non-debug
266 * context, if it exists.
267 */
268 static MaybeLocal<Context> GetDebuggedContext(Isolate* isolate);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000269
270 /**
271 * Enable/disable LiveEdit functionality for the given Isolate
272 * (default Isolate if not provided). V8 will abort if LiveEdit is
273 * unexpectedly used. LiveEdit is enabled by default.
274 */
275 static void SetLiveEditEnabled(Isolate* isolate, bool enable);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000276
277 /**
278 * Returns array of internal properties specific to the value type. Result has
279 * the following format: [<name>, <value>,...,<name>, <value>]. Result array
280 * will be allocated in the current context.
281 */
282 static MaybeLocal<Array> GetInternalProperties(Isolate* isolate,
283 Local<Value> value);
Ben Murdochda12d292016-06-02 14:46:10 +0100284
285 /**
286 * Defines if the ES2015 tail call elimination feature is enabled or not.
287 * The change of this flag triggers deoptimization of all functions that
288 * contain calls at tail position.
289 */
290 static bool IsTailCallEliminationEnabled(Isolate* isolate);
291 static void SetTailCallEliminationEnabled(Isolate* isolate, bool enabled);
Steve Blocka7e24c12009-10-30 11:49:00 +0000292};
293
294
295} // namespace v8
296
297
298#undef EXPORT
299
300
301#endif // V8_V8_DEBUG_H_