diff options
Diffstat (limited to 'src/3rdparty/v8/include')
-rw-r--r-- | src/3rdparty/v8/include/v8-debug.h | 408 | ||||
-rw-r--r-- | src/3rdparty/v8/include/v8-preparser.h | 118 | ||||
-rw-r--r-- | src/3rdparty/v8/include/v8-profiler.h | 580 | ||||
-rw-r--r-- | src/3rdparty/v8/include/v8-testing.h | 105 | ||||
-rw-r--r-- | src/3rdparty/v8/include/v8.h | 5069 | ||||
-rw-r--r-- | src/3rdparty/v8/include/v8stdint.h | 54 |
6 files changed, 0 insertions, 6334 deletions
diff --git a/src/3rdparty/v8/include/v8-debug.h b/src/3rdparty/v8/include/v8-debug.h deleted file mode 100644 index f432de0..0000000 --- a/src/3rdparty/v8/include/v8-debug.h +++ /dev/null @@ -1,408 +0,0 @@ -// Copyright 2008 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef V8_V8_DEBUG_H_ -#define V8_V8_DEBUG_H_ - -#include "v8.h" - -#ifdef _WIN32 -typedef int int32_t; -typedef unsigned int uint32_t; -typedef unsigned short uint16_t; // NOLINT -typedef long long int64_t; // NOLINT - -// Setup for Windows DLL export/import. See v8.h in this directory for -// information on how to build/use V8 as a DLL. -#if defined(BUILDING_V8_SHARED) && defined(USING_V8_SHARED) -#error both BUILDING_V8_SHARED and USING_V8_SHARED are set - please check the\ - build configuration to ensure that at most one of these is set -#endif - -#ifdef BUILDING_V8_SHARED -#define EXPORT __declspec(dllexport) -#elif USING_V8_SHARED -#define EXPORT __declspec(dllimport) -#else -#define EXPORT -#endif - -#else // _WIN32 - -// Setup for Linux shared library export. See v8.h in this directory for -// information on how to build/use V8 as shared library. -#if defined(__GNUC__) && (__GNUC__ >= 4) && defined(V8_SHARED) -#define EXPORT __attribute__ ((visibility("default"))) -#else // defined(__GNUC__) && (__GNUC__ >= 4) -#define EXPORT -#endif // defined(__GNUC__) && (__GNUC__ >= 4) - -#endif // _WIN32 - - -/** - * Debugger support for the V8 JavaScript engine. - */ -namespace v8 { - -// Debug events which can occur in the V8 JavaScript engine. -enum DebugEvent { - Break = 1, - Exception = 2, - NewFunction = 3, - BeforeCompile = 4, - AfterCompile = 5, - ScriptCollected = 6, - BreakForCommand = 7 -}; - - -class EXPORT Debug { - public: - /** - * A client object passed to the v8 debugger whose ownership will be taken by - * it. v8 is always responsible for deleting the object. - */ - class ClientData { - public: - virtual ~ClientData() {} - }; - - - /** - * A message object passed to the debug message handler. - */ - class Message { - public: - /** - * Check type of message. - */ - virtual bool IsEvent() const = 0; - virtual bool IsResponse() const = 0; - virtual DebugEvent GetEvent() const = 0; - - /** - * Indicate whether this is a response to a continue command which will - * start the VM running after this is processed. - */ - virtual bool WillStartRunning() const = 0; - - /** - * Access to execution state and event data. Don't store these cross - * callbacks as their content becomes invalid. These objects are from the - * debugger event that started the debug message loop. - */ - virtual Handle<Object> GetExecutionState() const = 0; - virtual Handle<Object> GetEventData() const = 0; - - /** - * Get the debugger protocol JSON. - */ - virtual Handle<String> GetJSON() const = 0; - - /** - * Get the context active when the debug event happened. Note this is not - * the current active context as the JavaScript part of the debugger is - * running in its own context which is entered at this point. - */ - virtual Handle<Context> GetEventContext() const = 0; - - /** - * Client data passed with the corresponding request if any. This is the - * client_data data value passed into Debug::SendCommand along with the - * request that led to the message or NULL if the message is an event. The - * debugger takes ownership of the data and will delete it even if there is - * no message handler. - */ - virtual ClientData* GetClientData() const = 0; - - virtual ~Message() {} - }; - - - /** - * An event details object passed to the debug event listener. - */ - class EventDetails { - public: - /** - * Event type. - */ - virtual DebugEvent GetEvent() const = 0; - - /** - * Access to execution state and event data of the debug event. Don't store - * these cross callbacks as their content becomes invalid. - */ - virtual Handle<Object> GetExecutionState() const = 0; - virtual Handle<Object> GetEventData() const = 0; - - /** - * Get the context active when the debug event happened. Note this is not - * the current active context as the JavaScript part of the debugger is - * running in its own context which is entered at this point. - */ - virtual Handle<Context> GetEventContext() const = 0; - - /** - * Client data passed with the corresponding callback when it was - * registered. - */ - virtual Handle<Value> GetCallbackData() const = 0; - - /** - * Client data passed to DebugBreakForCommand function. The - * debugger takes ownership of the data and will delete it even if - * there is no message handler. - */ - virtual ClientData* GetClientData() const = 0; - - virtual ~EventDetails() {} - }; - - - /** - * Debug event callback function. - * - * \param event the type of the debug event that triggered the callback - * (enum DebugEvent) - * \param exec_state execution state (JavaScript object) - * \param event_data event specific data (JavaScript object) - * \param data value passed by the user to SetDebugEventListener - */ - typedef void (*EventCallback)(DebugEvent event, - Handle<Object> exec_state, - Handle<Object> event_data, - Handle<Value> data); - - /** - * Debug event callback function. - * - * \param event_details object providing information about the debug event - * - * A EventCallback2 does not take possession of the event data, - * and must not rely on the data persisting after the handler returns. - */ - typedef void (*EventCallback2)(const EventDetails& event_details); - - /** - * Debug message callback function. - * - * \param message the debug message handler message object - * \param length length of the message - * \param client_data the data value passed when registering the message handler - - * A MessageHandler does not take possession of the message string, - * and must not rely on the data persisting after the handler returns. - * - * This message handler is deprecated. Use MessageHandler2 instead. - */ - typedef void (*MessageHandler)(const uint16_t* message, int length, - ClientData* client_data); - - /** - * Debug message callback function. - * - * \param message the debug message handler message object - * - * A MessageHandler does not take possession of the message data, - * and must not rely on the data persisting after the handler returns. - */ - typedef void (*MessageHandler2)(const Message& message); - - /** - * Debug host dispatch callback function. - */ - typedef void (*HostDispatchHandler)(); - - /** - * Callback function for the host to ensure debug messages are processed. - */ - typedef void (*DebugMessageDispatchHandler)(); - - // Set a C debug event listener. - static bool SetDebugEventListener(EventCallback that, - Handle<Value> data = Handle<Value>()); - static bool SetDebugEventListener2(EventCallback2 that, - Handle<Value> data = Handle<Value>()); - - // Set a JavaScript debug event listener. - static bool SetDebugEventListener(v8::Handle<v8::Object> that, - Handle<Value> data = Handle<Value>()); - - // Schedule a debugger break to happen when JavaScript code is run - // in the given isolate. If no isolate is provided the default - // isolate is used. - static void DebugBreak(Isolate* isolate = NULL); - - // Remove scheduled debugger break in given isolate if it has not - // happened yet. If no isolate is provided the default isolate is - // used. - static void CancelDebugBreak(Isolate* isolate = NULL); - - // Break execution of JavaScript in the given isolate (this method - // can be invoked from a non-VM thread) for further client command - // execution on a VM thread. Client data is then passed in - // EventDetails to EventCallback at the moment when the VM actually - // stops. If no isolate is provided the default isolate is used. - static void DebugBreakForCommand(ClientData* data = NULL, - Isolate* isolate = NULL); - - // Message based interface. The message protocol is JSON. NOTE the message - // handler thread is not supported any more parameter must be false. - static void SetMessageHandler(MessageHandler handler, - bool message_handler_thread = false); - static void SetMessageHandler2(MessageHandler2 handler); - - // If no isolate is provided the default isolate is - // used. - static void SendCommand(const uint16_t* command, int length, - ClientData* client_data = NULL, - Isolate* isolate = NULL); - - // Dispatch interface. - static void SetHostDispatchHandler(HostDispatchHandler handler, - int period = 100); - - /** - * Register a callback function to be called when a debug message has been - * received and is ready to be processed. For the debug messages to be - * processed V8 needs to be entered, and in certain embedding scenarios this - * callback can be used to make sure V8 is entered for the debug message to - * be processed. Note that debug messages will only be processed if there is - * a V8 break. This can happen automatically by using the option - * --debugger-auto-break. - * \param provide_locker requires that V8 acquires v8::Locker for you before - * calling handler - */ - static void SetDebugMessageDispatchHandler( - DebugMessageDispatchHandler handler, bool provide_locker = false); - - /** - * Run a JavaScript function in the debugger. - * \param fun the function to call - * \param data passed as second argument to the function - * With this call the debugger is entered and the function specified is called - * with the execution state as the first argument. This makes it possible to - * get access to information otherwise not available during normal JavaScript - * execution e.g. details on stack frames. Receiver of the function call will - * be the debugger context global object, however this is a subject to change. - * The following example shows a JavaScript function which when passed to - * v8::Debug::Call will return the current line of JavaScript execution. - * - * \code - * function frame_source_line(exec_state) { - * return exec_state.frame(0).sourceLine(); - * } - * \endcode - */ - static Local<Value> Call(v8::Handle<v8::Function> fun, - Handle<Value> data = Handle<Value>()); - - /** - * Returns a mirror object for the given object. - */ - static Local<Value> GetMirror(v8::Handle<v8::Value> obj); - - /** - * Enable the V8 builtin debug agent. The debugger agent will listen on the - * supplied TCP/IP port for remote debugger connection. - * \param name the name of the embedding application - * \param port the TCP/IP port to listen on - * \param wait_for_connection whether V8 should pause on a first statement - * allowing remote debugger to connect before anything interesting happened - */ - static bool EnableAgent(const char* name, int port, - bool wait_for_connection = false); - - /** - * Disable the V8 builtin debug agent. The TCP/IP connection will be closed. - */ - static void DisableAgent(); - - /** - * Makes V8 process all pending debug messages. - * - * From V8 point of view all debug messages come asynchronously (e.g. from - * remote debugger) but they all must be handled synchronously: V8 cannot - * do 2 things at one time so normal script execution must be interrupted - * for a while. - * - * Generally when message arrives V8 may be in one of 3 states: - * 1. V8 is running script; V8 will automatically interrupt and process all - * pending messages (however auto_break flag should be enabled); - * 2. V8 is suspended on debug breakpoint; in this state V8 is dedicated - * to reading and processing debug messages; - * 3. V8 is not running at all or has called some long-working C++ function; - * by default it means that processing of all debug messages will be deferred - * until V8 gets control again; however, embedding application may improve - * this by manually calling this method. - * - * It makes sense to call this method whenever a new debug message arrived and - * V8 is not already running. Method v8::Debug::SetDebugMessageDispatchHandler - * should help with the former condition. - * - * Technically this method in many senses is equivalent to executing empty - * script: - * 1. It does nothing except for processing all pending debug messages. - * 2. It should be invoked with the same precautions and from the same context - * as V8 script would be invoked from, because: - * a. with "evaluate" command it can do whatever normal script can do, - * including all native calls; - * b. no other thread should call V8 while this method is running - * (v8::Locker may be used here). - * - * "Evaluate" debug command behavior currently is not specified in scope - * of this method. - */ - static void ProcessDebugMessages(); - - /** - * Debugger is running in its own context which is entered while debugger - * messages are being dispatched. This is an explicit getter for this - * debugger context. Note that the content of the debugger context is subject - * to change. - */ - static Local<Context> GetDebugContext(); - - - /** - * Enable/disable LiveEdit functionality for the given Isolate - * (default Isolate if not provided). V8 will abort if LiveEdit is - * unexpectedly used. LiveEdit is enabled by default. - */ - static void SetLiveEditEnabled(bool enable, Isolate* isolate = NULL); -}; - - -} // namespace v8 - - -#undef EXPORT - - -#endif // V8_V8_DEBUG_H_ diff --git a/src/3rdparty/v8/include/v8-preparser.h b/src/3rdparty/v8/include/v8-preparser.h deleted file mode 100644 index 389949d..0000000 --- a/src/3rdparty/v8/include/v8-preparser.h +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2011 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef PREPARSER_H -#define PREPARSER_H - -#include "v8stdint.h" - -#ifdef _WIN32 - -// Setup for Windows DLL export/import. When building the V8 DLL the -// BUILDING_V8_SHARED needs to be defined. When building a program which uses -// the V8 DLL USING_V8_SHARED needs to be defined. When either building the V8 -// static library or building a program which uses the V8 static library neither -// BUILDING_V8_SHARED nor USING_V8_SHARED should be defined. -#if defined(BUILDING_V8_SHARED) && defined(USING_V8_SHARED) -#error both BUILDING_V8_SHARED and USING_V8_SHARED are set - please check the\ - build configuration to ensure that at most one of these is set -#endif - -#ifdef BUILDING_V8_SHARED -#define V8EXPORT __declspec(dllexport) -#elif USING_V8_SHARED -#define V8EXPORT __declspec(dllimport) -#else -#define V8EXPORT -#endif // BUILDING_V8_SHARED - -#else // _WIN32 - -// Setup for Linux shared library export. There is no need to distinguish -// between building or using the V8 shared library, but we should not -// export symbols when we are building a static library. -#if defined(__GNUC__) && ((__GNUC__ >= 4) || \ - (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(V8_SHARED) -#define V8EXPORT __attribute__ ((visibility("default"))) -#else -#define V8EXPORT -#endif - -#endif // _WIN32 - - -namespace v8 { - -// The result of preparsing is either a stack overflow error, or an opaque -// blob of data that can be passed back into the parser. -class V8EXPORT PreParserData { - public: - PreParserData(size_t size, const uint8_t* data) - : data_(data), size_(size) { } - - // Create a PreParserData value where stack_overflow reports true. - static PreParserData StackOverflow() { return PreParserData(0, NULL); } - - // Whether the pre-parser stopped due to a stack overflow. - // If this is the case, size() and data() should not be used. - bool stack_overflow() { return size_ == 0u; } - - // The size of the data in bytes. - size_t size() const { return size_; } - - // Pointer to the data. - const uint8_t* data() const { return data_; } - - private: - const uint8_t* const data_; - const size_t size_; -}; - - -// Interface for a stream of Unicode characters. -class V8EXPORT UnicodeInputStream { // NOLINT - Thinks V8EXPORT is class name. - public: - virtual ~UnicodeInputStream(); - - // Returns the next Unicode code-point in the input, or a negative value when - // there is no more input in the stream. - virtual int32_t Next() = 0; -}; - - -// Preparse a JavaScript program. The source code is provided as a -// UnicodeInputStream. The max_stack_size limits the amount of stack -// space that the preparser is allowed to use. If the preparser uses -// more stack space than the limit provided, the result's stack_overflow() -// method will return true. Otherwise the result contains preparser -// data that can be used by the V8 parser to speed up parsing. -PreParserData V8EXPORT Preparse(UnicodeInputStream* input, - size_t max_stack_size); - -} // namespace v8. - -#endif // PREPARSER_H diff --git a/src/3rdparty/v8/include/v8-profiler.h b/src/3rdparty/v8/include/v8-profiler.h deleted file mode 100644 index 4d3597a..0000000 --- a/src/3rdparty/v8/include/v8-profiler.h +++ /dev/null @@ -1,580 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef V8_V8_PROFILER_H_ -#define V8_V8_PROFILER_H_ - -#include "v8.h" - -#ifdef _WIN32 -// Setup for Windows DLL export/import. See v8.h in this directory for -// information on how to build/use V8 as a DLL. -#if defined(BUILDING_V8_SHARED) && defined(USING_V8_SHARED) -#error both BUILDING_V8_SHARED and USING_V8_SHARED are set - please check the\ - build configuration to ensure that at most one of these is set -#endif - -#ifdef BUILDING_V8_SHARED -#define V8EXPORT __declspec(dllexport) -#elif USING_V8_SHARED -#define V8EXPORT __declspec(dllimport) -#else -#define V8EXPORT -#endif - -#else // _WIN32 - -// Setup for Linux shared library export. See v8.h in this directory for -// information on how to build/use V8 as shared library. -#if defined(__GNUC__) && ((__GNUC__ >= 4) || \ - (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(V8_SHARED) -#define V8EXPORT __attribute__ ((visibility("default"))) -#else -#define V8EXPORT -#endif - -#endif // _WIN32 - - -/** - * Profiler support for the V8 JavaScript engine. - */ -namespace v8 { - -typedef uint32_t SnapshotObjectId; - -/** - * CpuProfileNode represents a node in a call graph. - */ -class V8EXPORT CpuProfileNode { - public: - /** Returns function name (empty string for anonymous functions.) */ - Handle<String> GetFunctionName() const; - - /** Returns resource name for script from where the function originates. */ - Handle<String> GetScriptResourceName() const; - - /** - * Returns the number, 1-based, of the line where the function originates. - * kNoLineNumberInfo if no line number information is available. - */ - int GetLineNumber() const; - - /** - * Returns total (self + children) execution time of the function, - * in milliseconds, estimated by samples count. - */ - double GetTotalTime() const; - - /** - * Returns self execution time of the function, in milliseconds, - * estimated by samples count. - */ - double GetSelfTime() const; - - /** Returns the count of samples where function exists. */ - double GetTotalSamplesCount() const; - - /** Returns the count of samples where function was currently executing. */ - double GetSelfSamplesCount() const; - - /** Returns function entry UID. */ - unsigned GetCallUid() const; - - /** Returns child nodes count of the node. */ - int GetChildrenCount() const; - - /** Retrieves a child node by index. */ - const CpuProfileNode* GetChild(int index) const; - - static const int kNoLineNumberInfo = Message::kNoLineNumberInfo; -}; - - -/** - * CpuProfile contains a CPU profile in a form of two call trees: - * - top-down (from main() down to functions that do all the work); - * - bottom-up call graph (in backward direction). - */ -class V8EXPORT CpuProfile { - public: - /** Returns CPU profile UID (assigned by the profiler.) */ - unsigned GetUid() const; - - /** Returns CPU profile title. */ - Handle<String> GetTitle() const; - - /** Returns the root node of the bottom up call tree. */ - const CpuProfileNode* GetBottomUpRoot() const; - - /** Returns the root node of the top down call tree. */ - const CpuProfileNode* GetTopDownRoot() const; - - /** - * Deletes the profile and removes it from CpuProfiler's list. - * All pointers to nodes previously returned become invalid. - * Profiles with the same uid but obtained using different - * security token are not deleted, but become inaccessible - * using FindProfile method. It is embedder's responsibility - * to call Delete on these profiles. - */ - void Delete(); -}; - - -/** - * Interface for controlling CPU profiling. - */ -class V8EXPORT CpuProfiler { - public: - /** - * A note on security tokens usage. As scripts from different - * origins can run inside a single V8 instance, it is possible to - * have functions from different security contexts intermixed in a - * single CPU profile. To avoid exposing function names belonging to - * other contexts, filtering by security token is performed while - * obtaining profiling results. - */ - - /** - * Returns the number of profiles collected (doesn't include - * profiles that are being collected at the moment of call.) - */ - static int GetProfilesCount(); - - /** Returns a profile by index. */ - static const CpuProfile* GetProfile( - int index, - Handle<Value> security_token = Handle<Value>()); - - /** Returns a profile by uid. */ - static const CpuProfile* FindProfile( - unsigned uid, - Handle<Value> security_token = Handle<Value>()); - - /** - * Starts collecting CPU profile. Title may be an empty string. It - * is allowed to have several profiles being collected at - * once. Attempts to start collecting several profiles with the same - * title are silently ignored. While collecting a profile, functions - * from all security contexts are included in it. The token-based - * filtering is only performed when querying for a profile. - */ - static void StartProfiling(Handle<String> title); - - /** - * Stops collecting CPU profile with a given title and returns it. - * If the title given is empty, finishes the last profile started. - */ - static const CpuProfile* StopProfiling( - Handle<String> title, - Handle<Value> security_token = Handle<Value>()); - - /** - * Deletes all existing profiles, also cancelling all profiling - * activity. All previously returned pointers to profiles and their - * contents become invalid after this call. - */ - static void DeleteAllProfiles(); -}; - - -class HeapGraphNode; - - -/** - * HeapSnapshotEdge represents a directed connection between heap - * graph nodes: from retainers to retained nodes. - */ -class V8EXPORT HeapGraphEdge { - public: - enum Type { - kContextVariable = 0, // A variable from a function context. - kElement = 1, // An element of an array. - kProperty = 2, // A named object property. - kInternal = 3, // A link that can't be accessed from JS, - // thus, its name isn't a real property name - // (e.g. parts of a ConsString). - kHidden = 4, // A link that is needed for proper sizes - // calculation, but may be hidden from user. - kShortcut = 5, // A link that must not be followed during - // sizes calculation. - kWeak = 6 // A weak reference (ignored by the GC). - }; - - /** Returns edge type (see HeapGraphEdge::Type). */ - Type GetType() const; - - /** - * Returns edge name. This can be a variable name, an element index, or - * a property name. - */ - Handle<Value> GetName() const; - - /** Returns origin node. */ - const HeapGraphNode* GetFromNode() const; - - /** Returns destination node. */ - const HeapGraphNode* GetToNode() const; -}; - - -/** - * HeapGraphNode represents a node in a heap graph. - */ -class V8EXPORT HeapGraphNode { - public: - enum Type { - kHidden = 0, // Hidden node, may be filtered when shown to user. - kArray = 1, // An array of elements. - kString = 2, // A string. - kObject = 3, // A JS object (except for arrays and strings). - kCode = 4, // Compiled code. - kClosure = 5, // Function closure. - kRegExp = 6, // RegExp. - kHeapNumber = 7, // Number stored in the heap. - kNative = 8, // Native object (not from V8 heap). - kSynthetic = 9 // Synthetic object, usualy used for grouping - // snapshot items together. - }; - - /** Returns node type (see HeapGraphNode::Type). */ - Type GetType() const; - - /** - * Returns node name. Depending on node's type this can be the name - * of the constructor (for objects), the name of the function (for - * closures), string value, or an empty string (for compiled code). - */ - Handle<String> GetName() const; - - /** - * Returns node id. For the same heap object, the id remains the same - * across all snapshots. - */ - SnapshotObjectId GetId() const; - - /** Returns node's own size, in bytes. */ - int GetSelfSize() const; - - /** Returns child nodes count of the node. */ - int GetChildrenCount() const; - - /** Retrieves a child by index. */ - const HeapGraphEdge* GetChild(int index) const; - - /** - * Finds and returns a value from the heap corresponding to this node, - * if the value is still reachable. - */ - Handle<Value> GetHeapValue() const; -}; - - -/** - * HeapSnapshots record the state of the JS heap at some moment. - */ -class V8EXPORT HeapSnapshot { - public: - enum Type { - kFull = 0 // Heap snapshot with all instances and references. - }; - enum SerializationFormat { - kJSON = 0 // See format description near 'Serialize' method. - }; - - /** Returns heap snapshot type. */ - Type GetType() const; - - /** Returns heap snapshot UID (assigned by the profiler.) */ - unsigned GetUid() const; - - /** Returns heap snapshot title. */ - Handle<String> GetTitle() const; - - /** Returns the root node of the heap graph. */ - const HeapGraphNode* GetRoot() const; - - /** Returns a node by its id. */ - const HeapGraphNode* GetNodeById(SnapshotObjectId id) const; - - /** Returns total nodes count in the snapshot. */ - int GetNodesCount() const; - - /** Returns a node by index. */ - const HeapGraphNode* GetNode(int index) const; - - /** Returns a max seen JS object Id. */ - SnapshotObjectId GetMaxSnapshotJSObjectId() const; - - /** - * Deletes the snapshot and removes it from HeapProfiler's list. - * All pointers to nodes, edges and paths previously returned become - * invalid. - */ - void Delete(); - - /** - * Prepare a serialized representation of the snapshot. The result - * is written into the stream provided in chunks of specified size. - * The total length of the serialized snapshot is unknown in - * advance, it can be roughly equal to JS heap size (that means, - * it can be really big - tens of megabytes). - * - * For the JSON format, heap contents are represented as an object - * with the following structure: - * - * { - * snapshot: { - * title: "...", - * uid: nnn, - * meta: { meta-info }, - * node_count: nnn, - * edge_count: nnn - * }, - * nodes: [nodes array], - * edges: [edges array], - * strings: [strings array] - * } - * - * Nodes reference strings, other nodes, and edges by their indexes - * in corresponding arrays. - */ - void Serialize(OutputStream* stream, SerializationFormat format) const; -}; - - -class RetainedObjectInfo; - -/** - * Interface for controlling heap profiling. - */ -class V8EXPORT HeapProfiler { - public: - /** - * Callback function invoked for obtaining RetainedObjectInfo for - * the given JavaScript wrapper object. It is prohibited to enter V8 - * while the callback is running: only getters on the handle and - * GetPointerFromInternalField on the objects are allowed. - */ - typedef RetainedObjectInfo* (*WrapperInfoCallback) - (uint16_t class_id, Handle<Value> wrapper); - - /** Returns the number of snapshots taken. */ - static int GetSnapshotsCount(); - - /** Returns a snapshot by index. */ - static const HeapSnapshot* GetSnapshot(int index); - - /** Returns a profile by uid. */ - static const HeapSnapshot* FindSnapshot(unsigned uid); - - /** - * Returns SnapshotObjectId for a heap object referenced by |value| if - * it has been seen by the heap profiler, kUnknownObjectId otherwise. - */ - static SnapshotObjectId GetSnapshotObjectId(Handle<Value> value); - - /** - * A constant for invalid SnapshotObjectId. GetSnapshotObjectId will return - * it in case heap profiler cannot find id for the object passed as - * parameter. HeapSnapshot::GetNodeById will always return NULL for such id. - */ - static const SnapshotObjectId kUnknownObjectId = 0; - - /** - * Callback interface for retrieving user friendly names of global objects. - */ - class ObjectNameResolver { - public: - /** - * Returns name to be used in the heap snapshot for given node. Returned - * string must stay alive until snapshot collection is completed. - */ - virtual const char* GetName(Handle<Object> object) = 0; - protected: - virtual ~ObjectNameResolver() {} - }; - - /** - * Takes a heap snapshot and returns it. Title may be an empty string. - * See HeapSnapshot::Type for types description. - */ - static const HeapSnapshot* TakeSnapshot( - Handle<String> title, - HeapSnapshot::Type type = HeapSnapshot::kFull, - ActivityControl* control = NULL, - ObjectNameResolver* global_object_name_resolver = NULL); - - /** - * Starts tracking of heap objects population statistics. After calling - * this method, all heap objects relocations done by the garbage collector - * are being registered. - */ - static void StartHeapObjectsTracking(); - - /** - * Adds a new time interval entry to the aggregated statistics array. The - * time interval entry contains information on the current heap objects - * population size. The method also updates aggregated statistics and - * reports updates for all previous time intervals via the OutputStream - * object. Updates on each time interval are provided as a stream of the - * HeapStatsUpdate structure instances. - * The return value of the function is the last seen heap object Id. - * - * StartHeapObjectsTracking must be called before the first call to this - * method. - */ - static SnapshotObjectId PushHeapObjectsStats(OutputStream* stream); - - /** - * Stops tracking of heap objects population statistics, cleans up all - * collected data. StartHeapObjectsTracking must be called again prior to - * calling PushHeapObjectsStats next time. - */ - static void StopHeapObjectsTracking(); - - /** - * Deletes all snapshots taken. All previously returned pointers to - * snapshots and their contents become invalid after this call. - */ - static void DeleteAllSnapshots(); - - /** Binds a callback to embedder's class ID. */ - static void DefineWrapperClass( - uint16_t class_id, - WrapperInfoCallback callback); - - /** - * Default value of persistent handle class ID. Must not be used to - * define a class. Can be used to reset a class of a persistent - * handle. - */ - static const uint16_t kPersistentHandleNoClassId = 0; - - /** Returns the number of currently existing persistent handles. */ - static int GetPersistentHandleCount(); - - /** Returns memory used for profiler internal data and snapshots. */ - static size_t GetMemorySizeUsedByProfiler(); -}; - - -/** - * Interface for providing information about embedder's objects - * held by global handles. This information is reported in two ways: - * - * 1. When calling AddObjectGroup, an embedder may pass - * RetainedObjectInfo instance describing the group. To collect - * this information while taking a heap snapshot, V8 calls GC - * prologue and epilogue callbacks. - * - * 2. When a heap snapshot is collected, V8 additionally - * requests RetainedObjectInfos for persistent handles that - * were not previously reported via AddObjectGroup. - * - * Thus, if an embedder wants to provide information about native - * objects for heap snapshots, he can do it in a GC prologue - * handler, and / or by assigning wrapper class ids in the following way: - * - * 1. Bind a callback to class id by calling DefineWrapperClass. - * 2. Call SetWrapperClassId on certain persistent handles. - * - * V8 takes ownership of RetainedObjectInfo instances passed to it and - * keeps them alive only during snapshot collection. Afterwards, they - * are freed by calling the Dispose class function. - */ -class V8EXPORT RetainedObjectInfo { // NOLINT - public: - /** Called by V8 when it no longer needs an instance. */ - virtual void Dispose() = 0; - - /** Returns whether two instances are equivalent. */ - virtual bool IsEquivalent(RetainedObjectInfo* other) = 0; - - /** - * Returns hash value for the instance. Equivalent instances - * must have the same hash value. - */ - virtual intptr_t GetHash() = 0; - - /** - * Returns human-readable label. It must be a null-terminated UTF-8 - * encoded string. V8 copies its contents during a call to GetLabel. - */ - virtual const char* GetLabel() = 0; - - /** - * Returns human-readable group label. It must be a null-terminated UTF-8 - * encoded string. V8 copies its contents during a call to GetGroupLabel. - * Heap snapshot generator will collect all the group names, create - * top level entries with these names and attach the objects to the - * corresponding top level group objects. There is a default - * implementation which is required because embedders don't have their - * own implementation yet. - */ - virtual const char* GetGroupLabel() { return GetLabel(); } - - /** - * Returns element count in case if a global handle retains - * a subgraph by holding one of its nodes. - */ - virtual intptr_t GetElementCount() { return -1; } - - /** Returns embedder's object size in bytes. */ - virtual intptr_t GetSizeInBytes() { return -1; } - - protected: - RetainedObjectInfo() {} - virtual ~RetainedObjectInfo() {} - - private: - RetainedObjectInfo(const RetainedObjectInfo&); - RetainedObjectInfo& operator=(const RetainedObjectInfo&); -}; - - -/** - * A struct for exporting HeapStats data from V8, using "push" model. - * See HeapProfiler::PushHeapObjectsStats. - */ -struct HeapStatsUpdate { - HeapStatsUpdate(uint32_t index, uint32_t count, uint32_t size) - : index(index), count(count), size(size) { } - uint32_t index; // Index of the time interval that was changed. - uint32_t count; // New value of count field for the interval with this index. - uint32_t size; // New value of size field for the interval with this index. -}; - - -} // namespace v8 - - -#undef V8EXPORT - - -#endif // V8_V8_PROFILER_H_ diff --git a/src/3rdparty/v8/include/v8-testing.h b/src/3rdparty/v8/include/v8-testing.h deleted file mode 100644 index 59eebf9..0000000 --- a/src/3rdparty/v8/include/v8-testing.h +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef V8_V8_TEST_H_ -#define V8_V8_TEST_H_ - -#include "v8.h" - -#ifdef _WIN32 -// Setup for Windows DLL export/import. See v8.h in this directory for -// information on how to build/use V8 as a DLL. -#if defined(BUILDING_V8_SHARED) && defined(USING_V8_SHARED) -#error both BUILDING_V8_SHARED and USING_V8_SHARED are set - please check the\ - build configuration to ensure that at most one of these is set -#endif - -#ifdef BUILDING_V8_SHARED -#define V8EXPORT __declspec(dllexport) -#elif USING_V8_SHARED -#define V8EXPORT __declspec(dllimport) -#else -#define V8EXPORT -#endif - -#else // _WIN32 - -// Setup for Linux shared library export. See v8.h in this directory for -// information on how to build/use V8 as shared library. -#if defined(__GNUC__) && ((__GNUC__ >= 4) || \ - (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(V8_SHARED) -#define V8EXPORT __attribute__ ((visibility("default"))) -#else -#define V8EXPORT -#endif - -#endif // _WIN32 - - -/** - * Testing support for the V8 JavaScript engine. - */ -namespace v8 { - -class V8EXPORT Testing { - public: - enum StressType { - kStressTypeOpt, - kStressTypeDeopt - }; - - /** - * Set the type of stressing to do. The default if not set is kStressTypeOpt. - */ - static void SetStressRunType(StressType type); - - /** - * Get the number of runs of a given test that is required to get the full - * stress coverage. - */ - static int GetStressRuns(); - - /** - * Indicate the number of the run which is about to start. The value of run - * should be between 0 and one less than the result from GetStressRuns() - */ - static void PrepareStressRun(int run); - - /** - * Force deoptimization of all functions. - */ - static void DeoptimizeAll(); -}; - - -} // namespace v8 - - -#undef V8EXPORT - - -#endif // V8_V8_TEST_H_ diff --git a/src/3rdparty/v8/include/v8.h b/src/3rdparty/v8/include/v8.h deleted file mode 100644 index 2ad95c5..0000000 --- a/src/3rdparty/v8/include/v8.h +++ /dev/null @@ -1,5069 +0,0 @@ -// Copyright 2012 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/** \mainpage V8 API Reference Guide - * - * V8 is Google's open source JavaScript engine. - * - * This set of documents provides reference material generated from the - * V8 header file, include/v8.h. - * - * For other documentation see http://code.google.com/apis/v8/ - */ - -#ifndef V8_H_ -#define V8_H_ - -// TODO(svenpanne) Remove me when the Chrome bindings are adapted. -#define V8_DISABLE_DEPRECATIONS 1 -// TODO(dcarney): Remove once Latin-1 transitions in WebKit has stuck. -#define V8_ONE_BYTE_STRINGS_ENABLED 1 - -#include "v8stdint.h" - -#ifdef _WIN32 - -// Setup for Windows DLL export/import. When building the V8 DLL the -// BUILDING_V8_SHARED needs to be defined. When building a program which uses -// the V8 DLL USING_V8_SHARED needs to be defined. When either building the V8 -// static library or building a program which uses the V8 static library neither -// BUILDING_V8_SHARED nor USING_V8_SHARED should be defined. -#if defined(BUILDING_V8_SHARED) && defined(USING_V8_SHARED) -#error both BUILDING_V8_SHARED and USING_V8_SHARED are set - please check the\ - build configuration to ensure that at most one of these is set -#endif - -#ifdef BUILDING_V8_SHARED -#define V8EXPORT __declspec(dllexport) -#elif USING_V8_SHARED -#define V8EXPORT __declspec(dllimport) -#else -#define V8EXPORT -#endif // BUILDING_V8_SHARED - -#else // _WIN32 - -// Setup for Linux shared library export. -#if defined(__GNUC__) && ((__GNUC__ >= 4) || \ - (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(V8_SHARED) -#ifdef BUILDING_V8_SHARED -#define V8EXPORT __attribute__ ((visibility("default"))) -#else -#define V8EXPORT -#endif -#else -#define V8EXPORT -#endif - -#endif // _WIN32 - -#if defined(__GNUC__) && !defined(__MINGW32__) && !defined(__MINGW64__) && !defined(DEBUG) -#define V8_INLINE(declarator) inline __attribute__((always_inline)) declarator -#elif defined(_MSC_VER) && !defined(DEBUG) -#define V8_INLINE(declarator) __forceinline declarator -#else -#define V8_INLINE(declarator) inline declarator -#endif - -#if defined(__GNUC__) && !V8_DISABLE_DEPRECATIONS -#define V8_DEPRECATED(declarator) declarator __attribute__ ((deprecated)) -#elif defined(_MSC_VER) && !V8_DISABLE_DEPRECATIONS -#define V8_DEPRECATED(declarator) __declspec(deprecated) declarator -#else -#define V8_DEPRECATED(declarator) declarator -#endif - -/** - * The v8 JavaScript engine. - */ -namespace v8 { - -class Context; -class String; -class StringObject; -class Value; -class Utils; -class Number; -class NumberObject; -class Object; -class Array; -class Int32; -class Uint32; -class External; -class Primitive; -class Boolean; -class BooleanObject; -class Integer; -class Function; -class Date; -class ImplementationUtilities; -class Signature; -class AccessorSignature; -template <class T> class Handle; -template <class T> class Local; -template <class T> class Persistent; -class FunctionTemplate; -class ObjectTemplate; -class Data; -class AccessorInfo; -class StackTrace; -class StackFrame; -class Isolate; - -namespace internal { - -class Arguments; -class Object; -class Heap; -class HeapObject; -class Isolate; -} - - -// --- Weak Handles --- - - -/** - * A weak reference callback function. - * - * This callback should either explicitly invoke Dispose on |object| if - * V8 wrapper is not needed anymore, or 'revive' it by invocation of MakeWeak. - * - * \param object the weak global object to be reclaimed by the garbage collector - * \param parameter the value passed in when making the weak global object - */ -typedef void (*WeakReferenceCallback)(Persistent<Value> object, - void* parameter); - -// TODO(svenpanne) Temporary definition until Chrome is in sync. -typedef void (*NearDeathCallback)(Isolate* isolate, - Persistent<Value> object, - void* parameter); - -// --- Handles --- - -#define TYPE_CHECK(T, S) \ - while (false) { \ - *(static_cast<T* volatile*>(0)) = static_cast<S*>(0); \ - } - -/** - * An object reference managed by the v8 garbage collector. - * - * All objects returned from v8 have to be tracked by the garbage - * collector so that it knows that the objects are still alive. Also, - * because the garbage collector may move objects, it is unsafe to - * point directly to an object. Instead, all objects are stored in - * handles which are known by the garbage collector and updated - * whenever an object moves. Handles should always be passed by value - * (except in cases like out-parameters) and they should never be - * allocated on the heap. - * - * There are two types of handles: local and persistent handles. - * Local handles are light-weight and transient and typically used in - * local operations. They are managed by HandleScopes. Persistent - * handles can be used when storing objects across several independent - * operations and have to be explicitly deallocated when they're no - * longer used. - * - * It is safe to extract the object stored in the handle by - * dereferencing the handle (for instance, to extract the Object* from - * a Handle<Object>); the value will still be governed by a handle - * behind the scenes and the same rules apply to these values as to - * their handles. - */ -template <class T> class Handle { - public: - /** - * Creates an empty handle. - */ - V8_INLINE(Handle()) : val_(0) {} - - /** - * Creates a new handle for the specified value. - */ - V8_INLINE(explicit Handle(T* val)) : val_(val) {} - - /** - * Creates a handle for the contents of the specified handle. This - * constructor allows you to pass handles as arguments by value and - * to assign between handles. However, if you try to assign between - * incompatible handles, for instance from a Handle<String> to a - * Handle<Number> it will cause a compile-time error. Assigning - * between compatible handles, for instance assigning a - * Handle<String> to a variable declared as Handle<Value>, is legal - * because String is a subclass of Value. - */ - template <class S> V8_INLINE(Handle(Handle<S> that)) - : val_(reinterpret_cast<T*>(*that)) { - /** - * This check fails when trying to convert between incompatible - * handles. For example, converting from a Handle<String> to a - * Handle<Number>. - */ - TYPE_CHECK(T, S); - } - - /** - * Returns true if the handle is empty. - */ - V8_INLINE(bool IsEmpty() const) { return val_ == 0; } - - /** - * Sets the handle to be empty. IsEmpty() will then return true. - */ - V8_INLINE(void Clear()) { val_ = 0; } - - V8_INLINE(T* operator->() const) { return val_; } - - V8_INLINE(T* operator*() const) { return val_; } - - /** - * Checks whether two handles are the same. - * Returns true if both are empty, or if the objects - * to which they refer are identical. - * The handles' references are not checked. - */ - template <class S> V8_INLINE(bool operator==(Handle<S> that) const) { - internal::Object** a = reinterpret_cast<internal::Object**>(**this); - internal::Object** b = reinterpret_cast<internal::Object**>(*that); - if (a == 0) return b == 0; - if (b == 0) return false; - return *a == *b; - } - - /** - * Checks whether two handles are different. - * Returns true if only one of the handles is empty, or if - * the objects to which they refer are different. - * The handles' references are not checked. - */ - template <class S> V8_INLINE(bool operator!=(Handle<S> that) const) { - return !operator==(that); - } - - template <class S> V8_INLINE(static Handle<T> Cast(Handle<S> that)) { -#ifdef V8_ENABLE_CHECKS - // If we're going to perform the type check then we have to check - // that the handle isn't empty before doing the checked cast. - if (that.IsEmpty()) return Handle<T>(); -#endif - return Handle<T>(T::Cast(*that)); - } - - template <class S> V8_INLINE(Handle<S> As()) { - return Handle<S>::Cast(*this); - } - - private: - T* val_; -}; - - -/** - * A light-weight stack-allocated object handle. All operations - * that return objects from within v8 return them in local handles. They - * are created within HandleScopes, and all local handles allocated within a - * handle scope are destroyed when the handle scope is destroyed. Hence it - * is not necessary to explicitly deallocate local handles. - */ -template <class T> class Local : public Handle<T> { - public: - V8_INLINE(Local()); - template <class S> V8_INLINE(Local(Local<S> that)) - : Handle<T>(reinterpret_cast<T*>(*that)) { - /** - * This check fails when trying to convert between incompatible - * handles. For example, converting from a Handle<String> to a - * Handle<Number>. - */ - TYPE_CHECK(T, S); - } - template <class S> V8_INLINE(Local(S* that) : Handle<T>(that)) { } - template <class S> V8_INLINE(static Local<T> Cast(Local<S> that)) { -#ifdef V8_ENABLE_CHECKS - // If we're going to perform the type check then we have to check - // that the handle isn't empty before doing the checked cast. - if (that.IsEmpty()) return Local<T>(); -#endif - return Local<T>(T::Cast(*that)); - } - - template <class S> V8_INLINE(Local<S> As()) { - return Local<S>::Cast(*this); - } - - /** - * Create a local handle for the content of another handle. - * The referee is kept alive by the local handle even when - * the original handle is destroyed/disposed. - */ - V8_INLINE(static Local<T> New(Handle<T> that)); - V8_INLINE(static Local<T> New(Isolate* isolate, Handle<T> that)); -}; - - -/** - * An object reference that is independent of any handle scope. Where - * a Local handle only lives as long as the HandleScope in which it was - * allocated, a Persistent handle remains valid until it is explicitly - * disposed. - * - * A persistent handle contains a reference to a storage cell within - * the v8 engine which holds an object value and which is updated by - * the garbage collector whenever the object is moved. A new storage - * cell can be created using Persistent::New and existing handles can - * be disposed using Persistent::Dispose. Since persistent handles - * are passed by value you may have many persistent handle objects - * that point to the same storage cell. For instance, if you pass a - * persistent handle as an argument to a function you will not get two - * different storage cells but rather two references to the same - * storage cell. - */ -template <class T> class Persistent : public Handle<T> { - public: - /** - * Creates an empty persistent handle that doesn't point to any - * storage cell. - */ - V8_INLINE(Persistent()); - - /** - * Creates a persistent handle for the same storage cell as the - * specified handle. This constructor allows you to pass persistent - * handles as arguments by value and to assign between persistent - * handles. However, attempting to assign between incompatible - * persistent handles, for instance from a Persistent<String> to a - * Persistent<Number> will cause a compile-time error. Assigning - * between compatible persistent handles, for instance assigning a - * Persistent<String> to a variable declared as Persistent<Value>, - * is allowed as String is a subclass of Value. - */ - template <class S> V8_INLINE(Persistent(Persistent<S> that)) - : Handle<T>(reinterpret_cast<T*>(*that)) { - /** - * This check fails when trying to convert between incompatible - * handles. For example, converting from a Handle<String> to a - * Handle<Number>. - */ - TYPE_CHECK(T, S); - } - - template <class S> V8_INLINE(Persistent(S* that)) : Handle<T>(that) { } - - /** - * "Casts" a plain handle which is known to be a persistent handle - * to a persistent handle. - */ - template <class S> explicit V8_INLINE(Persistent(Handle<S> that)) - : Handle<T>(*that) { } - - template <class S> V8_INLINE(static Persistent<T> Cast(Persistent<S> that)) { -#ifdef V8_ENABLE_CHECKS - // If we're going to perform the type check then we have to check - // that the handle isn't empty before doing the checked cast. - if (that.IsEmpty()) return Persistent<T>(); -#endif - return Persistent<T>(T::Cast(*that)); - } - - template <class S> V8_INLINE(Persistent<S> As()) { - return Persistent<S>::Cast(*this); - } - - /** Deprecated. Use Isolate version instead. */ - V8_DEPRECATED(static Persistent<T> New(Handle<T> that)); - - /** - * Creates a new persistent handle for an existing local or persistent handle. - */ - V8_INLINE(static Persistent<T> New(Isolate* isolate, Handle<T> that)); - - /** Deprecated. Use Isolate version instead. */ - V8_DEPRECATED(void Dispose()); - - /** - * Releases the storage cell referenced by this persistent handle. - * Does not remove the reference to the cell from any handles. - * This handle's reference, and any other references to the storage - * cell remain and IsEmpty will still return false. - */ - V8_INLINE(void Dispose(Isolate* isolate)); - - /** Deprecated. Use Isolate version instead. */ - V8_DEPRECATED(void MakeWeak(void* parameters, - WeakReferenceCallback callback)); - - /** - * Make the reference to this object weak. When only weak handles - * refer to the object, the garbage collector will perform a - * callback to the given V8::NearDeathCallback function, passing - * it the object reference and the given parameters. - */ - V8_INLINE(void MakeWeak(Isolate* isolate, - void* parameters, - NearDeathCallback callback)); - - /** Deprecated. Use Isolate version instead. */ - V8_DEPRECATED(void ClearWeak()); - - /** Clears the weak reference to this object. */ - V8_INLINE(void ClearWeak(Isolate* isolate)); - - /** Deprecated. Use Isolate version instead. */ - V8_DEPRECATED(void MarkIndependent()); - - /** - * Marks the reference to this object independent. Garbage collector is free - * to ignore any object groups containing this object. Weak callback for an - * independent handle should not assume that it will be preceded by a global - * GC prologue callback or followed by a global GC epilogue callback. - */ - V8_INLINE(void MarkIndependent(Isolate* isolate)); - - /** Deprecated. Use Isolate version instead. */ - V8_DEPRECATED(void MarkPartiallyDependent()); - - /** - * Marks the reference to this object partially dependent. Partially dependent - * handles only depend on other partially dependent handles and these - * dependencies are provided through object groups. It provides a way to build - * smaller object groups for young objects that represent only a subset of all - * external dependencies. This mark is automatically cleared after each - * garbage collection. - */ - V8_INLINE(void MarkPartiallyDependent(Isolate* isolate)); - - /** Deprecated. Use Isolate version instead. */ - V8_DEPRECATED(bool IsIndependent() const); - - /** Returns true if this handle was previously marked as independent. */ - V8_INLINE(bool IsIndependent(Isolate* isolate) const); - - /** Deprecated. Use Isolate version instead. */ - V8_DEPRECATED(bool IsNearDeath() const); - - /** Checks if the handle holds the only reference to an object. */ - V8_INLINE(bool IsNearDeath(Isolate* isolate) const); - - /** Deprecated. Use Isolate version instead. */ - V8_DEPRECATED(bool IsWeak() const); - - /** Returns true if the handle's reference is weak. */ - V8_INLINE(bool IsWeak(Isolate* isolate) const); - - /** Deprecated. Use Isolate version instead. */ - V8_DEPRECATED(void SetWrapperClassId(uint16_t class_id)); - - /** - * Assigns a wrapper class ID to the handle. See RetainedObjectInfo interface - * description in v8-profiler.h for details. - */ - V8_INLINE(void SetWrapperClassId(Isolate* isolate, uint16_t class_id)); - - /** Deprecated. Use Isolate version instead. */ - V8_DEPRECATED(uint16_t WrapperClassId() const); - - /** - * Returns the class ID previously assigned to this handle or 0 if no class ID - * was previously assigned. - */ - V8_INLINE(uint16_t WrapperClassId(Isolate* isolate) const); - - private: - friend class ImplementationUtilities; - friend class ObjectTemplate; -}; - - - /** - * A stack-allocated class that governs a number of local handles. - * After a handle scope has been created, all local handles will be - * allocated within that handle scope until either the handle scope is - * deleted or another handle scope is created. If there is already a - * handle scope and a new one is created, all allocations will take - * place in the new handle scope until it is deleted. After that, - * new handles will again be allocated in the original handle scope. - * - * After the handle scope of a local handle has been deleted the - * garbage collector will no longer track the object stored in the - * handle and may deallocate it. The behavior of accessing a handle - * for which the handle scope has been deleted is undefined. - */ -class V8EXPORT HandleScope { - public: - HandleScope(); - - ~HandleScope(); - - /** - * Closes the handle scope and returns the value as a handle in the - * previous scope, which is the new current scope after the call. - */ - template <class T> Local<T> Close(Handle<T> value); - - /** - * Counts the number of allocated handles. - */ - static int NumberOfHandles(); - - /** - * Creates a new handle with the given value. - */ - static internal::Object** CreateHandle(internal::Object* value); - static internal::Object** CreateHandle(internal::Isolate* isolate, - internal::Object* value); - // Faster version, uses HeapObject to obtain the current Isolate. - static internal::Object** CreateHandle(internal::HeapObject* value); - - private: - // Make it hard to create heap-allocated or illegal handle scopes by - // disallowing certain operations. - HandleScope(const HandleScope&); - void operator=(const HandleScope&); - void* operator new(size_t size); - void operator delete(void*, size_t); - - // This Data class is accessible internally as HandleScopeData through a - // typedef in the ImplementationUtilities class. - class V8EXPORT Data { - public: - internal::Object** next; - internal::Object** limit; - int level; - V8_INLINE(void Initialize()) { - next = limit = NULL; - level = 0; - } - }; - - void Leave(); - - internal::Isolate* isolate_; - internal::Object** prev_next_; - internal::Object** prev_limit_; - - // Allow for the active closing of HandleScopes which allows to pass a handle - // from the HandleScope being closed to the next top most HandleScope. - bool is_closed_; - internal::Object** RawClose(internal::Object** value); - - friend class ImplementationUtilities; -}; - - -// --- Special objects --- - - -/** - * The superclass of values and API object templates. - */ -class V8EXPORT Data { - private: - Data(); -}; - - -/** - * Pre-compilation data that can be associated with a script. This - * data can be calculated for a script in advance of actually - * compiling it, and can be stored between compilations. When script - * data is given to the compile method compilation will be faster. - */ -class V8EXPORT ScriptData { // NOLINT - public: - virtual ~ScriptData() { } - - /** - * Pre-compiles the specified script (context-independent). - * - * \param input Pointer to UTF-8 script source code. - * \param length Length of UTF-8 script source code. - */ - static ScriptData* PreCompile(const char* input, int length); - - /** - * Pre-compiles the specified script (context-independent). - * - * NOTE: Pre-compilation using this method cannot happen on another thread - * without using Lockers. - * - * \param source Script source code. - */ - static ScriptData* PreCompile(Handle<String> source); - - /** - * Load previous pre-compilation data. - * - * \param data Pointer to data returned by a call to Data() of a previous - * ScriptData. Ownership is not transferred. - * \param length Length of data. - */ - static ScriptData* New(const char* data, int length); - - /** - * Returns the length of Data(). - */ - virtual int Length() = 0; - - /** - * Returns a serialized representation of this ScriptData that can later be - * passed to New(). NOTE: Serialized data is platform-dependent. - */ - virtual const char* Data() = 0; - - /** - * Returns true if the source code could not be parsed. - */ - virtual bool HasError() = 0; -}; - - -/** - * The origin, within a file, of a script. - */ -class ScriptOrigin { - public: - V8_INLINE(ScriptOrigin( - Handle<Value> resource_name, - Handle<Integer> resource_line_offset = Handle<Integer>(), - Handle<Integer> resource_column_offset = Handle<Integer>())) - : resource_name_(resource_name), - resource_line_offset_(resource_line_offset), - resource_column_offset_(resource_column_offset) { } - V8_INLINE(Handle<Value> ResourceName() const); - V8_INLINE(Handle<Integer> ResourceLineOffset() const); - V8_INLINE(Handle<Integer> ResourceColumnOffset() const); - private: - Handle<Value> resource_name_; - Handle<Integer> resource_line_offset_; - Handle<Integer> resource_column_offset_; -}; - - -/** - * A compiled JavaScript script. - */ -class V8EXPORT Script { - public: - enum CompileFlags { - Default = 0x00, - QmlMode = 0x01, - NativeMode = 0x02 - }; - - /** - * Compiles the specified script (context-independent). - * - * \param source Script source code. - * \param origin Script origin, owned by caller, no references are kept - * when New() returns - * \param pre_data Pre-parsing data, as obtained by ScriptData::PreCompile() - * using pre_data speeds compilation if it's done multiple times. - * Owned by caller, no references are kept when New() returns. - * \param script_data Arbitrary data associated with script. Using - * this has same effect as calling SetData(), but allows data to be - * available to compile event handlers. - * \return Compiled script object (context independent; when run it - * will use the currently entered context). - */ - static Local<Script> New(Handle<String> source, - ScriptOrigin* origin = NULL, - ScriptData* pre_data = NULL, - Handle<String> script_data = Handle<String>(), - CompileFlags = Default); - - /** - * Compiles the specified script using the specified file name - * object (typically a string) as the script's origin. - * - * \param source Script source code. - * \param file_name file name object (typically a string) to be used - * as the script's origin. - * \return Compiled script object (context independent; when run it - * will use the currently entered context). - */ - static Local<Script> New(Handle<String> source, - Handle<Value> file_name, - CompileFlags = Default); - - /** - * Compiles the specified script (bound to current context). - * - * \param source Script source code. - * \param origin Script origin, owned by caller, no references are kept - * when Compile() returns - * \param pre_data Pre-parsing data, as obtained by ScriptData::PreCompile() - * using pre_data speeds compilation if it's done multiple times. - * Owned by caller, no references are kept when Compile() returns. - * \param script_data Arbitrary data associated with script. Using - * this has same effect as calling SetData(), but makes data available - * earlier (i.e. to compile event handlers). - * \return Compiled script object, bound to the context that was active - * when this function was called. When run it will always use this - * context. - */ - static Local<Script> Compile(Handle<String> source, - ScriptOrigin* origin = NULL, - ScriptData* pre_data = NULL, - Handle<String> script_data = Handle<String>(), - CompileFlags = Default); - - /** - * Compiles the specified script using the specified file name - * object (typically a string) as the script's origin. - * - * \param source Script source code. - * \param file_name File name to use as script's origin - * \param script_data Arbitrary data associated with script. Using - * this has same effect as calling SetData(), but makes data available - * earlier (i.e. to compile event handlers). - * \return Compiled script object, bound to the context that was active - * when this function was called. When run it will always use this - * context. - */ - static Local<Script> Compile(Handle<String> source, - Handle<Value> file_name, - Handle<String> script_data = Handle<String>(), - CompileFlags = Default); - - /** - * Runs the script returning the resulting value. If the script is - * context independent (created using ::New) it will be run in the - * currently entered context. If it is context specific (created - * using ::Compile) it will be run in the context in which it was - * compiled. - */ - Local<Value> Run(); - Local<Value> Run(Handle<Object> qml); - - /** - * Returns the script id value. - */ - Local<Value> Id(); - - /** - * Associate an additional data object with the script. This is mainly used - * with the debugger as this data object is only available through the - * debugger API. - */ - void SetData(Handle<String> data); -}; - - -/** - * An error message. - */ -class V8EXPORT Message { - public: - Local<String> Get() const; - Local<String> GetSourceLine() const; - - /** - * Returns the resource name for the script from where the function causing - * the error originates. - */ - Handle<Value> GetScriptResourceName() const; - - /** - * Returns the resource data for the script from where the function causing - * the error originates. - */ - Handle<Value> GetScriptData() const; - - /** - * Exception stack trace. By default stack traces are not captured for - * uncaught exceptions. SetCaptureStackTraceForUncaughtExceptions allows - * to change this option. - */ - Handle<StackTrace> GetStackTrace() const; - - /** - * Returns the number, 1-based, of the line where the error occurred. - */ - int GetLineNumber() const; - - /** - * Returns the index within the script of the first character where - * the error occurred. - */ - int GetStartPosition() const; - - /** - * Returns the index within the script of the last character where - * the error occurred. - */ - int GetEndPosition() const; - - /** - * Returns the index within the line of the first character where - * the error occurred. - */ - int GetStartColumn() const; - - /** - * Returns the index within the line of the last character where - * the error occurred. - */ - int GetEndColumn() const; - - // TODO(1245381): Print to a string instead of on a FILE. - static void PrintCurrentStackTrace(FILE* out); - - static const int kNoLineNumberInfo = 0; - static const int kNoColumnInfo = 0; -}; - - -/** - * Representation of a JavaScript stack trace. The information collected is a - * snapshot of the execution stack and the information remains valid after - * execution continues. - */ -class V8EXPORT StackTrace { - public: - /** - * Flags that determine what information is placed captured for each - * StackFrame when grabbing the current stack trace. - */ - enum StackTraceOptions { - kLineNumber = 1, - kColumnOffset = 1 << 1 | kLineNumber, - kScriptName = 1 << 2, - kFunctionName = 1 << 3, - kIsEval = 1 << 4, - kIsConstructor = 1 << 5, - kScriptNameOrSourceURL = 1 << 6, - kOverview = kLineNumber | kColumnOffset | kScriptName | kFunctionName, - kDetailed = kOverview | kIsEval | kIsConstructor | kScriptNameOrSourceURL - }; - - /** - * Returns a StackFrame at a particular index. - */ - Local<StackFrame> GetFrame(uint32_t index) const; - - /** - * Returns the number of StackFrames. - */ - int GetFrameCount() const; - - /** - * Returns StackTrace as a v8::Array that contains StackFrame objects. - */ - Local<Array> AsArray(); - - /** - * Grab a snapshot of the current JavaScript execution stack. - * - * \param frame_limit The maximum number of stack frames we want to capture. - * \param options Enumerates the set of things we will capture for each - * StackFrame. - */ - static Local<StackTrace> CurrentStackTrace( - int frame_limit, - StackTraceOptions options = kOverview); -}; - - -/** - * A single JavaScript stack frame. - */ -class V8EXPORT StackFrame { - public: - /** - * Returns the number, 1-based, of the line for the associate function call. - * This method will return Message::kNoLineNumberInfo if it is unable to - * retrieve the line number, or if kLineNumber was not passed as an option - * when capturing the StackTrace. - */ - int GetLineNumber() const; - - /** - * Returns the 1-based column offset on the line for the associated function - * call. - * This method will return Message::kNoColumnInfo if it is unable to retrieve - * the column number, or if kColumnOffset was not passed as an option when - * capturing the StackTrace. - */ - int GetColumn() const; - - /** - * Returns the name of the resource that contains the script for the - * function for this StackFrame. - */ - Local<String> GetScriptName() const; - - /** - * Returns the name of the resource that contains the script for the - * function for this StackFrame or sourceURL value if the script name - * is undefined and its source ends with //@ sourceURL=... string. - */ - Local<String> GetScriptNameOrSourceURL() const; - - /** - * Returns the name of the function associated with this stack frame. - */ - Local<String> GetFunctionName() const; - - /** - * Returns whether or not the associated function is compiled via a call to - * eval(). - */ - bool IsEval() const; - - /** - * Returns whether or not the associated function is called as a - * constructor via "new". - */ - bool IsConstructor() const; -}; - - -// --- Value --- - - -/** - * The superclass of all JavaScript values and objects. - */ -class V8EXPORT Value : public Data { - public: - /** - * Returns true if this value is the undefined value. See ECMA-262 - * 4.3.10. - */ - V8_INLINE(bool IsUndefined() const); - - /** - * Returns true if this value is the null value. See ECMA-262 - * 4.3.11. - */ - V8_INLINE(bool IsNull() const); - - /** - * Returns true if this value is true. - */ - bool IsTrue() const; - - /** - * Returns true if this value is false. - */ - bool IsFalse() const; - - /** - * Returns true if this value is an instance of the String type. - * See ECMA-262 8.4. - */ - V8_INLINE(bool IsString() const); - - /** - * Returns true if this value is a function. - */ - bool IsFunction() const; - - /** - * Returns true if this value is an array. - */ - bool IsArray() const; - - /** - * Returns true if this value is an object. - */ - bool IsObject() const; - - /** - * Returns true if this value is boolean. - */ - bool IsBoolean() const; - - /** - * Returns true if this value is a number. - */ - bool IsNumber() const; - - /** - * Returns true if this value is external. - */ - bool IsExternal() const; - - /** - * Returns true if this value is a 32-bit signed integer. - */ - bool IsInt32() const; - - /** - * Returns true if this value is a 32-bit unsigned integer. - */ - bool IsUint32() const; - - /** - * Returns true if this value is a Date. - */ - bool IsDate() const; - - /** - * Returns true if this value is a Boolean object. - */ - bool IsBooleanObject() const; - - /** - * Returns true if this value is a Number object. - */ - bool IsNumberObject() const; - - /** - * Returns true if this value is a String object. - */ - bool IsStringObject() const; - - /** - * Returns true if this value is a NativeError. - */ - bool IsNativeError() const; - - /** - * Returns true if this value is a RegExp. - */ - bool IsRegExp() const; - - /** - * Returns true if this value is an Error. - */ - bool IsError() const; - - Local<Boolean> ToBoolean() const; - Local<Number> ToNumber() const; - Local<String> ToString() const; - Local<String> ToDetailString() const; - Local<Object> ToObject() const; - Local<Integer> ToInteger() const; - Local<Uint32> ToUint32() const; - Local<Int32> ToInt32() const; - - /** - * Attempts to convert a string to an array index. - * Returns an empty handle if the conversion fails. - */ - Local<Uint32> ToArrayIndex() const; - - bool BooleanValue() const; - double NumberValue() const; - int64_t IntegerValue() const; - uint32_t Uint32Value() const; - int32_t Int32Value() const; - - /** JS == */ - bool Equals(Handle<Value> that) const; - bool StrictEquals(Handle<Value> that) const; - - private: - V8_INLINE(bool QuickIsUndefined() const); - V8_INLINE(bool QuickIsNull() const); - V8_INLINE(bool QuickIsString() const); - bool FullIsUndefined() const; - bool FullIsNull() const; - bool FullIsString() const; -}; - - -/** - * The superclass of primitive values. See ECMA-262 4.3.2. - */ -class V8EXPORT Primitive : public Value { }; - - -/** - * A primitive boolean value (ECMA-262, 4.3.14). Either the true - * or false value. - */ -class V8EXPORT Boolean : public Primitive { - public: - bool Value() const; - V8_INLINE(static Handle<Boolean> New(bool value)); -}; - - -/** - * A JavaScript string value (ECMA-262, 4.3.17). - */ -class V8EXPORT String : public Primitive { - public: - enum Encoding { - UNKNOWN_ENCODING = 0x1, - TWO_BYTE_ENCODING = 0x0, - ASCII_ENCODING = 0x4, - ONE_BYTE_ENCODING = 0x4 - }; - /** - * Returns the number of characters in this string. - */ - int Length() const; - - /** - * Returns the number of bytes in the UTF-8 encoded - * representation of this string. - */ - int Utf8Length() const; - - /** - * A fast conservative check for non-ASCII characters. May - * return true even for ASCII strings, but if it returns - * false you can be sure that all characters are in the range - * 0-127. - */ - bool MayContainNonAscii() const; - - /** - * Returns whether this string contains only one byte data. - */ - bool IsOneByte() const; - - /** - * Returns the hash of this string. - */ - uint32_t Hash() const; - - struct CompleteHashData { - CompleteHashData() : length(0), hash(0), symbol_id(0) {} - int length; - uint32_t hash; - uint32_t symbol_id; - }; - - /** - * Returns the "complete" hash of the string. This is - * all the information about the string needed to implement - * a very efficient hash keyed on the string. - * - * The members of CompleteHashData are: - * length: The length of the string. Equivalent to Length() - * hash: The hash of the string. Equivalent to Hash() - * symbol_id: If the string is a sequential symbol, the symbol - * id, otherwise 0. If the symbol ids of two strings are - * the same (and non-zero) the two strings are identical. - * If the symbol ids are different the strings may still be - * identical, but an Equals() check must be performed. - */ - CompleteHashData CompleteHash() const; - - /** - * Compute a hash value for the passed UTF16 string - * data. - */ - static uint32_t ComputeHash(uint16_t *string, int length); - static uint32_t ComputeHash(char *string, int length); - - /** - * Write the contents of the string to an external buffer. - * If no arguments are given, expects the buffer to be large - * enough to hold the entire string and NULL terminator. Copies - * the contents of the string and the NULL terminator into the - * buffer. - * - * WriteUtf8 will not write partial UTF-8 sequences, preferring to stop - * before the end of the buffer. - * - * Copies up to length characters into the output buffer. - * Only null-terminates if there is enough space in the buffer. - * - * \param buffer The buffer into which the string will be copied. - * \param start The starting position within the string at which - * copying begins. - * \param length The number of characters to copy from the string. For - * WriteUtf8 the number of bytes in the buffer. - * \param nchars_ref The number of characters written, can be NULL. - * \param options Various options that might affect performance of this or - * subsequent operations. - * \return The number of characters copied to the buffer excluding the null - * terminator. For WriteUtf8: The number of bytes copied to the buffer - * including the null terminator (if written). - */ - enum WriteOptions { - NO_OPTIONS = 0, - HINT_MANY_WRITES_EXPECTED = 1, - NO_NULL_TERMINATION = 2, - PRESERVE_ASCII_NULL = 4 - }; - - // 16-bit character codes. - int Write(uint16_t* buffer, - int start = 0, - int length = -1, - int options = NO_OPTIONS) const; - // ASCII characters. - int WriteAscii(char* buffer, - int start = 0, - int length = -1, - int options = NO_OPTIONS) const; - // One byte characters. - int WriteOneByte(uint8_t* buffer, - int start = 0, - int length = -1, - int options = NO_OPTIONS) const; - // UTF-8 encoded characters. - int WriteUtf8(char* buffer, - int length = -1, - int* nchars_ref = NULL, - int options = NO_OPTIONS) const; - - /** - * A zero length string. - */ - static v8::Local<v8::String> Empty(); - V8_INLINE(static v8::Local<v8::String> Empty(Isolate* isolate)); - - /** - * Returns true if the string is external - */ - bool IsExternal() const; - - /** - * Returns true if the string is both external and ASCII - */ - bool IsExternalAscii() const; - - class V8EXPORT ExternalStringResourceBase { // NOLINT - public: - virtual ~ExternalStringResourceBase() {} - - protected: - ExternalStringResourceBase() {} - - /** - * Internally V8 will call this Dispose method when the external string - * resource is no longer needed. The default implementation will use the - * delete operator. This method can be overridden in subclasses to - * control how allocated external string resources are disposed. - */ - virtual void Dispose() { delete this; } - - private: - // Disallow copying and assigning. - ExternalStringResourceBase(const ExternalStringResourceBase&); - void operator=(const ExternalStringResourceBase&); - - friend class v8::internal::Heap; - }; - - /** - * An ExternalStringResource is a wrapper around a two-byte string - * buffer that resides outside V8's heap. Implement an - * ExternalStringResource to manage the life cycle of the underlying - * buffer. Note that the string data must be immutable. - */ - class V8EXPORT ExternalStringResource - : public ExternalStringResourceBase { - public: - /** - * Override the destructor to manage the life cycle of the underlying - * buffer. - */ - virtual ~ExternalStringResource() {} - - /** - * The string data from the underlying buffer. - */ - virtual const uint16_t* data() const = 0; - - /** - * The length of the string. That is, the number of two-byte characters. - */ - virtual size_t length() const = 0; - - protected: - ExternalStringResource() {} - }; - - /** - * An ExternalAsciiStringResource is a wrapper around an ASCII - * string buffer that resides outside V8's heap. Implement an - * ExternalAsciiStringResource to manage the life cycle of the - * underlying buffer. Note that the string data must be immutable - * and that the data must be strict (7-bit) ASCII, not Latin-1 or - * UTF-8, which would require special treatment internally in the - * engine and, in the case of UTF-8, do not allow efficient indexing. - * Use String::New or convert to 16 bit data for non-ASCII. - */ - - class V8EXPORT ExternalAsciiStringResource - : public ExternalStringResourceBase { - public: - /** - * Override the destructor to manage the life cycle of the underlying - * buffer. - */ - virtual ~ExternalAsciiStringResource() {} - /** The string data from the underlying buffer.*/ - virtual const char* data() const = 0; - /** The number of ASCII characters in the string.*/ - virtual size_t length() const = 0; - protected: - ExternalAsciiStringResource() {} - }; - - typedef ExternalAsciiStringResource ExternalOneByteStringResource; - - /** - * If the string is an external string, return the ExternalStringResourceBase - * regardless of the encoding, otherwise return NULL. The encoding of the - * string is returned in encoding_out. - */ - V8_INLINE(ExternalStringResourceBase* GetExternalStringResourceBase( - Encoding* encoding_out) const); - - /** - * Get the ExternalStringResource for an external string. Returns - * NULL if IsExternal() doesn't return true. - */ - V8_INLINE(ExternalStringResource* GetExternalStringResource() const); - - /** - * Get the ExternalAsciiStringResource for an external ASCII string. - * Returns NULL if IsExternalAscii() doesn't return true. - */ - const ExternalAsciiStringResource* GetExternalAsciiStringResource() const; - - V8_INLINE(static String* Cast(v8::Value* obj)); - - /** - * Allocates a new string from either UTF-8 encoded or ASCII data. - * The second parameter 'length' gives the buffer length. If omitted, - * the function calls 'strlen' to determine the buffer length. - */ - static Local<String> New(const char* data, int length = -1); - - /** Allocates a new string from 16-bit character codes.*/ - static Local<String> New(const uint16_t* data, int length = -1); - - /** Creates a symbol. Returns one if it exists already.*/ - static Local<String> NewSymbol(const char* data, int length = -1); - - /** - * Creates a new string by concatenating the left and the right strings - * passed in as parameters. - */ - static Local<String> Concat(Handle<String> left, Handle<String> right); - - /** - * Creates a new external string using the data defined in the given - * resource. When the external string is no longer live on V8's heap the - * resource will be disposed by calling its Dispose method. The caller of - * this function should not otherwise delete or modify the resource. Neither - * should the underlying buffer be deallocated or modified except through the - * destructor of the external string resource. - */ - static Local<String> NewExternal(ExternalStringResource* resource); - - /** - * Associate an external string resource with this string by transforming it - * in place so that existing references to this string in the JavaScript heap - * will use the external string resource. The external string resource's - * character contents need to be equivalent to this string. - * Returns true if the string has been changed to be an external string. - * The string is not modified if the operation fails. See NewExternal for - * information on the lifetime of the resource. - */ - bool MakeExternal(ExternalStringResource* resource); - - /** - * Creates a new external string using the ASCII data defined in the given - * resource. When the external string is no longer live on V8's heap the - * resource will be disposed by calling its Dispose method. The caller of - * this function should not otherwise delete or modify the resource. Neither - * should the underlying buffer be deallocated or modified except through the - * destructor of the external string resource. - */ - static Local<String> NewExternal(ExternalAsciiStringResource* resource); - - /** - * Associate an external string resource with this string by transforming it - * in place so that existing references to this string in the JavaScript heap - * will use the external string resource. The external string resource's - * character contents need to be equivalent to this string. - * Returns true if the string has been changed to be an external string. - * The string is not modified if the operation fails. See NewExternal for - * information on the lifetime of the resource. - */ - bool MakeExternal(ExternalAsciiStringResource* resource); - - /** - * Returns true if this string can be made external. - */ - bool CanMakeExternal(); - - /** Creates an undetectable string from the supplied ASCII or UTF-8 data.*/ - static Local<String> NewUndetectable(const char* data, int length = -1); - - /** Creates an undetectable string from the supplied 16-bit character codes.*/ - static Local<String> NewUndetectable(const uint16_t* data, int length = -1); - - /** - * Converts an object to a UTF-8-encoded character array. Useful if - * you want to print the object. If conversion to a string fails - * (e.g. due to an exception in the toString() method of the object) - * then the length() method returns 0 and the * operator returns - * NULL. - */ - class V8EXPORT Utf8Value { - public: - explicit Utf8Value(Handle<v8::Value> obj); - ~Utf8Value(); - char* operator*() { return str_; } - const char* operator*() const { return str_; } - int length() const { return length_; } - private: - char* str_; - int length_; - - // Disallow copying and assigning. - Utf8Value(const Utf8Value&); - void operator=(const Utf8Value&); - }; - - /** - * Converts an object to an ASCII string. - * Useful if you want to print the object. - * If conversion to a string fails (eg. due to an exception in the toString() - * method of the object) then the length() method returns 0 and the * operator - * returns NULL. - */ - class V8EXPORT AsciiValue { - public: - explicit AsciiValue(Handle<v8::Value> obj); - ~AsciiValue(); - char* operator*() { return str_; } - const char* operator*() const { return str_; } - int length() const { return length_; } - private: - char* str_; - int length_; - - // Disallow copying and assigning. - AsciiValue(const AsciiValue&); - void operator=(const AsciiValue&); - }; - - /** - * Converts an object to a two-byte string. - * If conversion to a string fails (eg. due to an exception in the toString() - * method of the object) then the length() method returns 0 and the * operator - * returns NULL. - */ - class V8EXPORT Value { - public: - explicit Value(Handle<v8::Value> obj); - ~Value(); - uint16_t* operator*() { return str_; } - const uint16_t* operator*() const { return str_; } - int length() const { return length_; } - private: - uint16_t* str_; - int length_; - - // Disallow copying and assigning. - Value(const Value&); - void operator=(const Value&); - }; - - private: - void VerifyExternalStringResourceBase(ExternalStringResourceBase* v, - Encoding encoding) const; - void VerifyExternalStringResource(ExternalStringResource* val) const; - static void CheckCast(v8::Value* obj); -}; - - -/** - * A JavaScript number value (ECMA-262, 4.3.20) - */ -class V8EXPORT Number : public Primitive { - public: - double Value() const; - static Local<Number> New(double value); - V8_INLINE(static Number* Cast(v8::Value* obj)); - private: - Number(); - static void CheckCast(v8::Value* obj); -}; - - -/** - * A JavaScript value representing a signed integer. - */ -class V8EXPORT Integer : public Number { - public: - static Local<Integer> New(int32_t value); - static Local<Integer> NewFromUnsigned(uint32_t value); - static Local<Integer> New(int32_t value, Isolate*); - static Local<Integer> NewFromUnsigned(uint32_t value, Isolate*); - int64_t Value() const; - V8_INLINE(static Integer* Cast(v8::Value* obj)); - private: - Integer(); - static void CheckCast(v8::Value* obj); -}; - - -/** - * A JavaScript value representing a 32-bit signed integer. - */ -class V8EXPORT Int32 : public Integer { - public: - int32_t Value() const; - private: - Int32(); -}; - - -/** - * A JavaScript value representing a 32-bit unsigned integer. - */ -class V8EXPORT Uint32 : public Integer { - public: - uint32_t Value() const; - private: - Uint32(); -}; - - -enum PropertyAttribute { - None = 0, - ReadOnly = 1 << 0, - DontEnum = 1 << 1, - DontDelete = 1 << 2 -}; - -enum ExternalArrayType { - kExternalByteArray = 1, - kExternalUnsignedByteArray, - kExternalShortArray, - kExternalUnsignedShortArray, - kExternalIntArray, - kExternalUnsignedIntArray, - kExternalFloatArray, - kExternalDoubleArray, - kExternalPixelArray -}; - -/** - * Accessor[Getter|Setter] are used as callback functions when - * setting|getting a particular property. See Object and ObjectTemplate's - * method SetAccessor. - */ -typedef Handle<Value> (*AccessorGetter)(Local<String> property, - const AccessorInfo& info); - - -typedef void (*AccessorSetter)(Local<String> property, - Local<Value> value, - const AccessorInfo& info); - - -/** - * Access control specifications. - * - * Some accessors should be accessible across contexts. These - * accessors have an explicit access control parameter which specifies - * the kind of cross-context access that should be allowed. - * - * Additionally, for security, accessors can prohibit overwriting by - * accessors defined in JavaScript. For objects that have such - * accessors either locally or in their prototype chain it is not - * possible to overwrite the accessor by using __defineGetter__ or - * __defineSetter__ from JavaScript code. - */ -enum AccessControl { - DEFAULT = 0, - ALL_CAN_READ = 1, - ALL_CAN_WRITE = 1 << 1, - PROHIBITS_OVERWRITING = 1 << 2 -}; - - -/** - * A JavaScript object (ECMA-262, 4.3.3) - */ -class V8EXPORT Object : public Value { - public: - bool Set(Handle<Value> key, - Handle<Value> value, - PropertyAttribute attribs = None); - - bool Set(uint32_t index, Handle<Value> value); - - // Sets a local property on this object bypassing interceptors and - // overriding accessors or read-only properties. - // - // Note that if the object has an interceptor the property will be set - // locally, but since the interceptor takes precedence the local property - // will only be returned if the interceptor doesn't return a value. - // - // Note also that this only works for named properties. - bool ForceSet(Handle<Value> key, - Handle<Value> value, - PropertyAttribute attribs = None); - - Local<Value> Get(Handle<Value> key); - - Local<Value> Get(uint32_t index); - - /** - * Gets the property attributes of a property which can be None or - * any combination of ReadOnly, DontEnum and DontDelete. Returns - * None when the property doesn't exist. - */ - PropertyAttribute GetPropertyAttributes(Handle<Value> key); - - // TODO(1245389): Replace the type-specific versions of these - // functions with generic ones that accept a Handle<Value> key. - bool Has(Handle<String> key); - - bool Delete(Handle<String> key); - - // Delete a property on this object bypassing interceptors and - // ignoring dont-delete attributes. - bool ForceDelete(Handle<Value> key); - - bool Has(uint32_t index); - - bool Delete(uint32_t index); - - bool SetAccessor(Handle<String> name, - AccessorGetter getter, - AccessorSetter setter = 0, - Handle<Value> data = Handle<Value>(), - AccessControl settings = DEFAULT, - PropertyAttribute attribute = None); - - /** - * Returns an array containing the names of the enumerable properties - * of this object, including properties from prototype objects. The - * array returned by this method contains the same values as would - * be enumerated by a for-in statement over this object. - */ - Local<Array> GetPropertyNames(); - - /** - * This function has the same functionality as GetPropertyNames but - * the returned array doesn't contain the names of properties from - * prototype objects. - */ - Local<Array> GetOwnPropertyNames(); - - /** - * Get the prototype object. This does not skip objects marked to - * be skipped by __proto__ and it does not consult the security - * handler. - */ - Local<Value> GetPrototype(); - - /** - * Set the prototype object. This does not skip objects marked to - * be skipped by __proto__ and it does not consult the security - * handler. - */ - bool SetPrototype(Handle<Value> prototype); - - /** - * Finds an instance of the given function template in the prototype - * chain. - */ - Local<Object> FindInstanceInPrototypeChain(Handle<FunctionTemplate> tmpl); - - /** - * Call builtin Object.prototype.toString on this object. - * This is different from Value::ToString() that may call - * user-defined toString function. This one does not. - */ - Local<String> ObjectProtoToString(); - - /** - * Returns the function invoked as a constructor for this object. - * May be the null value. - */ - Local<Value> GetConstructor(); - - /** - * Returns the name of the function invoked as a constructor for this object. - */ - Local<String> GetConstructorName(); - - /** Gets the number of internal fields for this Object. */ - int InternalFieldCount(); - - /** Gets the value from an internal field. */ - V8_INLINE(Local<Value> GetInternalField(int index)); - - /** Sets the value in an internal field. */ - void SetInternalField(int index, Handle<Value> value); - - /** - * Gets a 2-byte-aligned native pointer from an internal field. This field - * must have been set by SetAlignedPointerInInternalField, everything else - * leads to undefined behavior. - */ - V8_INLINE(void* GetAlignedPointerFromInternalField(int index)); - - /** - * Sets a 2-byte-aligned native pointer in an internal field. To retrieve such - * a field, GetAlignedPointerFromInternalField must be used, everything else - * leads to undefined behavior. - */ - void SetAlignedPointerInInternalField(int index, void* value); - - class V8EXPORT ExternalResource { // NOLINT - public: - ExternalResource() {} - virtual ~ExternalResource() {} - - protected: - virtual void Dispose() { delete this; } - - private: - // Disallow copying and assigning. - ExternalResource(const ExternalResource&); - void operator=(const ExternalResource&); - - friend class v8::internal::Heap; - }; - - void SetExternalResource(ExternalResource* resource); - ExternalResource* GetExternalResource(); - - // Testers for local properties. - bool HasOwnProperty(Handle<String> key); - bool HasRealNamedProperty(Handle<String> key); - bool HasRealIndexedProperty(uint32_t index); - bool HasRealNamedCallbackProperty(Handle<String> key); - - /** - * If result.IsEmpty() no real property was located in the prototype chain. - * This means interceptors in the prototype chain are not called. - */ - Local<Value> GetRealNamedPropertyInPrototypeChain(Handle<String> key); - - /** - * If result.IsEmpty() no real property was located on the object or - * in the prototype chain. - * This means interceptors in the prototype chain are not called. - */ - Local<Value> GetRealNamedProperty(Handle<String> key); - - /** Tests for a named lookup interceptor.*/ - bool HasNamedLookupInterceptor(); - - /** Tests for an index lookup interceptor.*/ - bool HasIndexedLookupInterceptor(); - - /** - * Turns on access check on the object if the object is an instance of - * a template that has access check callbacks. If an object has no - * access check info, the object cannot be accessed by anyone. - */ - void TurnOnAccessCheck(); - - /** - * Returns the identity hash for this object. The current implementation - * uses a hidden property on the object to store the identity hash. - * - * The return value will never be 0. Also, it is not guaranteed to be - * unique. - */ - int GetIdentityHash(); - - /** - * Access hidden properties on JavaScript objects. These properties are - * hidden from the executing JavaScript and only accessible through the V8 - * C++ API. Hidden properties introduced by V8 internally (for example the - * identity hash) are prefixed with "v8::". - */ - bool SetHiddenValue(Handle<String> key, Handle<Value> value); - Local<Value> GetHiddenValue(Handle<String> key); - bool DeleteHiddenValue(Handle<String> key); - - /** - * Returns true if this is an instance of an api function (one - * created from a function created from a function template) and has - * been modified since it was created. Note that this method is - * conservative and may return true for objects that haven't actually - * been modified. - */ - bool IsDirty(); - - /** - * Clone this object with a fast but shallow copy. Values will point - * to the same values as the original object. - */ - Local<Object> Clone(); - - /** - * Returns the context in which the object was created. - */ - Local<Context> CreationContext(); - - /** - * Set the backing store of the indexed properties to be managed by the - * embedding layer. Access to the indexed properties will follow the rules - * spelled out in CanvasPixelArray. - * Note: The embedding program still owns the data and needs to ensure that - * the backing store is preserved while V8 has a reference. - */ - void SetIndexedPropertiesToPixelData(uint8_t* data, int length); - bool HasIndexedPropertiesInPixelData(); - uint8_t* GetIndexedPropertiesPixelData(); - int GetIndexedPropertiesPixelDataLength(); - - /** - * Set the backing store of the indexed properties to be managed by the - * embedding layer. Access to the indexed properties will follow the rules - * spelled out for the CanvasArray subtypes in the WebGL specification. - * Note: The embedding program still owns the data and needs to ensure that - * the backing store is preserved while V8 has a reference. - */ - void SetIndexedPropertiesToExternalArrayData(void* data, - ExternalArrayType array_type, - int number_of_elements); - bool HasIndexedPropertiesInExternalArrayData(); - void* GetIndexedPropertiesExternalArrayData(); - ExternalArrayType GetIndexedPropertiesExternalArrayDataType(); - int GetIndexedPropertiesExternalArrayDataLength(); - - /** - * Checks whether a callback is set by the - * ObjectTemplate::SetCallAsFunctionHandler method. - * When an Object is callable this method returns true. - */ - bool IsCallable(); - - /** - * Call an Object as a function if a callback is set by the - * ObjectTemplate::SetCallAsFunctionHandler method. - */ - Local<Value> CallAsFunction(Handle<Object> recv, - int argc, - Handle<Value> argv[]); - - /** - * Call an Object as a constructor if a callback is set by the - * ObjectTemplate::SetCallAsFunctionHandler method. - * Note: This method behaves like the Function::NewInstance method. - */ - Local<Value> CallAsConstructor(int argc, Handle<Value> argv[]); - - static Local<Object> New(); - V8_INLINE(static Object* Cast(Value* obj)); - - private: - Object(); - static void CheckCast(Value* obj); - Local<Value> SlowGetInternalField(int index); - void* SlowGetAlignedPointerFromInternalField(int index); -}; - - -/** - * An instance of the built-in array constructor (ECMA-262, 15.4.2). - */ -class V8EXPORT Array : public Object { - public: - uint32_t Length() const; - - /** - * Clones an element at index |index|. Returns an empty - * handle if cloning fails (for any reason). - */ - Local<Object> CloneElementAt(uint32_t index); - - /** - * Creates a JavaScript array with the given length. If the length - * is negative the returned array will have length 0. - */ - static Local<Array> New(int length = 0); - - V8_INLINE(static Array* Cast(Value* obj)); - private: - Array(); - static void CheckCast(Value* obj); -}; - - -/** - * A JavaScript function object (ECMA-262, 15.3). - */ -class V8EXPORT Function : public Object { - public: - Local<Object> NewInstance() const; - Local<Object> NewInstance(int argc, Handle<Value> argv[]) const; - Local<Value> Call(Handle<Object> recv, int argc, Handle<Value> argv[]); - void SetName(Handle<String> name); - Handle<Value> GetName() const; - - /** - * Name inferred from variable or property assignment of this function. - * Used to facilitate debugging and profiling of JavaScript code written - * in an OO style, where many functions are anonymous but are assigned - * to object properties. - */ - Handle<Value> GetInferredName() const; - - /** - * Returns zero based line number of function body and - * kLineOffsetNotFound if no information available. - */ - int GetScriptLineNumber() const; - /** - * Returns zero based column number of function body and - * kLineOffsetNotFound if no information available. - */ - int GetScriptColumnNumber() const; - Handle<Value> GetScriptId() const; - ScriptOrigin GetScriptOrigin() const; - V8_INLINE(static Function* Cast(Value* obj)); - static const int kLineOffsetNotFound; - - private: - Function(); - static void CheckCast(Value* obj); -}; - - -/** - * An instance of the built-in Date constructor (ECMA-262, 15.9). - */ -class V8EXPORT Date : public Object { - public: - static Local<Value> New(double time); - - /** - * A specialization of Value::NumberValue that is more efficient - * because we know the structure of this object. - */ - double NumberValue() const; - - V8_INLINE(static Date* Cast(v8::Value* obj)); - - /** - * Notification that the embedder has changed the time zone, - * daylight savings time, or other date / time configuration - * parameters. V8 keeps a cache of various values used for - * date / time computation. This notification will reset - * those cached values for the current context so that date / - * time configuration changes would be reflected in the Date - * object. - * - * This API should not be called more than needed as it will - * negatively impact the performance of date operations. - */ - static void DateTimeConfigurationChangeNotification(); - - private: - static void CheckCast(v8::Value* obj); -}; - - -/** - * A Number object (ECMA-262, 4.3.21). - */ -class V8EXPORT NumberObject : public Object { - public: - static Local<Value> New(double value); - - /** - * Returns the Number held by the object. - */ - double NumberValue() const; - - V8_INLINE(static NumberObject* Cast(v8::Value* obj)); - - private: - static void CheckCast(v8::Value* obj); -}; - - -/** - * A Boolean object (ECMA-262, 4.3.15). - */ -class V8EXPORT BooleanObject : public Object { - public: - static Local<Value> New(bool value); - - /** - * Returns the Boolean held by the object. - */ - bool BooleanValue() const; - - V8_INLINE(static BooleanObject* Cast(v8::Value* obj)); - - private: - static void CheckCast(v8::Value* obj); -}; - - -/** - * A String object (ECMA-262, 4.3.18). - */ -class V8EXPORT StringObject : public Object { - public: - static Local<Value> New(Handle<String> value); - - /** - * Returns the String held by the object. - */ - Local<String> StringValue() const; - - V8_INLINE(static StringObject* Cast(v8::Value* obj)); - - private: - static void CheckCast(v8::Value* obj); -}; - - -/** - * An instance of the built-in RegExp constructor (ECMA-262, 15.10). - */ -class V8EXPORT RegExp : public Object { - public: - /** - * Regular expression flag bits. They can be or'ed to enable a set - * of flags. - */ - enum Flags { - kNone = 0, - kGlobal = 1, - kIgnoreCase = 2, - kMultiline = 4 - }; - - /** - * Creates a regular expression from the given pattern string and - * the flags bit field. May throw a JavaScript exception as - * described in ECMA-262, 15.10.4.1. - * - * For example, - * RegExp::New(v8::String::New("foo"), - * static_cast<RegExp::Flags>(kGlobal | kMultiline)) - * is equivalent to evaluating "/foo/gm". - */ - static Local<RegExp> New(Handle<String> pattern, Flags flags); - - /** - * Returns the value of the source property: a string representing - * the regular expression. - */ - Local<String> GetSource() const; - - /** - * Returns the flags bit field. - */ - Flags GetFlags() const; - - V8_INLINE(static RegExp* Cast(v8::Value* obj)); - - private: - static void CheckCast(v8::Value* obj); -}; - - -/** - * A JavaScript value that wraps a C++ void*. This type of value is mainly used - * to associate C++ data structures with JavaScript objects. - */ -class V8EXPORT External : public Value { - public: - static Local<External> New(void* value); - V8_INLINE(static External* Cast(Value* obj)); - void* Value() const; - private: - static void CheckCast(v8::Value* obj); -}; - - -// --- Templates --- - - -/** - * The superclass of object and function templates. - */ -class V8EXPORT Template : public Data { - public: - /** Adds a property to each instance created by this template.*/ - void Set(Handle<String> name, Handle<Data> value, - PropertyAttribute attributes = None); - V8_INLINE(void Set(const char* name, Handle<Data> value)); - private: - Template(); - - friend class ObjectTemplate; - friend class FunctionTemplate; -}; - - -/** - * The argument information given to function call callbacks. This - * class provides access to information about the context of the call, - * including the receiver, the number and values of arguments, and - * the holder of the function. - */ -class V8EXPORT Arguments { - public: - V8_INLINE(int Length() const); - V8_INLINE(Local<Value> operator[](int i) const); - V8_INLINE(Local<Function> Callee() const); - V8_INLINE(Local<Object> This() const); - V8_INLINE(Local<Object> Holder() const); - V8_INLINE(bool IsConstructCall() const); - V8_INLINE(Local<Value> Data() const); - V8_INLINE(Isolate* GetIsolate() const); - - private: - static const int kIsolateIndex = 0; - static const int kDataIndex = -1; - static const int kCalleeIndex = -2; - static const int kHolderIndex = -3; - - friend class ImplementationUtilities; - V8_INLINE(Arguments(internal::Object** implicit_args, - internal::Object** values, - int length, - bool is_construct_call)); - internal::Object** implicit_args_; - internal::Object** values_; - int length_; - bool is_construct_call_; -}; - - -/** - * The information passed to an accessor callback about the context - * of the property access. - */ -class V8EXPORT AccessorInfo { - public: - V8_INLINE(AccessorInfo(internal::Object** args)) - : args_(args) { } - V8_INLINE(Isolate* GetIsolate() const); - V8_INLINE(Local<Value> Data() const); - V8_INLINE(Local<Object> This() const); - V8_INLINE(Local<Object> Holder() const); - - private: - internal::Object** args_; -}; - - -typedef Handle<Value> (*InvocationCallback)(const Arguments& args); - -/** - * NamedProperty[Getter|Setter] are used as interceptors on object. - * See ObjectTemplate::SetNamedPropertyHandler. - */ -typedef Handle<Value> (*NamedPropertyGetter)(Local<String> property, - const AccessorInfo& info); - - -/** - * Returns the value if the setter intercepts the request. - * Otherwise, returns an empty handle. - */ -typedef Handle<Value> (*NamedPropertySetter)(Local<String> property, - Local<Value> value, - const AccessorInfo& info); - -/** - * Returns a non-empty handle if the interceptor intercepts the request. - * The result is an integer encoding property attributes (like v8::None, - * v8::DontEnum, etc.) - */ -typedef Handle<Integer> (*NamedPropertyQuery)(Local<String> property, - const AccessorInfo& info); - - -/** - * Returns a non-empty handle if the deleter intercepts the request. - * The return value is true if the property could be deleted and false - * otherwise. - */ -typedef Handle<Boolean> (*NamedPropertyDeleter)(Local<String> property, - const AccessorInfo& info); - -/** - * Returns an array containing the names of the properties the named - * property getter intercepts. - */ -typedef Handle<Array> (*NamedPropertyEnumerator)(const AccessorInfo& info); - - -/** - * Returns the value of the property if the getter intercepts the - * request. Otherwise, returns an empty handle. - */ -typedef Handle<Value> (*IndexedPropertyGetter)(uint32_t index, - const AccessorInfo& info); - - -/** - * Returns the value if the setter intercepts the request. - * Otherwise, returns an empty handle. - */ -typedef Handle<Value> (*IndexedPropertySetter)(uint32_t index, - Local<Value> value, - const AccessorInfo& info); - - -/** - * Returns a non-empty handle if the interceptor intercepts the request. - * The result is an integer encoding property attributes. - */ -typedef Handle<Integer> (*IndexedPropertyQuery)(uint32_t index, - const AccessorInfo& info); - -/** - * Returns a non-empty handle if the deleter intercepts the request. - * The return value is true if the property could be deleted and false - * otherwise. - */ -typedef Handle<Boolean> (*IndexedPropertyDeleter)(uint32_t index, - const AccessorInfo& info); - -/** - * Returns an array containing the indices of the properties the - * indexed property getter intercepts. - */ -typedef Handle<Array> (*IndexedPropertyEnumerator)(const AccessorInfo& info); - - -/** - * Access type specification. - */ -enum AccessType { - ACCESS_GET, - ACCESS_SET, - ACCESS_HAS, - ACCESS_DELETE, - ACCESS_KEYS -}; - - -/** - * Returns true if cross-context access should be allowed to the named - * property with the given key on the host object. - */ -typedef bool (*NamedSecurityCallback)(Local<Object> host, - Local<Value> key, - AccessType type, - Local<Value> data); - - -/** - * Returns true if cross-context access should be allowed to the indexed - * property with the given index on the host object. - */ -typedef bool (*IndexedSecurityCallback)(Local<Object> host, - uint32_t index, - AccessType type, - Local<Value> data); - - -/** - * A FunctionTemplate is used to create functions at runtime. There - * can only be one function created from a FunctionTemplate in a - * context. The lifetime of the created function is equal to the - * lifetime of the context. So in case the embedder needs to create - * temporary functions that can be collected using Scripts is - * preferred. - * - * A FunctionTemplate can have properties, these properties are added to the - * function object when it is created. - * - * A FunctionTemplate has a corresponding instance template which is - * used to create object instances when the function is used as a - * constructor. Properties added to the instance template are added to - * each object instance. - * - * A FunctionTemplate can have a prototype template. The prototype template - * is used to create the prototype object of the function. - * - * The following example shows how to use a FunctionTemplate: - * - * \code - * v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); - * t->Set("func_property", v8::Number::New(1)); - * - * v8::Local<v8::Template> proto_t = t->PrototypeTemplate(); - * proto_t->Set("proto_method", v8::FunctionTemplate::New(InvokeCallback)); - * proto_t->Set("proto_const", v8::Number::New(2)); - * - * v8::Local<v8::ObjectTemplate> instance_t = t->InstanceTemplate(); - * instance_t->SetAccessor("instance_accessor", InstanceAccessorCallback); - * instance_t->SetNamedPropertyHandler(PropertyHandlerCallback, ...); - * instance_t->Set("instance_property", Number::New(3)); - * - * v8::Local<v8::Function> function = t->GetFunction(); - * v8::Local<v8::Object> instance = function->NewInstance(); - * \endcode - * - * Let's use "function" as the JS variable name of the function object - * and "instance" for the instance object created above. The function - * and the instance will have the following properties: - * - * \code - * func_property in function == true; - * function.func_property == 1; - * - * function.prototype.proto_method() invokes 'InvokeCallback' - * function.prototype.proto_const == 2; - * - * instance instanceof function == true; - * instance.instance_accessor calls 'InstanceAccessorCallback' - * instance.instance_property == 3; - * \endcode - * - * A FunctionTemplate can inherit from another one by calling the - * FunctionTemplate::Inherit method. The following graph illustrates - * the semantics of inheritance: - * - * \code - * FunctionTemplate Parent -> Parent() . prototype -> { } - * ^ ^ - * | Inherit(Parent) | .__proto__ - * | | - * FunctionTemplate Child -> Child() . prototype -> { } - * \endcode - * - * A FunctionTemplate 'Child' inherits from 'Parent', the prototype - * object of the Child() function has __proto__ pointing to the - * Parent() function's prototype object. An instance of the Child - * function has all properties on Parent's instance templates. - * - * Let Parent be the FunctionTemplate initialized in the previous - * section and create a Child FunctionTemplate by: - * - * \code - * Local<FunctionTemplate> parent = t; - * Local<FunctionTemplate> child = FunctionTemplate::New(); - * child->Inherit(parent); - * - * Local<Function> child_function = child->GetFunction(); - * Local<Object> child_instance = child_function->NewInstance(); - * \endcode - * - * The Child function and Child instance will have the following - * properties: - * - * \code - * child_func.prototype.__proto__ == function.prototype; - * child_instance.instance_accessor calls 'InstanceAccessorCallback' - * child_instance.instance_property == 3; - * \endcode - */ -class V8EXPORT FunctionTemplate : public Template { - public: - /** Creates a function template.*/ - static Local<FunctionTemplate> New( - InvocationCallback callback = 0, - Handle<Value> data = Handle<Value>(), - Handle<Signature> signature = Handle<Signature>(), - int length = 0); - /** Returns the unique function instance in the current execution context.*/ - Local<Function> GetFunction(); - - /** - * Set the call-handler callback for a FunctionTemplate. This - * callback is called whenever the function created from this - * FunctionTemplate is called. - */ - void SetCallHandler(InvocationCallback callback, - Handle<Value> data = Handle<Value>()); - - /** Set the predefined length property for the FunctionTemplate. */ - void SetLength(int length); - - /** Get the InstanceTemplate. */ - Local<ObjectTemplate> InstanceTemplate(); - - /** Causes the function template to inherit from a parent function template.*/ - void Inherit(Handle<FunctionTemplate> parent); - - /** - * A PrototypeTemplate is the template used to create the prototype object - * of the function created by this template. - */ - Local<ObjectTemplate> PrototypeTemplate(); - - /** - * Set the class name of the FunctionTemplate. This is used for - * printing objects created with the function created from the - * FunctionTemplate as its constructor. - */ - void SetClassName(Handle<String> name); - - /** - * Determines whether the __proto__ accessor ignores instances of - * the function template. If instances of the function template are - * ignored, __proto__ skips all instances and instead returns the - * next object in the prototype chain. - * - * Call with a value of true to make the __proto__ accessor ignore - * instances of the function template. Call with a value of false - * to make the __proto__ accessor not ignore instances of the - * function template. By default, instances of a function template - * are not ignored. - */ - void SetHiddenPrototype(bool value); - - /** - * Sets the ReadOnly flag in the attributes of the 'prototype' property - * of functions created from this FunctionTemplate to true. - */ - void ReadOnlyPrototype(); - - /** - * Returns true if the given object is an instance of this function - * template. - */ - bool HasInstance(Handle<Value> object); - - private: - FunctionTemplate(); - void AddInstancePropertyAccessor(Handle<String> name, - AccessorGetter getter, - AccessorSetter setter, - Handle<Value> data, - AccessControl settings, - PropertyAttribute attributes, - Handle<AccessorSignature> signature); - void SetNamedInstancePropertyHandler(NamedPropertyGetter getter, - NamedPropertySetter setter, - NamedPropertyQuery query, - NamedPropertyDeleter remover, - NamedPropertyEnumerator enumerator, - bool is_fallback, - Handle<Value> data); - void SetIndexedInstancePropertyHandler(IndexedPropertyGetter getter, - IndexedPropertySetter setter, - IndexedPropertyQuery query, - IndexedPropertyDeleter remover, - IndexedPropertyEnumerator enumerator, - Handle<Value> data); - void SetInstanceCallAsFunctionHandler(InvocationCallback callback, - Handle<Value> data); - - friend class Context; - friend class ObjectTemplate; -}; - - -/** - * An ObjectTemplate is used to create objects at runtime. - * - * Properties added to an ObjectTemplate are added to each object - * created from the ObjectTemplate. - */ -class V8EXPORT ObjectTemplate : public Template { - public: - /** Creates an ObjectTemplate. */ - static Local<ObjectTemplate> New(); - - /** Creates a new instance of this template.*/ - Local<Object> NewInstance(); - - /** - * Sets an accessor on the object template. - * - * Whenever the property with the given name is accessed on objects - * created from this ObjectTemplate the getter and setter callbacks - * are called instead of getting and setting the property directly - * on the JavaScript object. - * - * \param name The name of the property for which an accessor is added. - * \param getter The callback to invoke when getting the property. - * \param setter The callback to invoke when setting the property. - * \param data A piece of data that will be passed to the getter and setter - * callbacks whenever they are invoked. - * \param settings Access control settings for the accessor. This is a bit - * field consisting of one of more of - * DEFAULT = 0, ALL_CAN_READ = 1, or ALL_CAN_WRITE = 2. - * The default is to not allow cross-context access. - * ALL_CAN_READ means that all cross-context reads are allowed. - * ALL_CAN_WRITE means that all cross-context writes are allowed. - * The combination ALL_CAN_READ | ALL_CAN_WRITE can be used to allow all - * cross-context access. - * \param attribute The attributes of the property for which an accessor - * is added. - * \param signature The signature describes valid receivers for the accessor - * and is used to perform implicit instance checks against them. If the - * receiver is incompatible (i.e. is not an instance of the constructor as - * defined by FunctionTemplate::HasInstance()), an implicit TypeError is - * thrown and no callback is invoked. - */ - void SetAccessor(Handle<String> name, - AccessorGetter getter, - AccessorSetter setter = 0, - Handle<Value> data = Handle<Value>(), - AccessControl settings = DEFAULT, - PropertyAttribute attribute = None, - Handle<AccessorSignature> signature = - Handle<AccessorSignature>()); - - /** - * Sets a named property handler on the object template. - * - * Whenever a named property is accessed on objects created from - * this object template, the provided callback is invoked instead of - * accessing the property directly on the JavaScript object. - * - * \param getter The callback to invoke when getting a property. - * \param setter The callback to invoke when setting a property. - * \param query The callback to invoke to check if a property is present, - * and if present, get its attributes. - * \param deleter The callback to invoke when deleting a property. - * \param enumerator The callback to invoke to enumerate all the named - * properties of an object. - * \param data A piece of data that will be passed to the callbacks - * whenever they are invoked. - */ - void SetNamedPropertyHandler(NamedPropertyGetter getter, - NamedPropertySetter setter = 0, - NamedPropertyQuery query = 0, - NamedPropertyDeleter deleter = 0, - NamedPropertyEnumerator enumerator = 0, - Handle<Value> data = Handle<Value>()); - void SetFallbackPropertyHandler(NamedPropertyGetter getter, - NamedPropertySetter setter = 0, - NamedPropertyQuery query = 0, - NamedPropertyDeleter deleter = 0, - NamedPropertyEnumerator enumerator = 0, - Handle<Value> data = Handle<Value>()); - - /** - * Sets an indexed property handler on the object template. - * - * Whenever an indexed property is accessed on objects created from - * this object template, the provided callback is invoked instead of - * accessing the property directly on the JavaScript object. - * - * \param getter The callback to invoke when getting a property. - * \param setter The callback to invoke when setting a property. - * \param query The callback to invoke to check if an object has a property. - * \param deleter The callback to invoke when deleting a property. - * \param enumerator The callback to invoke to enumerate all the indexed - * properties of an object. - * \param data A piece of data that will be passed to the callbacks - * whenever they are invoked. - */ - void SetIndexedPropertyHandler(IndexedPropertyGetter getter, - IndexedPropertySetter setter = 0, - IndexedPropertyQuery query = 0, - IndexedPropertyDeleter deleter = 0, - IndexedPropertyEnumerator enumerator = 0, - Handle<Value> data = Handle<Value>()); - - /** - * Sets the callback to be used when calling instances created from - * this template as a function. If no callback is set, instances - * behave like normal JavaScript objects that cannot be called as a - * function. - */ - void SetCallAsFunctionHandler(InvocationCallback callback, - Handle<Value> data = Handle<Value>()); - - /** - * Mark object instances of the template as undetectable. - * - * In many ways, undetectable objects behave as though they are not - * there. They behave like 'undefined' in conditionals and when - * printed. However, properties can be accessed and called as on - * normal objects. - */ - void MarkAsUndetectable(); - - /** - * Sets access check callbacks on the object template. - * - * When accessing properties on instances of this object template, - * the access check callback will be called to determine whether or - * not to allow cross-context access to the properties. - * The last parameter specifies whether access checks are turned - * on by default on instances. If access checks are off by default, - * they can be turned on on individual instances by calling - * Object::TurnOnAccessCheck(). - */ - void SetAccessCheckCallbacks(NamedSecurityCallback named_handler, - IndexedSecurityCallback indexed_handler, - Handle<Value> data = Handle<Value>(), - bool turned_on_by_default = true); - - /** - * Gets the number of internal fields for objects generated from - * this template. - */ - int InternalFieldCount(); - - /** - * Sets the number of internal fields for objects generated from - * this template. - */ - void SetInternalFieldCount(int value); - - /** - * Sets whether the object can store an "external resource" object. - */ - bool HasExternalResource(); - void SetHasExternalResource(bool value); - - /** - * Mark object instances of the template as using the user object - * comparison callback. - */ - void MarkAsUseUserObjectComparison(); - - private: - ObjectTemplate(); - static Local<ObjectTemplate> New(Handle<FunctionTemplate> constructor); - friend class FunctionTemplate; -}; - - -/** - * A Signature specifies which receivers and arguments are valid - * parameters to a function. - */ -class V8EXPORT Signature : public Data { - public: - static Local<Signature> New(Handle<FunctionTemplate> receiver = - Handle<FunctionTemplate>(), - int argc = 0, - Handle<FunctionTemplate> argv[] = 0); - private: - Signature(); -}; - - -/** - * An AccessorSignature specifies which receivers are valid parameters - * to an accessor callback. - */ -class V8EXPORT AccessorSignature : public Data { - public: - static Local<AccessorSignature> New(Handle<FunctionTemplate> receiver = - Handle<FunctionTemplate>()); - private: - AccessorSignature(); -}; - - -/** - * A utility for determining the type of objects based on the template - * they were constructed from. - */ -class V8EXPORT TypeSwitch : public Data { - public: - static Local<TypeSwitch> New(Handle<FunctionTemplate> type); - static Local<TypeSwitch> New(int argc, Handle<FunctionTemplate> types[]); - int match(Handle<Value> value); - private: - TypeSwitch(); -}; - - -// --- Extensions --- - -class V8EXPORT ExternalAsciiStringResourceImpl - : public String::ExternalAsciiStringResource { - public: - ExternalAsciiStringResourceImpl() : data_(0), length_(0) {} - ExternalAsciiStringResourceImpl(const char* data, size_t length) - : data_(data), length_(length) {} - const char* data() const { return data_; } - size_t length() const { return length_; } - - private: - const char* data_; - size_t length_; -}; - -/** - * Ignore - */ -class V8EXPORT Extension { // NOLINT - public: - // Note that the strings passed into this constructor must live as long - // as the Extension itself. - Extension(const char* name, - const char* source = 0, - int dep_count = 0, - const char** deps = 0, - int source_length = -1); - virtual ~Extension() { } - virtual v8::Handle<v8::FunctionTemplate> - GetNativeFunction(v8::Handle<v8::String>) { - return v8::Handle<v8::FunctionTemplate>(); - } - - const char* name() const { return name_; } - size_t source_length() const { return source_length_; } - const String::ExternalAsciiStringResource* source() const { - return &source_; } - int dependency_count() { return dep_count_; } - const char** dependencies() { return deps_; } - void set_auto_enable(bool value) { auto_enable_ = value; } - bool auto_enable() { return auto_enable_; } - - private: - const char* name_; - size_t source_length_; // expected to initialize before source_ - ExternalAsciiStringResourceImpl source_; - int dep_count_; - const char** deps_; - bool auto_enable_; - - // Disallow copying and assigning. - Extension(const Extension&); - void operator=(const Extension&); -}; - - -void V8EXPORT RegisterExtension(Extension* extension); - - -/** - * Ignore - */ -class V8EXPORT DeclareExtension { - public: - V8_INLINE(DeclareExtension(Extension* extension)) { - RegisterExtension(extension); - } -}; - - -// --- Statics --- - - -Handle<Primitive> V8EXPORT Undefined(); -Handle<Primitive> V8EXPORT Null(); -Handle<Boolean> V8EXPORT True(); -Handle<Boolean> V8EXPORT False(); - -V8_INLINE(Handle<Primitive> Undefined(Isolate* isolate)); -V8_INLINE(Handle<Primitive> Null(Isolate* isolate)); -V8_INLINE(Handle<Boolean> True(Isolate* isolate)); -V8_INLINE(Handle<Boolean> False(Isolate* isolate)); - - -/** - * A set of constraints that specifies the limits of the runtime's memory use. - * You must set the heap size before initializing the VM - the size cannot be - * adjusted after the VM is initialized. - * - * If you are using threads then you should hold the V8::Locker lock while - * setting the stack limit and you must set a non-default stack limit separately - * for each thread. - */ -class V8EXPORT ResourceConstraints { - public: - ResourceConstraints(); - int max_young_space_size() const { return max_young_space_size_; } - void set_max_young_space_size(int value) { max_young_space_size_ = value; } - int max_old_space_size() const { return max_old_space_size_; } - void set_max_old_space_size(int value) { max_old_space_size_ = value; } - int max_executable_size() { return max_executable_size_; } - void set_max_executable_size(int value) { max_executable_size_ = value; } - uint32_t* stack_limit() const { return stack_limit_; } - // Sets an address beyond which the VM's stack may not grow. - void set_stack_limit(uint32_t* value) { stack_limit_ = value; } - private: - int max_young_space_size_; - int max_old_space_size_; - int max_executable_size_; - uint32_t* stack_limit_; -}; - - -bool V8EXPORT SetResourceConstraints(ResourceConstraints* constraints); - - -// --- Exceptions --- - - -typedef void (*FatalErrorCallback)(const char* location, const char* message); - - -typedef void (*MessageCallback)(Handle<Message> message, Handle<Value> error); - - -/** - * Schedules an exception to be thrown when returning to JavaScript. When an - * exception has been scheduled it is illegal to invoke any JavaScript - * operation; the caller must return immediately and only after the exception - * has been handled does it become legal to invoke JavaScript operations. - */ -Handle<Value> V8EXPORT ThrowException(Handle<Value> exception); - -/** - * Create new error objects by calling the corresponding error object - * constructor with the message. - */ -class V8EXPORT Exception { - public: - static Local<Value> RangeError(Handle<String> message); - static Local<Value> ReferenceError(Handle<String> message); - static Local<Value> SyntaxError(Handle<String> message); - static Local<Value> TypeError(Handle<String> message); - static Local<Value> Error(Handle<String> message); -}; - - -// --- Counters Callbacks --- - -typedef int* (*CounterLookupCallback)(const char* name); - -typedef void* (*CreateHistogramCallback)(const char* name, - int min, - int max, - size_t buckets); - -typedef void (*AddHistogramSampleCallback)(void* histogram, int sample); - -// --- Memory Allocation Callback --- - enum ObjectSpace { - kObjectSpaceNewSpace = 1 << 0, - kObjectSpaceOldPointerSpace = 1 << 1, - kObjectSpaceOldDataSpace = 1 << 2, - kObjectSpaceCodeSpace = 1 << 3, - kObjectSpaceMapSpace = 1 << 4, - kObjectSpaceLoSpace = 1 << 5, - - kObjectSpaceAll = kObjectSpaceNewSpace | kObjectSpaceOldPointerSpace | - kObjectSpaceOldDataSpace | kObjectSpaceCodeSpace | kObjectSpaceMapSpace | - kObjectSpaceLoSpace - }; - - enum AllocationAction { - kAllocationActionAllocate = 1 << 0, - kAllocationActionFree = 1 << 1, - kAllocationActionAll = kAllocationActionAllocate | kAllocationActionFree - }; - -typedef void (*MemoryAllocationCallback)(ObjectSpace space, - AllocationAction action, - int size); - -// --- Leave Script Callback --- -typedef void (*CallCompletedCallback)(); - -// --- Failed Access Check Callback --- -typedef void (*FailedAccessCheckCallback)(Local<Object> target, - AccessType type, - Local<Value> data); - -// --- User Object Comparison Callback --- -typedef bool (*UserObjectComparisonCallback)(Local<Object> lhs, - Local<Object> rhs); - -// --- AllowCodeGenerationFromStrings callbacks --- - -/** - * Callback to check if code generation from strings is allowed. See - * Context::AllowCodeGenerationFromStrings. - */ -typedef bool (*AllowCodeGenerationFromStringsCallback)(Local<Context> context); - -// --- Garbage Collection Callbacks --- - -/** - * Applications can register callback functions which will be called - * before and after a garbage collection. Allocations are not - * allowed in the callback functions, you therefore cannot manipulate - * objects (set or delete properties for example) since it is possible - * such operations will result in the allocation of objects. - */ -enum GCType { - kGCTypeScavenge = 1 << 0, - kGCTypeMarkSweepCompact = 1 << 1, - kGCTypeAll = kGCTypeScavenge | kGCTypeMarkSweepCompact -}; - -enum GCCallbackFlags { - kNoGCCallbackFlags = 0, - kGCCallbackFlagCompacted = 1 << 0 -}; - -typedef void (*GCPrologueCallback)(GCType type, GCCallbackFlags flags); -typedef void (*GCEpilogueCallback)(GCType type, GCCallbackFlags flags); - -typedef void (*GCCallback)(); - - -/** - * Collection of V8 heap information. - * - * Instances of this class can be passed to v8::V8::HeapStatistics to - * get heap statistics from V8. - */ -class V8EXPORT HeapStatistics { - public: - HeapStatistics(); - size_t total_heap_size() { return total_heap_size_; } - size_t total_heap_size_executable() { return total_heap_size_executable_; } - size_t total_physical_size() { return total_physical_size_; } - size_t used_heap_size() { return used_heap_size_; } - size_t heap_size_limit() { return heap_size_limit_; } - - private: - size_t total_heap_size_; - size_t total_heap_size_executable_; - size_t total_physical_size_; - size_t used_heap_size_; - size_t heap_size_limit_; - - friend class V8; - friend class Isolate; -}; - - -class RetainedObjectInfo; - -/** - * Isolate represents an isolated instance of the V8 engine. V8 - * isolates have completely separate states. Objects from one isolate - * must not be used in other isolates. When V8 is initialized a - * default isolate is implicitly created and entered. The embedder - * can create additional isolates and use them in parallel in multiple - * threads. An isolate can be entered by at most one thread at any - * given time. The Locker/Unlocker API must be used to synchronize. - */ -class V8EXPORT Isolate { - public: - /** - * Stack-allocated class which sets the isolate for all operations - * executed within a local scope. - */ - class V8EXPORT Scope { - public: - explicit Scope(Isolate* isolate) : isolate_(isolate) { - isolate->Enter(); - } - - ~Scope() { isolate_->Exit(); } - - private: - Isolate* const isolate_; - - // Prevent copying of Scope objects. - Scope(const Scope&); - Scope& operator=(const Scope&); - }; - - /** - * Creates a new isolate. Does not change the currently entered - * isolate. - * - * When an isolate is no longer used its resources should be freed - * by calling Dispose(). Using the delete operator is not allowed. - */ - static Isolate* New(); - - /** - * Returns the entered isolate for the current thread or NULL in - * case there is no current isolate. - */ - static Isolate* GetCurrent(); - - /** - * Methods below this point require holding a lock (using Locker) in - * a multi-threaded environment. - */ - - /** - * Sets this isolate as the entered one for the current thread. - * Saves the previously entered one (if any), so that it can be - * restored when exiting. Re-entering an isolate is allowed. - */ - void Enter(); - - /** - * Exits this isolate by restoring the previously entered one in the - * current thread. The isolate may still stay the same, if it was - * entered more than once. - * - * Requires: this == Isolate::GetCurrent(). - */ - void Exit(); - - /** - * Disposes the isolate. The isolate must not be entered by any - * thread to be disposable. - */ - void Dispose(); - - /** - * Associate embedder-specific data with the isolate - */ - V8_INLINE(void SetData(void* data)); - - /** - * Retrieve embedder-specific data from the isolate. - * Returns NULL if SetData has never been called. - */ - V8_INLINE(void* GetData()); - - /** - * Get statistics about the heap memory usage. - */ - void GetHeapStatistics(HeapStatistics* heap_statistics); - - private: - Isolate(); - Isolate(const Isolate&); - ~Isolate(); - Isolate& operator=(const Isolate&); - void* operator new(size_t size); - void operator delete(void*, size_t); -}; - - -class V8EXPORT StartupData { - public: - enum CompressionAlgorithm { - kUncompressed, - kBZip2 - }; - - const char* data; - int compressed_size; - int raw_size; -}; - - -/** - * A helper class for driving V8 startup data decompression. It is based on - * "CompressedStartupData" API functions from the V8 class. It isn't mandatory - * for an embedder to use this class, instead, API functions can be used - * directly. - * - * For an example of the class usage, see the "shell.cc" sample application. - */ -class V8EXPORT StartupDataDecompressor { // NOLINT - public: - StartupDataDecompressor(); - virtual ~StartupDataDecompressor(); - int Decompress(); - - protected: - virtual int DecompressData(char* raw_data, - int* raw_data_size, - const char* compressed_data, - int compressed_data_size) = 0; - - private: - char** raw_data; -}; - - -/** - * EntropySource is used as a callback function when v8 needs a source - * of entropy. - */ -typedef bool (*EntropySource)(unsigned char* buffer, size_t length); - - -/** - * ReturnAddressLocationResolver is used as a callback function when v8 is - * resolving the location of a return address on the stack. Profilers that - * change the return address on the stack can use this to resolve the stack - * location to whereever the profiler stashed the original return address. - * - * \param return_addr_location points to a location on stack where a machine - * return address resides. - * \returns either return_addr_location, or else a pointer to the profiler's - * copy of the original return address. - * - * \note the resolver function must not cause garbage collection. - */ -typedef uintptr_t (*ReturnAddressLocationResolver)( - uintptr_t return_addr_location); - - -/** - * FunctionEntryHook is the type of the profile entry hook called at entry to - * any generated function when function-level profiling is enabled. - * - * \param function the address of the function that's being entered. - * \param return_addr_location points to a location on stack where the machine - * return address resides. This can be used to identify the caller of - * \p function, and/or modified to divert execution when \p function exits. - * - * \note the entry hook must not cause garbage collection. - */ -typedef void (*FunctionEntryHook)(uintptr_t function, - uintptr_t return_addr_location); - - -/** - * A JIT code event is issued each time code is added, moved or removed. - * - * \note removal events are not currently issued. - */ -struct JitCodeEvent { - enum EventType { - CODE_ADDED, - CODE_MOVED, - CODE_REMOVED, - CODE_ADD_LINE_POS_INFO, - CODE_START_LINE_INFO_RECORDING, - CODE_END_LINE_INFO_RECORDING - }; - // Definition of the code position type. The "POSITION" type means the place - // in the source code which are of interest when making stack traces to - // pin-point the source location of a stack frame as close as possible. - // The "STATEMENT_POSITION" means the place at the beginning of each - // statement, and is used to indicate possible break locations. - enum PositionType { - POSITION, - STATEMENT_POSITION - }; - - // Type of event. - EventType type; - // Start of the instructions. - void* code_start; - // Size of the instructions. - size_t code_len; - // Script info for CODE_ADDED event. - Handle<Script> script; - // User-defined data for *_LINE_INFO_* event. It's used to hold the source - // code line information which is returned from the - // CODE_START_LINE_INFO_RECORDING event. And it's passed to subsequent - // CODE_ADD_LINE_POS_INFO and CODE_END_LINE_INFO_RECORDING events. - void* user_data; - - union { - // Only valid for CODE_ADDED. - struct { - // Name of the object associated with the code, note that the string is - // not zero-terminated. - const char* str; - // Number of chars in str. - size_t len; - } name; - - // Only valid for CODE_ADD_LINE_POS_INFO - struct { - // PC offset - size_t offset; - // Code postion - size_t pos; - // The position type. - PositionType position_type; - } line_info; - - // New location of instructions. Only valid for CODE_MOVED. - void* new_code_start; - }; -}; - -/** - * Option flags passed to the SetJitCodeEventHandler function. - */ -enum JitCodeEventOptions { - kJitCodeEventDefault = 0, - // Generate callbacks for already existent code. - kJitCodeEventEnumExisting = 1 -}; - - -/** - * Callback function passed to SetJitCodeEventHandler. - * - * \param event code add, move or removal event. - */ -typedef void (*JitCodeEventHandler)(const JitCodeEvent* event); - - -/** - * Interface for iterating through all external resources in the heap. - */ -class V8EXPORT ExternalResourceVisitor { // NOLINT - public: - virtual ~ExternalResourceVisitor() {} - virtual void VisitExternalString(Handle<String>) {} -}; - - -/** - * Interface for iterating through all the persistent handles in the heap. - */ -class V8EXPORT PersistentHandleVisitor { // NOLINT - public: - virtual ~PersistentHandleVisitor() {} - virtual void VisitPersistentHandle(Persistent<Value>, - uint16_t) {} -}; - - -/** - * Container class for static utility functions. - */ -class V8EXPORT V8 { - public: - /** Set the callback to invoke in case of fatal errors. */ - static void SetFatalErrorHandler(FatalErrorCallback that); - - /** - * Set the callback to invoke to check if code generation from - * strings should be allowed. - */ - static void SetAllowCodeGenerationFromStringsCallback( - AllowCodeGenerationFromStringsCallback that); - - /** - * Ignore out-of-memory exceptions. - * - * V8 running out of memory is treated as a fatal error by default. - * This means that the fatal error handler is called and that V8 is - * terminated. - * - * IgnoreOutOfMemoryException can be used to not treat an - * out-of-memory situation as a fatal error. This way, the contexts - * that did not cause the out of memory problem might be able to - * continue execution. - */ - static void IgnoreOutOfMemoryException(); - - /** - * Check if V8 is dead and therefore unusable. This is the case after - * fatal errors such as out-of-memory situations. - */ - static bool IsDead(); - - /** - * The following 4 functions are to be used when V8 is built with - * the 'compress_startup_data' flag enabled. In this case, the - * embedder must decompress startup data prior to initializing V8. - * - * This is how interaction with V8 should look like: - * int compressed_data_count = v8::V8::GetCompressedStartupDataCount(); - * v8::StartupData* compressed_data = - * new v8::StartupData[compressed_data_count]; - * v8::V8::GetCompressedStartupData(compressed_data); - * ... decompress data (compressed_data can be updated in-place) ... - * v8::V8::SetDecompressedStartupData(compressed_data); - * ... now V8 can be initialized - * ... make sure the decompressed data stays valid until V8 shutdown - * - * A helper class StartupDataDecompressor is provided. It implements - * the protocol of the interaction described above, and can be used in - * most cases instead of calling these API functions directly. - */ - static StartupData::CompressionAlgorithm GetCompressedStartupDataAlgorithm(); - static int GetCompressedStartupDataCount(); - static void GetCompressedStartupData(StartupData* compressed_data); - static void SetDecompressedStartupData(StartupData* decompressed_data); - - /** - * Adds a message listener. - * - * The same message listener can be added more than once and in that - * case it will be called more than once for each message. - * - * If data is specified, it will be passed to the callback when it is called. - * Otherwise, the exception object will be passed to the callback instead. - */ - static bool AddMessageListener(MessageCallback that, - Handle<Value> data = Handle<Value>()); - - /** - * Remove all message listeners from the specified callback function. - */ - static void RemoveMessageListeners(MessageCallback that); - - /** - * Tells V8 to capture current stack trace when uncaught exception occurs - * and report it to the message listeners. The option is off by default. - */ - static void SetCaptureStackTraceForUncaughtExceptions( - bool capture, - int frame_limit = 10, - StackTrace::StackTraceOptions options = StackTrace::kOverview); - - /** - * Sets V8 flags from a string. - */ - static void SetFlagsFromString(const char* str, int length); - - /** - * Sets V8 flags from the command line. - */ - static void SetFlagsFromCommandLine(int* argc, - char** argv, - bool remove_flags); - - /** Get the version string. */ - static const char* GetVersion(); - - /** - * Enables the host application to provide a mechanism for recording - * statistics counters. - */ - static void SetCounterFunction(CounterLookupCallback); - - /** - * Enables the host application to provide a mechanism for recording - * histograms. The CreateHistogram function returns a - * histogram which will later be passed to the AddHistogramSample - * function. - */ - static void SetCreateHistogramFunction(CreateHistogramCallback); - static void SetAddHistogramSampleFunction(AddHistogramSampleCallback); - - /** Callback function for reporting failed access checks.*/ - static void SetFailedAccessCheckCallbackFunction(FailedAccessCheckCallback); - - /** Callback for user object comparisons */ - static void SetUserObjectComparisonCallbackFunction( - UserObjectComparisonCallback); - - /** - * Enables the host application to receive a notification before a - * garbage collection. Allocations are not allowed in the - * callback function, you therefore cannot manipulate objects (set - * or delete properties for example) since it is possible such - * operations will result in the allocation of objects. It is possible - * to specify the GCType filter for your callback. But it is not possible to - * register the same callback function two times with different - * GCType filters. - */ - static void AddGCPrologueCallback( - GCPrologueCallback callback, GCType gc_type_filter = kGCTypeAll); - - /** - * This function removes callback which was installed by - * AddGCPrologueCallback function. - */ - static void RemoveGCPrologueCallback(GCPrologueCallback callback); - - /** - * The function is deprecated. Please use AddGCPrologueCallback instead. - * Enables the host application to receive a notification before a - * garbage collection. Allocations are not allowed in the - * callback function, you therefore cannot manipulate objects (set - * or delete properties for example) since it is possible such - * operations will result in the allocation of objects. - */ - V8_DEPRECATED(static void SetGlobalGCPrologueCallback(GCCallback)); - - /** - * Enables the host application to receive a notification after a - * garbage collection. Allocations are not allowed in the - * callback function, you therefore cannot manipulate objects (set - * or delete properties for example) since it is possible such - * operations will result in the allocation of objects. It is possible - * to specify the GCType filter for your callback. But it is not possible to - * register the same callback function two times with different - * GCType filters. - */ - static void AddGCEpilogueCallback( - GCEpilogueCallback callback, GCType gc_type_filter = kGCTypeAll); - - /** - * This function removes callback which was installed by - * AddGCEpilogueCallback function. - */ - static void RemoveGCEpilogueCallback(GCEpilogueCallback callback); - - /** - * The function is deprecated. Please use AddGCEpilogueCallback instead. - * Enables the host application to receive a notification after a - * major garbage collection. Allocations are not allowed in the - * callback function, you therefore cannot manipulate objects (set - * or delete properties for example) since it is possible such - * operations will result in the allocation of objects. - */ - V8_DEPRECATED(static void SetGlobalGCEpilogueCallback(GCCallback)); - - /** - * Enables the host application to provide a mechanism to be notified - * and perform custom logging when V8 Allocates Executable Memory. - */ - static void AddMemoryAllocationCallback(MemoryAllocationCallback callback, - ObjectSpace space, - AllocationAction action); - - /** - * Removes callback that was installed by AddMemoryAllocationCallback. - */ - static void RemoveMemoryAllocationCallback(MemoryAllocationCallback callback); - - /** - * Adds a callback to notify the host application when a script finished - * running. If a script re-enters the runtime during executing, the - * CallCompletedCallback is only invoked when the outer-most script - * execution ends. Executing scripts inside the callback do not trigger - * further callbacks. - */ - static void AddCallCompletedCallback(CallCompletedCallback callback); - - /** - * Removes callback that was installed by AddCallCompletedCallback. - */ - static void RemoveCallCompletedCallback(CallCompletedCallback callback); - - /** - * Allows the host application to group objects together. If one - * object in the group is alive, all objects in the group are alive. - * After each garbage collection, object groups are removed. It is - * intended to be used in the before-garbage-collection callback - * function, for instance to simulate DOM tree connections among JS - * wrapper objects. Object groups for all dependent handles need to - * be provided for kGCTypeMarkSweepCompact collections, for all other - * garbage collection types it is sufficient to provide object groups - * for partially dependent handles only. - * See v8-profiler.h for RetainedObjectInfo interface description. - */ - static void AddObjectGroup(Persistent<Value>* objects, - size_t length, - RetainedObjectInfo* info = NULL); - static void AddObjectGroup(Isolate* isolate, - Persistent<Value>* objects, - size_t length, - RetainedObjectInfo* info = NULL); - - /** - * Allows the host application to declare implicit references between - * the objects: if |parent| is alive, all |children| are alive too. - * After each garbage collection, all implicit references - * are removed. It is intended to be used in the before-garbage-collection - * callback function. - */ - static void AddImplicitReferences(Persistent<Object> parent, - Persistent<Value>* children, - size_t length); - - /** - * Initializes from snapshot if possible. Otherwise, attempts to - * initialize from scratch. This function is called implicitly if - * you use the API without calling it first. - */ - static bool Initialize(); - - /** - * Allows the host application to provide a callback which can be used - * as a source of entropy for random number generators. - */ - static void SetEntropySource(EntropySource source); - - /** - * Allows the host application to provide a callback that allows v8 to - * cooperate with a profiler that rewrites return addresses on stack. - */ - static void SetReturnAddressLocationResolver( - ReturnAddressLocationResolver return_address_resolver); - - /** - * Allows the host application to provide the address of a function that's - * invoked on entry to every V8-generated function. - * Note that \p entry_hook is invoked at the very start of each - * generated function. - * - * \param entry_hook a function that will be invoked on entry to every - * V8-generated function. - * \returns true on success on supported platforms, false on failure. - * \note Setting a new entry hook function when one is already active will - * fail. - */ - static bool SetFunctionEntryHook(FunctionEntryHook entry_hook); - - /** - * Allows the host application to provide the address of a function that is - * notified each time code is added, moved or removed. - * - * \param options options for the JIT code event handler. - * \param event_handler the JIT code event handler, which will be invoked - * each time code is added, moved or removed. - * \note \p event_handler won't get notified of existent code. - * \note since code removal notifications are not currently issued, the - * \p event_handler may get notifications of code that overlaps earlier - * code notifications. This happens when code areas are reused, and the - * earlier overlapping code areas should therefore be discarded. - * \note the events passed to \p event_handler and the strings they point to - * are not guaranteed to live past each call. The \p event_handler must - * copy strings and other parameters it needs to keep around. - * \note the set of events declared in JitCodeEvent::EventType is expected to - * grow over time, and the JitCodeEvent structure is expected to accrue - * new members. The \p event_handler function must ignore event codes - * it does not recognize to maintain future compatibility. - */ - static void SetJitCodeEventHandler(JitCodeEventOptions options, - JitCodeEventHandler event_handler); - - /** - * Adjusts the amount of registered external memory. Used to give - * V8 an indication of the amount of externally allocated memory - * that is kept alive by JavaScript objects. V8 uses this to decide - * when to perform global garbage collections. Registering - * externally allocated memory will trigger global garbage - * collections more often than otherwise in an attempt to garbage - * collect the JavaScript objects keeping the externally allocated - * memory alive. - * - * \param change_in_bytes the change in externally allocated memory - * that is kept alive by JavaScript objects. - * \returns the adjusted value. - */ - static intptr_t AdjustAmountOfExternalAllocatedMemory( - intptr_t change_in_bytes); - - /** - * Suspends recording of tick samples in the profiler. - * When the V8 profiling mode is enabled (usually via command line - * switches) this function suspends recording of tick samples. - * Profiling ticks are discarded until ResumeProfiler() is called. - * - * See also the --prof and --prof_auto command line switches to - * enable V8 profiling. - */ - static void PauseProfiler(); - - /** - * Resumes recording of tick samples in the profiler. - * See also PauseProfiler(). - */ - static void ResumeProfiler(); - - /** - * Return whether profiler is currently paused. - */ - static bool IsProfilerPaused(); - - /** - * Retrieve the V8 thread id of the calling thread. - * - * The thread id for a thread should only be retrieved after the V8 - * lock has been acquired with a Locker object with that thread. - */ - static int GetCurrentThreadId(); - - /** - * Forcefully terminate execution of a JavaScript thread. This can - * be used to terminate long-running scripts. - * - * TerminateExecution should only be called when then V8 lock has - * been acquired with a Locker object. Therefore, in order to be - * able to terminate long-running threads, preemption must be - * enabled to allow the user of TerminateExecution to acquire the - * lock. - * - * The termination is achieved by throwing an exception that is - * uncatchable by JavaScript exception handlers. Termination - * exceptions act as if they were caught by a C++ TryCatch exception - * handler. If forceful termination is used, any C++ TryCatch - * exception handler that catches an exception should check if that - * exception is a termination exception and immediately return if - * that is the case. Returning immediately in that case will - * continue the propagation of the termination exception if needed. - * - * The thread id passed to TerminateExecution must have been - * obtained by calling GetCurrentThreadId on the thread in question. - * - * \param thread_id The thread id of the thread to terminate. - */ - static void TerminateExecution(int thread_id); - - /** - * Forcefully terminate the current thread of JavaScript execution - * in the given isolate. If no isolate is provided, the default - * isolate is used. - * - * This method can be used by any thread even if that thread has not - * acquired the V8 lock with a Locker object. - * - * \param isolate The isolate in which to terminate the current JS execution. - */ - static void TerminateExecution(Isolate* isolate = NULL); - - /** - * Is V8 terminating JavaScript execution. - * - * Returns true if JavaScript execution is currently terminating - * because of a call to TerminateExecution. In that case there are - * still JavaScript frames on the stack and the termination - * exception is still active. - * - * \param isolate The isolate in which to check. - */ - static bool IsExecutionTerminating(Isolate* isolate = NULL); - - /** - * Releases any resources used by v8 and stops any utility threads - * that may be running. Note that disposing v8 is permanent, it - * cannot be reinitialized. - * - * It should generally not be necessary to dispose v8 before exiting - * a process, this should happen automatically. It is only necessary - * to use if the process needs the resources taken up by v8. - */ - static bool Dispose(); - - /** Deprecated. Use Isolate::GetHeapStatistics instead. */ - V8_DEPRECATED(static void GetHeapStatistics(HeapStatistics* heap_statistics)); - - /** - * Iterates through all external resources referenced from current isolate - * heap. GC is not invoked prior to iterating, therefore there is no - * guarantee that visited objects are still alive. - */ - static void VisitExternalResources(ExternalResourceVisitor* visitor); - - /** - * Iterates through all the persistent handles in the current isolate's heap - * that have class_ids. - */ - static void VisitHandlesWithClassIds(PersistentHandleVisitor* visitor); - - /** - * Iterates through all the persistent handles in the current isolate's heap - * that have class_ids and are candidates to be marked as partially dependent - * handles. This will visit handles to young objects created since the last - * garbage collection but is free to visit an arbitrary superset of these - * objects. - */ - static void VisitHandlesForPartialDependence( - Isolate* isolate, PersistentHandleVisitor* visitor); - - /** - * Optional notification that the embedder is idle. - * V8 uses the notification to reduce memory footprint. - * This call can be used repeatedly if the embedder remains idle. - * Returns true if the embedder should stop calling IdleNotification - * until real work has been done. This indicates that V8 has done - * as much cleanup as it will be able to do. - * - * The hint argument specifies the amount of work to be done in the function - * on scale from 1 to 1000. There is no guarantee that the actual work will - * match the hint. - */ - static bool IdleNotification(int hint = 1000); - - /** - * Optional notification that the system is running low on memory. - * V8 uses these notifications to attempt to free memory. - */ - static void LowMemoryNotification(); - - /** - * Optional notification that a context has been disposed. V8 uses - * these notifications to guide the GC heuristic. Returns the number - * of context disposals - including this one - since the last time - * V8 had a chance to clean up. - */ - static int ContextDisposedNotification(); - - private: - V8(); - - static internal::Object** GlobalizeReference(internal::Isolate* isolate, - internal::Object** handle); - static void DisposeGlobal(internal::Isolate* isolate, - internal::Object** global_handle); - static void MakeWeak(internal::Isolate* isolate, - internal::Object** global_handle, - void* data, - WeakReferenceCallback weak_reference_callback, - NearDeathCallback near_death_callback); - static void ClearWeak(internal::Isolate* isolate, - internal::Object** global_handle); - - template <class T> friend class Handle; - template <class T> friend class Local; - template <class T> friend class Persistent; - friend class Context; -}; - - -/** - * An external exception handler. - */ -class V8EXPORT TryCatch { - public: - /** - * Creates a new try/catch block and registers it with v8. Note that - * all TryCatch blocks should be stack allocated because the memory - * location itself is compared against JavaScript try/catch blocks. - */ - TryCatch(); - - /** - * Unregisters and deletes this try/catch block. - */ - ~TryCatch(); - - /** - * Returns true if an exception has been caught by this try/catch block. - */ - bool HasCaught() const; - - /** - * For certain types of exceptions, it makes no sense to continue - * execution. - * - * Currently, the only type of exception that can be caught by a - * TryCatch handler and for which it does not make sense to continue - * is termination exception. Such exceptions are thrown when the - * TerminateExecution methods are called to terminate a long-running - * script. - * - * If CanContinue returns false, the correct action is to perform - * any C++ cleanup needed and then return. - */ - bool CanContinue() const; - - /** - * Throws the exception caught by this TryCatch in a way that avoids - * it being caught again by this same TryCatch. As with ThrowException - * it is illegal to execute any JavaScript operations after calling - * ReThrow; the caller must return immediately to where the exception - * is caught. - */ - Handle<Value> ReThrow(); - - /** - * Returns the exception caught by this try/catch block. If no exception has - * been caught an empty handle is returned. - * - * The returned handle is valid until this TryCatch block has been destroyed. - */ - Local<Value> Exception() const; - - /** - * Returns the .stack property of the thrown object. If no .stack - * property is present an empty handle is returned. - */ - Local<Value> StackTrace() const; - - /** - * Returns the message associated with this exception. If there is - * no message associated an empty handle is returned. - * - * The returned handle is valid until this TryCatch block has been - * destroyed. - */ - Local<v8::Message> Message() const; - - /** - * Clears any exceptions that may have been caught by this try/catch block. - * After this method has been called, HasCaught() will return false. - * - * It is not necessary to clear a try/catch block before using it again; if - * another exception is thrown the previously caught exception will just be - * overwritten. However, it is often a good idea since it makes it easier - * to determine which operation threw a given exception. - */ - void Reset(); - - /** - * Set verbosity of the external exception handler. - * - * By default, exceptions that are caught by an external exception - * handler are not reported. Call SetVerbose with true on an - * external exception handler to have exceptions caught by the - * handler reported as if they were not caught. - */ - void SetVerbose(bool value); - - /** - * Set whether or not this TryCatch should capture a Message object - * which holds source information about where the exception - * occurred. True by default. - */ - void SetCaptureMessage(bool value); - - private: - // Make it hard to create heap-allocated TryCatch blocks. - TryCatch(const TryCatch&); - void operator=(const TryCatch&); - void* operator new(size_t size); - void operator delete(void*, size_t); - - v8::internal::Isolate* isolate_; - void* next_; - void* exception_; - void* message_; - bool is_verbose_ : 1; - bool can_continue_ : 1; - bool capture_message_ : 1; - bool rethrow_ : 1; - - friend class v8::internal::Isolate; -}; - - -// --- Context --- - - -/** - * Ignore - */ -class V8EXPORT ExtensionConfiguration { - public: - ExtensionConfiguration(int name_count, const char* names[]) - : name_count_(name_count), names_(names) { } - private: - friend class ImplementationUtilities; - int name_count_; - const char** names_; -}; - - -/** - * A sandboxed execution context with its own set of built-in objects - * and functions. - */ -class V8EXPORT Context { - public: - /** - * Returns the global proxy object or global object itself for - * detached contexts. - * - * Global proxy object is a thin wrapper whose prototype points to - * actual context's global object with the properties like Object, etc. - * This is done that way for security reasons (for more details see - * https://wiki.mozilla.org/Gecko:SplitWindow). - * - * Please note that changes to global proxy object prototype most probably - * would break VM---v8 expects only global object as a prototype of - * global proxy object. - * - * If DetachGlobal() has been invoked, Global() would return actual global - * object until global is reattached with ReattachGlobal(). - */ - Local<Object> Global(); - - /** - * Detaches the global object from its context before - * the global object can be reused to create a new context. - */ - void DetachGlobal(); - - /** - * Reattaches a global object to a context. This can be used to - * restore the connection between a global object and a context - * after DetachGlobal has been called. - * - * \param global_object The global object to reattach to the - * context. For this to work, the global object must be the global - * object that was associated with this context before a call to - * DetachGlobal. - */ - void ReattachGlobal(Handle<Object> global_object); - - /** Creates a new context. - * - * Returns a persistent handle to the newly allocated context. This - * persistent handle has to be disposed when the context is no - * longer used so the context can be garbage collected. - * - * \param extensions An optional extension configuration containing - * the extensions to be installed in the newly created context. - * - * \param global_template An optional object template from which the - * global object for the newly created context will be created. - * - * \param global_object An optional global object to be reused for - * the newly created context. This global object must have been - * created by a previous call to Context::New with the same global - * template. The state of the global object will be completely reset - * and only object identify will remain. - */ - static Persistent<Context> New( - ExtensionConfiguration* extensions = NULL, - Handle<ObjectTemplate> global_template = Handle<ObjectTemplate>(), - Handle<Value> global_object = Handle<Value>()); - - /** Returns the last entered context. */ - static Local<Context> GetEntered(); - - /** Returns the context that is on the top of the stack. */ - static Local<Context> GetCurrent(); - - /** - * Returns the context of the calling JavaScript code. That is the - * context of the top-most JavaScript frame. If there are no - * JavaScript frames an empty handle is returned. - */ - static Local<Context> GetCalling(); - static Local<Object> GetCallingQmlGlobal(); - static Local<Value> GetCallingScriptData(); - - /** - * Sets the security token for the context. To access an object in - * another context, the security tokens must match. - */ - void SetSecurityToken(Handle<Value> token); - - /** Restores the security token to the default value. */ - void UseDefaultSecurityToken(); - - /** Returns the security token of this context.*/ - Handle<Value> GetSecurityToken(); - - /** - * Enter this context. After entering a context, all code compiled - * and run is compiled and run in this context. If another context - * is already entered, this old context is saved so it can be - * restored when the new context is exited. - */ - void Enter(); - - /** - * Exit this context. Exiting the current context restores the - * context that was in place when entering the current context. - */ - void Exit(); - - /** Returns true if the context has experienced an out of memory situation. */ - bool HasOutOfMemoryException(); - - /** Returns true if V8 has a current context. */ - static bool InContext(); - - /** Returns an isolate associated with a current context. */ - v8::Isolate* GetIsolate(); - - /** - * Gets the embedder data with the given index, which must have been set by a - * previous call to SetEmbedderData with the same index. Note that index 0 - * currently has a special meaning for Chrome's debugger. - */ - V8_INLINE(Local<Value> GetEmbedderData(int index)); - - /** - * Sets the embedder data with the given index, growing the data as - * needed. Note that index 0 currently has a special meaning for Chrome's - * debugger. - */ - void SetEmbedderData(int index, Handle<Value> value); - - /** - * Gets a 2-byte-aligned native pointer from the embedder data with the given - * index, which must have bees set by a previous call to - * SetAlignedPointerInEmbedderData with the same index. Note that index 0 - * currently has a special meaning for Chrome's debugger. - */ - V8_INLINE(void* GetAlignedPointerFromEmbedderData(int index)); - - /** - * Sets a 2-byte-aligned native pointer in the embedder data with the given - * index, growing the data as needed. Note that index 0 currently has a - * special meaning for Chrome's debugger. - */ - void SetAlignedPointerInEmbedderData(int index, void* value); - - /** - * Control whether code generation from strings is allowed. Calling - * this method with false will disable 'eval' and the 'Function' - * constructor for code running in this context. If 'eval' or the - * 'Function' constructor are used an exception will be thrown. - * - * If code generation from strings is not allowed the - * V8::AllowCodeGenerationFromStrings callback will be invoked if - * set before blocking the call to 'eval' or the 'Function' - * constructor. If that callback returns true, the call will be - * allowed, otherwise an exception will be thrown. If no callback is - * set an exception will be thrown. - */ - void AllowCodeGenerationFromStrings(bool allow); - - /** - * Returns true if code generation from strings is allowed for the context. - * For more details see AllowCodeGenerationFromStrings(bool) documentation. - */ - bool IsCodeGenerationFromStringsAllowed(); - - /** - * Sets the error description for the exception that is thrown when - * code generation from strings is not allowed and 'eval' or the 'Function' - * constructor are called. - */ - void SetErrorMessageForCodeGenerationFromStrings(Handle<String> message); - - /** - * Stack-allocated class which sets the execution context for all - * operations executed within a local scope. - */ - class Scope { - public: - explicit V8_INLINE(Scope(Handle<Context> context)) : context_(context) { - context_->Enter(); - } - V8_INLINE(~Scope()) { context_->Exit(); } - private: - Handle<Context> context_; - }; - - private: - friend class Value; - friend class Script; - friend class Object; - friend class Function; - - Local<Value> SlowGetEmbedderData(int index); - void* SlowGetAlignedPointerFromEmbedderData(int index); -}; - - -/** - * Multiple threads in V8 are allowed, but only one thread at a time is allowed - * to use any given V8 isolate, see the comments in the Isolate class. The - * definition of 'using a V8 isolate' includes accessing handles or holding onto - * object pointers obtained from V8 handles while in the particular V8 isolate. - * It is up to the user of V8 to ensure, perhaps with locking, that this - * constraint is not violated. In addition to any other synchronization - * mechanism that may be used, the v8::Locker and v8::Unlocker classes must be - * used to signal thead switches to V8. - * - * v8::Locker is a scoped lock object. While it's active, i.e. between its - * construction and destruction, the current thread is allowed to use the locked - * isolate. V8 guarantees that an isolate can be locked by at most one thread at - * any time. In other words, the scope of a v8::Locker is a critical section. - * - * Sample usage: -* \code - * ... - * { - * v8::Locker locker(isolate); - * v8::Isolate::Scope isolate_scope(isolate); - * ... - * // Code using V8 and isolate goes here. - * ... - * } // Destructor called here - * \endcode - * - * If you wish to stop using V8 in a thread A you can do this either by - * destroying the v8::Locker object as above or by constructing a v8::Unlocker - * object: - * - * \code - * { - * isolate->Exit(); - * v8::Unlocker unlocker(isolate); - * ... - * // Code not using V8 goes here while V8 can run in another thread. - * ... - * } // Destructor called here. - * isolate->Enter(); - * \endcode - * - * The Unlocker object is intended for use in a long-running callback from V8, - * where you want to release the V8 lock for other threads to use. - * - * The v8::Locker is a recursive lock, i.e. you can lock more than once in a - * given thread. This can be useful if you have code that can be called either - * from code that holds the lock or from code that does not. The Unlocker is - * not recursive so you can not have several Unlockers on the stack at once, and - * you can not use an Unlocker in a thread that is not inside a Locker's scope. - * - * An unlocker will unlock several lockers if it has to and reinstate the - * correct depth of locking on its destruction, e.g.: - * - * \code - * // V8 not locked. - * { - * v8::Locker locker(isolate); - * Isolate::Scope isolate_scope(isolate); - * // V8 locked. - * { - * v8::Locker another_locker(isolate); - * // V8 still locked (2 levels). - * { - * isolate->Exit(); - * v8::Unlocker unlocker(isolate); - * // V8 not locked. - * } - * isolate->Enter(); - * // V8 locked again (2 levels). - * } - * // V8 still locked (1 level). - * } - * // V8 Now no longer locked. - * \endcode - */ -class V8EXPORT Unlocker { - public: - /** - * Initialize Unlocker for a given Isolate. - */ - V8_INLINE(explicit Unlocker(Isolate* isolate)) { Initialize(isolate); } - - /** Deprecated. Use Isolate version instead. */ - V8_DEPRECATED(Unlocker()); - - ~Unlocker(); - private: - void Initialize(Isolate* isolate); - - internal::Isolate* isolate_; -}; - - -class V8EXPORT Locker { - public: - /** - * Initialize Locker for a given Isolate. - */ - V8_INLINE(explicit Locker(Isolate* isolate)) { Initialize(isolate); } - - /** Deprecated. Use Isolate version instead. */ - V8_DEPRECATED(Locker()); - - ~Locker(); - - /** - * Start preemption. - * - * When preemption is started, a timer is fired every n milliseconds - * that will switch between multiple threads that are in contention - * for the V8 lock. - */ - static void StartPreemption(int every_n_ms); - - /** - * Stop preemption. - */ - static void StopPreemption(); - - /** - * Returns whether or not the locker for a given isolate, is locked by the - * current thread. - */ - static bool IsLocked(Isolate* isolate); - - /** - * Returns whether v8::Locker is being used by this V8 instance. - */ - static bool IsActive(); - - private: - void Initialize(Isolate* isolate); - - bool has_lock_; - bool top_level_; - internal::Isolate* isolate_; - - static bool active_; - - // Disallow copying and assigning. - Locker(const Locker&); - void operator=(const Locker&); -}; - - -/** - * A struct for exporting HeapStats data from V8, using "push" model. - */ -struct HeapStatsUpdate; - - -/** - * An interface for exporting data from V8, using "push" model. - */ -class V8EXPORT OutputStream { // NOLINT - public: - enum OutputEncoding { - kAscii = 0 // 7-bit ASCII. - }; - enum WriteResult { - kContinue = 0, - kAbort = 1 - }; - virtual ~OutputStream() {} - /** Notify about the end of stream. */ - virtual void EndOfStream() = 0; - /** Get preferred output chunk size. Called only once. */ - virtual int GetChunkSize() { return 1024; } - /** Get preferred output encoding. Called only once. */ - virtual OutputEncoding GetOutputEncoding() { return kAscii; } - /** - * Writes the next chunk of snapshot data into the stream. Writing - * can be stopped by returning kAbort as function result. EndOfStream - * will not be called in case writing was aborted. - */ - virtual WriteResult WriteAsciiChunk(char* data, int size) = 0; - /** - * Writes the next chunk of heap stats data into the stream. Writing - * can be stopped by returning kAbort as function result. EndOfStream - * will not be called in case writing was aborted. - */ - virtual WriteResult WriteHeapStatsChunk(HeapStatsUpdate* data, int count) { - (void)data; - (void)count; - - return kAbort; - }; -}; - - -/** - * An interface for reporting progress and controlling long-running - * activities. - */ -class V8EXPORT ActivityControl { // NOLINT - public: - enum ControlOption { - kContinue = 0, - kAbort = 1 - }; - virtual ~ActivityControl() {} - /** - * Notify about current progress. The activity can be stopped by - * returning kAbort as the callback result. - */ - virtual ControlOption ReportProgressValue(int done, int total) = 0; -}; - - -// --- Implementation --- - - -namespace internal { - -const int kApiPointerSize = sizeof(void*); // NOLINT -const int kApiIntSize = sizeof(int); // NOLINT - -// Tag information for HeapObject. -const int kHeapObjectTag = 1; -const int kHeapObjectTagSize = 2; -const intptr_t kHeapObjectTagMask = (1 << kHeapObjectTagSize) - 1; - -// Tag information for Smi. -const int kSmiTag = 0; -const int kSmiTagSize = 1; -const intptr_t kSmiTagMask = (1 << kSmiTagSize) - 1; - -template <size_t ptr_size> struct SmiTagging; - -// Smi constants for 32-bit systems. -template <> struct SmiTagging<4> { - static const int kSmiShiftSize = 0; - static const int kSmiValueSize = 31; - V8_INLINE(static int SmiToInt(internal::Object* value)) { - int shift_bits = kSmiTagSize + kSmiShiftSize; - // Throw away top 32 bits and shift down (requires >> to be sign extending). - return static_cast<int>(reinterpret_cast<intptr_t>(value)) >> shift_bits; - } -}; - -// Smi constants for 64-bit systems. -template <> struct SmiTagging<8> { - static const int kSmiShiftSize = 31; - static const int kSmiValueSize = 32; - V8_INLINE(static int SmiToInt(internal::Object* value)) { - int shift_bits = kSmiTagSize + kSmiShiftSize; - // Shift down and throw away top 32 bits. - return static_cast<int>(reinterpret_cast<intptr_t>(value) >> shift_bits); - } -}; - -typedef SmiTagging<kApiPointerSize> PlatformSmiTagging; -const int kSmiShiftSize = PlatformSmiTagging::kSmiShiftSize; -const int kSmiValueSize = PlatformSmiTagging::kSmiValueSize; - -/** - * This class exports constants and functionality from within v8 that - * is necessary to implement inline functions in the v8 api. Don't - * depend on functions and constants defined here. - */ -class Internals { - public: - // These values match non-compiler-dependent values defined within - // the implementation of v8. - static const int kHeapObjectMapOffset = 0; - static const int kMapInstanceTypeOffset = 1 * kApiPointerSize + kApiIntSize; - static const int kStringResourceOffset = 3 * kApiPointerSize; - - static const int kOddballKindOffset = 3 * kApiPointerSize; - static const int kForeignAddressOffset = kApiPointerSize; - static const int kJSObjectHeaderSize = 3 * kApiPointerSize; - static const int kFixedArrayHeaderSize = 2 * kApiPointerSize; - static const int kContextHeaderSize = 2 * kApiPointerSize; - static const int kContextEmbedderDataIndex = 55; - static const int kFullStringRepresentationMask = 0x07; - static const int kStringEncodingMask = 0x4; - static const int kExternalTwoByteRepresentationTag = 0x02; - static const int kExternalAsciiRepresentationTag = 0x06; - - static const int kIsolateStateOffset = 0; - static const int kIsolateEmbedderDataOffset = 1 * kApiPointerSize; - static const int kIsolateRootsOffset = 3 * kApiPointerSize; - static const int kUndefinedValueRootIndex = 5; - static const int kNullValueRootIndex = 7; - static const int kTrueValueRootIndex = 8; - static const int kFalseValueRootIndex = 9; - static const int kEmptyStringRootIndex = 119; - - static const int kNodeClassIdOffset = 1 * kApiPointerSize; - static const int kNodeFlagsOffset = 1 * kApiPointerSize + 3; - static const int kNodeStateMask = 0xf; - static const int kNodeStateIsWeakValue = 2; - static const int kNodeStateIsNearDeathValue = 4; - static const int kNodeIsIndependentShift = 4; - static const int kNodeIsPartiallyDependentShift = 5; - - static const int kJSObjectType = 0xae; - static const int kFirstNonstringType = 0x80; - static const int kOddballType = 0x83; - static const int kForeignType = 0x86; - - static const int kUndefinedOddballKind = 5; - static const int kNullOddballKind = 3; - - V8_INLINE(static bool HasHeapObjectTag(internal::Object* value)) { - return ((reinterpret_cast<intptr_t>(value) & kHeapObjectTagMask) == - kHeapObjectTag); - } - - V8_INLINE(static int SmiValue(internal::Object* value)) { - return PlatformSmiTagging::SmiToInt(value); - } - - V8_INLINE(static int GetInstanceType(internal::Object* obj)) { - typedef internal::Object O; - O* map = ReadField<O*>(obj, kHeapObjectMapOffset); - return ReadField<uint8_t>(map, kMapInstanceTypeOffset); - } - - V8_INLINE(static int GetOddballKind(internal::Object* obj)) { - typedef internal::Object O; - return SmiValue(ReadField<O*>(obj, kOddballKindOffset)); - } - - V8_INLINE(static bool IsExternalTwoByteString(int instance_type)) { - int representation = (instance_type & kFullStringRepresentationMask); - return representation == kExternalTwoByteRepresentationTag; - } - - V8_INLINE(static bool IsInitialized(v8::Isolate* isolate)) { - uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + kIsolateStateOffset; - return *reinterpret_cast<int*>(addr) == 1; - } - - V8_INLINE(static uint8_t GetNodeFlag(internal::Object** obj, int shift)) { - uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset; - return *addr & (1 << shift); - } - - V8_INLINE(static void UpdateNodeFlag(internal::Object** obj, - bool value, int shift)) { - uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset; - uint8_t mask = 1 << shift; - *addr = (*addr & ~mask) | (value << shift); - } - - V8_INLINE(static uint8_t GetNodeState(internal::Object** obj)) { - uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset; - return *addr & kNodeStateMask; - } - - V8_INLINE(static void UpdateNodeState(internal::Object** obj, - uint8_t value)) { - uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset; - *addr = (*addr & ~kNodeStateMask) | value; - } - - V8_INLINE(static void SetEmbedderData(v8::Isolate* isolate, void* data)) { - uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + - kIsolateEmbedderDataOffset; - *reinterpret_cast<void**>(addr) = data; - } - - V8_INLINE(static void* GetEmbedderData(v8::Isolate* isolate)) { - uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + - kIsolateEmbedderDataOffset; - return *reinterpret_cast<void**>(addr); - } - - V8_INLINE(static internal::Object** GetRoot(v8::Isolate* isolate, - int index)) { - uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + kIsolateRootsOffset; - return reinterpret_cast<internal::Object**>(addr + index * kApiPointerSize); - } - - template <typename T> - V8_INLINE(static T ReadField(Object* ptr, int offset)) { - uint8_t* addr = reinterpret_cast<uint8_t*>(ptr) + offset - kHeapObjectTag; - return *reinterpret_cast<T*>(addr); - } - - template <typename T> - V8_INLINE(static T ReadEmbedderData(Context* context, int index)) { - typedef internal::Object O; - typedef internal::Internals I; - O* ctx = *reinterpret_cast<O**>(context); - int embedder_data_offset = I::kContextHeaderSize + - (internal::kApiPointerSize * I::kContextEmbedderDataIndex); - O* embedder_data = I::ReadField<O*>(ctx, embedder_data_offset); - int value_offset = - I::kFixedArrayHeaderSize + (internal::kApiPointerSize * index); - return I::ReadField<T>(embedder_data, value_offset); - } - - V8_INLINE(static bool CanCastToHeapObject(void*)) { return false; } - V8_INLINE(static bool CanCastToHeapObject(Context*)) { return true; } - V8_INLINE(static bool CanCastToHeapObject(String*)) { return true; } - V8_INLINE(static bool CanCastToHeapObject(Object*)) { return true; } - V8_INLINE(static bool CanCastToHeapObject(Message*)) { return true; } - V8_INLINE(static bool CanCastToHeapObject(StackTrace*)) { return true; } - V8_INLINE(static bool CanCastToHeapObject(StackFrame*)) { return true; } -}; - -} // namespace internal - - -template <class T> -Local<T>::Local() : Handle<T>() { } - - -template <class T> -Local<T> Local<T>::New(Handle<T> that) { - if (that.IsEmpty()) return Local<T>(); - T* that_ptr = *that; - internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr); - if (internal::Internals::CanCastToHeapObject(that_ptr)) { - return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle( - reinterpret_cast<internal::HeapObject*>(*p)))); - } - return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(*p))); -} - - -template <class T> -Local<T> Local<T>::New(Isolate* isolate, Handle<T> that) { - if (that.IsEmpty()) return Local<T>(); - T* that_ptr = *that; - internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr); - return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle( - reinterpret_cast<internal::Isolate*>(isolate), *p))); -} - - -template <class T> -Persistent<T> Persistent<T>::New(Handle<T> that) { - return New(Isolate::GetCurrent(), that); -} - - -template <class T> -Persistent<T> Persistent<T>::New(Isolate* isolate, Handle<T> that) { - if (that.IsEmpty()) return Persistent<T>(); - internal::Object** p = reinterpret_cast<internal::Object**>(*that); - return Persistent<T>(reinterpret_cast<T*>( - V8::GlobalizeReference(reinterpret_cast<internal::Isolate*>(isolate), - p))); -} - - -template <class T> -bool Persistent<T>::IsIndependent() const { - return IsIndependent(Isolate::GetCurrent()); -} - - -template <class T> -bool Persistent<T>::IsIndependent(Isolate* isolate) const { - typedef internal::Internals I; - if (this->IsEmpty()) return false; - if (!I::IsInitialized(isolate)) return false; - return I::GetNodeFlag(reinterpret_cast<internal::Object**>(**this), - I::kNodeIsIndependentShift); -} - - -template <class T> -bool Persistent<T>::IsNearDeath() const { - return IsNearDeath(Isolate::GetCurrent()); -} - - -template <class T> -bool Persistent<T>::IsNearDeath(Isolate* isolate) const { - typedef internal::Internals I; - if (this->IsEmpty()) return false; - if (!I::IsInitialized(isolate)) return false; - return I::GetNodeState(reinterpret_cast<internal::Object**>(**this)) == - I::kNodeStateIsNearDeathValue; -} - - -template <class T> -bool Persistent<T>::IsWeak() const { - return IsWeak(Isolate::GetCurrent()); -} - - -template <class T> -bool Persistent<T>::IsWeak(Isolate* isolate) const { - typedef internal::Internals I; - if (this->IsEmpty()) return false; - if (!I::IsInitialized(isolate)) return false; - return I::GetNodeState(reinterpret_cast<internal::Object**>(**this)) == - I::kNodeStateIsWeakValue; -} - - -template <class T> -void Persistent<T>::Dispose() { - Dispose(Isolate::GetCurrent()); -} - - -template <class T> -void Persistent<T>::Dispose(Isolate* isolate) { - if (this->IsEmpty()) return; - V8::DisposeGlobal(reinterpret_cast<internal::Isolate*>(isolate), - reinterpret_cast<internal::Object**>(**this)); -} - - -template <class T> -Persistent<T>::Persistent() : Handle<T>() { } - -template <class T> -void Persistent<T>::MakeWeak(void* parameters, WeakReferenceCallback callback) { - Isolate* isolate = Isolate::GetCurrent(); - V8::MakeWeak(reinterpret_cast<internal::Isolate*>(isolate), - reinterpret_cast<internal::Object**>(**this), - parameters, - callback, - NULL); -} - -template <class T> -void Persistent<T>::MakeWeak(Isolate* isolate, - void* parameters, - NearDeathCallback callback) { - V8::MakeWeak(reinterpret_cast<internal::Isolate*>(isolate), - reinterpret_cast<internal::Object**>(**this), - parameters, - NULL, - callback); -} - -template <class T> -void Persistent<T>::ClearWeak() { - ClearWeak(Isolate::GetCurrent()); -} - -template <class T> -void Persistent<T>::ClearWeak(Isolate* isolate) { - V8::ClearWeak(reinterpret_cast<internal::Isolate*>(isolate), - reinterpret_cast<internal::Object**>(**this)); -} - -template <class T> -void Persistent<T>::MarkIndependent() { - MarkIndependent(Isolate::GetCurrent()); -} - -template <class T> -void Persistent<T>::MarkIndependent(Isolate* isolate) { - typedef internal::Internals I; - if (this->IsEmpty()) return; - if (!I::IsInitialized(isolate)) return; - I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(**this), - true, - I::kNodeIsIndependentShift); -} - -template <class T> -void Persistent<T>::MarkPartiallyDependent() { - MarkPartiallyDependent(Isolate::GetCurrent()); -} - -template <class T> -void Persistent<T>::MarkPartiallyDependent(Isolate* isolate) { - typedef internal::Internals I; - if (this->IsEmpty()) return; - if (!I::IsInitialized(isolate)) return; - I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(**this), - true, - I::kNodeIsPartiallyDependentShift); -} - -template <class T> -void Persistent<T>::SetWrapperClassId(uint16_t class_id) { - SetWrapperClassId(Isolate::GetCurrent(), class_id); -} - -template <class T> -void Persistent<T>::SetWrapperClassId(Isolate* isolate, uint16_t class_id) { - typedef internal::Internals I; - if (this->IsEmpty()) return; - if (!I::IsInitialized(isolate)) return; - internal::Object** obj = reinterpret_cast<internal::Object**>(**this); - uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset; - *reinterpret_cast<uint16_t*>(addr) = class_id; -} - -template <class T> -uint16_t Persistent<T>::WrapperClassId() const { - return WrapperClassId(Isolate::GetCurrent()); -} - -template <class T> -uint16_t Persistent<T>::WrapperClassId(Isolate* isolate) const { - typedef internal::Internals I; - if (this->IsEmpty()) return 0; - if (!I::IsInitialized(isolate)) return 0; - internal::Object** obj = reinterpret_cast<internal::Object**>(**this); - uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset; - return *reinterpret_cast<uint16_t*>(addr); -} - -Arguments::Arguments(internal::Object** implicit_args, - internal::Object** values, int length, - bool is_construct_call) - : implicit_args_(implicit_args), - values_(values), - length_(length), - is_construct_call_(is_construct_call) { } - - -Local<Value> Arguments::operator[](int i) const { - if (i < 0 || length_ <= i) return Local<Value>(*Undefined()); - return Local<Value>(reinterpret_cast<Value*>(values_ - i)); -} - - -Local<Function> Arguments::Callee() const { - return Local<Function>(reinterpret_cast<Function*>( - &implicit_args_[kCalleeIndex])); -} - - -Local<Object> Arguments::This() const { - return Local<Object>(reinterpret_cast<Object*>(values_ + 1)); -} - - -Local<Object> Arguments::Holder() const { - return Local<Object>(reinterpret_cast<Object*>( - &implicit_args_[kHolderIndex])); -} - - -Local<Value> Arguments::Data() const { - return Local<Value>(reinterpret_cast<Value*>(&implicit_args_[kDataIndex])); -} - - -Isolate* Arguments::GetIsolate() const { - return *reinterpret_cast<Isolate**>(&implicit_args_[kIsolateIndex]); -} - - -bool Arguments::IsConstructCall() const { - return is_construct_call_; -} - - -int Arguments::Length() const { - return length_; -} - - -template <class T> -Local<T> HandleScope::Close(Handle<T> value) { - internal::Object** before = reinterpret_cast<internal::Object**>(*value); - internal::Object** after = RawClose(before); - return Local<T>(reinterpret_cast<T*>(after)); -} - -Handle<Value> ScriptOrigin::ResourceName() const { - return resource_name_; -} - - -Handle<Integer> ScriptOrigin::ResourceLineOffset() const { - return resource_line_offset_; -} - - -Handle<Integer> ScriptOrigin::ResourceColumnOffset() const { - return resource_column_offset_; -} - - -Handle<Boolean> Boolean::New(bool value) { - return value ? True() : False(); -} - - -void Template::Set(const char* name, v8::Handle<Data> value) { - Set(v8::String::New(name), value); -} - - -Local<Value> Object::GetInternalField(int index) { -#ifndef V8_ENABLE_CHECKS - typedef internal::Object O; - typedef internal::Internals I; - O* obj = *reinterpret_cast<O**>(this); - // Fast path: If the object is a plain JSObject, which is the common case, we - // know where to find the internal fields and can return the value directly. - if (I::GetInstanceType(obj) == I::kJSObjectType) { - int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index); - O* value = I::ReadField<O*>(obj, offset); - O** result = HandleScope::CreateHandle(value); - return Local<Value>(reinterpret_cast<Value*>(result)); - } -#endif - return SlowGetInternalField(index); -} - - -void* Object::GetAlignedPointerFromInternalField(int index) { -#ifndef V8_ENABLE_CHECKS - typedef internal::Object O; - typedef internal::Internals I; - O* obj = *reinterpret_cast<O**>(this); - // Fast path: If the object is a plain JSObject, which is the common case, we - // know where to find the internal fields and can return the value directly. - if (I::GetInstanceType(obj) == I::kJSObjectType) { - int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index); - return I::ReadField<void*>(obj, offset); - } -#endif - return SlowGetAlignedPointerFromInternalField(index); -} - - -String* String::Cast(v8::Value* value) { -#ifdef V8_ENABLE_CHECKS - CheckCast(value); -#endif - return static_cast<String*>(value); -} - - -Local<String> String::Empty(Isolate* isolate) { - typedef internal::Object* S; - typedef internal::Internals I; - if (!I::IsInitialized(isolate)) return Empty(); - S* slot = I::GetRoot(isolate, I::kEmptyStringRootIndex); - return Local<String>(reinterpret_cast<String*>(slot)); -} - - -String::ExternalStringResource* String::GetExternalStringResource() const { - typedef internal::Object O; - typedef internal::Internals I; - O* obj = *reinterpret_cast<O**>(const_cast<String*>(this)); - String::ExternalStringResource* result; - if (I::IsExternalTwoByteString(I::GetInstanceType(obj))) { - void* value = I::ReadField<void*>(obj, I::kStringResourceOffset); - result = reinterpret_cast<String::ExternalStringResource*>(value); - } else { - result = NULL; - } -#ifdef V8_ENABLE_CHECKS - VerifyExternalStringResource(result); -#endif - return result; -} - - -String::ExternalStringResourceBase* String::GetExternalStringResourceBase( - String::Encoding* encoding_out) const { - typedef internal::Object O; - typedef internal::Internals I; - O* obj = *reinterpret_cast<O**>(const_cast<String*>(this)); - int type = I::GetInstanceType(obj) & I::kFullStringRepresentationMask; - *encoding_out = static_cast<Encoding>(type & I::kStringEncodingMask); - ExternalStringResourceBase* resource = NULL; - if (type == I::kExternalAsciiRepresentationTag || - type == I::kExternalTwoByteRepresentationTag) { - void* value = I::ReadField<void*>(obj, I::kStringResourceOffset); - resource = static_cast<ExternalStringResourceBase*>(value); - } -#ifdef V8_ENABLE_CHECKS - VerifyExternalStringResourceBase(resource, *encoding_out); -#endif - return resource; -} - - -bool Value::IsUndefined() const { -#ifdef V8_ENABLE_CHECKS - return FullIsUndefined(); -#else - return QuickIsUndefined(); -#endif -} - -bool Value::QuickIsUndefined() const { - typedef internal::Object O; - typedef internal::Internals I; - O* obj = *reinterpret_cast<O**>(const_cast<Value*>(this)); - if (!I::HasHeapObjectTag(obj)) return false; - if (I::GetInstanceType(obj) != I::kOddballType) return false; - return (I::GetOddballKind(obj) == I::kUndefinedOddballKind); -} - - -bool Value::IsNull() const { -#ifdef V8_ENABLE_CHECKS - return FullIsNull(); -#else - return QuickIsNull(); -#endif -} - -bool Value::QuickIsNull() const { - typedef internal::Object O; - typedef internal::Internals I; - O* obj = *reinterpret_cast<O**>(const_cast<Value*>(this)); - if (!I::HasHeapObjectTag(obj)) return false; - if (I::GetInstanceType(obj) != I::kOddballType) return false; - return (I::GetOddballKind(obj) == I::kNullOddballKind); -} - - -bool Value::IsString() const { -#ifdef V8_ENABLE_CHECKS - return FullIsString(); -#else - return QuickIsString(); -#endif -} - -bool Value::QuickIsString() const { - typedef internal::Object O; - typedef internal::Internals I; - O* obj = *reinterpret_cast<O**>(const_cast<Value*>(this)); - if (!I::HasHeapObjectTag(obj)) return false; - return (I::GetInstanceType(obj) < I::kFirstNonstringType); -} - - -Number* Number::Cast(v8::Value* value) { -#ifdef V8_ENABLE_CHECKS - CheckCast(value); -#endif - return static_cast<Number*>(value); -} - - -Integer* Integer::Cast(v8::Value* value) { -#ifdef V8_ENABLE_CHECKS - CheckCast(value); -#endif - return static_cast<Integer*>(value); -} - - -Date* Date::Cast(v8::Value* value) { -#ifdef V8_ENABLE_CHECKS - CheckCast(value); -#endif - return static_cast<Date*>(value); -} - - -StringObject* StringObject::Cast(v8::Value* value) { -#ifdef V8_ENABLE_CHECKS - CheckCast(value); -#endif - return static_cast<StringObject*>(value); -} - - -NumberObject* NumberObject::Cast(v8::Value* value) { -#ifdef V8_ENABLE_CHECKS - CheckCast(value); -#endif - return static_cast<NumberObject*>(value); -} - - -BooleanObject* BooleanObject::Cast(v8::Value* value) { -#ifdef V8_ENABLE_CHECKS - CheckCast(value); -#endif - return static_cast<BooleanObject*>(value); -} - - -RegExp* RegExp::Cast(v8::Value* value) { -#ifdef V8_ENABLE_CHECKS - CheckCast(value); -#endif - return static_cast<RegExp*>(value); -} - - -Object* Object::Cast(v8::Value* value) { -#ifdef V8_ENABLE_CHECKS - CheckCast(value); -#endif - return static_cast<Object*>(value); -} - - -Array* Array::Cast(v8::Value* value) { -#ifdef V8_ENABLE_CHECKS - CheckCast(value); -#endif - return static_cast<Array*>(value); -} - - -Function* Function::Cast(v8::Value* value) { -#ifdef V8_ENABLE_CHECKS - CheckCast(value); -#endif - return static_cast<Function*>(value); -} - - -External* External::Cast(v8::Value* value) { -#ifdef V8_ENABLE_CHECKS - CheckCast(value); -#endif - return static_cast<External*>(value); -} - - -Isolate* AccessorInfo::GetIsolate() const { - return *reinterpret_cast<Isolate**>(&args_[-3]); -} - - -Local<Value> AccessorInfo::Data() const { - return Local<Value>(reinterpret_cast<Value*>(&args_[-2])); -} - - -Local<Object> AccessorInfo::This() const { - return Local<Object>(reinterpret_cast<Object*>(&args_[0])); -} - - -Local<Object> AccessorInfo::Holder() const { - return Local<Object>(reinterpret_cast<Object*>(&args_[-1])); -} - - -Handle<Primitive> Undefined(Isolate* isolate) { - typedef internal::Object* S; - typedef internal::Internals I; - if (!I::IsInitialized(isolate)) return Undefined(); - S* slot = I::GetRoot(isolate, I::kUndefinedValueRootIndex); - return Handle<Primitive>(reinterpret_cast<Primitive*>(slot)); -} - - -Handle<Primitive> Null(Isolate* isolate) { - typedef internal::Object* S; - typedef internal::Internals I; - if (!I::IsInitialized(isolate)) return Null(); - S* slot = I::GetRoot(isolate, I::kNullValueRootIndex); - return Handle<Primitive>(reinterpret_cast<Primitive*>(slot)); -} - - -Handle<Boolean> True(Isolate* isolate) { - typedef internal::Object* S; - typedef internal::Internals I; - if (!I::IsInitialized(isolate)) return True(); - S* slot = I::GetRoot(isolate, I::kTrueValueRootIndex); - return Handle<Boolean>(reinterpret_cast<Boolean*>(slot)); -} - - -Handle<Boolean> False(Isolate* isolate) { - typedef internal::Object* S; - typedef internal::Internals I; - if (!I::IsInitialized(isolate)) return False(); - S* slot = I::GetRoot(isolate, I::kFalseValueRootIndex); - return Handle<Boolean>(reinterpret_cast<Boolean*>(slot)); -} - - -void Isolate::SetData(void* data) { - typedef internal::Internals I; - I::SetEmbedderData(this, data); -} - - -void* Isolate::GetData() { - typedef internal::Internals I; - return I::GetEmbedderData(this); -} - - -Local<Value> Context::GetEmbedderData(int index) { -#ifndef V8_ENABLE_CHECKS - typedef internal::Object O; - typedef internal::Internals I; - O** result = HandleScope::CreateHandle(I::ReadEmbedderData<O*>(this, index)); - return Local<Value>(reinterpret_cast<Value*>(result)); -#else - return SlowGetEmbedderData(index); -#endif -} - - -void* Context::GetAlignedPointerFromEmbedderData(int index) { -#ifndef V8_ENABLE_CHECKS - typedef internal::Internals I; - return I::ReadEmbedderData<void*>(this, index); -#else - return SlowGetAlignedPointerFromEmbedderData(index); -#endif -} - - -/** - * \example shell.cc - * A simple shell that takes a list of expressions on the - * command-line and executes them. - */ - - -/** - * \example process.cc - */ - - -} // namespace v8 - - -#undef V8EXPORT -#undef TYPE_CHECK - - -#endif // V8_H_ diff --git a/src/3rdparty/v8/include/v8stdint.h b/src/3rdparty/v8/include/v8stdint.h deleted file mode 100644 index 7c12e1f..0000000 --- a/src/3rdparty/v8/include/v8stdint.h +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2012 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Load definitions of standard types. - -#ifndef V8STDINT_H_ -#define V8STDINT_H_ - -#include <stddef.h> -#include <stdio.h> - -#if defined(_WIN32) && !defined(__MINGW32__) - -typedef signed char int8_t; -typedef unsigned char uint8_t; -typedef short int16_t; // NOLINT -typedef unsigned short uint16_t; // NOLINT -typedef int int32_t; -typedef unsigned int uint32_t; -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; -// intptr_t and friends are defined in crtdefs.h through stdio.h. - -#else - -#include <stdint.h> - -#endif - -#endif // V8STDINT_H_ |