19258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org// Copyright 2008 the V8 project authors. All rights reserved.
243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Redistribution and use in source and binary forms, with or without
343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// modification, are permitted provided that the following conditions are
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// met:
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Redistributions of source code must retain the above copyright
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       notice, this list of conditions and the following disclaimer.
843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Redistributions in binary form must reproduce the above
943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       copyright notice, this list of conditions and the following
1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       disclaimer in the documentation and/or other materials provided
1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       with the distribution.
1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Neither the name of Google Inc. nor the names of its
1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       contributors may be used to endorse or promote products derived
1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       from this software without specific prior written permission.
1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
285ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#ifndef V8_V8_DEBUG_H_
295ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#define V8_V8_DEBUG_H_
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "v8.h"
3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Debugger support for the V8 JavaScript engine.
3543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansennamespace v8 {
3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
387276f14ca716596e0a0d17539516370c1f453847kasper.lund// Debug events which can occur in the V8 JavaScript engine.
3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenenum DebugEvent {
4043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Break = 1,
4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Exception = 2,
4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  NewFunction = 3,
4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  BeforeCompile = 4,
4471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  AfterCompile  = 5,
4522762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com  ScriptCollected = 6,
4622762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com  BreakForCommand = 7
4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
50594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Debug {
5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
5265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  /**
5365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   * A client object passed to the v8 debugger whose ownership will be taken by
5465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   * it. v8 is always responsible for deleting the object.
5565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   */
5665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  class ClientData {
5765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   public:
5865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    virtual ~ClientData() {}
5965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  };
6065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
6165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
6265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  /**
635ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org   * A message object passed to the debug message handler.
645ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org   */
655ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org  class Message {
665ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org   public:
675ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org    /**
685ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org     * Check type of message.
695ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org     */
705ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org    virtual bool IsEvent() const = 0;
715ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org    virtual bool IsResponse() const = 0;
725ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org    virtual DebugEvent GetEvent() const = 0;
735ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org
745ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org    /**
755ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org     * Indicate whether this is a response to a continue command which will
765ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org     * start the VM running after this is processed.
775ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org     */
785ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org    virtual bool WillStartRunning() const = 0;
795ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org
805ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org    /**
815ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org     * Access to execution state and event data. Don't store these cross
825ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org     * callbacks as their content becomes invalid. These objects are from the
835ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org     * debugger event that started the debug message loop.
845ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org     */
855ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org    virtual Handle<Object> GetExecutionState() const = 0;
865ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org    virtual Handle<Object> GetEventData() const = 0;
875ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org
885ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org    /**
895ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org     * Get the debugger protocol JSON.
905ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org     */
915ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org    virtual Handle<String> GetJSON() const = 0;
925ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org
935ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org    /**
945ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org     * Get the context active when the debug event happened. Note this is not
955ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org     * the current active context as the JavaScript part of the debugger is
967304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org     * running in its own context which is entered at this point.
975ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org     */
985ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org    virtual Handle<Context> GetEventContext() const = 0;
995ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org
1005ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org    /**
1015ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org     * Client data passed with the corresponding request if any. This is the
1025ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org     * client_data data value passed into Debug::SendCommand along with the
1035ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org     * request that led to the message or NULL if the message is an event. The
1045ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org     * debugger takes ownership of the data and will delete it even if there is
1055ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org     * no message handler.
1065ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org     */
1075ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org    virtual ClientData* GetClientData() const = 0;
1085ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org
1095ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org    virtual ~Message() {}
1105ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org  };
111f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org
1125ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org
1135ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org  /**
1149dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com   * An event details object passed to the debug event listener.
1159dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com   */
1169dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  class EventDetails {
1179dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com   public:
1189dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    /**
1199dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com     * Event type.
1209dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com     */
1219dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    virtual DebugEvent GetEvent() const = 0;
1229dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
1239dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    /**
1249dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com     * Access to execution state and event data of the debug event. Don't store
1259dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com     * these cross callbacks as their content becomes invalid.
1269dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com     */
1279dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    virtual Handle<Object> GetExecutionState() const = 0;
1289dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    virtual Handle<Object> GetEventData() const = 0;
1299dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
1309dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    /**
1319dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com     * Get the context active when the debug event happened. Note this is not
1329dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com     * the current active context as the JavaScript part of the debugger is
1337304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org     * running in its own context which is entered at this point.
1349dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com     */
1359dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    virtual Handle<Context> GetEventContext() const = 0;
1369dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
1379dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    /**
1387304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org     * Client data passed with the corresponding callback when it was
1397304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org     * registered.
1409dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com     */
1419dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    virtual Handle<Value> GetCallbackData() const = 0;
1429dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
14322762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com    /**
14422762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com     * Client data passed to DebugBreakForCommand function. The
14522762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com     * debugger takes ownership of the data and will delete it even if
14622762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com     * there is no message handler.
14722762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com     */
14822762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com    virtual ClientData* GetClientData() const = 0;
14922762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com
1509dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    virtual ~EventDetails() {}
1519dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  };
1529dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
1539dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
1549dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  /**
15565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   * Debug event callback function.
15665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   *
15765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   * \param event the type of the debug event that triggered the callback
15865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   *   (enum DebugEvent)
15965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   * \param exec_state execution state (JavaScript object)
16065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   * \param event_data event specific data (JavaScript object)
16165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   * \param data value passed by the user to SetDebugEventListener
16265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   */
16365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  typedef void (*EventCallback)(DebugEvent event,
1645ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org                                Handle<Object> exec_state,
1655ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org                                Handle<Object> event_data,
1665ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org                                Handle<Value> data);
16765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
1689dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  /**
1699dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com   * Debug event callback function.
1709dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com   *
1719dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com   * \param event_details object providing information about the debug event
1729dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com   *
1739dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com   * A EventCallback2 does not take possession of the event data,
1749dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com   * and must not rely on the data persisting after the handler returns.
1759dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com   */
1769dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  typedef void (*EventCallback2)(const EventDetails& event_details);
17765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
17865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  /**
17965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   * Debug message callback function.
18065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   *
1815ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org   * \param message the debug message handler message object
18265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   * \param length length of the message
1835ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org   * \param client_data the data value passed when registering the message handler
1845ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org
1859dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com   * A MessageHandler does not take possession of the message string,
18665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   * and must not rely on the data persisting after the handler returns.
1875ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org   *
1885ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org   * This message handler is deprecated. Use MessageHandler2 instead.
18965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   */
19065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  typedef void (*MessageHandler)(const uint16_t* message, int length,
1915ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org                                 ClientData* client_data);
1925ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org
1935ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org  /**
1945ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org   * Debug message callback function.
1955ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org   *
1965ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org   * \param message the debug message handler message object
197ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   *
1989dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com   * A MessageHandler does not take possession of the message data,
1995ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org   * and must not rely on the data persisting after the handler returns.
2005ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org   */
2015ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org  typedef void (*MessageHandler2)(const Message& message);
20265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
20365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  /**
20465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   * Debug host dispatch callback function.
20565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   */
20665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  typedef void (*HostDispatchHandler)();
20765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
208c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  /**
209c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org   * Callback function for the host to ensure debug messages are processed.
210c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org   */
211c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  typedef void (*DebugMessageDispatchHandler)();
212c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
213245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Set a C debug event listener.
214ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  V8_DEPRECATED(static bool SetDebugEventListener(
215ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org      EventCallback that,
216ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org      Handle<Value> data = Handle<Value>()));
2179dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  static bool SetDebugEventListener2(EventCallback2 that,
2189dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                                     Handle<Value> data = Handle<Value>());
21943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
220245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Set a JavaScript debug event listener.
221245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  static bool SetDebugEventListener(v8::Handle<v8::Object> that,
22243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                    Handle<Value> data = Handle<Value>());
22343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
224ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Schedule a debugger break to happen when JavaScript code is run
225ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // in the given isolate. If no isolate is provided the default
226ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // isolate is used.
227ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  static void DebugBreak(Isolate* isolate = NULL);
22843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
229ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Remove scheduled debugger break in given isolate if it has not
230ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // happened yet. If no isolate is provided the default isolate is
231ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // used.
232ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  static void CancelDebugBreak(Isolate* isolate = NULL);
233f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org
234ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Break execution of JavaScript in the given isolate (this method
235ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // can be invoked from a non-VM thread) for further client command
236ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // execution on a VM thread. Client data is then passed in
237ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // EventDetails to EventCallback at the moment when the VM actually
238ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // stops. If no isolate is provided the default isolate is used.
239ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  static void DebugBreakForCommand(ClientData* data = NULL,
240ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                                   Isolate* isolate = NULL);
24122762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com
2423a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org  // Message based interface. The message protocol is JSON. NOTE the message
2433a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org  // handler thread is not supported any more parameter must be false.
244ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  V8_DEPRECATED(static void SetMessageHandler(
245ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org      MessageHandler handler,
246ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org      bool message_handler_thread = false));
2475ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org  static void SetMessageHandler2(MessageHandler2 handler);
248ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
249ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // If no isolate is provided the default isolate is
250ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // used.
25165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  static void SendCommand(const uint16_t* command, int length,
252ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                          ClientData* client_data = NULL,
253ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                          Isolate* isolate = NULL);
254a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
255381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org  // Dispatch interface.
25665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  static void SetHostDispatchHandler(HostDispatchHandler handler,
25765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org                                     int period = 100);
258381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
259c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  /**
260c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org   * Register a callback function to be called when a debug message has been
261c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org   * received and is ready to be processed. For the debug messages to be
262c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org   * processed V8 needs to be entered, and in certain embedding scenarios this
263c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org   * callback can be used to make sure V8 is entered for the debug message to
264c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org   * be processed. Note that debug messages will only be processed if there is
265c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org   * a V8 break. This can happen automatically by using the option
266c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org   * --debugger-auto-break.
267b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * \param provide_locker requires that V8 acquires v8::Locker for you before
268b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   *        calling handler
269c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org   */
270c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  static void SetDebugMessageDispatchHandler(
271b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org      DebugMessageDispatchHandler handler, bool provide_locker = false);
272c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
273a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org /**
274a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  * Run a JavaScript function in the debugger.
275a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  * \param fun the function to call
276a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  * \param data passed as second argument to the function
277a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  * With this call the debugger is entered and the function specified is called
278a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  * with the execution state as the first argument. This makes it possible to
279a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  * get access to information otherwise not available during normal JavaScript
280df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org  * execution e.g. details on stack frames. Receiver of the function call will
281df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org  * be the debugger context global object, however this is a subject to change.
2827304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  * The following example shows a JavaScript function which when passed to
283df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org  * v8::Debug::Call will return the current line of JavaScript execution.
284a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  *
285a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  * \code
286a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  *   function frame_source_line(exec_state) {
287a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  *     return exec_state.frame(0).sourceLine();
288a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  *   }
289a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  * \endcode
290a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  */
291911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  static Local<Value> Call(v8::Handle<v8::Function> fun,
292de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org                           Handle<Value> data = Handle<Value>());
2937be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
294911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  /**
295911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org   * Returns a mirror object for the given object.
296911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org   */
297911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  static Local<Value> GetMirror(v8::Handle<v8::Value> obj);
298911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
2997be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org /**
3007be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  * Enable the V8 builtin debug agent. The debugger agent will listen on the
3017be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  * supplied TCP/IP port for remote debugger connection.
302bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  * \param name the name of the embedding application
3037be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  * \param port the TCP/IP port to listen on
3040c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  * \param wait_for_connection whether V8 should pause on a first statement
3050c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  *   allowing remote debugger to connect before anything interesting happened
3067be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  */
3070c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  static bool EnableAgent(const char* name, int port,
3080c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org                          bool wait_for_connection = false);
309b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
310b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  /**
311c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    * Disable the V8 builtin debug agent. The TCP/IP connection will be closed.
312c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    */
313c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  static void DisableAgent();
314c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
315c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  /**
316b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * Makes V8 process all pending debug messages.
317b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   *
318b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * From V8 point of view all debug messages come asynchronously (e.g. from
319b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * remote debugger) but they all must be handled synchronously: V8 cannot
320b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * do 2 things at one time so normal script execution must be interrupted
321b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * for a while.
322b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   *
323b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * Generally when message arrives V8 may be in one of 3 states:
324b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * 1. V8 is running script; V8 will automatically interrupt and process all
325b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * pending messages (however auto_break flag should be enabled);
326b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * 2. V8 is suspended on debug breakpoint; in this state V8 is dedicated
327b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * to reading and processing debug messages;
328b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * 3. V8 is not running at all or has called some long-working C++ function;
3297304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * by default it means that processing of all debug messages will be deferred
330b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * until V8 gets control again; however, embedding application may improve
331b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * this by manually calling this method.
332b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   *
333b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * It makes sense to call this method whenever a new debug message arrived and
334b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * V8 is not already running. Method v8::Debug::SetDebugMessageDispatchHandler
335b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * should help with the former condition.
336b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   *
337b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * Technically this method in many senses is equivalent to executing empty
338b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * script:
339b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * 1. It does nothing except for processing all pending debug messages.
340b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * 2. It should be invoked with the same precautions and from the same context
341b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * as V8 script would be invoked from, because:
342b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   *   a. with "evaluate" command it can do whatever normal script can do,
343b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   *   including all native calls;
344b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   *   b. no other thread should call V8 while this method is running
345b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   *   (v8::Locker may be used here).
346b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   *
347b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * "Evaluate" debug command behavior currently is not specified in scope
348b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   * of this method.
349b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org   */
350b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  static void ProcessDebugMessages();
351df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org
352df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org  /**
3537304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * Debugger is running in its own context which is entered while debugger
354df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org   * messages are being dispatched. This is an explicit getter for this
355df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org   * debugger context. Note that the content of the debugger context is subject
356df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org   * to change.
357df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org   */
358df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org  static Local<Context> GetDebugContext();
359de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
360de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
361de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  /**
362de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org   * Enable/disable LiveEdit functionality for the given Isolate
363de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org   * (default Isolate if not provided). V8 will abort if LiveEdit is
364de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org   * unexpectedly used. LiveEdit is enabled by default.
365de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org   */
366de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  static void SetLiveEditEnabled(bool enable, Isolate* isolate = NULL);
36743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
36843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
37043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}  // namespace v8
37143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
37243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
37343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef EXPORT
37443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
37543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3765ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#endif  // V8_V8_DEBUG_H_
377