128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5727e995b7bba3c57fb1e5c156d386ca11894f781v/** \mainpage V8 API Reference Guide
69258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org *
79258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org * V8 is Google's open source JavaScript engine.
8727e995b7bba3c57fb1e5c156d386ca11894f781v *
9727e995b7bba3c57fb1e5c156d386ca11894f781v * This set of documents provides reference material generated from the
10727e995b7bba3c57fb1e5c156d386ca11894f781v * V8 header file, include/v8.h.
11727e995b7bba3c57fb1e5c156d386ca11894f781v *
12727e995b7bba3c57fb1e5c156d386ca11894f781v * For other documentation see http://code.google.com/apis/v8/
1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
14727e995b7bba3c57fb1e5c156d386ca11894f781v
159258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org#ifndef V8_H_
169258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org#define V8_H_
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org#include "v8stdint.h"
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// We reserve the V8_* prefix for macros defined in V8 public API and
21594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// assume there are no name conflicts with the embedder's code.
22594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
239259716434187c932704601f700375e53d865de8rossberg@chromium.org#ifdef V8_OS_WIN
249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Setup for Windows DLL export/import. When building the V8 DLL the
269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// BUILDING_V8_SHARED needs to be defined. When building a program which uses
279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// the V8 DLL USING_V8_SHARED needs to be defined. When either building the V8
289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// static library or building a program which uses the V8 static library neither
299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// BUILDING_V8_SHARED nor USING_V8_SHARED should be defined.
309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#if defined(BUILDING_V8_SHARED) && defined(USING_V8_SHARED)
319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#error both BUILDING_V8_SHARED and USING_V8_SHARED are set - please check the\
329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  build configuration to ensure that at most one of these is set
339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#endif
349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#ifdef BUILDING_V8_SHARED
369259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_EXPORT __declspec(dllexport)
379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#elif USING_V8_SHARED
389259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_EXPORT __declspec(dllimport)
3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#else
409259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_EXPORT
419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#endif  // BUILDING_V8_SHARED
429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
439259716434187c932704601f700375e53d865de8rossberg@chromium.org#else  // V8_OS_WIN
449085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
45d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org// Setup for Linux shared library export.
469259716434187c932704601f700375e53d865de8rossberg@chromium.org#if V8_HAS_ATTRIBUTE_VISIBILITY && defined(V8_SHARED)
479259716434187c932704601f700375e53d865de8rossberg@chromium.org# ifdef BUILDING_V8_SHARED
489259716434187c932704601f700375e53d865de8rossberg@chromium.org#  define V8_EXPORT __attribute__ ((visibility("default")))
499259716434187c932704601f700375e53d865de8rossberg@chromium.org# else
509259716434187c932704601f700375e53d865de8rossberg@chromium.org#  define V8_EXPORT
519259716434187c932704601f700375e53d865de8rossberg@chromium.org# endif
52eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org#else
539259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_EXPORT
54eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org#endif
55eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
569259716434187c932704601f700375e53d865de8rossberg@chromium.org#endif  // V8_OS_WIN
57ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
59727e995b7bba3c57fb1e5c156d386ca11894f781v * The v8 JavaScript engine.
6043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
6143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansennamespace v8 {
6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
634c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass AccessorSignature;
6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Array;
6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Boolean;
6684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgclass BooleanObject;
674c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Context;
68f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgclass CpuProfiler;
694c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Data;
7043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Date;
714c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass DeclaredAccessorDescriptor;
724c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass External;
734c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Function;
744c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass FunctionTemplate;
75f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgclass HeapProfiler;
7643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass ImplementationUtilities;
774c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Int32;
784c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Integer;
794c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Isolate;
80e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgclass Name;
814c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Number;
824c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass NumberObject;
834c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Object;
844c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass ObjectOperationDescriptor;
854c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass ObjectTemplate;
8690dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.orgclass Platform;
874c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Primitive;
884c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass RawOperationDescriptor;
896b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgclass Script;
9043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Signature;
914c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass StackFrame;
924c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass StackTrace;
934c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass String;
944c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass StringObject;
95e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgclass Symbol;
96e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgclass SymbolObject;
970cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgclass Private;
984c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Uint32;
994c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Utils;
1004c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Value;
10143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentemplate <class T> class Handle;
10243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentemplate <class T> class Local;
1031e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgtemplate <class T> class Eternal;
104639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgtemplate<class T> class NonCopyablePersistentTraits;
105c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgtemplate<class T> class PersistentBase;
106639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgtemplate<class T,
107639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org         class M = NonCopyablePersistentTraits<T> > class Persistent;
108c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgtemplate<class T> class UniquePersistent;
1096b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgtemplate<class K, class V, class T> class PersistentValueMap;
1102f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.orgtemplate<class V, class T> class PersistentValueVector;
111639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgtemplate<class T, class P> class WeakCallbackObject;
112bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgclass FunctionTemplate;
113bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgclass ObjectTemplate;
114bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgclass Data;
115a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgtemplate<typename T> class FunctionCallbackInfo;
116bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T> class PropertyCallbackInfo;
117bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgclass StackTrace;
118bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgclass StackFrame;
119bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgclass Isolate;
120bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgclass DeclaredAccessorDescriptor;
121bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgclass ObjectOperationDescriptor;
122bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgclass RawOperationDescriptor;
1231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass CallHandlerHelper;
124cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.orgclass EscapableHandleScope;
125381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.orgtemplate<typename T> class ReturnValue;
12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgnamespace internal {
128c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgclass Arguments;
1292356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.orgclass Heap;
130ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgclass HeapObject;
131ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgclass Isolate;
1324c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Object;
133b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgstruct StreamedSource;
134f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.orgtemplate<typename T> class CustomArguments;
135bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgclass PropertyCallbackArguments;
136bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgclass FunctionCallbackArguments;
137639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgclass GlobalHandles;
13818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
13918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
14043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
141ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org/**
142ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org * General purpose unique identifier.
143ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org */
144ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.orgclass UniqueId {
145ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org public:
146ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  explicit UniqueId(intptr_t data)
147ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org      : data_(data) {}
148ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
149ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  bool operator==(const UniqueId& other) const {
150ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    return data_ == other.data_;
151ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  }
152ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
153ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  bool operator!=(const UniqueId& other) const {
154ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    return data_ != other.data_;
155ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  }
156ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
157ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  bool operator<(const UniqueId& other) const {
158ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    return data_ < other.data_;
159ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  }
160ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
161ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org private:
162ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  intptr_t data_;
163ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org};
164ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
165fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Handles ---
16643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
167ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org#define TYPE_CHECK(T, S)                                       \
168ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org  while (false) {                                              \
169ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org    *(static_cast<T* volatile*>(0)) = static_cast<S*>(0);      \
17043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
17143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
17343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
17443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * An object reference managed by the v8 garbage collector.
17543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
17643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * All objects returned from v8 have to be tracked by the garbage
17743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * collector so that it knows that the objects are still alive.  Also,
17843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * because the garbage collector may move objects, it is unsafe to
17943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * point directly to an object.  Instead, all objects are stored in
18043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * handles which are known by the garbage collector and updated
18143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * whenever an object moves.  Handles should always be passed by value
18243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * (except in cases like out-parameters) and they should never be
18343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * allocated on the heap.
18443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
18543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * There are two types of handles: local and persistent handles.
18643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Local handles are light-weight and transient and typically used in
18743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * local operations.  They are managed by HandleScopes.  Persistent
18843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * handles can be used when storing objects across several independent
18943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * operations and have to be explicitly deallocated when they're no
19043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * longer used.
19143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
19243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * It is safe to extract the object stored in the handle by
19343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * dereferencing the handle (for instance, to extract the Object* from
1947304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org * a Handle<Object>); the value will still be governed by a handle
19543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * behind the scenes and the same rules apply to these values as to
19643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * their handles.
19743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
19869ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgtemplate <class T> class Handle {
19943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
20043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
20143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Creates an empty handle.
20243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
2034a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Handle() : val_(0) {}
20443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
20643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Creates a handle for the contents of the specified handle.  This
20743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * constructor allows you to pass handles as arguments by value and
208727e995b7bba3c57fb1e5c156d386ca11894f781v   * to assign between handles.  However, if you try to assign between
20943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * incompatible handles, for instance from a Handle<String> to a
2107304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * Handle<Number> it will cause a compile-time error.  Assigning
21143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * between compatible handles, for instance assigning a
21243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Handle<String> to a variable declared as Handle<Value>, is legal
21343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * because String is a subclass of Value.
21443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
2154a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  template <class S> V8_INLINE Handle(Handle<S> that)
21643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      : val_(reinterpret_cast<T*>(*that)) {
21743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    /**
21843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     * This check fails when trying to convert between incompatible
21943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     * handles. For example, converting from a Handle<String> to a
22043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     * Handle<Number>.
22143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     */
22243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    TYPE_CHECK(T, S);
22343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
22443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
22643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if the handle is empty.
22743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
2284a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE bool IsEmpty() const { return val_ == 0; }
22943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
23143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Sets the handle to be empty. IsEmpty() will then return true.
23243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
2334a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE void Clear() { val_ = 0; }
234b645116853c677aca8a316381b87441ba6004f67danno@chromium.org
2354a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE T* operator->() const { return val_; }
236b645116853c677aca8a316381b87441ba6004f67danno@chromium.org
2374a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE T* operator*() const { return val_; }
23843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
24043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Checks whether two handles are the same.
24143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if both are empty, or if the objects
24243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * to which they refer are identical.
24343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * The handles' references are not checked.
24443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
2454a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  template <class S> V8_INLINE bool operator==(const Handle<S>& that) const {
246c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    internal::Object** a = reinterpret_cast<internal::Object**>(this->val_);
247c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    internal::Object** b = reinterpret_cast<internal::Object**>(that.val_);
24843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (a == 0) return b == 0;
24943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (b == 0) return false;
25043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return *a == *b;
25143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
25243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2534a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  template <class S> V8_INLINE bool operator==(
254c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org      const PersistentBase<S>& that) const {
255c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    internal::Object** a = reinterpret_cast<internal::Object**>(this->val_);
256c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    internal::Object** b = reinterpret_cast<internal::Object**>(that.val_);
25757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    if (a == 0) return b == 0;
25857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    if (b == 0) return false;
25957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    return *a == *b;
26057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
26157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
26243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
26343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Checks whether two handles are different.
26443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if only one of the handles is empty, or if
26543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * the objects to which they refer are different.
26643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * The handles' references are not checked.
26743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
2684a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  template <class S> V8_INLINE bool operator!=(const Handle<S>& that) const {
26943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return !operator==(that);
27043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
27143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2724a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  template <class S> V8_INLINE bool operator!=(
2734a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org      const Persistent<S>& that) const {
27432cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return !operator==(that);
27532cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }
27632cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org
2774a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  template <class S> V8_INLINE static Handle<T> Cast(Handle<S> that) {
27818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
27918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    // If we're going to perform the type check then we have to check
28018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    // that the handle isn't empty before doing the checked cast.
28143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (that.IsEmpty()) return Handle<T>();
28218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
28343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return Handle<T>(T::Cast(*that));
28443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
28543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2864a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  template <class S> V8_INLINE Handle<S> As() {
287ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    return Handle<S>::Cast(*this);
288ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
289ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
2904a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static Handle<T> New(Isolate* isolate, Handle<T> that) {
29157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    return New(isolate, that.val_);
29257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
293c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE static Handle<T> New(Isolate* isolate,
294c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org                                 const PersistentBase<T>& that) {
29557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    return New(isolate, that.val_);
29657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
29757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
29843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
299f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org  friend class Utils;
300639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  template<class F, class M> friend class Persistent;
301c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  template<class F> friend class PersistentBase;
302c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  template<class F> friend class Handle;
303b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  template<class F> friend class Local;
304b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  template<class F> friend class FunctionCallbackInfo;
305b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  template<class F> friend class PropertyCallbackInfo;
306f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org  template<class F> friend class internal::CustomArguments;
30757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  friend Handle<Primitive> Undefined(Isolate* isolate);
30857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  friend Handle<Primitive> Null(Isolate* isolate);
30957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  friend Handle<Boolean> True(Isolate* isolate);
31057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  friend Handle<Boolean> False(Isolate* isolate);
31157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  friend class Context;
312b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  friend class HandleScope;
3130cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  friend class Object;
3140cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  friend class Private;
31557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
316202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  /**
317202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org   * Creates a new handle for the specified value.
318202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org   */
319202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  V8_INLINE explicit Handle(T* val) : val_(val) {}
320202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
3214a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static Handle<T> New(Isolate* isolate, T* that);
32257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
32343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  T* val_;
32443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
32543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
32843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * A light-weight stack-allocated object handle.  All operations
32943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * that return objects from within v8 return them in local handles.  They
33043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * are created within HandleScopes, and all local handles allocated within a
33143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * handle scope are destroyed when the handle scope is destroyed.  Hence it
33243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * is not necessary to explicitly deallocate local handles.
33343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
33469ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgtemplate <class T> class Local : public Handle<T> {
33543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
3364a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Local();
3374a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  template <class S> V8_INLINE Local(Local<S> that)
33843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      : Handle<T>(reinterpret_cast<T*>(*that)) {
33943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    /**
34043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     * This check fails when trying to convert between incompatible
34143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     * handles. For example, converting from a Handle<String> to a
34243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     * Handle<Number>.
34343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     */
34443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    TYPE_CHECK(T, S);
34543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
34657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
34757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
3484a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  template <class S> V8_INLINE static Local<T> Cast(Local<S> that) {
34918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
35018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    // If we're going to perform the type check then we have to check
35118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    // that the handle isn't empty before doing the checked cast.
35243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (that.IsEmpty()) return Local<T>();
35318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
35443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return Local<T>(T::Cast(*that));
35543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
3564a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  template <class S> V8_INLINE Local(Handle<S> that)
35757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org      : Handle<T>(reinterpret_cast<T*>(*that)) {
35857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    TYPE_CHECK(T, S);
35957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
36043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3614a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  template <class S> V8_INLINE Local<S> As() {
362ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    return Local<S>::Cast(*this);
363ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
364ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
36532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  /**
36632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org   * Create a local handle for the content of another handle.
36732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org   * The referee is kept alive by the local handle even when
36832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org   * the original handle is destroyed/disposed.
36943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
3704a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static Local<T> New(Isolate* isolate, Handle<T> that);
3714a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static Local<T> New(Isolate* isolate,
372c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org                                const PersistentBase<T>& that);
37343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
37457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org private:
375f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org  friend class Utils;
3761e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  template<class F> friend class Eternal;
377c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  template<class F> friend class PersistentBase;
378639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  template<class F, class M> friend class Persistent;
379b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  template<class F> friend class Handle;
380c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  template<class F> friend class Local;
381b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  template<class F> friend class FunctionCallbackInfo;
382b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  template<class F> friend class PropertyCallbackInfo;
38357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  friend class String;
38457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  friend class Object;
38557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  friend class Context;
386f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org  template<class F> friend class internal::CustomArguments;
387b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  friend class HandleScope;
388cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  friend class EscapableHandleScope;
389381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  template<class F1, class F2, class F3> friend class PersistentValueMap;
3902f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  template<class F1, class F2> friend class PersistentValueVector;
39157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
392202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  template <class S> V8_INLINE Local(S* that) : Handle<T>(that) { }
3934a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static Local<T> New(Isolate* isolate, T* that);
39457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org};
39543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3961e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
3971e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// Eternal handles are set-once handles that live for the life of the isolate.
3981e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgtemplate <class T> class Eternal {
3991e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org public:
4004a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Eternal() : index_(kInitialValue) { }
4011e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  template<class S>
4024a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Eternal(Isolate* isolate, Local<S> handle) : index_(kInitialValue) {
4031e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    Set(isolate, handle);
4041e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  }
4051e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  // Can only be safely called if already set.
4064a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Local<T> Get(Isolate* isolate);
4074a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE bool IsEmpty() { return index_ == kInitialValue; }
4084a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  template<class S> V8_INLINE void Set(Isolate* isolate, Local<S> handle);
4091e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
4101e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org private:
4111e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  static const int kInitialValue = -1;
4121e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  int index_;
4131e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org};
4141e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
4151e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
416639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgtemplate<class T, class P>
417639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgclass WeakCallbackData {
418639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org public:
419639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  typedef void (*Callback)(const WeakCallbackData<T, P>& data);
420639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
4214a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Isolate* GetIsolate() const { return isolate_; }
4224a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Local<T> GetValue() const { return handle_; }
4234a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE P* GetParameter() const { return parameter_; }
424639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
425639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org private:
426639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  friend class internal::GlobalHandles;
427639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  WeakCallbackData(Isolate* isolate, Local<T> handle, P* parameter)
428639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    : isolate_(isolate), handle_(handle), parameter_(parameter) { }
429639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  Isolate* isolate_;
430639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  Local<T> handle_;
431639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  P* parameter_;
432639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org};
433639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
434639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
435639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org/**
436c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org * An object reference that is independent of any handle scope.  Where
437c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org * a Local handle only lives as long as the HandleScope in which it was
438c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org * allocated, a PersistentBase handle remains valid until it is explicitly
439c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org * disposed.
440c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org *
441c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org * A persistent handle contains a reference to a storage cell within
442c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org * the v8 engine which holds an object value and which is updated by
443c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org * the garbage collector whenever the object is moved.  A new storage
444c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org * cell can be created using the constructor or PersistentBase::Reset and
445c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org * existing handles can be disposed using PersistentBase::Reset.
446c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org *
447c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org */
448c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgtemplate <class T> class PersistentBase {
449c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org public:
450c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  /**
451c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * If non-empty, destroy the underlying storage cell
452c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * IsEmpty() will return true after this call.
453c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   */
454c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE void Reset();
455c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  /**
456c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * If non-empty, destroy the underlying storage cell
457c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * and create a new one with the contents of other if other is non empty
458c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   */
459c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  template <class S>
460c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE void Reset(Isolate* isolate, const Handle<S>& other);
461c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
462c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  /**
463c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * If non-empty, destroy the underlying storage cell
464c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * and create a new one with the contents of other if other is non empty
465c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   */
466c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  template <class S>
467c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE void Reset(Isolate* isolate, const PersistentBase<S>& other);
468c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
469c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE bool IsEmpty() const { return val_ == 0; }
470c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
471c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  template <class S>
472c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE bool operator==(const PersistentBase<S>& that) const {
473c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    internal::Object** a = reinterpret_cast<internal::Object**>(this->val_);
474c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    internal::Object** b = reinterpret_cast<internal::Object**>(that.val_);
475c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    if (a == 0) return b == 0;
476c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    if (b == 0) return false;
477c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    return *a == *b;
478c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  }
479c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
480c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  template <class S> V8_INLINE bool operator==(const Handle<S>& that) const {
481c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    internal::Object** a = reinterpret_cast<internal::Object**>(this->val_);
482c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    internal::Object** b = reinterpret_cast<internal::Object**>(that.val_);
483c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    if (a == 0) return b == 0;
484c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    if (b == 0) return false;
485c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    return *a == *b;
486c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  }
487c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
488c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  template <class S>
489c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE bool operator!=(const PersistentBase<S>& that) const {
490c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    return !operator==(that);
491c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  }
492c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
493c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  template <class S> V8_INLINE bool operator!=(const Handle<S>& that) const {
494c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    return !operator==(that);
495c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  }
496c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
49763a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  /**
49863a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org   *  Install a finalization callback on this object.
49963a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org   *  NOTE: There is no guarantee as to *when* or even *if* the callback is
50063a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org   *  invoked. The invocation is performed solely on a best effort basis.
50163a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org   *  As always, GC-based finalization should *not* be relied upon for any
50263a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org   *  critical form of resource management!
50363a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org   */
504c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  template<typename P>
505c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE void SetWeak(
506c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org      P* parameter,
507c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org      typename WeakCallbackData<T, P>::Callback callback);
508c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
509c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  template<typename S, typename P>
510c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE void SetWeak(
511c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org      P* parameter,
512c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org      typename WeakCallbackData<S, P>::Callback callback);
513c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
514381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  template<typename P>
515381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  V8_INLINE P* ClearWeak();
516381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org
517381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  // TODO(dcarney): remove this.
518381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  V8_INLINE void ClearWeak() { ClearWeak<void>(); }
519c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
520c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  /**
521c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * Marks the reference to this object independent. Garbage collector is free
522c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * to ignore any object groups containing this object. Weak callback for an
523c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * independent handle should not assume that it will be preceded by a global
524c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * GC prologue callback or followed by a global GC epilogue callback.
525c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   */
526c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE void MarkIndependent();
527c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
528c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  /**
529c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * Marks the reference to this object partially dependent. Partially dependent
530c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * handles only depend on other partially dependent handles and these
531c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * dependencies are provided through object groups. It provides a way to build
532c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * smaller object groups for young objects that represent only a subset of all
533c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * external dependencies. This mark is automatically cleared after each
534c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * garbage collection.
535c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   */
536c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE void MarkPartiallyDependent();
537c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
538c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE bool IsIndependent() const;
539c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
540c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  /** Checks if the handle holds the only reference to an object. */
541c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE bool IsNearDeath() const;
542c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
543c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  /** Returns true if the handle's reference is weak.  */
544c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE bool IsWeak() const;
545c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
546c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  /**
547c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * Assigns a wrapper class ID to the handle. See RetainedObjectInfo interface
548c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * description in v8-profiler.h for details.
549c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   */
550c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE void SetWrapperClassId(uint16_t class_id);
551c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
552c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  /**
553c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * Returns the class ID previously assigned to this handle or 0 if no class ID
554c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * was previously assigned.
555c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   */
556c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE uint16_t WrapperClassId() const;
557c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
558c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org private:
559c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  friend class Isolate;
560c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  friend class Utils;
561c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  template<class F> friend class Handle;
562c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  template<class F> friend class Local;
563c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  template<class F1, class F2> friend class Persistent;
564c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  template<class F> friend class UniquePersistent;
565c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  template<class F> friend class PersistentBase;
566c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  template<class F> friend class ReturnValue;
567381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  template<class F1, class F2, class F3> friend class PersistentValueMap;
5682f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  template<class F1, class F2> friend class PersistentValueVector;
569ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  friend class Object;
570c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
571c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  explicit V8_INLINE PersistentBase(T* val) : val_(val) {}
572c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  PersistentBase(PersistentBase& other); // NOLINT
573c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  void operator=(PersistentBase&);
574c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE static T* New(Isolate* isolate, T* that);
575c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
576c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  T* val_;
577c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org};
578c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
579c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
580c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org/**
581639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org * Default traits for Persistent. This class does not allow
582639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org * use of the copy constructor or assignment operator.
583639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org * At present kResetInDestructor is not set, but that will change in a future
584639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org * version.
585639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org */
586639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgtemplate<class T>
587639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgclass NonCopyablePersistentTraits {
588639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org public:
589639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  typedef Persistent<T, NonCopyablePersistentTraits<T> > NonCopyablePersistent;
590639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  static const bool kResetInDestructor = false;
591639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  template<class S, class M>
5924a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static void Copy(const Persistent<S, M>& source,
5934a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org                             NonCopyablePersistent* dest) {
594639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    Uncompilable<Object>();
595639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  }
596639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  // TODO(dcarney): come up with a good compile error here.
5974a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  template<class O> V8_INLINE static void Uncompilable() {
598639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    TYPE_CHECK(O, Primitive);
599639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  }
600639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org};
601639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
602639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
60343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
604528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org * Helper class traits to allow copying and assignment of Persistent.
605528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org * This will clone the contents of storage cell, but not any of the flags, etc.
606528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org */
607528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtemplate<class T>
608528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgstruct CopyablePersistentTraits {
609528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  typedef Persistent<T, CopyablePersistentTraits<T> > CopyablePersistent;
610528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  static const bool kResetInDestructor = true;
611528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  template<class S, class M>
612528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  static V8_INLINE void Copy(const Persistent<S, M>& source,
613528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                             CopyablePersistent* dest) {
614528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    // do nothing, just allow copy
615528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  }
616528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org};
617528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
618528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
619528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org/**
620c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org * A PersistentBase which allows copy and assignment.
621639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org *
622639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org * Copy, assignment and destructor bevavior is controlled by the traits
623639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org * class M.
624c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org *
625c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org * Note: Persistent class hierarchy is subject to future changes.
62643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
627c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgtemplate <class T, class M> class Persistent : public PersistentBase<T> {
62843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
629639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  /**
630639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org   * A Persistent with no storage cell.
631639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org   */
632c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE Persistent() : PersistentBase<T>(0) { }
63357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
634639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org   * Construct a Persistent from a Handle.
635639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org   * When the Handle is non-empty, a new storage cell is created
636639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org   * pointing to the same object, and no flags are set.
63757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
6384a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  template <class S> V8_INLINE Persistent(Isolate* isolate, Handle<S> that)
639c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org      : PersistentBase<T>(PersistentBase<T>::New(isolate, *that)) {
640639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    TYPE_CHECK(T, S);
641639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  }
64243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
643639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org   * Construct a Persistent from a Persistent.
644639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org   * When the Persistent is non-empty, a new storage cell is created
645639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org   * pointing to the same object, and no flags are set.
64643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
647639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  template <class S, class M2>
6484a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Persistent(Isolate* isolate, const Persistent<S, M2>& that)
649c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    : PersistentBase<T>(PersistentBase<T>::New(isolate, *that)) {
650639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    TYPE_CHECK(T, S);
651639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  }
65243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
653639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org   * The copy constructors and assignment operator create a Persistent
654639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org   * exactly as the Persistent constructor, but the Copy function from the
655639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org   * traits class is called, allowing the setting of flags based on the
656639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org   * copied Persistent.
65743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
658c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE Persistent(const Persistent& that) : PersistentBase<T>(0) {
659639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    Copy(that);
660639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  }
661639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  template <class S, class M2>
662c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE Persistent(const Persistent<S, M2>& that) : PersistentBase<T>(0) {
663639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    Copy(that);
664639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  }
6654a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Persistent& operator=(const Persistent& that) { // NOLINT
666639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    Copy(that);
667639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    return *this;
668639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  }
669639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  template <class S, class M2>
6704a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Persistent& operator=(const Persistent<S, M2>& that) { // NOLINT
671639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    Copy(that);
672639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    return *this;
67343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
674c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  /**
675c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org   * The destructor will dispose the Persistent based on the
676c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org   * kResetInDestructor flags in the traits class.  Since not calling dispose
677c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org   * can result in a memory leak, it is recommended to always set this flag.
678c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org   */
6794a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE ~Persistent() {
680c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    if (M::kResetInDestructor) this->Reset();
681c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  }
68243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
683639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  // TODO(dcarney): this is pretty useless, fix or remove
684c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  template <class S>
6854a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static Persistent<T>& Cast(Persistent<S>& that) { // NOLINT
686c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#ifdef V8_ENABLE_CHECKS
687c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    // If we're going to perform the type check then we have to check
688c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    // that the handle isn't empty before doing the checked cast.
689c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    if (!that.IsEmpty()) T::Cast(*that);
690c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#endif
691c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    return reinterpret_cast<Persistent<T>&>(that);
692c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  }
693c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
694639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  // TODO(dcarney): this is pretty useless, fix or remove
6954a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  template <class S> V8_INLINE Persistent<S>& As() { // NOLINT
696c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    return Persistent<S>::Cast(*this);
697c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  }
698d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
699cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org  // This will be removed.
700cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org  V8_INLINE T* ClearAndLeak();
701906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org
70257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org private:
703690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org  friend class Isolate;
704f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org  friend class Utils;
705b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  template<class F> friend class Handle;
706b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  template<class F> friend class Local;
707639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  template<class F1, class F2> friend class Persistent;
7081fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  template<class F> friend class ReturnValue;
70957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
710202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  template <class S> V8_INLINE Persistent(S* that) : PersistentBase<T>(that) { }
711202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  V8_INLINE T* operator*() const { return this->val_; }
712639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  template<class S, class M2>
7134a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE void Copy(const Persistent<S, M2>& that);
714c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org};
71557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
716c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
717c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org/**
718c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org * A PersistentBase which has move semantics.
719c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org *
720c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org * Note: Persistent class hierarchy is subject to future changes.
721c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org */
722c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgtemplate<class T>
723c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgclass UniquePersistent : public PersistentBase<T> {
724c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  struct RValue {
7259ed27460593e67bc55b9feb15ca7c301e9f804b0rossberg@chromium.org    V8_INLINE explicit RValue(UniquePersistent* obj) : object(obj) {}
726c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    UniquePersistent* object;
727c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  };
728c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
729c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org public:
730381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  /**
731c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * A UniquePersistent with no storage cell.
732c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   */
733c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE UniquePersistent() : PersistentBase<T>(0) { }
734c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  /**
735c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * Construct a UniquePersistent from a Handle.
736c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * When the Handle is non-empty, a new storage cell is created
737c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * pointing to the same object, and no flags are set.
738c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   */
739c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  template <class S>
740c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE UniquePersistent(Isolate* isolate, Handle<S> that)
741c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org      : PersistentBase<T>(PersistentBase<T>::New(isolate, *that)) {
742c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    TYPE_CHECK(T, S);
743c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  }
744c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  /**
745c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * Construct a UniquePersistent from a PersistentBase.
746c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * When the Persistent is non-empty, a new storage cell is created
747c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * pointing to the same object, and no flags are set.
748c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   */
749c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  template <class S>
750c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE UniquePersistent(Isolate* isolate, const PersistentBase<S>& that)
751c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    : PersistentBase<T>(PersistentBase<T>::New(isolate, that.val_)) {
752c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    TYPE_CHECK(T, S);
753c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  }
754c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  /**
755c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * Move constructor.
756c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   */
757c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE UniquePersistent(RValue rvalue)
758c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    : PersistentBase<T>(rvalue.object->val_) {
759c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    rvalue.object->val_ = 0;
760c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  }
761c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE ~UniquePersistent() { this->Reset(); }
762c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  /**
763c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * Move via assignment.
764c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   */
765c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  template<class S>
766c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE UniquePersistent& operator=(UniquePersistent<S> rhs) {
767c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    TYPE_CHECK(T, S);
768381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    this->Reset();
769c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    this->val_ = rhs.val_;
770c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    rhs.val_ = 0;
771c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    return *this;
772c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  }
773c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  /**
774c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * Cast operator for moves.
775c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   */
776c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  V8_INLINE operator RValue() { return RValue(this); }
777c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  /**
778c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   * Pass allows returning uniques from functions, etc.
779c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org   */
780ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  UniquePersistent Pass() { return UniquePersistent(RValue(this)); }
781c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
782c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org private:
783c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  UniquePersistent(UniquePersistent&);
784c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  void operator=(UniquePersistent&);
78543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
78643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
787c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
788727e995b7bba3c57fb1e5c156d386ca11894f781v /**
78943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * A stack-allocated class that governs a number of local handles.
79043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * After a handle scope has been created, all local handles will be
79143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * allocated within that handle scope until either the handle scope is
79243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * deleted or another handle scope is created.  If there is already a
79343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * handle scope and a new one is created, all allocations will take
794727e995b7bba3c57fb1e5c156d386ca11894f781v * place in the new handle scope until it is deleted.  After that,
79543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * new handles will again be allocated in the original handle scope.
79643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
79743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * After the handle scope of a local handle has been deleted the
79843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * garbage collector will no longer track the object stored in the
79943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * handle and may deallocate it.  The behavior of accessing a handle
80043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * for which the handle scope has been deleted is undefined.
80143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
802594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT HandleScope {
80343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
8042bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope(Isolate* isolate);
8052bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org
806ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  ~HandleScope();
80743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
80843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
80943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Counts the number of allocated handles.
81043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
8114610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org  static int NumberOfHandles(Isolate* isolate);
81243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
81326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  V8_INLINE Isolate* GetIsolate() const {
81426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    return reinterpret_cast<Isolate*>(isolate_);
81526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  }
81626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
81726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org protected:
81826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  V8_INLINE HandleScope() {}
81926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
82026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  void Initialize(Isolate* isolate);
82126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
82232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  static internal::Object** CreateHandle(internal::Isolate* isolate,
82332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org                                         internal::Object* value);
82426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
82526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org private:
82626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  // Uses heap_object to obtain the current Isolate.
827cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  static internal::Object** CreateHandle(internal::HeapObject* heap_object,
828cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org                                         internal::Object* value);
829cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org
83049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  // Make it hard to create heap-allocated or illegal handle scopes by
83149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  // disallowing certain operations.
83243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  HandleScope(const HandleScope&);
83343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void operator=(const HandleScope&);
83443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void* operator new(size_t size);
83543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void operator delete(void*, size_t);
83643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
837ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  internal::Isolate* isolate_;
838303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  internal::Object** prev_next_;
839303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  internal::Object** prev_limit_;
84043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
84126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  // Local::New uses CreateHandle with an Isolate* parameter.
842cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  template<class F> friend class Local;
84326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
84426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  // Object::GetInternalField and Context::GetEmbedderData use CreateHandle with
84526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  // a HeapObject* in their shortcuts.
846cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  friend class Object;
847cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  friend class Context;
848cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org};
849cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org
850cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org
851cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org/**
852cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org * A HandleScope which first allocates a handle in the current scope
853cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org * which will be later filled with the escape value.
854cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org */
855cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.orgclass V8_EXPORT EscapableHandleScope : public HandleScope {
856cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org public:
857cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  EscapableHandleScope(Isolate* isolate);
858cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  V8_INLINE ~EscapableHandleScope() {}
859cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org
860cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  /**
861cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org   * Pushes the value into the previous scope and returns a handle to it.
862cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org   * Cannot be called twice.
863cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org   */
864cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  template <class T>
865cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  V8_INLINE Local<T> Escape(Local<T> value) {
866cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org    internal::Object** slot =
867cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org        Escape(reinterpret_cast<internal::Object**>(*value));
868cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org    return Local<T>(reinterpret_cast<T*>(slot));
869cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  }
870cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org
871cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org private:
872cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  internal::Object** Escape(internal::Object** escape_value);
873cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org
8745ae72c9d3193fcbb0e2640a2b74b2f1f0d1b05e9mstarzinger@chromium.org  // Make it hard to create heap-allocated or illegal handle scopes by
8755ae72c9d3193fcbb0e2640a2b74b2f1f0d1b05e9mstarzinger@chromium.org  // disallowing certain operations.
8765ae72c9d3193fcbb0e2640a2b74b2f1f0d1b05e9mstarzinger@chromium.org  EscapableHandleScope(const EscapableHandleScope&);
8775ae72c9d3193fcbb0e2640a2b74b2f1f0d1b05e9mstarzinger@chromium.org  void operator=(const EscapableHandleScope&);
8785ae72c9d3193fcbb0e2640a2b74b2f1f0d1b05e9mstarzinger@chromium.org  void* operator new(size_t size);
8795ae72c9d3193fcbb0e2640a2b74b2f1f0d1b05e9mstarzinger@chromium.org  void operator delete(void*, size_t);
8805ae72c9d3193fcbb0e2640a2b74b2f1f0d1b05e9mstarzinger@chromium.org
881cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  internal::Object** escape_slot_;
88243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
88343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
88443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
885c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org/**
886c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org * A simple Maybe type, representing an object which may or may not have a
887c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org * value.
888c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org */
889c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.orgtemplate<class T>
890dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.orgstruct Maybe {
891c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  Maybe() : has_value(false) {}
892c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  explicit Maybe(T t) : has_value(true), value(t) {}
893c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  Maybe(bool has, T t) : has_value(has), value(t) {}
894c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org
895c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  bool has_value;
896c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  T value;
897c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org};
898c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org
899c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org
900eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org// Convenience wrapper.
901eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.orgtemplate <class T>
902eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.orginline Maybe<T> maybe(T t) {
903eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  return Maybe<T>(t);
904eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org}
905eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org
906eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org
907fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Special objects ---
90843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
90943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
91043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
91143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * The superclass of values and API object templates.
91243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
913594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Data {
91443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
91543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Data();
91643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
91743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
91843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
91943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
92043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * The origin, within a file, of a script.
92143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
9226bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.orgclass ScriptOrigin {
92343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
9244a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE ScriptOrigin(
92569ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org      Handle<Value> resource_name,
92669ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org      Handle<Integer> resource_line_offset = Handle<Integer>(),
927d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      Handle<Integer> resource_column_offset = Handle<Integer>(),
928f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      Handle<Boolean> resource_is_shared_cross_origin = Handle<Boolean>(),
929f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      Handle<Integer> script_id = Handle<Integer>())
93043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      : resource_name_(resource_name),
93143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        resource_line_offset_(resource_line_offset),
932d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org        resource_column_offset_(resource_column_offset),
933f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org        resource_is_shared_cross_origin_(resource_is_shared_cross_origin),
934f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org        script_id_(script_id) { }
9354a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Handle<Value> ResourceName() const;
9364a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Handle<Integer> ResourceLineOffset() const;
9374a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Handle<Integer> ResourceColumnOffset() const;
9384a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Handle<Boolean> ResourceIsSharedCrossOrigin() const;
939f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  V8_INLINE Handle<Integer> ScriptID() const;
94043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
941cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager  Handle<Value> resource_name_;
94243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Handle<Integer> resource_line_offset_;
94343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Handle<Integer> resource_column_offset_;
944d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  Handle<Boolean> resource_is_shared_cross_origin_;
945f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  Handle<Integer> script_id_;
94643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
94743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
94843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
94943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
9506b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org * A compiled JavaScript script, not yet tied to a Context.
95143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
9526b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgclass V8_EXPORT UnboundScript {
95343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
9545c838251403b0be9a882540f1922577abba4c872ager@chromium.org  /**
9556b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   * Binds the script to the currently entered context.
9565c838251403b0be9a882540f1922577abba4c872ager@chromium.org   */
9576b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org  Local<Script> BindToCurrentContext();
9586b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org
9596b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org  int GetId();
9606b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org  Handle<Value> GetScriptName();
961911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
9625c838251403b0be9a882540f1922577abba4c872ager@chromium.org  /**
963d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org   * Data read from magic sourceURL comments.
964d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org   */
965d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  Handle<Value> GetSourceURL();
966d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  /**
967d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org   * Data read from magic sourceMappingURL comments.
968d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org   */
969d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  Handle<Value> GetSourceMappingURL();
970d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org
971d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  /**
9726b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   * Returns zero based line number of the code_pos location in the script.
9736b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   * -1 will be returned if no information available.
9745c838251403b0be9a882540f1922577abba4c872ager@chromium.org   */
9756b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org  int GetLineNumber(int code_pos);
9765c838251403b0be9a882540f1922577abba4c872ager@chromium.org
9776b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org  static const int kNoScriptId = 0;
9786b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org};
9796b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org
9806b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org
9816b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org/**
9826b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org * A compiled JavaScript script, tied to a Context which was active when the
9836b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org * script was compiled.
9846b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org */
9856b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgclass V8_EXPORT Script {
9866b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org public:
9875c838251403b0be9a882540f1922577abba4c872ager@chromium.org  /**
9886b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   * A shorthand for ScriptCompiler::Compile().
98943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
99043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static Local<Script> Compile(Handle<String> source,
9912ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                               ScriptOrigin* origin = NULL);
99243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9936b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org  // To be decprecated, use the Compile above.
994cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager  static Local<Script> Compile(Handle<String> source,
9956b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org                               Handle<String> file_name);
996cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
997727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
9986b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   * Runs the script returning the resulting value. It will be run in the
9996b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   * context in which it was created (ScriptCompiler::CompileBound or
10006b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   * UnboundScript::BindToGlobalContext()).
1001727e995b7bba3c57fb1e5c156d386ca11894f781v   */
100243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Local<Value> Run();
10037be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
10047be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  /**
10056b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   * Returns the corresponding context-unbound script.
10061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   */
10076b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org  Local<UnboundScript> GetUnboundScript();
10081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
10096b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org  V8_DEPRECATED("Use GetUnboundScript()->GetId()",
10101e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org                int GetId()) {
10111e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org    return GetUnboundScript()->GetId();
10126b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org  }
10136b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org};
10141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
10156b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org
10166b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org/**
10176b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org * For compiling scripts.
10186b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org */
10196b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgclass V8_EXPORT ScriptCompiler {
10206b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org public:
10216b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org  /**
10226b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   * Compilation data that the embedder can cache and pass back to speed up
10236b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   * future compilations. The data is produced if the CompilerOptions passed to
10246b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   * the compilation functions in ScriptCompiler contains produce_data_to_cache
10256b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   * = true. The data to cache can then can be retrieved from
10266b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   * UnboundScript.
10276b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   */
10286b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org  struct V8_EXPORT CachedData {
102969f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    enum BufferPolicy {
103069f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org      BufferNotOwned,
103169f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org      BufferOwned
103269f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    };
103369f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org
103469f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    CachedData() : data(NULL), length(0), buffer_policy(BufferNotOwned) {}
103569f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org
103669f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    // If buffer_policy is BufferNotOwned, the caller keeps the ownership of
103769f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    // data and guarantees that it stays alive until the CachedData object is
103869f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    // destroyed. If the policy is BufferOwned, the given data will be deleted
103969f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    // (with delete[]) when the CachedData object is destroyed.
104069f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    CachedData(const uint8_t* data, int length,
104169f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org               BufferPolicy buffer_policy = BufferNotOwned);
104269f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    ~CachedData();
10436b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org    // TODO(marja): Async compilation; add constructors which take a callback
10446b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org    // which will be called when V8 no longer needs the data.
10456b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org    const uint8_t* data;
10466b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org    int length;
104769f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    BufferPolicy buffer_policy;
104869f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org
10493c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org   private:
1050aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org    // Prevent copying. Not implemented.
1051aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org    CachedData(const CachedData&);
1052aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org    CachedData& operator=(const CachedData&);
10536b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org  };
10546b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org
10556b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org  /**
10561e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org   * Source code which can be then compiled to a UnboundScript or Script.
10576b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   */
1058a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  class Source {
105969f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org   public:
106069f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    // Source takes ownership of CachedData.
1061a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    V8_INLINE Source(Local<String> source_string, const ScriptOrigin& origin,
106269f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org           CachedData* cached_data = NULL);
1063a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    V8_INLINE Source(Local<String> source_string,
1064a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org                     CachedData* cached_data = NULL);
1065a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    V8_INLINE ~Source();
106669f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org
106769f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    // Ownership of the CachedData or its buffers is *not* transferred to the
106869f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    // caller. The CachedData object is alive as long as the Source object is
106969f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    // alive.
1070a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    V8_INLINE const CachedData* GetCachedData() const;
107169f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org
107269f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org   private:
107369f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    friend class ScriptCompiler;
1074aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org    // Prevent copying. Not implemented.
107569f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    Source(const Source&);
1076a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    Source& operator=(const Source&);
10776b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org
10786b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org    Local<String> source_string;
10796b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org
10806b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org    // Origin information
10816b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org    Handle<Value> resource_name;
10826b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org    Handle<Integer> resource_line_offset;
10836b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org    Handle<Integer> resource_column_offset;
10846b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org    Handle<Boolean> resource_is_shared_cross_origin;
10856b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org
10864c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    // Cached data from previous compilation (if a kConsume*Cache flag is
10874c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    // set), or hold newly generated cache data (kProduce*Cache flags) are
10884c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    // set when calling a compile method.
108969f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    CachedData* cached_data;
10906b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org  };
10916b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org
1092b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  /**
1093b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   * For streaming incomplete script data to V8. The embedder should implement a
1094b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   * subclass of this class.
1095b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   */
1096b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  class ExternalSourceStream {
1097b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   public:
1098b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    virtual ~ExternalSourceStream() {}
1099b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org
1100b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    /**
1101b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org     * V8 calls this to request the next chunk of data from the embedder. This
1102b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org     * function will be called on a background thread, so it's OK to block and
1103b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org     * wait for the data, if the embedder doesn't have data yet. Returns the
1104b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org     * length of the data returned. When the data ends, GetMoreData should
1105b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org     * return 0. Caller takes ownership of the data.
1106b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org     *
1107b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org     * When streaming UTF-8 data, V8 handles multi-byte characters split between
1108b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org     * two data chunks, but doesn't handle multi-byte characters split between
1109b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org     * more than two data chunks. The embedder can avoid this problem by always
1110b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org     * returning at least 2 bytes of data.
1111b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org     *
1112b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org     * If the embedder wants to cancel the streaming, they should make the next
1113b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org     * GetMoreData call return 0. V8 will interpret it as end of data (and most
1114b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org     * probably, parsing will fail). The streaming task will return as soon as
1115b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org     * V8 has parsed the data it received so far.
1116b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org     */
1117b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    virtual size_t GetMoreData(const uint8_t** src) = 0;
1118b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  };
1119b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org
1120b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org
1121b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  /**
1122b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   * Source code which can be streamed into V8 in pieces. It will be parsed
1123b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   * while streaming. It can be compiled after the streaming is complete.
1124b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   * StreamedSource must be kept alive while the streaming task is ran (see
1125b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   * ScriptStreamingTask below).
1126b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   */
1127b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  class V8_EXPORT StreamedSource {
1128b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   public:
1129b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    enum Encoding { ONE_BYTE, TWO_BYTE, UTF8 };
1130b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org
1131b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    StreamedSource(ExternalSourceStream* source_stream, Encoding encoding);
1132b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    ~StreamedSource();
1133b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org
1134b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    // Ownership of the CachedData or its buffers is *not* transferred to the
1135b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    // caller. The CachedData object is alive as long as the StreamedSource
1136b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    // object is alive.
1137b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    const CachedData* GetCachedData() const;
1138b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org
1139b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    internal::StreamedSource* impl() const { return impl_; }
1140b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org
1141b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   private:
1142b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    // Prevent copying. Not implemented.
1143b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    StreamedSource(const StreamedSource&);
1144b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    StreamedSource& operator=(const StreamedSource&);
1145b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org
1146b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    internal::StreamedSource* impl_;
1147b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  };
1148b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org
1149b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  /**
1150b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   * A streaming task which the embedder must run on a background thread to
1151b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   * stream scripts into V8. Returned by ScriptCompiler::StartStreamingScript.
1152b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   */
1153b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  class ScriptStreamingTask {
1154b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   public:
1155b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    virtual ~ScriptStreamingTask() {}
1156b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    virtual void Run() = 0;
1157b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  };
1158b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org
11596b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org  enum CompileOptions {
11604c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    kNoCompileOptions = 0,
11614c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    kProduceParserCache,
11624c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    kConsumeParserCache,
11634c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    kProduceCodeCache,
11644c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    kConsumeCodeCache,
11654c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
11664c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    // Support the previous API for a transition period.
11674c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    kProduceDataToCache
11686b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org  };
11696b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org
11706b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org  /**
11716b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   * Compiles the specified script (context-independent).
117270d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org   * Cached data as part of the source object can be optionally produced to be
117370d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org   * consumed later to speed up compilation of identical source scripts.
117470d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org   *
117570d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org   * Note that when producing cached data, the source must point to NULL for
117670d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org   * cached data. When consuming cached data, the cached data must have been
117770d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org   * produced by the same version of V8.
11786b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   *
11796b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   * \param source Script source code.
11806b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   * \return Compiled script object (context independent; for running it must be
11816b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   *   bound to a context).
11826b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   */
11836b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org  static Local<UnboundScript> CompileUnbound(
118469f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org      Isolate* isolate, Source* source,
11856b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org      CompileOptions options = kNoCompileOptions);
11866b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org
11876b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org  /**
11886b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   * Compiles the specified script (bound to current context).
11896b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   *
11906b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   * \param source Script source code.
11916b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   * \param pre_data Pre-parsing data, as obtained by ScriptData::PreCompile()
11926b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   *   using pre_data speeds compilation if it's done multiple times.
11936b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   *   Owned by caller, no references are kept when this function returns.
11946b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   * \return Compiled script object, bound to the context that was active
11956b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   *   when this function was called. When run it will always use this
11966b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   *   context.
11976b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org   */
11986b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org  static Local<Script> Compile(
119969f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org      Isolate* isolate, Source* source,
12006b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org      CompileOptions options = kNoCompileOptions);
1201b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org
1202b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  /**
1203b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   * Returns a task which streams script data into V8, or NULL if the script
1204b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   * cannot be streamed. The user is responsible for running the task on a
1205b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   * background thread and deleting it. When ran, the task starts parsing the
1206b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   * script, and it will request data from the StreamedSource as needed. When
1207b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   * ScriptStreamingTask::Run exits, all data has been streamed and the script
1208b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   * can be compiled (see Compile below).
1209b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   *
1210b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   * This API allows to start the streaming with as little data as possible, and
1211b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   * the remaining data (for example, the ScriptOrigin) is passed to Compile.
1212b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   */
1213b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  static ScriptStreamingTask* StartStreamingScript(
1214b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org      Isolate* isolate, StreamedSource* source,
1215b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org      CompileOptions options = kNoCompileOptions);
1216b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org
1217b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  /**
1218b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   * Compiles a streamed script (bound to current context).
1219b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   *
1220b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   * This can only be called after the streaming has finished
1221b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   * (ScriptStreamingTask has been run). V8 doesn't construct the source string
1222b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   * during streaming, so the embedder needs to pass the full source here.
1223b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org   */
1224b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  static Local<Script> Compile(Isolate* isolate, StreamedSource* source,
1225b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org                               Handle<String> full_source_string,
1226b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org                               const ScriptOrigin& origin);
122743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
122843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
122943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
123043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
123143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * An error message.
123243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
1233594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Message {
123443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
12353291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  Local<String> Get() const;
12363291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  Local<String> GetSourceLine() const;
123743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
123865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  /**
12394b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org   * Returns the origin for the script from where the function causing the
12404b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org   * error originates.
12414b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org   */
12424b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  ScriptOrigin GetScriptOrigin() const;
12434b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org
12444b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  /**
124565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   * Returns the resource name for the script from where the function causing
124665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   * the error originates.
124765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   */
12483291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  Handle<Value> GetScriptResourceName() const;
124943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12509258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  /**
12516a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org   * Exception stack trace. By default stack traces are not captured for
12526a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org   * uncaught exceptions. SetCaptureStackTraceForUncaughtExceptions allows
12536a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org   * to change this option.
12546a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org   */
12556a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org  Handle<StackTrace> GetStackTrace() const;
12566a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org
12576a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org  /**
12589258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * Returns the number, 1-based, of the line where the error occurred.
12599258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   */
12603291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  int GetLineNumber() const;
126143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12629258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  /**
12639258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * Returns the index within the script of the first character where
12649258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * the error occurred.
12659258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   */
12663291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  int GetStartPosition() const;
12679258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
12689258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  /**
12699258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * Returns the index within the script of the last character where
12709258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * the error occurred.
12719258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   */
12723291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  int GetEndPosition() const;
12739258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
12749258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  /**
12759258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * Returns the index within the line of the first character where
12769258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * the error occurred.
12779258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   */
12783291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  int GetStartColumn() const;
12799258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
12809258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  /**
12819258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * Returns the index within the line of the last character where
12829258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * the error occurred.
12839258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   */
12843291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  int GetEndColumn() const;
12859258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
1286d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  /**
1287d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org   * Passes on the value set by the embedder when it fed the script from which
1288d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org   * this Message was generated to V8.
1289d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org   */
1290d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  bool IsSharedCrossOrigin() const;
1291d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
129243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // TODO(1245381): Print to a string instead of on a FILE.
129337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  static void PrintCurrentStackTrace(Isolate* isolate, FILE* out);
1294720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1295720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  static const int kNoLineNumberInfo = 0;
1296720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  static const int kNoColumnInfo = 0;
12978fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org  static const int kNoScriptIdInfo = 0;
1298720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org};
1299720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1300720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1301720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org/**
1302720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org * Representation of a JavaScript stack trace. The information collected is a
1303720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org * snapshot of the execution stack and the information remains valid after
1304720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org * execution continues.
1305720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org */
1306594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT StackTrace {
1307720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org public:
1308720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  /**
1309720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * Flags that determine what information is placed captured for each
1310720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * StackFrame when grabbing the current stack trace.
1311720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   */
1312720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  enum StackTraceOptions {
1313720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org    kLineNumber = 1,
1314720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org    kColumnOffset = 1 << 1 | kLineNumber,
1315720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org    kScriptName = 1 << 2,
1316720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org    kFunctionName = 1 << 3,
1317720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org    kIsEval = 1 << 4,
1318720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org    kIsConstructor = 1 << 5,
1319b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org    kScriptNameOrSourceURL = 1 << 6,
13208fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org    kScriptId = 1 << 7,
132154ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org    kExposeFramesAcrossSecurityOrigins = 1 << 8,
1322720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org    kOverview = kLineNumber | kColumnOffset | kScriptName | kFunctionName,
1323b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org    kDetailed = kOverview | kIsEval | kIsConstructor | kScriptNameOrSourceURL
1324720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  };
1325720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1326720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  /**
1327720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * Returns a StackFrame at a particular index.
1328720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   */
1329720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  Local<StackFrame> GetFrame(uint32_t index) const;
1330720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1331720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  /**
1332720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * Returns the number of StackFrames.
1333720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   */
1334720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  int GetFrameCount() const;
1335720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1336720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  /**
1337720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * Returns StackTrace as a v8::Array that contains StackFrame objects.
1338720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   */
1339720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  Local<Array> AsArray();
1340720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1341720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  /**
13427304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * Grab a snapshot of the current JavaScript execution stack.
1343720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   *
1344720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * \param frame_limit The maximum number of stack frames we want to capture.
1345720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * \param options Enumerates the set of things we will capture for each
1346720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   *   StackFrame.
1347720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   */
1348720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  static Local<StackTrace> CurrentStackTrace(
134937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org      Isolate* isolate,
135037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org      int frame_limit,
135137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org      StackTraceOptions options = kOverview);
1352720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org};
1353720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1354720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1355720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org/**
1356720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org * A single JavaScript stack frame.
1357720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org */
1358594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT StackFrame {
1359720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org public:
1360720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  /**
1361720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * Returns the number, 1-based, of the line for the associate function call.
1362720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * This method will return Message::kNoLineNumberInfo if it is unable to
1363720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * retrieve the line number, or if kLineNumber was not passed as an option
1364720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * when capturing the StackTrace.
1365720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   */
1366720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  int GetLineNumber() const;
1367720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1368720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  /**
1369720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * Returns the 1-based column offset on the line for the associated function
1370720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * call.
1371720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * This method will return Message::kNoColumnInfo if it is unable to retrieve
1372720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * the column number, or if kColumnOffset was not passed as an option when
1373720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * capturing the StackTrace.
1374720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   */
1375720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  int GetColumn() const;
1376720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1377720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  /**
13788fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org   * Returns the id of the script for the function for this StackFrame.
13798fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org   * This method will return Message::kNoScriptIdInfo if it is unable to
13808fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org   * retrieve the script id, or if kScriptId was not passed as an option when
13818fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org   * capturing the StackTrace.
13828fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org   */
13838fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org  int GetScriptId() const;
13848fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org
13858fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org  /**
1386720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * Returns the name of the resource that contains the script for the
1387720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * function for this StackFrame.
1388720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   */
1389720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  Local<String> GetScriptName() const;
1390720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1391720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  /**
1392b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org   * Returns the name of the resource that contains the script for the
1393b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org   * function for this StackFrame or sourceURL value if the script name
1394b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org   * is undefined and its source ends with //# sourceURL=... string or
1395b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org   * deprecated //@ sourceURL=... string.
1396b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org   */
1397b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  Local<String> GetScriptNameOrSourceURL() const;
1398b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org
1399b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  /**
1400720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * Returns the name of the function associated with this stack frame.
1401720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   */
1402720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  Local<String> GetFunctionName() const;
1403720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1404720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  /**
1405720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * Returns whether or not the associated function is compiled via a call to
1406720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * eval().
1407720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   */
1408720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  bool IsEval() const;
1409720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1410720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  /**
14117304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * Returns whether or not the associated function is called as a
1412720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * constructor via "new".
1413720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   */
1414720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  bool IsConstructor() const;
141543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
141643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
141743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1418594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org/**
1419594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org * A JSON Parser.
1420594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org */
1421594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT JSON {
1422594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org public:
1423594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  /**
1424594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org   * Tries to parse the string |json_string| and returns it as value if
1425594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org   * successful.
1426594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org   *
1427594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org   * \param json_string The string to parse.
1428594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org   * \return The corresponding value if successfully parsed.
1429594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org   */
1430594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  static Local<Value> Parse(Local<String> json_string);
1431594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org};
1432594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
1433594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
1434fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Value ---
143543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
143643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
143743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
1438727e995b7bba3c57fb1e5c156d386ca11894f781v * The superclass of all JavaScript values and objects.
143943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
1440594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Value : public Data {
144143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
144243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
144343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is the undefined value.  See ECMA-262
144443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * 4.3.10.
144543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
14464a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE bool IsUndefined() const;
144743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
144843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
144943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is the null value.  See ECMA-262
145043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * 4.3.11.
145143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
14524a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE bool IsNull() const;
145343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
145443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   /**
145543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is true.
145643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
145746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsTrue() const;
145843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
145943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
146043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is false.
146143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
146246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsFalse() const;
146343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
146443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
1465e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org   * Returns true if this value is a symbol or a string.
1466e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org   * This is an experimental feature.
1467e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org   */
1468e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  bool IsName() const;
1469e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
1470e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  /**
147143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is an instance of the String type.
147243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * See ECMA-262 8.4.
147343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
14744a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE bool IsString() const;
147543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
147643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
1477e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   * Returns true if this value is a symbol.
1478e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   * This is an experimental feature.
1479e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   */
1480e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  bool IsSymbol() const;
1481e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1482e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  /**
148343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is a function.
148443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
148546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsFunction() const;
148643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
148743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
148843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is an array.
148943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
149046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsArray() const;
149143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1492727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
149343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is an object.
149443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
149546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsObject() const;
149643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1497727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
149843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is boolean.
149943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
150046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsBoolean() const;
15019258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
1502727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
150343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is a number.
150443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
150546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsNumber() const;
150643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1507727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
150843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is external.
150943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
151046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsExternal() const;
151143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1512727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
151343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is a 32-bit signed integer.
151443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
151546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsInt32() const;
151643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15175a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  /**
1518c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.org   * Returns true if this value is a 32-bit unsigned integer.
1519ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org   */
152046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsUint32() const;
1521ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
1522ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  /**
15235a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * Returns true if this value is a Date.
15245a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   */
152546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsDate() const;
15265a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
152726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org  /**
15285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org   * Returns true if this value is an Arguments object.
15295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org   */
15305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  bool IsArgumentsObject() const;
15315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
15325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  /**
153384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   * Returns true if this value is a Boolean object.
153484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   */
153546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsBooleanObject() const;
153684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
153784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  /**
153884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   * Returns true if this value is a Number object.
153984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   */
154046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsNumberObject() const;
154184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
154284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  /**
154384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   * Returns true if this value is a String object.
154484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   */
154546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsStringObject() const;
154684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
154784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  /**
1548e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   * Returns true if this value is a Symbol object.
1549e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   * This is an experimental feature.
1550e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   */
1551e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  bool IsSymbolObject() const;
1552e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1553e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  /**
155484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   * Returns true if this value is a NativeError.
155584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   */
155646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsNativeError() const;
155784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
155884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  /**
155926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org   * Returns true if this value is a RegExp.
156026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org   */
156146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsRegExp() const;
156226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org
1563486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  /**
1564486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org   * Returns true if this value is a Promise.
1565486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org   * This is an experimental feature.
1566486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org   */
1567486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  bool IsPromise() const;
156857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
156957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
15706474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org   * Returns true if this value is a Map.
15716474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org   * This is an experimental feature.
15726474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org   */
15736474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  bool IsMap() const;
15746474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
15756474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  /**
15766474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org   * Returns true if this value is a Set.
15776474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org   * This is an experimental feature.
15786474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org   */
15796474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  bool IsSet() const;
15806474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
15816474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  /**
15826474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org   * Returns true if this value is a WeakMap.
15836474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org   * This is an experimental feature.
15846474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org   */
15856474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  bool IsWeakMap() const;
15866474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
15876474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  /**
15886474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org   * Returns true if this value is a WeakSet.
15896474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org   * This is an experimental feature.
15906474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org   */
15916474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  bool IsWeakSet() const;
15926474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
15936474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  /**
159457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Returns true if this value is an ArrayBuffer.
159557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * This is an experimental feature.
159657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
159757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool IsArrayBuffer() const;
159857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
159957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
16001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * Returns true if this value is an ArrayBufferView.
16011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * This is an experimental feature.
16021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   */
16031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  bool IsArrayBufferView() const;
16041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
16051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  /**
160657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Returns true if this value is one of TypedArrays.
160757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * This is an experimental feature.
160857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
160957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool IsTypedArray() const;
161057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
161157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
161257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Returns true if this value is an Uint8Array.
161357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * This is an experimental feature.
161457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
161557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool IsUint8Array() const;
161657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
161757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
161857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Returns true if this value is an Uint8ClampedArray.
161957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * This is an experimental feature.
162057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
162157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool IsUint8ClampedArray() const;
162257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
162357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
162457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Returns true if this value is an Int8Array.
162557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * This is an experimental feature.
162657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
162757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool IsInt8Array() const;
162857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
162957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
163057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Returns true if this value is an Uint16Array.
163157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * This is an experimental feature.
163257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
163357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool IsUint16Array() const;
163457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
163557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
163657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Returns true if this value is an Int16Array.
163757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * This is an experimental feature.
163857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
163957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool IsInt16Array() const;
164057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
164157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
164257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Returns true if this value is an Uint32Array.
164357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * This is an experimental feature.
164457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
164557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool IsUint32Array() const;
164657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
164757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
164857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Returns true if this value is an Int32Array.
164957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * This is an experimental feature.
165057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
165157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool IsInt32Array() const;
165257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
165357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
165457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Returns true if this value is a Float32Array.
165557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * This is an experimental feature.
165657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
165757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool IsFloat32Array() const;
165857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
165957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
166057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Returns true if this value is a Float64Array.
166157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * This is an experimental feature.
166257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
166357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool IsFloat64Array() const;
166457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
16651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  /**
16661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * Returns true if this value is a DataView.
16671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * This is an experimental feature.
16681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   */
16691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  bool IsDataView() const;
16701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
167146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Boolean> ToBoolean() const;
167246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Number> ToNumber() const;
167346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<String> ToString() const;
167446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<String> ToDetailString() const;
167546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Object> ToObject() const;
167646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Integer> ToInteger() const;
167746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Uint32> ToUint32() const;
167846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Int32> ToInt32() const;
167943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
168043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
168143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Attempts to convert a string to an array index.
168243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns an empty handle if the conversion fails.
168343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
168446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Uint32> ToArrayIndex() const;
168543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
168646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool BooleanValue() const;
168746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  double NumberValue() const;
168846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int64_t IntegerValue() const;
168946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  uint32_t Uint32Value() const;
169046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int32_t Int32Value() const;
169143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
169243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /** JS == */
169346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool Equals(Handle<Value> that) const;
169446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool StrictEquals(Handle<Value> that) const;
16953d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  bool SameValue(Handle<Value> that) const;
16969d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
16974a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  template <class T> V8_INLINE static Value* Cast(T* value);
16981fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
169918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org private:
17004a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE bool QuickIsUndefined() const;
17014a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE bool QuickIsNull() const;
17024a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE bool QuickIsString() const;
170346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool FullIsUndefined() const;
170446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool FullIsNull() const;
170546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool FullIsString() const;
170643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
170743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
170843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
170943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
171043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * The superclass of primitive values.  See ECMA-262 4.3.2.
171143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
1712594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Primitive : public Value { };
171343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
171443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
171543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
171643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * A primitive boolean value (ECMA-262, 4.3.14).  Either the true
171743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * or false value.
171843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
1719594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Boolean : public Primitive {
172043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
172146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool Value() const;
172237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  V8_INLINE static Handle<Boolean> New(Isolate* isolate, bool value);
172343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
172443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
172543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
172643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
1727e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org * A superclass for symbols and strings.
1728e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org */
1729e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgclass V8_EXPORT Name : public Primitive {
1730e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org public:
1731e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  V8_INLINE static Name* Cast(v8::Value* obj);
1732e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org private:
1733e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  static void CheckCast(v8::Value* obj);
1734e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org};
1735e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
1736e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
1737e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org/**
1738727e995b7bba3c57fb1e5c156d386ca11894f781v * A JavaScript string value (ECMA-262, 4.3.17).
173943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
1740e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgclass V8_EXPORT String : public Name {
174143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
174256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  enum Encoding {
174356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    UNKNOWN_ENCODING = 0x1,
174456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    TWO_BYTE_ENCODING = 0x0,
17452c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    ASCII_ENCODING = 0x4,  // TODO(yangguo): deprecate this.
174646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    ONE_BYTE_ENCODING = 0x4
174756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  };
17489258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  /**
17499258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * Returns the number of characters in this string.
17509258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   */
175146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int Length() const;
175243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1753727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
17549258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * Returns the number of bytes in the UTF-8 encoded
17559258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * representation of this string.
17569258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   */
175746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int Utf8Length() const;
17589258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
17599258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  /**
1760dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org   * Returns whether this string is known to contain only one byte data.
1761dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org   * Does not read the string.
1762dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org   * False negatives are possible.
176346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org   */
176446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsOneByte() const;
17652c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org
17662c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  /**
1767dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org   * Returns whether this string contain only one byte data.
1768dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org   * Will read the entire string in some cases.
1769dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org   */
1770dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  bool ContainsOnlyOneByte() const;
1771dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
1772dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  /**
1773727e995b7bba3c57fb1e5c156d386ca11894f781v   * Write the contents of the string to an external buffer.
1774727e995b7bba3c57fb1e5c156d386ca11894f781v   * If no arguments are given, expects the buffer to be large
1775727e995b7bba3c57fb1e5c156d386ca11894f781v   * enough to hold the entire string and NULL terminator. Copies
1776727e995b7bba3c57fb1e5c156d386ca11894f781v   * the contents of the string and the NULL terminator into the
1777727e995b7bba3c57fb1e5c156d386ca11894f781v   * buffer.
1778727e995b7bba3c57fb1e5c156d386ca11894f781v   *
17795f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org   * WriteUtf8 will not write partial UTF-8 sequences, preferring to stop
17805f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org   * before the end of the buffer.
17815f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org   *
1782727e995b7bba3c57fb1e5c156d386ca11894f781v   * Copies up to length characters into the output buffer.
1783727e995b7bba3c57fb1e5c156d386ca11894f781v   * Only null-terminates if there is enough space in the buffer.
1784727e995b7bba3c57fb1e5c156d386ca11894f781v   *
1785727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param buffer The buffer into which the string will be copied.
1786727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param start The starting position within the string at which
1787727e995b7bba3c57fb1e5c156d386ca11894f781v   * copying begins.
17885f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org   * \param length The number of characters to copy from the string.  For
17895f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org   *    WriteUtf8 the number of bytes in the buffer.
1790357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org   * \param nchars_ref The number of characters written, can be NULL.
1791ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org   * \param options Various options that might affect performance of this or
1792c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org   *    subsequent operations.
17935f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org   * \return The number of characters copied to the buffer excluding the null
17945f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org   *    terminator.  For WriteUtf8: The number of bytes copied to the buffer
1795ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org   *    including the null terminator (if written).
1796727e995b7bba3c57fb1e5c156d386ca11894f781v   */
1797ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  enum WriteOptions {
1798ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org    NO_OPTIONS = 0,
1799ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org    HINT_MANY_WRITES_EXPECTED = 1,
1800304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    NO_NULL_TERMINATION = 2,
18012c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    PRESERVE_ASCII_NULL = 4,  // TODO(yangguo): deprecate this.
18022c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    PRESERVE_ONE_BYTE_NULL = 4,
1803c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org    // Used by WriteUtf8 to replace orphan surrogate code units with the
1804c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org    // unicode replacement character. Needs to be set to guarantee valid UTF-8
1805c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org    // output.
1806c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org    REPLACE_INVALID_UTF8 = 8
1807b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org  };
1808b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org
180934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  // 16-bit character codes.
181046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int Write(uint16_t* buffer,
181146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org            int start = 0,
181246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org            int length = -1,
181346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org            int options = NO_OPTIONS) const;
181446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  // One byte characters.
181546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int WriteOneByte(uint8_t* buffer,
181646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                   int start = 0,
181746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                   int length = -1,
181846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                   int options = NO_OPTIONS) const;
181934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  // UTF-8 encoded characters.
182046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int WriteUtf8(char* buffer,
182146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                int length = -1,
182246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                int* nchars_ref = NULL,
182346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                int options = NO_OPTIONS) const;
182443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1825727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
1826563b8dce8453a0464b60f21746e2f95a893f7a3aager@chromium.org   * A zero length string.
1827563b8dce8453a0464b60f21746e2f95a893f7a3aager@chromium.org   */
18284a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static v8::Local<v8::String> Empty(Isolate* isolate);
1829563b8dce8453a0464b60f21746e2f95a893f7a3aager@chromium.org
1830563b8dce8453a0464b60f21746e2f95a893f7a3aager@chromium.org  /**
1831727e995b7bba3c57fb1e5c156d386ca11894f781v   * Returns true if the string is external
1832727e995b7bba3c57fb1e5c156d386ca11894f781v   */
183346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsExternal() const;
183443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1835727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
18362c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org   * Returns true if the string is both external and one-byte.
1837727e995b7bba3c57fb1e5c156d386ca11894f781v   */
18382c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  bool IsExternalOneByte() const;
18392c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
18402c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  // TODO(yangguo): deprecate this.
18412c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  bool IsExternalAscii() const { return IsExternalOneByte(); }
184213bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org
1843594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  class V8_EXPORT ExternalStringResourceBase {  // NOLINT
184413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org   public:
184513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org    virtual ~ExternalStringResourceBase() {}
18462356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
184713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org   protected:
184813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org    ExternalStringResourceBase() {}
18492356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
18502356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org    /**
18512356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org     * Internally V8 will call this Dispose method when the external string
18522356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org     * resource is no longer needed. The default implementation will use the
18532356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org     * delete operator. This method can be overridden in subclasses to
18542356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org     * control how allocated external string resources are disposed.
18552356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org     */
18562356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org    virtual void Dispose() { delete this; }
18572356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
185813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org   private:
185913bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org    // Disallow copying and assigning.
186013bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org    ExternalStringResourceBase(const ExternalStringResourceBase&);
186113bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org    void operator=(const ExternalStringResourceBase&);
18622356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
18632356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org    friend class v8::internal::Heap;
186413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  };
186513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org
1866727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
1867727e995b7bba3c57fb1e5c156d386ca11894f781v   * An ExternalStringResource is a wrapper around a two-byte string
1868727e995b7bba3c57fb1e5c156d386ca11894f781v   * buffer that resides outside V8's heap. Implement an
1869727e995b7bba3c57fb1e5c156d386ca11894f781v   * ExternalStringResource to manage the life cycle of the underlying
18709258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * buffer.  Note that the string data must be immutable.
1871727e995b7bba3c57fb1e5c156d386ca11894f781v   */
1872594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  class V8_EXPORT ExternalStringResource
187313bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org      : public ExternalStringResourceBase {
187443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   public:
187543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    /**
187643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     * Override the destructor to manage the life cycle of the underlying
187743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     * buffer.
187843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     */
187943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    virtual ~ExternalStringResource() {}
18802356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
18812356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org    /**
18822356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org     * The string data from the underlying buffer.
18832356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org     */
188443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    virtual const uint16_t* data() const = 0;
18852356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
18862356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org    /**
18872356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org     * The length of the string. That is, the number of two-byte characters.
18882356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org     */
188943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    virtual size_t length() const = 0;
18902356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
189143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   protected:
189243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ExternalStringResource() {}
189343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  };
189443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
189543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
18962c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org   * An ExternalOneByteStringResource is a wrapper around an one-byte
1897727e995b7bba3c57fb1e5c156d386ca11894f781v   * string buffer that resides outside V8's heap. Implement an
18982c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org   * ExternalOneByteStringResource to manage the life cycle of the
18999258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * underlying buffer.  Note that the string data must be immutable
19002c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org   * and that the data must be Latin-1 and not UTF-8, which would require
19012c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org   * special treatment internally in the engine and do not allow efficient
19022c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org   * indexing.  Use String::New or convert to 16 bit data for non-Latin1.
1903727e995b7bba3c57fb1e5c156d386ca11894f781v   */
190443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19052c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  class V8_EXPORT ExternalOneByteStringResource
190613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org      : public ExternalStringResourceBase {
190743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   public:
190843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    /**
190943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     * Override the destructor to manage the life cycle of the underlying
191043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     * buffer.
191143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     */
19122c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    virtual ~ExternalOneByteStringResource() {}
191343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    /** The string data from the underlying buffer.*/
191443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    virtual const char* data() const = 0;
19152c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    /** The number of Latin-1 characters in the string.*/
191643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    virtual size_t length() const = 0;
191743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   protected:
19182c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    ExternalOneByteStringResource() {}
191943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  };
192043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19212c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  typedef ExternalOneByteStringResource ExternalAsciiStringResource;
192246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
192343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
192456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org   * If the string is an external string, return the ExternalStringResourceBase
192556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org   * regardless of the encoding, otherwise return NULL.  The encoding of the
192656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org   * string is returned in encoding_out.
192756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org   */
19284a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE ExternalStringResourceBase* GetExternalStringResourceBase(
19294a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org      Encoding* encoding_out) const;
193056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
193156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  /**
19329085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org   * Get the ExternalStringResource for an external string.  Returns
19339085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org   * NULL if IsExternal() doesn't return true.
193443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
19354a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE ExternalStringResource* GetExternalStringResource() const;
193643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
193743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
19382c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org   * Get the ExternalOneByteStringResource for an external one-byte string.
19392c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org   * Returns NULL if IsExternalOneByte() doesn't return true.
194043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
19412c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const ExternalOneByteStringResource* GetExternalOneByteStringResource() const;
19422c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
19432c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  // TODO(yangguo): deprecate this.
19442c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const ExternalAsciiStringResource* GetExternalAsciiStringResource() const {
19452c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    return GetExternalOneByteStringResource();
19462c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  }
194743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19484a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static String* Cast(v8::Value* obj);
194943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
195032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  enum NewStringType {
195132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org    kNormalString, kInternalizedString, kUndetectableString
195232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  };
195332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
195432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  /** Allocates a new string from UTF-8 data.*/
195532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  static Local<String> NewFromUtf8(Isolate* isolate,
195632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org                                  const char* data,
195732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org                                  NewStringType type = kNormalString,
195832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org                                  int length = -1);
195932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
196032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  /** Allocates a new string from Latin-1 data.*/
196132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  static Local<String> NewFromOneByte(
196232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org      Isolate* isolate,
196332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org      const uint8_t* data,
196432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org      NewStringType type = kNormalString,
196532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org      int length = -1);
196632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
196732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  /** Allocates a new string from UTF-16 data.*/
196832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  static Local<String> NewFromTwoByte(
196932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org      Isolate* isolate,
197032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org      const uint16_t* data,
197132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org      NewStringType type = kNormalString,
197232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org      int length = -1);
197343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1974727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
19759d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com   * Creates a new string by concatenating the left and the right strings
19769d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com   * passed in as parameters.
19779d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com   */
197846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static Local<String> Concat(Handle<String> left, Handle<String> right);
19799d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
19809d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  /**
1981727e995b7bba3c57fb1e5c156d386ca11894f781v   * Creates a new external string using the data defined in the given
19821af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org   * resource. When the external string is no longer live on V8's heap the
19832356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org   * resource will be disposed by calling its Dispose method. The caller of
19842356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org   * this function should not otherwise delete or modify the resource. Neither
19852356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org   * should the underlying buffer be deallocated or modified except through the
19862356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org   * destructor of the external string resource.
1987727e995b7bba3c57fb1e5c156d386ca11894f781v   */
198837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  static Local<String> NewExternal(Isolate* isolate,
198937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org                                   ExternalStringResource* resource);
1990bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
19916f10e41fef1524c70846d970268de222e41c594cager@chromium.org  /**
19926f10e41fef1524c70846d970268de222e41c594cager@chromium.org   * Associate an external string resource with this string by transforming it
19936f10e41fef1524c70846d970268de222e41c594cager@chromium.org   * in place so that existing references to this string in the JavaScript heap
19946f10e41fef1524c70846d970268de222e41c594cager@chromium.org   * will use the external string resource. The external string resource's
19957304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * character contents need to be equivalent to this string.
19966f10e41fef1524c70846d970268de222e41c594cager@chromium.org   * Returns true if the string has been changed to be an external string.
19971af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org   * The string is not modified if the operation fails. See NewExternal for
19981af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org   * information on the lifetime of the resource.
19996f10e41fef1524c70846d970268de222e41c594cager@chromium.org   */
200046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool MakeExternal(ExternalStringResource* resource);
200143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2002727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
20032c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org   * Creates a new external string using the one-byte data defined in the given
20041af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org   * resource. When the external string is no longer live on V8's heap the
20052356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org   * resource will be disposed by calling its Dispose method. The caller of
20062356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org   * this function should not otherwise delete or modify the resource. Neither
20072356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org   * should the underlying buffer be deallocated or modified except through the
20082356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org   * destructor of the external string resource.
200946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org   */
201037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  static Local<String> NewExternal(Isolate* isolate,
20112c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org                                   ExternalOneByteStringResource* resource);
2012bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
20136f10e41fef1524c70846d970268de222e41c594cager@chromium.org  /**
20146f10e41fef1524c70846d970268de222e41c594cager@chromium.org   * Associate an external string resource with this string by transforming it
20156f10e41fef1524c70846d970268de222e41c594cager@chromium.org   * in place so that existing references to this string in the JavaScript heap
20166f10e41fef1524c70846d970268de222e41c594cager@chromium.org   * will use the external string resource. The external string resource's
20177304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * character contents need to be equivalent to this string.
20186f10e41fef1524c70846d970268de222e41c594cager@chromium.org   * Returns true if the string has been changed to be an external string.
20191af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org   * The string is not modified if the operation fails. See NewExternal for
20201af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org   * information on the lifetime of the resource.
20216f10e41fef1524c70846d970268de222e41c594cager@chromium.org   */
20222c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  bool MakeExternal(ExternalOneByteStringResource* resource);
202343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20245a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com  /**
20255a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com   * Returns true if this string can be made external.
20265a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com   */
202746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool CanMakeExternal();
20285a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com
202943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
203034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org   * Converts an object to a UTF-8-encoded character array.  Useful if
203171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org   * you want to print the object.  If conversion to a string fails
203234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org   * (e.g. due to an exception in the toString() method of the object)
203371daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org   * then the length() method returns 0 and the * operator returns
203471daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org   * NULL.
20359258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   */
2036594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  class V8_EXPORT Utf8Value {
20379258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   public:
20389258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org    explicit Utf8Value(Handle<v8::Value> obj);
20399258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org    ~Utf8Value();
2040a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org    char* operator*() { return str_; }
2041a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org    const char* operator*() const { return str_; }
2042a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org    int length() const { return length_; }
20439258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   private:
20449258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org    char* str_;
20459258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org    int length_;
204641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
204741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    // Disallow copying and assigning.
204841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    Utf8Value(const Utf8Value&);
204941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    void operator=(const Utf8Value&);
20509258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  };
20519258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
20529258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  /**
205343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Converts an object to a two-byte string.
205471daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org   * If conversion to a string fails (eg. due to an exception in the toString()
205571daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org   * method of the object) then the length() method returns 0 and the * operator
205671daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org   * returns NULL.
205743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
2058594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  class V8_EXPORT Value {
205943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   public:
206043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    explicit Value(Handle<v8::Value> obj);
206143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ~Value();
2062a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org    uint16_t* operator*() { return str_; }
2063a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org    const uint16_t* operator*() const { return str_; }
2064a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org    int length() const { return length_; }
206543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   private:
206643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    uint16_t* str_;
20679258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org    int length_;
206841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
206941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    // Disallow copying and assigning.
207041044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    Value(const Value&);
207141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    void operator=(const Value&);
207243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  };
20739d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
207418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org private:
207546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void VerifyExternalStringResourceBase(ExternalStringResourceBase* v,
207646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                                        Encoding encoding) const;
207746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void VerifyExternalStringResource(ExternalStringResource* val) const;
207846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(v8::Value* obj);
207943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
208043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
208143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
208243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
2083e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org * A JavaScript symbol (ECMA-262 edition 6)
2084e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org *
2085e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org * This is an experimental feature. Use at your own risk.
2086e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org */
2087e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgclass V8_EXPORT Symbol : public Name {
2088e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org public:
2089e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // Returns the print name string of the symbol, or undefined if none.
2090e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Local<Value> Name() const;
2091e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
2092a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  // Create a symbol. If name is not empty, it will be used as the description.
20930cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  static Local<Symbol> New(
2094a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org      Isolate *isolate, Local<String> name = Local<String>());
2095a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org
2096a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  // Access global symbol registry.
2097a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  // Note that symbols created this way are never collected, so
2098a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  // they should only be used for statically fixed properties.
2099a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  // Also, there is only one global name space for the names used as keys.
2100a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  // To minimize the potential for clashes, use qualified names as keys.
2101a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  static Local<Symbol> For(Isolate *isolate, Local<String> name);
2102a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org
2103a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  // Retrieve a global symbol. Similar to |For|, but using a separate
2104a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  // registry that is not accessible by (and cannot clash with) JavaScript code.
2105a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  static Local<Symbol> ForApi(Isolate *isolate, Local<String> name);
2106e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
21077dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org  // Well-known symbols
21087dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org  static Local<Symbol> GetIterator(Isolate* isolate);
21097dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org  static Local<Symbol> GetUnscopables(Isolate* isolate);
21107dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org
21114a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static Symbol* Cast(v8::Value* obj);
21127dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org
2113e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org private:
2114e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Symbol();
2115e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  static void CheckCast(v8::Value* obj);
2116e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org};
2117e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
2118e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
2119e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org/**
21200cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org * A private symbol
21210cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org *
21220cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org * This is an experimental feature. Use at your own risk.
21230cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org */
21240cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgclass V8_EXPORT Private : public Data {
21250cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org public:
21260cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  // Returns the print name string of the private symbol, or undefined if none.
21270cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  Local<Value> Name() const;
21280cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
2129a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  // Create a private symbol. If name is not empty, it will be the description.
2130a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  static Local<Private> New(
2131a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org      Isolate *isolate, Local<String> name = Local<String>());
2132a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org
2133a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  // Retrieve a global private symbol. If a symbol with this name has not
2134a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  // been retrieved in the same isolate before, it is created.
2135a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  // Note that private symbols created this way are never collected, so
2136a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  // they should only be used for statically fixed properties.
2137a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  // Also, there is only one global name space for the names used as keys.
2138a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  // To minimize the potential for clashes, use qualified names as keys,
2139a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  // e.g., "Class#property".
2140a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  static Local<Private> ForApi(Isolate *isolate, Local<String> name);
21410cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
21420cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org private:
21430cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  Private();
21440cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org};
21450cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
21460cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
21470cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org/**
2148727e995b7bba3c57fb1e5c156d386ca11894f781v * A JavaScript number value (ECMA-262, 4.3.20)
214943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
2150594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Number : public Primitive {
215143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
215246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  double Value() const;
2153bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  static Local<Number> New(Isolate* isolate, double value);
21544a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static Number* Cast(v8::Value* obj);
215543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
215646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Number();
215746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(v8::Value* obj);
215843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
215943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
216043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
216143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
2162727e995b7bba3c57fb1e5c156d386ca11894f781v * A JavaScript value representing a signed integer.
216343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
2164594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Integer : public Number {
216543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
216637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  static Local<Integer> New(Isolate* isolate, int32_t value);
216737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  static Local<Integer> NewFromUnsigned(Isolate* isolate, uint32_t value);
216846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int64_t Value() const;
21694a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static Integer* Cast(v8::Value* obj);
217043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
217146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Integer();
217246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(v8::Value* obj);
217343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
217443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
217543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
217643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
2177727e995b7bba3c57fb1e5c156d386ca11894f781v * A JavaScript value representing a 32-bit signed integer.
217843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
2179594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Int32 : public Integer {
218043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
218146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int32_t Value() const;
218243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
218346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Int32();
218443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
218543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
218643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
218743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
2188727e995b7bba3c57fb1e5c156d386ca11894f781v * A JavaScript value representing a 32-bit unsigned integer.
218943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
2190594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Uint32 : public Integer {
219143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
219246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  uint32_t Value() const;
219343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
219446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Uint32();
219543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
219643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
219743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
219843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenenum PropertyAttribute {
219943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  None       = 0,
220043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ReadOnly   = 1 << 0,
220143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  DontEnum   = 1 << 1,
220243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  DontDelete = 1 << 2
220343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
220443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22053811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgenum ExternalArrayType {
2206af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  kExternalInt8Array = 1,
2207af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  kExternalUint8Array,
2208af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  kExternalInt16Array,
2209af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  kExternalUint16Array,
2210af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  kExternalInt32Array,
2211af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  kExternalUint32Array,
2212af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  kExternalFloat32Array,
2213af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  kExternalFloat64Array,
2214af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  kExternalUint8ClampedArray,
2215af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org
2216af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  // Legacy constant names
2217af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  kExternalByteArray = kExternalInt8Array,
2218af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  kExternalUnsignedByteArray = kExternalUint8Array,
2219af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  kExternalShortArray = kExternalInt16Array,
2220af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  kExternalUnsignedShortArray = kExternalUint16Array,
2221af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  kExternalIntArray = kExternalInt32Array,
2222af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  kExternalUnsignedIntArray = kExternalUint32Array,
2223af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  kExternalFloatArray = kExternalFloat32Array,
2224af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  kExternalDoubleArray = kExternalFloat64Array,
2225af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  kExternalPixelArray = kExternalUint8ClampedArray
22263811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org};
22273811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
222843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
22299155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org * Accessor[Getter|Setter] are used as callback functions when
22309155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org * setting|getting a particular property. See Object and ObjectTemplate's
22319155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org * method SetAccessor.
22329155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org */
2233bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*AccessorGetterCallback)(
2234bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    Local<String> property,
2235bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<Value>& info);
2236e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgtypedef void (*AccessorNameGetterCallback)(
2237e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org    Local<Name> property,
2238e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org    const PropertyCallbackInfo<Value>& info);
22399155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
22409155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
2241bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*AccessorSetterCallback)(
2242bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    Local<String> property,
2243bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    Local<Value> value,
2244bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<void>& info);
2245e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgtypedef void (*AccessorNameSetterCallback)(
2246e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org    Local<Name> property,
2247e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org    Local<Value> value,
2248e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org    const PropertyCallbackInfo<void>& info);
22499155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
22509155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
22519155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org/**
22529155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org * Access control specifications.
22539155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org *
22549155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org * Some accessors should be accessible across contexts.  These
22559155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org * accessors have an explicit access control parameter which specifies
22569155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org * the kind of cross-context access that should be allowed.
22579155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org *
22588d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org * TODO(dcarney): Remove PROHIBITS_OVERWRITING as it is now unused.
22599155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org */
22609155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgenum AccessControl {
22619155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  DEFAULT               = 0,
22629155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  ALL_CAN_READ          = 1,
22639155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  ALL_CAN_WRITE         = 1 << 1,
22649155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  PROHIBITS_OVERWRITING = 1 << 2
22659155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org};
22669155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
22679155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
22689155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org/**
2269727e995b7bba3c57fb1e5c156d386ca11894f781v * A JavaScript object (ECMA-262, 4.3.3)
227043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
2271594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Object : public Value {
227243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
22739bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  bool Set(Handle<Value> key, Handle<Value> value);
227465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
227546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool Set(uint32_t index, Handle<Value> value);
2276ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
2277fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org  // Sets an own property on this object bypassing interceptors and
227865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  // overriding accessors or read-only properties.
227965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  //
228065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  // Note that if the object has an interceptor the property will be set
228165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  // locally, but since the interceptor takes precedence the local property
228265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  // will only be returned if the interceptor doesn't return a value.
228365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  //
228465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  // Note also that this only works for named properties.
228546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool ForceSet(Handle<Value> key,
228646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                Handle<Value> value,
228746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                PropertyAttribute attribs = None);
2288e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
228946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Value> Get(Handle<Value> key);
229043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
229146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Value> Get(uint32_t index);
2292ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
2293717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org  /**
2294717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org   * Gets the property attributes of a property which can be None or
2295717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org   * any combination of ReadOnly, DontEnum and DontDelete. Returns
2296717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org   * None when the property doesn't exist.
2297717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org   */
229846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  PropertyAttribute GetPropertyAttributes(Handle<Value> key);
2299717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org
2300d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  /**
2301d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org   * Returns Object.getOwnPropertyDescriptor as per ES5 section 15.2.3.3.
2302d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org   */
2303d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  Local<Value> GetOwnPropertyDescriptor(Local<String> key);
2304d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org
2305e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  bool Has(Handle<Value> key);
2306e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
2307e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  bool Delete(Handle<Value> key);
2308e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
2309e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  // Delete a property on this object bypassing interceptors and
2310e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  // ignoring dont-delete attributes.
231146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool ForceDelete(Handle<Value> key);
2312e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
231346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool Has(uint32_t index);
2314e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
231546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool Delete(uint32_t index);
231643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2317bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  bool SetAccessor(Handle<String> name,
2318bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                   AccessorGetterCallback getter,
2319bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                   AccessorSetterCallback setter = 0,
2320bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                   Handle<Value> data = Handle<Value>(),
2321bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                   AccessControl settings = DEFAULT,
2322bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                   PropertyAttribute attribute = None);
2323e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  bool SetAccessor(Handle<Name> name,
2324e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org                   AccessorNameGetterCallback getter,
2325e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org                   AccessorNameSetterCallback setter = 0,
2326e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org                   Handle<Value> data = Handle<Value>(),
2327e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org                   AccessControl settings = DEFAULT,
2328e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org                   PropertyAttribute attribute = None);
23299155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
2330750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  // This function is not yet stable and should not be used at this time.
2331e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  bool SetDeclaredAccessor(Local<Name> name,
23323d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org                           Local<DeclaredAccessorDescriptor> descriptor,
23333d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org                           PropertyAttribute attribute = None,
23343d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org                           AccessControl settings = DEFAULT);
2335750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
2336e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  void SetAccessorProperty(Local<Name> name,
2337a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org                           Local<Function> getter,
2338a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org                           Handle<Function> setter = Handle<Function>(),
2339a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org                           PropertyAttribute attribute = None,
2340a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org                           AccessControl settings = DEFAULT);
2341a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org
234243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
23430cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org   * Functionality for private properties.
23440cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org   * This is an experimental feature, use at your own risk.
23450cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org   * Note: Private properties are inherited. Do not rely on this, since it may
23460cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org   * change.
23470cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org   */
23480cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  bool HasPrivate(Handle<Private> key);
23490cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  bool SetPrivate(Handle<Private> key, Handle<Value> value);
23500cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  bool DeletePrivate(Handle<Private> key);
23510cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  Local<Value> GetPrivate(Handle<Private> key);
23520cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
23530cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  /**
23545a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * Returns an array containing the names of the enumerable properties
23555a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * of this object, including properties from prototype objects.  The
23565a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * array returned by this method contains the same values as would
23575a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * be enumerated by a for-in statement over this object.
23585a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   */
235946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Array> GetPropertyNames();
23605a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
23615a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  /**
23626d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org   * This function has the same functionality as GetPropertyNames but
23636d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org   * the returned array doesn't contain the names of properties from
23646d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org   * prototype objects.
23656d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org   */
236646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Array> GetOwnPropertyNames();
23676d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
23686d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  /**
236943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Get the prototype object.  This does not skip objects marked to
237043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * be skipped by __proto__ and it does not consult the security
237143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * handler.
237243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
237346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Value> GetPrototype();
237443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
237543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
23765c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * Set the prototype object.  This does not skip objects marked to
23775c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * be skipped by __proto__ and it does not consult the security
23785c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * handler.
23795c838251403b0be9a882540f1922577abba4c872ager@chromium.org   */
238046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool SetPrototype(Handle<Value> prototype);
23815c838251403b0be9a882540f1922577abba4c872ager@chromium.org
23825c838251403b0be9a882540f1922577abba4c872ager@chromium.org  /**
2383900d3b7262f6cf66f9e2d89ceb64ffd929c6cca0sgjesse@chromium.org   * Finds an instance of the given function template in the prototype
2384900d3b7262f6cf66f9e2d89ceb64ffd929c6cca0sgjesse@chromium.org   * chain.
2385900d3b7262f6cf66f9e2d89ceb64ffd929c6cca0sgjesse@chromium.org   */
238646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Object> FindInstanceInPrototypeChain(Handle<FunctionTemplate> tmpl);
2387900d3b7262f6cf66f9e2d89ceb64ffd929c6cca0sgjesse@chromium.org
2388900d3b7262f6cf66f9e2d89ceb64ffd929c6cca0sgjesse@chromium.org  /**
238943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Call builtin Object.prototype.toString on this object.
239043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * This is different from Value::ToString() that may call
239143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * user-defined toString function. This one does not.
239243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
239346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<String> ObjectProtoToString();
239443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2395beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  /**
2396beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org   * Returns the name of the function invoked as a constructor for this object.
2397beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org   */
239846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<String> GetConstructorName();
2399beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
2400212ac23f8231d169b4aa6737d762099993020826kasper.lund  /** Gets the number of internal fields for this Object. */
240146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int InternalFieldCount();
2402eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
2403ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  /** Same as above, but works for Persistents */
2404ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  V8_INLINE static int InternalFieldCount(
2405ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      const PersistentBase<Object>& object) {
2406ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    return object.val_->InternalFieldCount();
2407ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  }
2408ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2409eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  /** Gets the value from an internal field. */
24104a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Local<Value> GetInternalField(int index);
2411eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
2412212ac23f8231d169b4aa6737d762099993020826kasper.lund  /** Sets the value in an internal field. */
241346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void SetInternalField(int index, Handle<Value> value);
24149d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
2415eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  /**
2416eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * Gets a 2-byte-aligned native pointer from an internal field. This field
2417eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * must have been set by SetAlignedPointerInInternalField, everything else
2418eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * leads to undefined behavior.
2419eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   */
24204a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE void* GetAlignedPointerFromInternalField(int index);
2421eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
2422ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  /** Same as above, but works for Persistents */
2423ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  V8_INLINE static void* GetAlignedPointerFromInternalField(
2424ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      const PersistentBase<Object>& object, int index) {
2425ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    return object.val_->GetAlignedPointerFromInternalField(index);
2426ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  }
2427ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2428eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  /**
2429eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * Sets a 2-byte-aligned native pointer in an internal field. To retrieve such
2430eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * a field, GetAlignedPointerFromInternalField must be used, everything else
2431eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * leads to undefined behavior.
2432eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   */
243346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void SetAlignedPointerInInternalField(int index, void* value);
2434e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org
243543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Testers for local properties.
243646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool HasOwnProperty(Handle<String> key);
243746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool HasRealNamedProperty(Handle<String> key);
243846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool HasRealIndexedProperty(uint32_t index);
243946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool HasRealNamedCallbackProperty(Handle<String> key);
244043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
244143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
244243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * If result.IsEmpty() no real property was located in the prototype chain.
244343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * This means interceptors in the prototype chain are not called.
244443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
244546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Value> GetRealNamedPropertyInPrototypeChain(Handle<String> key);
244698aff2fe110015974dbb787dc353f9760034df71sgjesse@chromium.org
244798aff2fe110015974dbb787dc353f9760034df71sgjesse@chromium.org  /**
244898aff2fe110015974dbb787dc353f9760034df71sgjesse@chromium.org   * If result.IsEmpty() no real property was located on the object or
244998aff2fe110015974dbb787dc353f9760034df71sgjesse@chromium.org   * in the prototype chain.
245098aff2fe110015974dbb787dc353f9760034df71sgjesse@chromium.org   * This means interceptors in the prototype chain are not called.
245198aff2fe110015974dbb787dc353f9760034df71sgjesse@chromium.org   */
245246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Value> GetRealNamedProperty(Handle<String> key);
245343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
245443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /** Tests for a named lookup interceptor.*/
245546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool HasNamedLookupInterceptor();
245643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2457212ac23f8231d169b4aa6737d762099993020826kasper.lund  /** Tests for an index lookup interceptor.*/
245846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool HasIndexedLookupInterceptor();
245943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
24605a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  /**
24615a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * Turns on access check on the object if the object is an instance of
24625a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * a template that has access check callbacks. If an object has no
24635a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * access check info, the object cannot be accessed by anyone.
24645a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   */
246546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void TurnOnAccessCheck();
246641826e77311db718135ef6517b846933dfd275f3ager@chromium.org
24673b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org  /**
24687304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * Returns the identity hash for this object. The current implementation
24697304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * uses a hidden property on the object to store the identity hash.
24705ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org   *
24719085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org   * The return value will never be 0. Also, it is not guaranteed to be
24725ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org   * unique.
24733b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org   */
247446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int GetIdentityHash();
247541826e77311db718135ef6517b846933dfd275f3ager@chromium.org
24763b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org  /**
24773b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org   * Access hidden properties on JavaScript objects. These properties are
24783b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org   * hidden from the executing JavaScript and only accessible through the V8
24793b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org   * C++ API. Hidden properties introduced by V8 internally (for example the
24803b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org   * identity hash) are prefixed with "v8::".
24813b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org   */
248246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool SetHiddenValue(Handle<String> key, Handle<Value> value);
248346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Value> GetHiddenValue(Handle<String> key);
248446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool DeleteHiddenValue(Handle<String> key);
24859d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
24862bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com  /**
24872bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com   * Returns true if this is an instance of an api function (one
24882bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com   * created from a function created from a function template) and has
24892bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com   * been modified since it was created.  Note that this method is
24902bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com   * conservative and may return true for objects that haven't actually
24912bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com   * been modified.
24922bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com   */
249346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsDirty();
24943b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org
24953b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org  /**
24963b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org   * Clone this object with a fast but shallow copy.  Values will point
24973b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org   * to the same values as the original object.
24983b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org   */
249946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Object> Clone();
250043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
25010b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org  /**
2502c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org   * Returns the context in which the object was created.
2503c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org   */
250446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Context> CreationContext();
2505c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
2506c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  /**
25070b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org   * Set the backing store of the indexed properties to be managed by the
25080b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org   * embedding layer. Access to the indexed properties will follow the rules
25090b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org   * spelled out in CanvasPixelArray.
25100b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org   * Note: The embedding program still owns the data and needs to ensure that
25110b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org   *       the backing store is preserved while V8 has a reference.
25120b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org   */
251346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void SetIndexedPropertiesToPixelData(uint8_t* data, int length);
251446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool HasIndexedPropertiesInPixelData();
251546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  uint8_t* GetIndexedPropertiesPixelData();
251646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int GetIndexedPropertiesPixelDataLength();
25170b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
25183811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  /**
25193811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org   * Set the backing store of the indexed properties to be managed by the
25203811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org   * embedding layer. Access to the indexed properties will follow the rules
25213811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org   * spelled out for the CanvasArray subtypes in the WebGL specification.
25223811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org   * Note: The embedding program still owns the data and needs to ensure that
25233811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org   *       the backing store is preserved while V8 has a reference.
25243811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org   */
252546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void SetIndexedPropertiesToExternalArrayData(void* data,
252646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                                               ExternalArrayType array_type,
252746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                                               int number_of_elements);
252846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool HasIndexedPropertiesInExternalArrayData();
252946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void* GetIndexedPropertiesExternalArrayData();
253046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  ExternalArrayType GetIndexedPropertiesExternalArrayDataType();
253146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int GetIndexedPropertiesExternalArrayDataLength();
25323811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
25331c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  /**
253483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org   * Checks whether a callback is set by the
253583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org   * ObjectTemplate::SetCallAsFunctionHandler method.
253683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org   * When an Object is callable this method returns true.
253783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org   */
253846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsCallable();
253983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org
254083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  /**
25411805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org   * Call an Object as a function if a callback is set by the
25421c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org   * ObjectTemplate::SetCallAsFunctionHandler method.
25431c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org   */
2544c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  Local<Value> CallAsFunction(Handle<Value> recv,
254546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                              int argc,
254646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                              Handle<Value> argv[]);
25471c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
25481c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  /**
25497304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * Call an Object as a constructor if a callback is set by the
25501c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org   * ObjectTemplate::SetCallAsFunctionHandler method.
25511c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org   * Note: This method behaves like the Function::NewInstance method.
25521c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org   */
255346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Value> CallAsConstructor(int argc, Handle<Value> argv[]);
25541c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
255537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  static Local<Object> New(Isolate* isolate);
25560f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org
25574a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static Object* Cast(Value* obj);
2558e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org
255943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
256046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Object();
256146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(Value* obj);
256246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Value> SlowGetInternalField(int index);
256346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void* SlowGetAlignedPointerFromInternalField(int index);
256443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
256543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
256643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
256743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
256843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * An instance of the built-in array constructor (ECMA-262, 15.4.2).
256943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
2570594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Array : public Object {
257143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
257246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  uint32_t Length() const;
257343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
25743e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org  /**
25753e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org   * Clones an element at index |index|.  Returns an empty
25763e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org   * handle if cloning fails (for any reason).
25773e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org   */
257846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Object> CloneElementAt(uint32_t index);
25793e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org
2580badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org  /**
2581badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org   * Creates a JavaScript array with the given length. If the length
2582badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org   * is negative the returned array will have length 0.
2583badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org   */
258437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  static Local<Array> New(Isolate* isolate, int length = 0);
2585badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org
25864a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static Array* Cast(Value* obj);
258743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
258846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Array();
258946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(Value* obj);
259043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
259143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
259243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2593639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgtemplate<typename T>
2594639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgclass ReturnValue {
2595639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org public:
25964a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  template <class S> V8_INLINE ReturnValue(const ReturnValue<S>& that)
2597639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org      : value_(that.value_) {
2598639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    TYPE_CHECK(T, S);
2599639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  }
2600639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  // Handle setters
26014a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  template <typename S> V8_INLINE void Set(const Persistent<S>& handle);
26024a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  template <typename S> V8_INLINE void Set(const Handle<S> handle);
2603639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  // Fast primitive setters
26044a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE void Set(bool value);
26054a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE void Set(double i);
26064a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE void Set(int32_t i);
26074a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE void Set(uint32_t i);
2608639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  // Fast JS primitive setters
26094a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE void SetNull();
26104a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE void SetUndefined();
26114a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE void SetEmptyString();
2612639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  // Convenience getter for Isolate
26134a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Isolate* GetIsolate();
2614639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
26153c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  // Pointer setter: Uncompilable to prevent inadvertent misuse.
26163c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  template <typename S>
26173c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  V8_INLINE void Set(S* whatever);
26183c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org
2619639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org private:
2620639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  template<class F> friend class ReturnValue;
2621639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  template<class F> friend class FunctionCallbackInfo;
2622639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  template<class F> friend class PropertyCallbackInfo;
2623381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  template<class F, class G, class H> friend class PersistentValueMap;
2624381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  V8_INLINE void SetInternal(internal::Object* value) { *value_ = value; }
26254a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE internal::Object* GetDefaultValue();
26264a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE explicit ReturnValue(internal::Object** slot);
2627639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  internal::Object** value_;
2628639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org};
2629639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
2630639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
2631639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org/**
2632639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org * The argument information given to function call callbacks.  This
2633639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org * class provides access to information about the context of the call,
2634639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org * including the receiver, the number and values of arguments, and
2635639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org * the holder of the function.
2636639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org */
2637639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgtemplate<typename T>
2638639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgclass FunctionCallbackInfo {
2639639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org public:
26404a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE int Length() const;
26414a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Local<Value> operator[](int i) const;
26424a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Local<Function> Callee() const;
26434a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Local<Object> This() const;
26444a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Local<Object> Holder() const;
26454a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE bool IsConstructCall() const;
26464a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Local<Value> Data() const;
26474a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Isolate* GetIsolate() const;
26484a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE ReturnValue<T> GetReturnValue() const;
2649639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  // This shouldn't be public, but the arm compiler needs it.
2650528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  static const int kArgsLength = 7;
2651639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
2652639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org protected:
2653639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  friend class internal::FunctionCallbackArguments;
2654639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  friend class internal::CustomArguments<FunctionCallbackInfo>;
2655fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  static const int kHolderIndex = 0;
2656fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  static const int kIsolateIndex = 1;
2657fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  static const int kReturnValueDefaultValueIndex = 2;
2658fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  static const int kReturnValueIndex = 3;
2659fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  static const int kDataIndex = 4;
2660fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  static const int kCalleeIndex = 5;
2661fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  static const int kContextSaveIndex = 6;
2662639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
26634a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE FunctionCallbackInfo(internal::Object** implicit_args,
2664639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org                   internal::Object** values,
2665639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org                   int length,
26664a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org                   bool is_construct_call);
2667639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  internal::Object** implicit_args_;
2668639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  internal::Object** values_;
2669639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  int length_;
2670639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  bool is_construct_call_;
2671639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org};
2672639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
2673639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
2674639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org/**
2675639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org * The information passed to a property callback about the context
2676639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org * of the property access.
2677639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org */
2678639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgtemplate<typename T>
2679639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgclass PropertyCallbackInfo {
2680639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org public:
26814a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Isolate* GetIsolate() const;
26824a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Local<Value> Data() const;
2683aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org  V8_INLINE Local<Object> This() const;
26844a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Local<Object> Holder() const;
26854a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE ReturnValue<T> GetReturnValue() const;
2686639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  // This shouldn't be public, but the arm compiler needs it.
2687639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  static const int kArgsLength = 6;
2688639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
2689639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org protected:
2690639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  friend class MacroAssembler;
2691639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  friend class internal::PropertyCallbackArguments;
2692639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  friend class internal::CustomArguments<PropertyCallbackInfo>;
2693fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  static const int kHolderIndex = 0;
2694fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  static const int kIsolateIndex = 1;
2695fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  static const int kReturnValueDefaultValueIndex = 2;
2696fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  static const int kReturnValueIndex = 3;
2697fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  static const int kDataIndex = 4;
2698fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  static const int kThisIndex = 5;
26994a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org
27004a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE PropertyCallbackInfo(internal::Object** args) : args_(args) {}
2701639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  internal::Object** args_;
2702639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org};
2703639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
2704639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
2705639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgtypedef void (*FunctionCallback)(const FunctionCallbackInfo<Value>& info);
2706639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
2707639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
270843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
2709727e995b7bba3c57fb1e5c156d386ca11894f781v * A JavaScript function object (ECMA-262, 15.3).
271043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
2711594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Function : public Object {
271243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
2713639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  /**
2714639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org   * Create a function in the current execution context
2715639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org   * for a given FunctionCallback.
2716639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org   */
2717639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  static Local<Function> New(Isolate* isolate,
2718639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org                             FunctionCallback callback,
2719639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org                             Local<Value> data = Local<Value>(),
2720639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org                             int length = 0);
2721639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
272246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Object> NewInstance() const;
272346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Object> NewInstance(int argc, Handle<Value> argv[]) const;
2724c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  Local<Value> Call(Handle<Value> recv, int argc, Handle<Value> argv[]);
272546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void SetName(Handle<String> name);
272646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Handle<Value> GetName() const;
27275c838251403b0be9a882540f1922577abba4c872ager@chromium.org
27285c838251403b0be9a882540f1922577abba4c872ager@chromium.org  /**
2729659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org   * Name inferred from variable or property assignment of this function.
2730659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org   * Used to facilitate debugging and profiling of JavaScript code written
2731659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org   * in an OO style, where many functions are anonymous but are assigned
2732659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org   * to object properties.
2733659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org   */
273446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Handle<Value> GetInferredName() const;
2735659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
2736659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  /**
2737c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org   * User-defined name assigned to the "displayName" property of this function.
2738c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org   * Used to facilitate debugging and profiling of JavaScript code.
2739c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org   */
2740c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  Handle<Value> GetDisplayName() const;
2741c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org
2742c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  /**
27435c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * Returns zero based line number of function body and
27445c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * kLineOffsetNotFound if no information available.
27455c838251403b0be9a882540f1922577abba4c872ager@chromium.org   */
274646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int GetScriptLineNumber() const;
2747c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  /**
2748c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org   * Returns zero based column number of function body and
2749c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org   * kLineOffsetNotFound if no information available.
2750c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org   */
275146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int GetScriptColumnNumber() const;
27521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
27531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  /**
2754db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org   * Tells whether this function is builtin.
2755db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org   */
2756db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org  bool IsBuiltin() const;
2757db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org
2758db783297aea0c1b0faf438598202d2abe10da70ebmeurer@chromium.org  /**
27591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * Returns scriptId.
27601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   */
27611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  int ScriptId() const;
27621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
27634954674151afa960af66efb4831df06bde727333yangguo@chromium.org  /**
27644954674151afa960af66efb4831df06bde727333yangguo@chromium.org   * Returns the original function if this function is bound, else returns
27654954674151afa960af66efb4831df06bde727333yangguo@chromium.org   * v8::Undefined.
27664954674151afa960af66efb4831df06bde727333yangguo@chromium.org   */
27674954674151afa960af66efb4831df06bde727333yangguo@chromium.org  Local<Value> GetBoundFunction() const;
27684954674151afa960af66efb4831df06bde727333yangguo@chromium.org
276946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  ScriptOrigin GetScriptOrigin() const;
27704a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static Function* Cast(Value* obj);
277146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static const int kLineOffsetNotFound;
2772c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
277343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
277446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Function();
277546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(Value* obj);
277643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
277743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2778486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org
2779486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org/**
2780486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org * An instance of the built-in Promise constructor (ES6 draft).
2781486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org * This API is experimental. Only works with --harmony flag.
2782486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org */
2783486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.orgclass V8_EXPORT Promise : public Object {
2784486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org public:
27852904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org  class V8_EXPORT Resolver : public Object {
27862904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org   public:
27872904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org    /**
27882904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org     * Create a new resolver, along with an associated promise in pending state.
27892904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org     */
27902904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org    static Local<Resolver> New(Isolate* isolate);
2791486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org
27922904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org    /**
27932904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org     * Extract the associated promise.
27942904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org     */
27952904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org    Local<Promise> GetPromise();
27962904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org
27972904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org    /**
27982904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org     * Resolve/reject the associated promise with a given value.
27992904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org     * Ignored if the promise is no longer pending.
28002904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org     */
28012904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org    void Resolve(Handle<Value> value);
28022904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org    void Reject(Handle<Value> value);
28032904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org
28042904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org    V8_INLINE static Resolver* Cast(Value* obj);
28052904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org
28062904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org   private:
28072904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org    Resolver();
28082904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org    static void CheckCast(Value* obj);
28092904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org  };
2810486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org
2811486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  /**
2812486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org   * Register a resolution/rejection handler with a promise.
2813486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org   * The handler is given the respective resolution/rejection value as
2814486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org   * an argument. If the promise is already resolved/rejected, the handler is
2815486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org   * invoked at the end of turn.
2816486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org   */
2817486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  Local<Promise> Chain(Handle<Function> handler);
2818486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  Local<Promise> Catch(Handle<Function> handler);
28191845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  Local<Promise> Then(Handle<Function> handler);
2820486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org
2821486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  V8_INLINE static Promise* Cast(Value* obj);
2822486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org
2823486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org private:
2824486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  Promise();
2825486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  static void CheckCast(Value* obj);
2826486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org};
2827486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org
2828486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org
2829a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org#ifndef V8_ARRAY_BUFFER_INTERNAL_FIELD_COUNT
2830e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org// The number of required internal fields can be defined by embedder.
2831a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org#define V8_ARRAY_BUFFER_INTERNAL_FIELD_COUNT 2
2832a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org#endif
283343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
283443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
2835ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org * An instance of the built-in ArrayBuffer constructor (ES6 draft 15.13.5).
2836ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org * This API is experimental and may change significantly.
2837ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org */
2838594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT ArrayBuffer : public Object {
2839ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org public:
2840ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  /**
2841837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * Allocator that V8 uses to allocate |ArrayBuffer|'s memory.
2842837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * The allocator is a global V8 setting. It should be set with
2843837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * V8::SetArrayBufferAllocator prior to creation of a first ArrayBuffer.
2844837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   *
2845837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * This API is experimental and may change significantly.
2846837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   */
2847594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  class V8_EXPORT Allocator { // NOLINT
2848837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   public:
2849837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org    virtual ~Allocator() {}
2850837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org
2851837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org    /**
2852837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org     * Allocate |length| bytes. Return NULL if allocation is not successful.
2853d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org     * Memory should be initialized to zeroes.
2854837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org     */
2855837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org    virtual void* Allocate(size_t length) = 0;
2856d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
2857d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    /**
2858d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org     * Allocate |length| bytes. Return NULL if allocation is not successful.
2859d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org     * Memory does not have to be initialized.
2860d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org     */
2861e97852de34e44a479f092bd2449134e707cd9cf1dslomov@chromium.org    virtual void* AllocateUninitialized(size_t length) = 0;
2862837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org    /**
2863307dd6ea3b729c8058ada645b42a1cf083c92128danno@chromium.org     * Free the memory block of size |length|, pointed to by |data|.
2864307dd6ea3b729c8058ada645b42a1cf083c92128danno@chromium.org     * That memory is guaranteed to be previously allocated by |Allocate|.
2865837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org     */
2866e97852de34e44a479f092bd2449134e707cd9cf1dslomov@chromium.org    virtual void Free(void* data, size_t length) = 0;
2867837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  };
2868837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org
2869837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  /**
2870837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * The contents of an |ArrayBuffer|. Externalization of |ArrayBuffer|
2871837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * returns an instance of this class, populated, with a pointer to data
2872837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * and byte length.
2873837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   *
2874837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * The Data pointer of ArrayBuffer::Contents is always allocated with
2875837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * Allocator::Allocate that is set with V8::SetArrayBufferAllocator.
2876837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   *
2877837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * This API is experimental and may change significantly.
2878837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   */
2879594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  class V8_EXPORT Contents { // NOLINT
2880837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   public:
2881837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org    Contents() : data_(NULL), byte_length_(0) {}
2882837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org
2883837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org    void* Data() const { return data_; }
2884837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org    size_t ByteLength() const { return byte_length_; }
2885837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org
2886837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   private:
2887837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org    void* data_;
2888837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org    size_t byte_length_;
2889837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org
2890837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org    friend class ArrayBuffer;
2891837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  };
2892837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org
2893837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org
2894837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  /**
2895ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * Data length in bytes.
2896ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   */
2897ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  size_t ByteLength() const;
2898ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
2899ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  /**
2900ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * Create a new ArrayBuffer. Allocate |byte_length| bytes.
2901ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * Allocated memory will be owned by a created ArrayBuffer and
2902a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org   * will be deallocated when it is garbage-collected,
2903a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org   * unless the object is externalized.
2904ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   */
290537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  static Local<ArrayBuffer> New(Isolate* isolate, size_t byte_length);
2906ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
2907ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  /**
2908ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * Create a new ArrayBuffer over an existing memory block.
2909a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org   * The created array buffer is immediately in externalized state.
2910ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * The memory block will not be reclaimed when a created ArrayBuffer
2911ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * is garbage-collected.
2912ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   */
291337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  static Local<ArrayBuffer> New(Isolate* isolate, void* data,
291437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org                                size_t byte_length);
2915ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
2916a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  /**
2917a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org   * Returns true if ArrayBuffer is extrenalized, that is, does not
2918a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org   * own its memory block.
2919a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org   */
2920a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  bool IsExternal() const;
2921a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
2922a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  /**
29231fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org   * Neuters this ArrayBuffer and all its views (typed arrays).
29241fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org   * Neutering sets the byte length of the buffer and all typed arrays to zero,
29251fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org   * preventing JavaScript from ever accessing underlying backing store.
29261fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org   * ArrayBuffer should have been externalized.
29271fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org   */
29281fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  void Neuter();
29291fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
29301fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  /**
2931837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * Make this ArrayBuffer external. The pointer to underlying memory block
2932837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * and byte length are returned as |Contents| structure. After ArrayBuffer
2933837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * had been etxrenalized, it does no longer owns the memory block. The caller
2934837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * should take steps to free memory when it is no longer needed.
2935837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   *
2936837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * The memory block is guaranteed to be allocated with |Allocator::Allocate|
2937837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * that has been set with V8::SetArrayBufferAllocator.
2938a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org   */
2939837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  Contents Externalize();
2940a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
29414a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static ArrayBuffer* Cast(Value* obj);
2942ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
2943a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  static const int kInternalFieldCount = V8_ARRAY_BUFFER_INTERNAL_FIELD_COUNT;
2944a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
2945ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org private:
2946ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  ArrayBuffer();
2947ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  static void CheckCast(Value* obj);
2948ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org};
2949ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
2950ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
2951e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org#ifndef V8_ARRAY_BUFFER_VIEW_INTERNAL_FIELD_COUNT
2952e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org// The number of required internal fields can be defined by embedder.
2953e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org#define V8_ARRAY_BUFFER_VIEW_INTERNAL_FIELD_COUNT 2
2954e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org#endif
2955e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
2956e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
2957ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org/**
29581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * A base class for an instance of one of "views" over ArrayBuffer,
29591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * including TypedArrays and DataView (ES6 draft 15.13).
29601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org *
2961f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * This API is experimental and may change significantly.
2962f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org */
2963594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT ArrayBufferView : public Object {
2964f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org public:
2965f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  /**
2966f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org   * Returns underlying ArrayBuffer.
2967f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org   */
2968f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Local<ArrayBuffer> Buffer();
2969f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  /**
29701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * Byte offset in |Buffer|.
2971f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org   */
2972f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  size_t ByteOffset();
2973f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  /**
29741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * Size of a view in bytes.
2975f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org   */
2976f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  size_t ByteLength();
2977f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
29784a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static ArrayBufferView* Cast(Value* obj);
29791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
2980e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  static const int kInternalFieldCount =
2981e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org      V8_ARRAY_BUFFER_VIEW_INTERNAL_FIELD_COUNT;
2982e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
29831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private:
29841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  ArrayBufferView();
29851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  static void CheckCast(Value* obj);
29861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org};
29871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
29881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
29891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org/**
29901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * A base class for an instance of TypedArray series of constructors
29911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * (ES6 draft 15.13.6).
29921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * This API is experimental and may change significantly.
29931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org */
2994594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT TypedArray : public ArrayBufferView {
29951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public:
29961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  /**
29971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * Number of elements in this typed array
29981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * (e.g. for Int16Array, |ByteLength|/2).
29991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   */
30001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  size_t Length();
30011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
30024a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static TypedArray* Cast(Value* obj);
3003f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3004f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org private:
3005f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  TypedArray();
3006f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static void CheckCast(Value* obj);
3007f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org};
3008f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3009f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3010f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org/**
3011f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * An instance of Uint8Array constructor (ES6 draft 15.13.6).
3012f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * This API is experimental and may change significantly.
3013f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org */
3014594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Uint8Array : public TypedArray {
3015f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org public:
3016f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Local<Uint8Array> New(Handle<ArrayBuffer> array_buffer,
3017f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org                               size_t byte_offset, size_t length);
30184a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static Uint8Array* Cast(Value* obj);
3019f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3020f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org private:
3021f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Uint8Array();
3022f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static void CheckCast(Value* obj);
3023f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org};
3024f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3025f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3026f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org/**
302757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org * An instance of Uint8ClampedArray constructor (ES6 draft 15.13.6).
302857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org * This API is experimental and may change significantly.
302957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org */
3030594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Uint8ClampedArray : public TypedArray {
303157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org public:
303257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  static Local<Uint8ClampedArray> New(Handle<ArrayBuffer> array_buffer,
303357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org                               size_t byte_offset, size_t length);
30344a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static Uint8ClampedArray* Cast(Value* obj);
303557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
303657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org private:
303757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  Uint8ClampedArray();
303857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  static void CheckCast(Value* obj);
303957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org};
304057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
304157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org/**
3042f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * An instance of Int8Array constructor (ES6 draft 15.13.6).
3043f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * This API is experimental and may change significantly.
3044f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org */
3045594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Int8Array : public TypedArray {
3046f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org public:
3047f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Local<Int8Array> New(Handle<ArrayBuffer> array_buffer,
3048f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org                               size_t byte_offset, size_t length);
30494a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static Int8Array* Cast(Value* obj);
3050f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3051f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org private:
3052f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Int8Array();
3053f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static void CheckCast(Value* obj);
3054f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org};
3055f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3056f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3057f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org/**
3058f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * An instance of Uint16Array constructor (ES6 draft 15.13.6).
3059f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * This API is experimental and may change significantly.
3060f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org */
3061594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Uint16Array : public TypedArray {
3062f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org public:
3063f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Local<Uint16Array> New(Handle<ArrayBuffer> array_buffer,
3064f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org                               size_t byte_offset, size_t length);
30654a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static Uint16Array* Cast(Value* obj);
3066f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3067f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org private:
3068f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Uint16Array();
3069f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static void CheckCast(Value* obj);
3070f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org};
3071f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3072f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3073f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org/**
3074f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * An instance of Int16Array constructor (ES6 draft 15.13.6).
3075f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * This API is experimental and may change significantly.
3076f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org */
3077594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Int16Array : public TypedArray {
3078f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org public:
3079f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Local<Int16Array> New(Handle<ArrayBuffer> array_buffer,
3080f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org                               size_t byte_offset, size_t length);
30814a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static Int16Array* Cast(Value* obj);
3082f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3083f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org private:
3084f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Int16Array();
3085f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static void CheckCast(Value* obj);
3086f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org};
3087f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3088f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3089f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org/**
3090f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * An instance of Uint32Array constructor (ES6 draft 15.13.6).
3091f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * This API is experimental and may change significantly.
3092f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org */
3093594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Uint32Array : public TypedArray {
3094f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org public:
3095f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Local<Uint32Array> New(Handle<ArrayBuffer> array_buffer,
3096f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org                               size_t byte_offset, size_t length);
30974a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static Uint32Array* Cast(Value* obj);
3098f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3099f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org private:
3100f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Uint32Array();
3101f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static void CheckCast(Value* obj);
3102f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org};
3103f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3104f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3105f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org/**
3106f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * An instance of Int32Array constructor (ES6 draft 15.13.6).
3107f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * This API is experimental and may change significantly.
3108f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org */
3109594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Int32Array : public TypedArray {
3110f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org public:
3111f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Local<Int32Array> New(Handle<ArrayBuffer> array_buffer,
3112f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org                               size_t byte_offset, size_t length);
31134a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static Int32Array* Cast(Value* obj);
3114f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3115f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org private:
3116f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Int32Array();
3117f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static void CheckCast(Value* obj);
3118f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org};
3119f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3120f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3121f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org/**
3122f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * An instance of Float32Array constructor (ES6 draft 15.13.6).
3123f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * This API is experimental and may change significantly.
3124f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org */
3125594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Float32Array : public TypedArray {
3126f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org public:
3127f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Local<Float32Array> New(Handle<ArrayBuffer> array_buffer,
3128f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org                               size_t byte_offset, size_t length);
31294a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static Float32Array* Cast(Value* obj);
3130f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3131f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org private:
3132f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Float32Array();
3133f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static void CheckCast(Value* obj);
3134f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org};
3135f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3136f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3137f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org/**
3138f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * An instance of Float64Array constructor (ES6 draft 15.13.6).
3139f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * This API is experimental and may change significantly.
3140f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org */
3141594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Float64Array : public TypedArray {
3142f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org public:
3143f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Local<Float64Array> New(Handle<ArrayBuffer> array_buffer,
3144f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org                               size_t byte_offset, size_t length);
31454a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static Float64Array* Cast(Value* obj);
3146f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3147f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org private:
3148f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Float64Array();
3149f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static void CheckCast(Value* obj);
3150f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org};
3151f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3152f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
3153f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org/**
31541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * An instance of DataView constructor (ES6 draft 15.13.7).
31551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * This API is experimental and may change significantly.
31561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org */
3157594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT DataView : public ArrayBufferView {
31581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public:
31591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  static Local<DataView> New(Handle<ArrayBuffer> array_buffer,
31601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                             size_t byte_offset, size_t length);
31614a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static DataView* Cast(Value* obj);
31621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
31631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private:
31641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  DataView();
31651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  static void CheckCast(Value* obj);
31661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org};
31671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
31681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
31691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org/**
3170fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org * An instance of the built-in Date constructor (ECMA-262, 15.9).
3171fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org */
3172594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Date : public Object {
3173fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org public:
317437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  static Local<Value> New(Isolate* isolate, double time);
3175d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
3176fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  /**
3177fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * A specialization of Value::NumberValue that is more efficient
3178fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * because we know the structure of this object.
3179fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   */
3180d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  double ValueOf() const;
3181fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
31824a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static Date* Cast(v8::Value* obj);
3183fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
3184fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  /**
3185fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * Notification that the embedder has changed the time zone,
3186fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * daylight savings time, or other date / time configuration
3187fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * parameters.  V8 keeps a cache of various values used for
3188fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * date / time computation.  This notification will reset
3189fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * those cached values for the current context so that date /
3190fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * time configuration changes would be reflected in the Date
3191fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * object.
3192fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   *
3193fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * This API should not be called more than needed as it will
3194fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * negatively impact the performance of date operations.
3195fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   */
319637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  static void DateTimeConfigurationChangeNotification(Isolate* isolate);
3197fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
3198fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org private:
319946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(v8::Value* obj);
3200fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org};
3201fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
3202fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
3203fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org/**
320484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org * A Number object (ECMA-262, 4.3.21).
320584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org */
3206594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT NumberObject : public Object {
320784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org public:
320837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  static Local<Value> New(Isolate* isolate, double value);
3209d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
3210d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  double ValueOf() const;
321184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
32124a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static NumberObject* Cast(v8::Value* obj);
321384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
321484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org private:
321546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(v8::Value* obj);
321684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org};
321784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
321884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
321984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org/**
322084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org * A Boolean object (ECMA-262, 4.3.15).
322184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org */
3222594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT BooleanObject : public Object {
322384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org public:
322446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static Local<Value> New(bool value);
322584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
3226d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  bool ValueOf() const;
322784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
32284a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static BooleanObject* Cast(v8::Value* obj);
322984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
323084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org private:
323146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(v8::Value* obj);
323284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org};
323384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
323484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
323584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org/**
323684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org * A String object (ECMA-262, 4.3.18).
323784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org */
3238594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT StringObject : public Object {
323984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org public:
324046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static Local<Value> New(Handle<String> value);
324184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
3242d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  Local<String> ValueOf() const;
324384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
32444a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static StringObject* Cast(v8::Value* obj);
324584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
324684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org private:
324746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(v8::Value* obj);
324884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org};
324984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
325084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
325184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org/**
3252e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org * A Symbol object (ECMA-262 edition 6).
3253e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org *
3254e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org * This is an experimental feature. Use at your own risk.
3255e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org */
3256594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT SymbolObject : public Object {
3257e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org public:
3258e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  static Local<Value> New(Isolate* isolate, Handle<Symbol> value);
3259e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
3260d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  Local<Symbol> ValueOf() const;
3261e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
32624a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static SymbolObject* Cast(v8::Value* obj);
3263e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
3264e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org private:
3265e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  static void CheckCast(v8::Value* obj);
3266e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org};
3267e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
3268e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
3269e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org/**
3270fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org * An instance of the built-in RegExp constructor (ECMA-262, 15.10).
3271fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org */
3272594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT RegExp : public Object {
3273fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org public:
3274fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  /**
3275fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * Regular expression flag bits. They can be or'ed to enable a set
3276fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * of flags.
3277fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   */
3278fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  enum Flags {
3279fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org    kNone = 0,
3280fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org    kGlobal = 1,
3281fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org    kIgnoreCase = 2,
3282fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org    kMultiline = 4
3283fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  };
3284fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
3285fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  /**
3286fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * Creates a regular expression from the given pattern string and
3287fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * the flags bit field. May throw a JavaScript exception as
3288fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * described in ECMA-262, 15.10.4.1.
3289fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   *
3290fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * For example,
3291fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   *   RegExp::New(v8::String::New("foo"),
3292fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   *               static_cast<RegExp::Flags>(kGlobal | kMultiline))
3293fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * is equivalent to evaluating "/foo/gm".
3294fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   */
329546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static Local<RegExp> New(Handle<String> pattern, Flags flags);
3296fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
3297fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  /**
3298fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * Returns the value of the source property: a string representing
3299fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * the regular expression.
3300fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   */
330146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<String> GetSource() const;
3302fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
3303fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  /**
3304fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * Returns the flags bit field.
3305fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   */
330646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Flags GetFlags() const;
3307fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
33084a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static RegExp* Cast(v8::Value* obj);
3309fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
3310fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org private:
331146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(v8::Value* obj);
3312fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org};
3313fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
3314fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
3315fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org/**
3316eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org * A JavaScript value that wraps a C++ void*. This type of value is mainly used
3317eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org * to associate C++ data structures with JavaScript objects.
331843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3319594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT External : public Value {
332043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
33210cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  static Local<External> New(Isolate* isolate, void* value);
33224a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static External* Cast(Value* obj);
332346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void* Value() const;
332443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
332546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(v8::Value* obj);
332643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
332743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
332843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3329fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Templates ---
333043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
333143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
333243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
333343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * The superclass of object and function templates.
333443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3335594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Template : public Data {
333643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
333743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /** Adds a property to each instance created by this template.*/
3338e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  void Set(Handle<Name> name, Handle<Data> value,
333943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           PropertyAttribute attributes = None);
334037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  V8_INLINE void Set(Isolate* isolate, const char* name, Handle<Data> value);
33411e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
33421e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  void SetAccessorProperty(
3343e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org     Local<Name> name,
33441e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     Local<FunctionTemplate> getter = Local<FunctionTemplate>(),
33451e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     Local<FunctionTemplate> setter = Local<FunctionTemplate>(),
33461e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     PropertyAttribute attribute = None,
33471e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     AccessControl settings = DEFAULT);
33481e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
33493d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  /**
33503d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   * Whenever the property with the given name is accessed on objects
33513d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   * created from this Template the getter and setter callbacks
33523d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   * are called instead of getting and setting the property directly
33533d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   * on the JavaScript object.
33543d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   *
33553d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   * \param name The name of the property for which an accessor is added.
33563d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   * \param getter The callback to invoke when getting the property.
33573d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   * \param setter The callback to invoke when setting the property.
33583d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   * \param data A piece of data that will be passed to the getter and setter
33593d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   *   callbacks whenever they are invoked.
33603d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   * \param settings Access control settings for the accessor. This is a bit
33613d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   *   field consisting of one of more of
33623d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   *   DEFAULT = 0, ALL_CAN_READ = 1, or ALL_CAN_WRITE = 2.
33633d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   *   The default is to not allow cross-context access.
33643d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   *   ALL_CAN_READ means that all cross-context reads are allowed.
33653d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   *   ALL_CAN_WRITE means that all cross-context writes are allowed.
33663d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   *   The combination ALL_CAN_READ | ALL_CAN_WRITE can be used to allow all
33673d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   *   cross-context access.
33683d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   * \param attribute The attributes of the property for which an accessor
33693d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   *   is added.
33703d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   * \param signature The signature describes valid receivers for the accessor
33713d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   *   and is used to perform implicit instance checks against them. If the
33723d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   *   receiver is incompatible (i.e. is not an instance of the constructor as
33733d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   *   defined by FunctionTemplate::HasInstance()), an implicit TypeError is
33743d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   *   thrown and no callback is invoked.
33753d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org   */
33763d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  void SetNativeDataProperty(Local<String> name,
33773d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org                             AccessorGetterCallback getter,
33783d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org                             AccessorSetterCallback setter = 0,
33793d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org                             // TODO(dcarney): gcc can't handle Local below
33803d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org                             Handle<Value> data = Handle<Value>(),
33813d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org                             PropertyAttribute attribute = None,
33823d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org                             Local<AccessorSignature> signature =
33833d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org                                 Local<AccessorSignature>(),
33843d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org                             AccessControl settings = DEFAULT);
3385e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  void SetNativeDataProperty(Local<Name> name,
3386e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org                             AccessorNameGetterCallback getter,
3387e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org                             AccessorNameSetterCallback setter = 0,
3388e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org                             // TODO(dcarney): gcc can't handle Local below
3389e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org                             Handle<Value> data = Handle<Value>(),
3390e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org                             PropertyAttribute attribute = None,
3391e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org                             Local<AccessorSignature> signature =
3392e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org                                 Local<AccessorSignature>(),
3393e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org                             AccessControl settings = DEFAULT);
33943d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org
33953d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  // This function is not yet stable and should not be used at this time.
3396e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  bool SetDeclaredAccessor(Local<Name> name,
33973d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org                           Local<DeclaredAccessorDescriptor> descriptor,
33983d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org                           PropertyAttribute attribute = None,
33993d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org                           Local<AccessorSignature> signature =
34003d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org                               Local<AccessorSignature>(),
34013d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org                           AccessControl settings = DEFAULT);
34023d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org
340343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
340443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Template();
340543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
340643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class ObjectTemplate;
340743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class FunctionTemplate;
340843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
340943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
341043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
341143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
341243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * NamedProperty[Getter|Setter] are used as interceptors on object.
341343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * See ObjectTemplate::SetNamedPropertyHandler.
341443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3415bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*NamedPropertyGetterCallback)(
3416bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    Local<String> property,
3417bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<Value>& info);
341843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
341943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
342043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
342143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns the value if the setter intercepts the request.
342243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Otherwise, returns an empty handle.
342343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3424bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*NamedPropertySetterCallback)(
3425bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    Local<String> property,
3426bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    Local<Value> value,
3427bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<Value>& info);
3428bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
342943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
343043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
343143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns a non-empty handle if the interceptor intercepts the request.
34322c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org * The result is an integer encoding property attributes (like v8::None,
34332c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org * v8::DontEnum, etc.)
343443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3435bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*NamedPropertyQueryCallback)(
3436bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    Local<String> property,
3437bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<Integer>& info);
343843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
343943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
344043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
344143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns a non-empty handle if the deleter intercepts the request.
3442727e995b7bba3c57fb1e5c156d386ca11894f781v * The return value is true if the property could be deleted and false
3443727e995b7bba3c57fb1e5c156d386ca11894f781v * otherwise.
344443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3445bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*NamedPropertyDeleterCallback)(
3446bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    Local<String> property,
3447bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<Boolean>& info);
3448bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
344943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
345043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
3451727e995b7bba3c57fb1e5c156d386ca11894f781v * Returns an array containing the names of the properties the named
3452727e995b7bba3c57fb1e5c156d386ca11894f781v * property getter intercepts.
345343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3454bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*NamedPropertyEnumeratorCallback)(
3455bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<Array>& info);
345643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3457727e995b7bba3c57fb1e5c156d386ca11894f781v
345843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
3459727e995b7bba3c57fb1e5c156d386ca11894f781v * Returns the value of the property if the getter intercepts the
3460727e995b7bba3c57fb1e5c156d386ca11894f781v * request.  Otherwise, returns an empty handle.
346143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3462bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*IndexedPropertyGetterCallback)(
3463bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    uint32_t index,
3464bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<Value>& info);
346543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
346643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
346743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
346843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns the value if the setter intercepts the request.
346943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Otherwise, returns an empty handle.
347043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3471bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*IndexedPropertySetterCallback)(
3472bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    uint32_t index,
3473bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    Local<Value> value,
3474bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<Value>& info);
347543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
347643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
347743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
347843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns a non-empty handle if the interceptor intercepts the request.
3479ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org * The result is an integer encoding property attributes.
348043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3481bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*IndexedPropertyQueryCallback)(
3482bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    uint32_t index,
3483bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<Integer>& info);
3484bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
348543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
348643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
348743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns a non-empty handle if the deleter intercepts the request.
3488727e995b7bba3c57fb1e5c156d386ca11894f781v * The return value is true if the property could be deleted and false
3489727e995b7bba3c57fb1e5c156d386ca11894f781v * otherwise.
349043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3491bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*IndexedPropertyDeleterCallback)(
3492bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    uint32_t index,
3493bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<Boolean>& info);
3494bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
349543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3496727e995b7bba3c57fb1e5c156d386ca11894f781v/**
3497727e995b7bba3c57fb1e5c156d386ca11894f781v * Returns an array containing the indices of the properties the
3498727e995b7bba3c57fb1e5c156d386ca11894f781v * indexed property getter intercepts.
3499727e995b7bba3c57fb1e5c156d386ca11894f781v */
3500bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*IndexedPropertyEnumeratorCallback)(
3501bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<Array>& info);
350243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
350343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
350443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
3505727e995b7bba3c57fb1e5c156d386ca11894f781v * Access type specification.
350643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
350743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenenum AccessType {
350843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ACCESS_GET,
350943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ACCESS_SET,
351043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ACCESS_HAS,
351143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ACCESS_DELETE,
351243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ACCESS_KEYS
351343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
351443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3515727e995b7bba3c57fb1e5c156d386ca11894f781v
3516727e995b7bba3c57fb1e5c156d386ca11894f781v/**
3517727e995b7bba3c57fb1e5c156d386ca11894f781v * Returns true if cross-context access should be allowed to the named
35182bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com * property with the given key on the host object.
3519727e995b7bba3c57fb1e5c156d386ca11894f781v */
35202bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.comtypedef bool (*NamedSecurityCallback)(Local<Object> host,
352143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                      Local<Value> key,
352243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                      AccessType type,
352343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                      Local<Value> data);
352443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3525727e995b7bba3c57fb1e5c156d386ca11894f781v
3526727e995b7bba3c57fb1e5c156d386ca11894f781v/**
3527727e995b7bba3c57fb1e5c156d386ca11894f781v * Returns true if cross-context access should be allowed to the indexed
35282bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com * property with the given index on the host object.
3529727e995b7bba3c57fb1e5c156d386ca11894f781v */
35302bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.comtypedef bool (*IndexedSecurityCallback)(Local<Object> host,
353143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                        uint32_t index,
353243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                        AccessType type,
353343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                        Local<Value> data);
353443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
353543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
353643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
3537727e995b7bba3c57fb1e5c156d386ca11894f781v * A FunctionTemplate is used to create functions at runtime. There
3538727e995b7bba3c57fb1e5c156d386ca11894f781v * can only be one function created from a FunctionTemplate in a
3539c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * context.  The lifetime of the created function is equal to the
3540c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * lifetime of the context.  So in case the embedder needs to create
3541c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * temporary functions that can be collected using Scripts is
3542c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * preferred.
354343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
354443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * A FunctionTemplate can have properties, these properties are added to the
3545727e995b7bba3c57fb1e5c156d386ca11894f781v * function object when it is created.
354643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3547727e995b7bba3c57fb1e5c156d386ca11894f781v * A FunctionTemplate has a corresponding instance template which is
3548727e995b7bba3c57fb1e5c156d386ca11894f781v * used to create object instances when the function is used as a
3549727e995b7bba3c57fb1e5c156d386ca11894f781v * constructor. Properties added to the instance template are added to
3550727e995b7bba3c57fb1e5c156d386ca11894f781v * each object instance.
355143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
355243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * A FunctionTemplate can have a prototype template. The prototype template
355343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * is used to create the prototype object of the function.
355443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3555727e995b7bba3c57fb1e5c156d386ca11894f781v * The following example shows how to use a FunctionTemplate:
355643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3557727e995b7bba3c57fb1e5c156d386ca11894f781v * \code
355843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *    v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New();
355943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *    t->Set("func_property", v8::Number::New(1));
356043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
356143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *    v8::Local<v8::Template> proto_t = t->PrototypeTemplate();
356243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *    proto_t->Set("proto_method", v8::FunctionTemplate::New(InvokeCallback));
356343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *    proto_t->Set("proto_const", v8::Number::New(2));
356443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
356543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *    v8::Local<v8::ObjectTemplate> instance_t = t->InstanceTemplate();
356643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *    instance_t->SetAccessor("instance_accessor", InstanceAccessorCallback);
356743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *    instance_t->SetNamedPropertyHandler(PropertyHandlerCallback, ...);
356843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *    instance_t->Set("instance_property", Number::New(3));
356943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
357043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *    v8::Local<v8::Function> function = t->GetFunction();
357143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *    v8::Local<v8::Object> instance = function->NewInstance();
3572727e995b7bba3c57fb1e5c156d386ca11894f781v * \endcode
357343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
357443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Let's use "function" as the JS variable name of the function object
3575727e995b7bba3c57fb1e5c156d386ca11894f781v * and "instance" for the instance object created above.  The function
3576727e995b7bba3c57fb1e5c156d386ca11894f781v * and the instance will have the following properties:
357743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3578727e995b7bba3c57fb1e5c156d386ca11894f781v * \code
3579727e995b7bba3c57fb1e5c156d386ca11894f781v *   func_property in function == true;
3580727e995b7bba3c57fb1e5c156d386ca11894f781v *   function.func_property == 1;
358143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3582727e995b7bba3c57fb1e5c156d386ca11894f781v *   function.prototype.proto_method() invokes 'InvokeCallback'
3583727e995b7bba3c57fb1e5c156d386ca11894f781v *   function.prototype.proto_const == 2;
358443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3585727e995b7bba3c57fb1e5c156d386ca11894f781v *   instance instanceof function == true;
3586727e995b7bba3c57fb1e5c156d386ca11894f781v *   instance.instance_accessor calls 'InstanceAccessorCallback'
3587727e995b7bba3c57fb1e5c156d386ca11894f781v *   instance.instance_property == 3;
3588727e995b7bba3c57fb1e5c156d386ca11894f781v * \endcode
358943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3590727e995b7bba3c57fb1e5c156d386ca11894f781v * A FunctionTemplate can inherit from another one by calling the
3591727e995b7bba3c57fb1e5c156d386ca11894f781v * FunctionTemplate::Inherit method.  The following graph illustrates
3592727e995b7bba3c57fb1e5c156d386ca11894f781v * the semantics of inheritance:
359343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3594727e995b7bba3c57fb1e5c156d386ca11894f781v * \code
3595727e995b7bba3c57fb1e5c156d386ca11894f781v *   FunctionTemplate Parent  -> Parent() . prototype -> { }
3596727e995b7bba3c57fb1e5c156d386ca11894f781v *     ^                                                  ^
3597727e995b7bba3c57fb1e5c156d386ca11894f781v *     | Inherit(Parent)                                  | .__proto__
3598727e995b7bba3c57fb1e5c156d386ca11894f781v *     |                                                  |
3599727e995b7bba3c57fb1e5c156d386ca11894f781v *   FunctionTemplate Child   -> Child()  . prototype -> { }
3600727e995b7bba3c57fb1e5c156d386ca11894f781v * \endcode
360143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3602727e995b7bba3c57fb1e5c156d386ca11894f781v * A FunctionTemplate 'Child' inherits from 'Parent', the prototype
3603727e995b7bba3c57fb1e5c156d386ca11894f781v * object of the Child() function has __proto__ pointing to the
3604727e995b7bba3c57fb1e5c156d386ca11894f781v * Parent() function's prototype object. An instance of the Child
3605727e995b7bba3c57fb1e5c156d386ca11894f781v * function has all properties on Parent's instance templates.
360643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3607727e995b7bba3c57fb1e5c156d386ca11894f781v * Let Parent be the FunctionTemplate initialized in the previous
3608727e995b7bba3c57fb1e5c156d386ca11894f781v * section and create a Child FunctionTemplate by:
360943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3610727e995b7bba3c57fb1e5c156d386ca11894f781v * \code
361143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   Local<FunctionTemplate> parent = t;
361243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   Local<FunctionTemplate> child = FunctionTemplate::New();
361343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   child->Inherit(parent);
361443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
361543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   Local<Function> child_function = child->GetFunction();
361643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   Local<Object> child_instance = child_function->NewInstance();
3617727e995b7bba3c57fb1e5c156d386ca11894f781v * \endcode
361843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3619727e995b7bba3c57fb1e5c156d386ca11894f781v * The Child function and Child instance will have the following
3620727e995b7bba3c57fb1e5c156d386ca11894f781v * properties:
3621727e995b7bba3c57fb1e5c156d386ca11894f781v *
3622727e995b7bba3c57fb1e5c156d386ca11894f781v * \code
362343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   child_func.prototype.__proto__ == function.prototype;
3624727e995b7bba3c57fb1e5c156d386ca11894f781v *   child_instance.instance_accessor calls 'InstanceAccessorCallback'
362543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   child_instance.instance_property == 3;
3626727e995b7bba3c57fb1e5c156d386ca11894f781v * \endcode
362743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3628594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT FunctionTemplate : public Template {
362943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
363043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /** Creates a function template.*/
3631bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  static Local<FunctionTemplate> New(
363237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org      Isolate* isolate,
363337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org      FunctionCallback callback = 0,
363437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org      Handle<Value> data = Handle<Value>(),
363537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org      Handle<Signature> signature = Handle<Signature>(),
363637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org      int length = 0);
3637bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
363843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /** Returns the unique function instance in the current execution context.*/
363943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Local<Function> GetFunction();
364043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3641727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
3642727e995b7bba3c57fb1e5c156d386ca11894f781v   * Set the call-handler callback for a FunctionTemplate.  This
3643727e995b7bba3c57fb1e5c156d386ca11894f781v   * callback is called whenever the function created from this
3644727e995b7bba3c57fb1e5c156d386ca11894f781v   * FunctionTemplate is called.
3645727e995b7bba3c57fb1e5c156d386ca11894f781v   */
3646bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  void SetCallHandler(FunctionCallback callback,
3647bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                      Handle<Value> data = Handle<Value>());
364843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3649a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  /** Set the predefined length property for the FunctionTemplate. */
3650a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  void SetLength(int length);
3651a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
3652727e995b7bba3c57fb1e5c156d386ca11894f781v  /** Get the InstanceTemplate. */
365343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Local<ObjectTemplate> InstanceTemplate();
365443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
365543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /** Causes the function template to inherit from a parent function template.*/
365643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void Inherit(Handle<FunctionTemplate> parent);
365743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
365843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
365943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * A PrototypeTemplate is the template used to create the prototype object
366043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * of the function created by this template.
366143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
366243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Local<ObjectTemplate> PrototypeTemplate();
366343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3664727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
3665727e995b7bba3c57fb1e5c156d386ca11894f781v   * Set the class name of the FunctionTemplate.  This is used for
3666727e995b7bba3c57fb1e5c156d386ca11894f781v   * printing objects created with the function created from the
3667727e995b7bba3c57fb1e5c156d386ca11894f781v   * FunctionTemplate as its constructor.
3668727e995b7bba3c57fb1e5c156d386ca11894f781v   */
366943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void SetClassName(Handle<String> name);
367043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
367143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
3672727e995b7bba3c57fb1e5c156d386ca11894f781v   * Determines whether the __proto__ accessor ignores instances of
3673727e995b7bba3c57fb1e5c156d386ca11894f781v   * the function template.  If instances of the function template are
3674727e995b7bba3c57fb1e5c156d386ca11894f781v   * ignored, __proto__ skips all instances and instead returns the
3675727e995b7bba3c57fb1e5c156d386ca11894f781v   * next object in the prototype chain.
3676727e995b7bba3c57fb1e5c156d386ca11894f781v   *
3677727e995b7bba3c57fb1e5c156d386ca11894f781v   * Call with a value of true to make the __proto__ accessor ignore
3678727e995b7bba3c57fb1e5c156d386ca11894f781v   * instances of the function template.  Call with a value of false
3679727e995b7bba3c57fb1e5c156d386ca11894f781v   * to make the __proto__ accessor not ignore instances of the
3680727e995b7bba3c57fb1e5c156d386ca11894f781v   * function template.  By default, instances of a function template
3681727e995b7bba3c57fb1e5c156d386ca11894f781v   * are not ignored.
368243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
368343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void SetHiddenPrototype(bool value);
368443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
368543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
36862c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org   * Sets the ReadOnly flag in the attributes of the 'prototype' property
36872c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org   * of functions created from this FunctionTemplate to true.
368804921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org   */
36892c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org  void ReadOnlyPrototype();
369004921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org
369104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  /**
3692662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org   * Removes the prototype property from functions created from this
3693662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org   * FunctionTemplate.
3694662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org   */
3695662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  void RemovePrototype();
3696662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
3697662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  /**
3698727e995b7bba3c57fb1e5c156d386ca11894f781v   * Returns true if the given object is an instance of this function
3699727e995b7bba3c57fb1e5c156d386ca11894f781v   * template.
370043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
370143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool HasInstance(Handle<Value> object);
370243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
370343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
370443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  FunctionTemplate();
370543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class Context;
370643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class ObjectTemplate;
370743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
370843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
370943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
371043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
3711727e995b7bba3c57fb1e5c156d386ca11894f781v * An ObjectTemplate is used to create objects at runtime.
3712727e995b7bba3c57fb1e5c156d386ca11894f781v *
3713727e995b7bba3c57fb1e5c156d386ca11894f781v * Properties added to an ObjectTemplate are added to each object
3714727e995b7bba3c57fb1e5c156d386ca11894f781v * created from the ObjectTemplate.
371543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3716594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT ObjectTemplate : public Template {
371743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
3718727e995b7bba3c57fb1e5c156d386ca11894f781v  /** Creates an ObjectTemplate. */
371937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  static Local<ObjectTemplate> New(Isolate* isolate);
372037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  // Will be deprecated soon.
372143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static Local<ObjectTemplate> New();
3722727e995b7bba3c57fb1e5c156d386ca11894f781v
372343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /** Creates a new instance of this template.*/
372443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Local<Object> NewInstance();
372543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
372643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
372743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Sets an accessor on the object template.
3728727e995b7bba3c57fb1e5c156d386ca11894f781v   *
3729727e995b7bba3c57fb1e5c156d386ca11894f781v   * Whenever the property with the given name is accessed on objects
3730727e995b7bba3c57fb1e5c156d386ca11894f781v   * created from this ObjectTemplate the getter and setter callbacks
3731727e995b7bba3c57fb1e5c156d386ca11894f781v   * are called instead of getting and setting the property directly
3732727e995b7bba3c57fb1e5c156d386ca11894f781v   * on the JavaScript object.
3733727e995b7bba3c57fb1e5c156d386ca11894f781v   *
3734727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param name The name of the property for which an accessor is added.
3735727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param getter The callback to invoke when getting the property.
3736727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param setter The callback to invoke when setting the property.
3737727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param data A piece of data that will be passed to the getter and setter
3738727e995b7bba3c57fb1e5c156d386ca11894f781v   *   callbacks whenever they are invoked.
3739727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param settings Access control settings for the accessor. This is a bit
3740727e995b7bba3c57fb1e5c156d386ca11894f781v   *   field consisting of one of more of
3741727e995b7bba3c57fb1e5c156d386ca11894f781v   *   DEFAULT = 0, ALL_CAN_READ = 1, or ALL_CAN_WRITE = 2.
3742727e995b7bba3c57fb1e5c156d386ca11894f781v   *   The default is to not allow cross-context access.
3743727e995b7bba3c57fb1e5c156d386ca11894f781v   *   ALL_CAN_READ means that all cross-context reads are allowed.
3744727e995b7bba3c57fb1e5c156d386ca11894f781v   *   ALL_CAN_WRITE means that all cross-context writes are allowed.
3745727e995b7bba3c57fb1e5c156d386ca11894f781v   *   The combination ALL_CAN_READ | ALL_CAN_WRITE can be used to allow all
3746727e995b7bba3c57fb1e5c156d386ca11894f781v   *   cross-context access.
3747727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param attribute The attributes of the property for which an accessor
3748727e995b7bba3c57fb1e5c156d386ca11894f781v   *   is added.
37497028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org   * \param signature The signature describes valid receivers for the accessor
37507028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org   *   and is used to perform implicit instance checks against them. If the
37517028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org   *   receiver is incompatible (i.e. is not an instance of the constructor as
37527028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org   *   defined by FunctionTemplate::HasInstance()), an implicit TypeError is
37537028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org   *   thrown and no callback is invoked.
375443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
3755bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  void SetAccessor(Handle<String> name,
3756bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                   AccessorGetterCallback getter,
3757bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                   AccessorSetterCallback setter = 0,
3758bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                   Handle<Value> data = Handle<Value>(),
3759bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                   AccessControl settings = DEFAULT,
3760bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                   PropertyAttribute attribute = None,
3761bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                   Handle<AccessorSignature> signature =
3762bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                       Handle<AccessorSignature>());
3763e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  void SetAccessor(Handle<Name> name,
3764e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org                   AccessorNameGetterCallback getter,
3765e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org                   AccessorNameSetterCallback setter = 0,
3766e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org                   Handle<Value> data = Handle<Value>(),
3767e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org                   AccessControl settings = DEFAULT,
3768e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org                   PropertyAttribute attribute = None,
3769e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org                   Handle<AccessorSignature> signature =
3770e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org                       Handle<AccessorSignature>());
377143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
377243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
377343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Sets a named property handler on the object template.
3774727e995b7bba3c57fb1e5c156d386ca11894f781v   *
3775e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org   * Whenever a property whose name is a string is accessed on objects created
3776e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org   * from this object template, the provided callback is invoked instead of
3777727e995b7bba3c57fb1e5c156d386ca11894f781v   * accessing the property directly on the JavaScript object.
3778727e995b7bba3c57fb1e5c156d386ca11894f781v   *
3779727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param getter The callback to invoke when getting a property.
3780727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param setter The callback to invoke when setting a property.
37812c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org   * \param query The callback to invoke to check if a property is present,
37822c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org   *   and if present, get its attributes.
3783727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param deleter The callback to invoke when deleting a property.
3784727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param enumerator The callback to invoke to enumerate all the named
3785727e995b7bba3c57fb1e5c156d386ca11894f781v   *   properties of an object.
3786727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param data A piece of data that will be passed to the callbacks
3787727e995b7bba3c57fb1e5c156d386ca11894f781v   *   whenever they are invoked.
378843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
3789bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  void SetNamedPropertyHandler(
3790bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      NamedPropertyGetterCallback getter,
3791bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      NamedPropertySetterCallback setter = 0,
3792bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      NamedPropertyQueryCallback query = 0,
3793bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      NamedPropertyDeleterCallback deleter = 0,
3794bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      NamedPropertyEnumeratorCallback enumerator = 0,
3795bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      Handle<Value> data = Handle<Value>());
379643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
379743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
379843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Sets an indexed property handler on the object template.
3799727e995b7bba3c57fb1e5c156d386ca11894f781v   *
3800727e995b7bba3c57fb1e5c156d386ca11894f781v   * Whenever an indexed property is accessed on objects created from
3801727e995b7bba3c57fb1e5c156d386ca11894f781v   * this object template, the provided callback is invoked instead of
3802727e995b7bba3c57fb1e5c156d386ca11894f781v   * accessing the property directly on the JavaScript object.
3803727e995b7bba3c57fb1e5c156d386ca11894f781v   *
3804727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param getter The callback to invoke when getting a property.
3805727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param setter The callback to invoke when setting a property.
38067304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * \param query The callback to invoke to check if an object has a property.
3807727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param deleter The callback to invoke when deleting a property.
3808727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param enumerator The callback to invoke to enumerate all the indexed
3809727e995b7bba3c57fb1e5c156d386ca11894f781v   *   properties of an object.
3810727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param data A piece of data that will be passed to the callbacks
3811727e995b7bba3c57fb1e5c156d386ca11894f781v   *   whenever they are invoked.
381243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
3813bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  void SetIndexedPropertyHandler(
3814bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      IndexedPropertyGetterCallback getter,
3815bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      IndexedPropertySetterCallback setter = 0,
3816bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      IndexedPropertyQueryCallback query = 0,
3817bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      IndexedPropertyDeleterCallback deleter = 0,
3818bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      IndexedPropertyEnumeratorCallback enumerator = 0,
3819bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      Handle<Value> data = Handle<Value>());
382026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org
382143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
382243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Sets the callback to be used when calling instances created from
382343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * this template as a function.  If no callback is set, instances
3824727e995b7bba3c57fb1e5c156d386ca11894f781v   * behave like normal JavaScript objects that cannot be called as a
382543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * function.
382643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
3827bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  void SetCallAsFunctionHandler(FunctionCallback callback,
3828bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                                Handle<Value> data = Handle<Value>());
382943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3830727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
3831727e995b7bba3c57fb1e5c156d386ca11894f781v   * Mark object instances of the template as undetectable.
3832727e995b7bba3c57fb1e5c156d386ca11894f781v   *
3833727e995b7bba3c57fb1e5c156d386ca11894f781v   * In many ways, undetectable objects behave as though they are not
3834727e995b7bba3c57fb1e5c156d386ca11894f781v   * there.  They behave like 'undefined' in conditionals and when
3835727e995b7bba3c57fb1e5c156d386ca11894f781v   * printed.  However, properties can be accessed and called as on
3836727e995b7bba3c57fb1e5c156d386ca11894f781v   * normal objects.
3837727e995b7bba3c57fb1e5c156d386ca11894f781v   */
383843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void MarkAsUndetectable();
383943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3840727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
3841727e995b7bba3c57fb1e5c156d386ca11894f781v   * Sets access check callbacks on the object template.
3842727e995b7bba3c57fb1e5c156d386ca11894f781v   *
3843727e995b7bba3c57fb1e5c156d386ca11894f781v   * When accessing properties on instances of this object template,
3844727e995b7bba3c57fb1e5c156d386ca11894f781v   * the access check callback will be called to determine whether or
3845727e995b7bba3c57fb1e5c156d386ca11894f781v   * not to allow cross-context access to the properties.
38465a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * The last parameter specifies whether access checks are turned
38475a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * on by default on instances. If access checks are off by default,
38485a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * they can be turned on on individual instances by calling
38495a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * Object::TurnOnAccessCheck().
3850727e995b7bba3c57fb1e5c156d386ca11894f781v   */
385143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void SetAccessCheckCallbacks(NamedSecurityCallback named_handler,
385243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                               IndexedSecurityCallback indexed_handler,
38535a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org                               Handle<Value> data = Handle<Value>(),
38545a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org                               bool turned_on_by_default = true);
385543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3856212ac23f8231d169b4aa6737d762099993020826kasper.lund  /**
3857212ac23f8231d169b4aa6737d762099993020826kasper.lund   * Gets the number of internal fields for objects generated from
3858212ac23f8231d169b4aa6737d762099993020826kasper.lund   * this template.
3859212ac23f8231d169b4aa6737d762099993020826kasper.lund   */
3860212ac23f8231d169b4aa6737d762099993020826kasper.lund  int InternalFieldCount();
3861212ac23f8231d169b4aa6737d762099993020826kasper.lund
3862212ac23f8231d169b4aa6737d762099993020826kasper.lund  /**
3863212ac23f8231d169b4aa6737d762099993020826kasper.lund   * Sets the number of internal fields for objects generated from
3864212ac23f8231d169b4aa6737d762099993020826kasper.lund   * this template.
3865212ac23f8231d169b4aa6737d762099993020826kasper.lund   */
3866212ac23f8231d169b4aa6737d762099993020826kasper.lund  void SetInternalFieldCount(int value);
3867212ac23f8231d169b4aa6737d762099993020826kasper.lund
386843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
386943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ObjectTemplate();
387037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  static Local<ObjectTemplate> New(internal::Isolate* isolate,
387137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org                                   Handle<FunctionTemplate> constructor);
387243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class FunctionTemplate;
387343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
387443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
387543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
387643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
38777028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org * A Signature specifies which receivers and arguments are valid
38787028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org * parameters to a function.
387943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3880594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Signature : public Data {
388143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
388237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  static Local<Signature> New(Isolate* isolate,
388337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org                              Handle<FunctionTemplate> receiver =
388437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org                                  Handle<FunctionTemplate>(),
388537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org                              int argc = 0,
388637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org                              Handle<FunctionTemplate> argv[] = 0);
38879f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org
388843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
388943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Signature();
389043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
389143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
389243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
389343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
38947028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org * An AccessorSignature specifies which receivers are valid parameters
38957028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org * to an accessor callback.
38967028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org */
3897594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT AccessorSignature : public Data {
38987028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org public:
389937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  static Local<AccessorSignature> New(Isolate* isolate,
390037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org                                      Handle<FunctionTemplate> receiver =
390137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org                                          Handle<FunctionTemplate>());
390237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org
39037028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org private:
39047028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  AccessorSignature();
39057028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org};
39067028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
39077028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
3908594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT DeclaredAccessorDescriptor : public Data {
3909750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org private:
3910750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  DeclaredAccessorDescriptor();
3911750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org};
3912750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
3913750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
3914594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT ObjectOperationDescriptor : public Data {
3915750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org public:
3916750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  // This function is not yet stable and should not be used at this time.
3917750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  static Local<RawOperationDescriptor> NewInternalFieldDereference(
3918750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      Isolate* isolate,
3919750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      int internal_field);
3920750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org private:
3921750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ObjectOperationDescriptor();
3922750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org};
3923750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
3924750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
3925750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgenum DeclaredAccessorDescriptorDataType {
3926750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    kDescriptorBoolType,
3927750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    kDescriptorInt8Type, kDescriptorUint8Type,
3928750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    kDescriptorInt16Type, kDescriptorUint16Type,
3929750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    kDescriptorInt32Type, kDescriptorUint32Type,
3930750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    kDescriptorFloatType, kDescriptorDoubleType
3931750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org};
3932750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
3933750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
3934594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT RawOperationDescriptor : public Data {
3935750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org public:
3936750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  Local<DeclaredAccessorDescriptor> NewHandleDereference(Isolate* isolate);
3937750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  Local<RawOperationDescriptor> NewRawDereference(Isolate* isolate);
3938750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  Local<RawOperationDescriptor> NewRawShift(Isolate* isolate,
3939750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                                            int16_t byte_offset);
3940750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  Local<DeclaredAccessorDescriptor> NewPointerCompare(Isolate* isolate,
3941750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                                                      void* compare_value);
3942750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  Local<DeclaredAccessorDescriptor> NewPrimitiveValue(
3943750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      Isolate* isolate,
3944750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      DeclaredAccessorDescriptorDataType data_type,
3945750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      uint8_t bool_offset = 0);
3946750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  Local<DeclaredAccessorDescriptor> NewBitmaskCompare8(Isolate* isolate,
3947750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                                                       uint8_t bitmask,
3948750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                                                       uint8_t compare_value);
3949750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  Local<DeclaredAccessorDescriptor> NewBitmaskCompare16(
3950750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      Isolate* isolate,
3951750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      uint16_t bitmask,
3952750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      uint16_t compare_value);
3953750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  Local<DeclaredAccessorDescriptor> NewBitmaskCompare32(
3954750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      Isolate* isolate,
3955750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      uint32_t bitmask,
3956750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      uint32_t compare_value);
3957750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
3958750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org private:
3959750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  RawOperationDescriptor();
3960750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org};
3961750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
3962750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
39637028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org/**
3964727e995b7bba3c57fb1e5c156d386ca11894f781v * A utility for determining the type of objects based on the template
3965727e995b7bba3c57fb1e5c156d386ca11894f781v * they were constructed from.
396643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3967594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT TypeSwitch : public Data {
396843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
396943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static Local<TypeSwitch> New(Handle<FunctionTemplate> type);
397043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static Local<TypeSwitch> New(int argc, Handle<FunctionTemplate> types[]);
397143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int match(Handle<Value> value);
397243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
397343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  TypeSwitch();
397443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
397543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
397643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3977fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Extensions ---
397843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
39792c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.orgclass V8_EXPORT ExternalOneByteStringResourceImpl
39802c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    : public String::ExternalOneByteStringResource {
3981c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com public:
39822c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  ExternalOneByteStringResourceImpl() : data_(0), length_(0) {}
39832c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  ExternalOneByteStringResourceImpl(const char* data, size_t length)
3984c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      : data_(data), length_(length) {}
3985c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  const char* data() const { return data_; }
3986c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  size_t length() const { return length_; }
3987c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
3988c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com private:
3989c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  const char* data_;
3990c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  size_t length_;
3991c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com};
399243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
399343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
399443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Ignore
399543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3996594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Extension {  // NOLINT
399743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
3998c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Note that the strings passed into this constructor must live as long
3999c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // as the Extension itself.
400043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Extension(const char* name,
4001355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org            const char* source = 0,
400243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            int dep_count = 0,
4003c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com            const char** deps = 0,
4004c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com            int source_length = -1);
400543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  virtual ~Extension() { }
400637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  virtual v8::Handle<v8::FunctionTemplate> GetNativeFunctionTemplate(
400737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org      v8::Isolate* isolate, v8::Handle<v8::String> name) {
400843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return v8::Handle<v8::FunctionTemplate>();
400943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
401043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4011c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  const char* name() const { return name_; }
4012c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  size_t source_length() const { return source_length_; }
40132c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const String::ExternalOneByteStringResource* source() const {
4014c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    return &source_; }
401543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int dependency_count() { return dep_count_; }
401643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  const char** dependencies() { return deps_; }
401743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void set_auto_enable(bool value) { auto_enable_ = value; }
401843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool auto_enable() { return auto_enable_; }
401943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
402043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
402143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  const char* name_;
4022c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  size_t source_length_;  // expected to initialize before source_
40232c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  ExternalOneByteStringResourceImpl source_;
402443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int dep_count_;
402543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  const char** deps_;
402643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool auto_enable_;
402741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
402841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org  // Disallow copying and assigning.
402941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org  Extension(const Extension&);
403041044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org  void operator=(const Extension&);
403143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
403243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
403343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4034594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgvoid V8_EXPORT RegisterExtension(Extension* extension);
403543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
403643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4037fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Statics ---
403843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
403937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgV8_INLINE Handle<Primitive> Undefined(Isolate* isolate);
404037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgV8_INLINE Handle<Primitive> Null(Isolate* isolate);
404137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgV8_INLINE Handle<Boolean> True(Isolate* isolate);
404237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgV8_INLINE Handle<Boolean> False(Isolate* isolate);
404343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
404443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
404543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
4046c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * A set of constraints that specifies the limits of the runtime's memory use.
4047c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * You must set the heap size before initializing the VM - the size cannot be
4048c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * adjusted after the VM is initialized.
4049c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org *
4050c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * If you are using threads then you should hold the V8::Locker lock while
4051c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * setting the stack limit and you must set a non-default stack limit separately
4052c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * for each thread.
405343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
4054594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT ResourceConstraints {
405543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
405643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ResourceConstraints();
4057feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org
4058feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  /**
4059feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org   * Configures the constraints with reasonable default values based on the
4060feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org   * capabilities of the current device the VM is running on.
4061feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org   *
4062feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org   * \param physical_memory The total amount of physical memory on the current
4063feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org   *   device, in bytes.
40645b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org   * \param virtual_memory_limit The amount of virtual memory on the current
40655b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org   *   device, in bytes, or zero, if there is no limit.
40669af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org   * \param number_of_processors The number of CPUs available on the current
40679af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org   *   device.
4068feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org   */
40699af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  void ConfigureDefaults(uint64_t physical_memory,
40705b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org                         uint64_t virtual_memory_limit,
40719af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org                         uint32_t number_of_processors);
4072feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org
40733c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  int max_semi_space_size() const { return max_semi_space_size_; }
40743c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  void set_max_semi_space_size(int value) { max_semi_space_size_ = value; }
40755a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  int max_old_space_size() const { return max_old_space_size_; }
407643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void set_max_old_space_size(int value) { max_old_space_size_ = value; }
40779af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  int max_executable_size() const { return max_executable_size_; }
407801fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org  void set_max_executable_size(int value) { max_executable_size_ = value; }
40795a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  uint32_t* stack_limit() const { return stack_limit_; }
4080c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  // Sets an address beyond which the VM's stack may not grow.
408143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void set_stack_limit(uint32_t* value) { stack_limit_ = value; }
40829af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  int max_available_threads() const { return max_available_threads_; }
40839af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  // Set the number of threads available to V8, assuming at least 1.
40849af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  void set_max_available_threads(int value) {
40859af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    max_available_threads_ = value;
40869af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  }
408770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  size_t code_range_size() const { return code_range_size_; }
408870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  void set_code_range_size(size_t value) {
40895b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    code_range_size_ = value;
40905b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  }
4091c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org
409243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
40933c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  int max_semi_space_size_;
409443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int max_old_space_size_;
409501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org  int max_executable_size_;
409643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  uint32_t* stack_limit_;
40979af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  int max_available_threads_;
409870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  size_t code_range_size_;
409943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
410043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
410143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4102fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Exceptions ---
410343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
410443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
410543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef void (*FatalErrorCallback)(const char* location, const char* message);
410643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
410743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
410889e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.orgtypedef void (*MessageCallback)(Handle<Message> message, Handle<Value> error);
410943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4110ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org// --- Tracing ---
4111ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
4112ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgtypedef void (*LogEventCallback)(const char* name, int event);
411343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
411443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
411543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Create new error objects by calling the corresponding error object
411643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * constructor with the message.
411743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
4118594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Exception {
411943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
412043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static Local<Value> RangeError(Handle<String> message);
412143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static Local<Value> ReferenceError(Handle<String> message);
412243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static Local<Value> SyntaxError(Handle<String> message);
412343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static Local<Value> TypeError(Handle<String> message);
412443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static Local<Value> Error(Handle<String> message);
412543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
412643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
412743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4128fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Counters Callbacks ---
412943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4130a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgtypedef int* (*CounterLookupCallback)(const char* name);
413143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4132bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgtypedef void* (*CreateHistogramCallback)(const char* name,
4133bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org                                         int min,
4134bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org                                         int max,
4135bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org                                         size_t buckets);
4136bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
4137bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgtypedef void (*AddHistogramSampleCallback)(void* histogram, int sample);
4138bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
4139fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Memory Allocation Callback ---
41403cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org  enum ObjectSpace {
41413cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org    kObjectSpaceNewSpace = 1 << 0,
41423cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org    kObjectSpaceOldPointerSpace = 1 << 1,
41433cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org    kObjectSpaceOldDataSpace = 1 << 2,
41443cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org    kObjectSpaceCodeSpace = 1 << 3,
41453cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org    kObjectSpaceMapSpace = 1 << 4,
41463cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org    kObjectSpaceLoSpace = 1 << 5,
41473cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org
41483cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org    kObjectSpaceAll = kObjectSpaceNewSpace | kObjectSpaceOldPointerSpace |
41493cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org      kObjectSpaceOldDataSpace | kObjectSpaceCodeSpace | kObjectSpaceMapSpace |
41503cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org      kObjectSpaceLoSpace
41513cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org  };
41523cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org
41533cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org  enum AllocationAction {
41543cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org    kAllocationActionAllocate = 1 << 0,
41553cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org    kAllocationActionFree = 1 << 1,
41563cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org    kAllocationActionAll = kAllocationActionAllocate | kAllocationActionFree
41573cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org  };
41583cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org
41593cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.orgtypedef void (*MemoryAllocationCallback)(ObjectSpace space,
41603cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org                                         AllocationAction action,
41613cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org                                         int size);
41623cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org
4163fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org// --- Leave Script Callback ---
4164fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.orgtypedef void (*CallCompletedCallback)();
4165fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org
416638de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org// --- Microtask Callback ---
416738de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.orgtypedef void (*MicrotaskCallback)(void* data);
416838de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org
4169fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Failed Access Check Callback ---
417043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef void (*FailedAccessCheckCallback)(Local<Object> target,
417143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                          AccessType type,
417243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                          Local<Value> data);
417343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4174fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- AllowCodeGenerationFromStrings callbacks ---
4175fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
4176fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org/**
4177fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org * Callback to check if code generation from strings is allowed. See
4178fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org * Context::AllowCodeGenerationFromStrings.
4179fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org */
4180fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.orgtypedef bool (*AllowCodeGenerationFromStringsCallback)(Local<Context> context);
4181fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
4182fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Garbage Collection Callbacks ---
418343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
418443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
41855d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org * Applications can register callback functions which will be called
41865d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org * before and after a garbage collection.  Allocations are not
41875d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org * allowed in the callback functions, you therefore cannot manipulate
4188727e995b7bba3c57fb1e5c156d386ca11894f781v * objects (set or delete properties for example) since it is possible
4189727e995b7bba3c57fb1e5c156d386ca11894f781v * such operations will result in the allocation of objects.
419043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
41915d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.orgenum GCType {
41925d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  kGCTypeScavenge = 1 << 0,
41935d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  kGCTypeMarkSweepCompact = 1 << 1,
41945d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  kGCTypeAll = kGCTypeScavenge | kGCTypeMarkSweepCompact
41955d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org};
41965d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
41975d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.orgenum GCCallbackFlags {
41985d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  kNoGCCallbackFlags = 0,
4199ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  kGCCallbackFlagCompacted = 1 << 0,
42004ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  kGCCallbackFlagConstructRetainedObjectInfos = 1 << 1,
42014ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  kGCCallbackFlagForced = 1 << 2
42025d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org};
42035d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
42045d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.orgtypedef void (*GCPrologueCallback)(GCType type, GCCallbackFlags flags);
42055d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.orgtypedef void (*GCEpilogueCallback)(GCType type, GCCallbackFlags flags);
42065d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
4207ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.orgtypedef void (*InterruptCallback)(Isolate* isolate, void* data);
4208ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org
420943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
421043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
42113811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org * Collection of V8 heap information.
42123811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org *
42133811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org * Instances of this class can be passed to v8::V8::HeapStatistics to
42143811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org * get heap statistics from V8.
42153811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org */
4216594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT HeapStatistics {
42173811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org public:
42183811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  HeapStatistics();
42193811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  size_t total_heap_size() { return total_heap_size_; }
422001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org  size_t total_heap_size_executable() { return total_heap_size_executable_; }
422172204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org  size_t total_physical_size() { return total_physical_size_; }
42223811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  size_t used_heap_size() { return used_heap_size_; }
4223c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  size_t heap_size_limit() { return heap_size_limit_; }
42243811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
42253811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org private:
42263811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  size_t total_heap_size_;
422701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org  size_t total_heap_size_executable_;
422872204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org  size_t total_physical_size_;
42293811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  size_t used_heap_size_;
4230c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  size_t heap_size_limit_;
42313811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
42323811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  friend class V8;
42337c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  friend class Isolate;
42343811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org};
42353811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
42363811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
4237b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.orgclass RetainedObjectInfo;
4238b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org
42399e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org
42409e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org/**
42419e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org * FunctionEntryHook is the type of the profile entry hook called at entry to
42429e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org * any generated function when function-level profiling is enabled.
42439e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org *
42449e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org * \param function the address of the function that's being entered.
42459e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org * \param return_addr_location points to a location on stack where the machine
42469e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org *    return address resides. This can be used to identify the caller of
42479e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org *    \p function, and/or modified to divert execution when \p function exits.
42489e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org *
42499e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org * \note the entry hook must not cause garbage collection.
42509e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org */
42519e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.orgtypedef void (*FunctionEntryHook)(uintptr_t function,
42529e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org                                  uintptr_t return_addr_location);
42539e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org
42549e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org/**
42559e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org * A JIT code event is issued each time code is added, moved or removed.
42569e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org *
42579e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org * \note removal events are not currently issued.
42589e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org */
42599e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.orgstruct JitCodeEvent {
42609e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  enum EventType {
42619e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    CODE_ADDED,
42629e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    CODE_MOVED,
42639e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    CODE_REMOVED,
42649e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    CODE_ADD_LINE_POS_INFO,
42659e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    CODE_START_LINE_INFO_RECORDING,
42669e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    CODE_END_LINE_INFO_RECORDING
42679e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  };
42689e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  // Definition of the code position type. The "POSITION" type means the place
42699e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  // in the source code which are of interest when making stack traces to
42709e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  // pin-point the source location of a stack frame as close as possible.
42719e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  // The "STATEMENT_POSITION" means the place at the beginning of each
42729e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  // statement, and is used to indicate possible break locations.
42739e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  enum PositionType { POSITION, STATEMENT_POSITION };
42749e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org
42759e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  // Type of event.
42769e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  EventType type;
42779e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  // Start of the instructions.
42789e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  void* code_start;
42799e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  // Size of the instructions.
42809e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  size_t code_len;
42819e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  // Script info for CODE_ADDED event.
42829e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  Handle<UnboundScript> script;
42839e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  // User-defined data for *_LINE_INFO_* event. It's used to hold the source
42849e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  // code line information which is returned from the
42859e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  // CODE_START_LINE_INFO_RECORDING event. And it's passed to subsequent
42869e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  // CODE_ADD_LINE_POS_INFO and CODE_END_LINE_INFO_RECORDING events.
42879e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  void* user_data;
42889e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org
42899e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  struct name_t {
42909e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    // Name of the object associated with the code, note that the string is not
42919e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    // zero-terminated.
42929e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    const char* str;
42939e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    // Number of chars in str.
42949e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    size_t len;
42959e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  };
42969e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org
42979e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  struct line_info_t {
42989e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    // PC offset
42999e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    size_t offset;
43009e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    // Code postion
43019e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    size_t pos;
43029e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    // The position type.
43039e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    PositionType position_type;
43049e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  };
43059e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org
43069e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  union {
43079e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    // Only valid for CODE_ADDED.
43089e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    struct name_t name;
43099e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org
43109e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    // Only valid for CODE_ADD_LINE_POS_INFO
43119e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    struct line_info_t line_info;
43129e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org
43139e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    // New location of instructions. Only valid for CODE_MOVED.
43149e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    void* new_code_start;
43159e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  };
43169e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org};
43179e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org
43189e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org/**
43199e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org * Option flags passed to the SetJitCodeEventHandler function.
43209e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org */
43219e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.orgenum JitCodeEventOptions {
43229e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  kJitCodeEventDefault = 0,
43239e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  // Generate callbacks for already existent code.
43249e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  kJitCodeEventEnumExisting = 1
43259e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org};
43269e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org
43279e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org
43289e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org/**
43299e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org * Callback function passed to SetJitCodeEventHandler.
43309e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org *
43319e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org * \param event code add, move or removal event.
43329e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org */
43339e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.orgtypedef void (*JitCodeEventHandler)(const JitCodeEvent* event);
43349e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org
43359e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org
43363811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org/**
4337a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org * Isolate represents an isolated instance of the V8 engine.  V8 isolates have
4338a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org * completely separate states.  Objects from one isolate must not be used in
4339a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org * other isolates.  The embedder can create multiple isolates and use them in
4340a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org * parallel in multiple threads.  An isolate can be entered by at most one
4341a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org * thread at any given time.  The Locker/Unlocker API must be used to
4342a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org * synchronize.
4343ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org */
4344594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Isolate {
4345ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org public:
4346ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  /**
43479e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org   * Initial configuration parameters for a new Isolate.
43489e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org   */
43499e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  struct CreateParams {
4350a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    CreateParams()
4351a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        : entry_hook(NULL),
4352a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          code_event_handler(NULL),
4353a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          enable_serializer(false) {}
43549e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org
43559e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    /**
43569e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org     * The optional entry_hook allows the host application to provide the
43579e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org     * address of a function that's invoked on entry to every V8-generated
43589e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org     * function.  Note that entry_hook is invoked at the very start of each
43599e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org     * generated function. Furthermore, if an  entry_hook is given, V8 will
43609e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org     * always run without a context snapshot.
43619e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org     */
43629e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    FunctionEntryHook entry_hook;
43639e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org
43649e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    /**
43659e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org     * Allows the host application to provide the address of a function that is
43669e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org     * notified each time code is added, moved or removed.
43679e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org     */
43689e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    JitCodeEventHandler code_event_handler;
4369d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org
4370d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org    /**
4371d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org     * ResourceConstraints to use for the new Isolate.
4372d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org     */
4373d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org    ResourceConstraints constraints;
4374a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
4375a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    /**
4376a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org     * This flag currently renders the Isolate unusable.
4377a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org     */
4378a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    bool enable_serializer;
43799e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  };
43809e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org
43819e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org
43829e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  /**
4383ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * Stack-allocated class which sets the isolate for all operations
4384ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * executed within a local scope.
4385ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   */
4386594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  class V8_EXPORT Scope {
4387ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   public:
4388ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    explicit Scope(Isolate* isolate) : isolate_(isolate) {
4389ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      isolate->Enter();
4390ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    }
4391ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4392ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    ~Scope() { isolate_->Exit(); }
4393ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4394ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   private:
4395ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    Isolate* const isolate_;
4396ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4397ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    // Prevent copying of Scope objects.
4398ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    Scope(const Scope&);
4399ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    Scope& operator=(const Scope&);
4400ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  };
4401ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
44025697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org
44035697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org  /**
44045697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org   * Assert that no Javascript code is invoked.
44055697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org   */
4406c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  class V8_EXPORT DisallowJavascriptExecutionScope {
44075697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org   public:
44085697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org    enum OnFailure { CRASH_ON_FAILURE, THROW_ON_FAILURE };
44095697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org
44107010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org    DisallowJavascriptExecutionScope(Isolate* isolate, OnFailure on_failure);
44115697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org    ~DisallowJavascriptExecutionScope();
44125697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org
44135697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org   private:
44145697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org    bool on_failure_;
44155697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org    void* internal_;
44165697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org
44175697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org    // Prevent copying of Scope objects.
44185697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org    DisallowJavascriptExecutionScope(const DisallowJavascriptExecutionScope&);
44195697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org    DisallowJavascriptExecutionScope& operator=(
44205697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org        const DisallowJavascriptExecutionScope&);
44215697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org  };
44225697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org
44235697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org
44245697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org  /**
44255697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org   * Introduce exception to DisallowJavascriptExecutionScope.
44265697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org   */
4427c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  class V8_EXPORT AllowJavascriptExecutionScope {
44285697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org   public:
44295697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org    explicit AllowJavascriptExecutionScope(Isolate* isolate);
44305697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org    ~AllowJavascriptExecutionScope();
44315697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org
44325697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org   private:
44335697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org    void* internal_throws_;
44345697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org    void* internal_assert_;
44355697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org
44365697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org    // Prevent copying of Scope objects.
44375697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org    AllowJavascriptExecutionScope(const AllowJavascriptExecutionScope&);
44385697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org    AllowJavascriptExecutionScope& operator=(
44395697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org        const AllowJavascriptExecutionScope&);
44405697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org  };
44415697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org
4442ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  /**
4443c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org   * Do not run microtasks while this scope is active, even if microtasks are
4444c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org   * automatically executed otherwise.
4445c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org   */
4446c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org  class V8_EXPORT SuppressMicrotaskExecutionScope {
4447c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org   public:
4448c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org    explicit SuppressMicrotaskExecutionScope(Isolate* isolate);
4449c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org    ~SuppressMicrotaskExecutionScope();
4450c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org
4451c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org   private:
4452c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org    internal::Isolate* isolate_;
4453c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org
4454c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org    // Prevent copying of Scope objects.
4455c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org    SuppressMicrotaskExecutionScope(const SuppressMicrotaskExecutionScope&);
4456c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org    SuppressMicrotaskExecutionScope& operator=(
4457c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org        const SuppressMicrotaskExecutionScope&);
4458c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org  };
4459c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org
4460c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org  /**
44614ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org   * Types of garbage collections that can be requested via
44624ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org   * RequestGarbageCollectionForTesting.
44634ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org   */
44644ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  enum GarbageCollectionType {
44654ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org    kFullGarbageCollection,
44664ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org    kMinorGarbageCollection
44674ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  };
44684ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org
44694ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  /**
4470975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org   * Features reported via the SetUseCounterCallback callback. Do not chang
4471975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org   * assigned numbers of existing items; add new features to the end of this
4472975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org   * list.
4473975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org   */
4474975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  enum UseCounterFeature {
44755de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org    kUseAsm = 0,
44765de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org    kUseCounterFeatureCount  // This enum value must be last.
4477975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  };
4478975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org
4479975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  typedef void (*UseCounterCallback)(Isolate* isolate,
4480975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org                                     UseCounterFeature feature);
4481975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org
4482975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org
4483975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  /**
4484ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * Creates a new isolate.  Does not change the currently entered
4485ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * isolate.
4486ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   *
4487ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * When an isolate is no longer used its resources should be freed
4488ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * by calling Dispose().  Using the delete operator is not allowed.
4489a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org   *
4490a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org   * V8::Initialize() must have run prior to this.
4491ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   */
44929e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  static Isolate* New(const CreateParams& params = CreateParams());
4493ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4494ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  /**
4495ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * Returns the entered isolate for the current thread or NULL in
4496ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * case there is no current isolate.
4497ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   */
4498ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  static Isolate* GetCurrent();
4499ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4500ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  /**
4501ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * Methods below this point require holding a lock (using Locker) in
4502ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * a multi-threaded environment.
4503ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   */
4504ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4505ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  /**
4506ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * Sets this isolate as the entered one for the current thread.
4507ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * Saves the previously entered one (if any), so that it can be
4508ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * restored when exiting.  Re-entering an isolate is allowed.
4509ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   */
4510ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void Enter();
4511ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4512ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  /**
4513ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * Exits this isolate by restoring the previously entered one in the
4514ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * current thread.  The isolate may still stay the same, if it was
4515ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * entered more than once.
4516ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   *
4517ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * Requires: this == Isolate::GetCurrent().
4518ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   */
4519ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void Exit();
4520ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4521ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  /**
4522ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * Disposes the isolate.  The isolate must not be entered by any
4523ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * thread to be disposable.
4524ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   */
4525ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void Dispose();
4526ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4527ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  /**
45287ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org   * Associate embedder-specific data with the isolate. |slot| has to be
45297ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org   * between 0 and GetNumberOfDataSlots() - 1.
45307ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org   */
45317ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  V8_INLINE void SetData(uint32_t slot, void* data);
45327ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org
45337ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  /**
45347ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org   * Retrieve embedder-specific data from the isolate.
45357ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org   * Returns NULL if SetData has never been called for the given |slot|.
45367ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org   */
45377ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  V8_INLINE void* GetData(uint32_t slot);
45387ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org
45397ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  /**
45407ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org   * Returns the maximum number of available embedder data slots. Valid slots
45417ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org   * are in the range of 0 - GetNumberOfDataSlots() - 1.
45427ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org   */
45437ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  V8_INLINE static uint32_t GetNumberOfDataSlots();
45447ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org
45457ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  /**
45467c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org   * Get statistics about the heap memory usage.
45477c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org   */
45487c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  void GetHeapStatistics(HeapStatistics* heap_statistics);
45497c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
45502bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  /**
45512bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   * Adjusts the amount of registered external memory. Used to give V8 an
45522bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   * indication of the amount of externally allocated memory that is kept alive
45532bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   * by JavaScript objects. V8 uses this to decide when to perform global
45542bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   * garbage collections. Registering externally allocated memory will trigger
45552bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   * global garbage collections more often than it would otherwise in an attempt
45562bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   * to garbage collect the JavaScript objects that keep the externally
45572bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   * allocated memory alive.
45582bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   *
45592bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   * \param change_in_bytes the change in externally allocated memory that is
45602bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   *   kept alive by JavaScript objects.
45612bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   * \returns the adjusted value.
45622bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   */
45631e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  V8_INLINE int64_t
45641e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org      AdjustAmountOfExternalAllocatedMemory(int64_t change_in_bytes);
45652bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org
4566f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  /**
4567f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org   * Returns heap profiler for this isolate. Will return NULL until the isolate
4568f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org   * is initialized.
4569f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org   */
4570f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  HeapProfiler* GetHeapProfiler();
4571f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
4572f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  /**
457393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org   * Returns CPU profiler for this isolate. Will return NULL unless the isolate
457493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org   * is initialized. It is the embedder's responsibility to stop all CPU
457593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org   * profiling activities if it has started any.
4576f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org   */
4577f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  CpuProfiler* GetCpuProfiler();
4578f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
4579528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  /** Returns true if this isolate has a current context. */
4580528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  bool InContext();
4581528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
458240ce96b9446ccab86d0d80ee90bb86a9cca33aa7mvstanton@chromium.org  /** Returns the context that is on the top of the stack. */
458340ce96b9446ccab86d0d80ee90bb86a9cca33aa7mvstanton@chromium.org  Local<Context> GetCurrentContext();
458440ce96b9446ccab86d0d80ee90bb86a9cca33aa7mvstanton@chromium.org
4585ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  /**
4586528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org   * Returns the context of the calling JavaScript code.  That is the
4587528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org   * context of the top-most JavaScript frame.  If there are no
4588528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org   * JavaScript frames an empty handle is returned.
4589528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org   */
4590528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Local<Context> GetCallingContext();
4591528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
4592528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  /** Returns the last entered context. */
4593528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Local<Context> GetEnteredContext();
4594528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
4595528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  /**
4596cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org   * Schedules an exception to be thrown when returning to JavaScript.  When an
4597cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org   * exception has been scheduled it is illegal to invoke any JavaScript
4598cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org   * operation; the caller must return immediately and only after the exception
4599cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org   * has been handled does it become legal to invoke JavaScript operations.
4600cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org   */
4601cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  Local<Value> ThrowException(Local<Value> exception);
4602cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org
4603cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  /**
4604ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * Allows the host application to group objects together. If one
4605ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * object in the group is alive, all objects in the group are alive.
4606ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * After each garbage collection, object groups are removed. It is
4607ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * intended to be used in the before-garbage-collection callback
4608ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * function, for instance to simulate DOM tree connections among JS
4609ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * wrapper objects. Object groups for all dependent handles need to
4610ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * be provided for kGCTypeMarkSweepCompact collections, for all other
4611ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * garbage collection types it is sufficient to provide object groups
4612ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * for partially dependent handles only.
4613ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   */
4614690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org  template<typename T> void SetObjectGroupId(const Persistent<T>& object,
4615690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org                                             UniqueId id);
4616ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
4617ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  /**
4618ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * Allows the host application to declare implicit references from an object
4619ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * group to an object. If the objects of the object group are alive, the child
4620ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * object is alive too. After each garbage collection, all implicit references
4621ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * are removed. It is intended to be used in the before-garbage-collection
4622ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * callback function.
4623ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   */
4624690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org  template<typename T> void SetReferenceFromGroup(UniqueId id,
4625690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org                                                  const Persistent<T>& child);
4626ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
4627ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  /**
4628ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * Allows the host application to declare implicit references from an object
4629ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * to another object. If the parent object is alive, the child object is alive
4630ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * too. After each garbage collection, all implicit references are removed. It
4631ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * is intended to be used in the before-garbage-collection callback function.
4632ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   */
4633690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org  template<typename T, typename S>
4634690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org  void SetReference(const Persistent<T>& parent, const Persistent<S>& child);
4635ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
4636528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  typedef void (*GCPrologueCallback)(Isolate* isolate,
4637528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                                     GCType type,
4638528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                                     GCCallbackFlags flags);
4639528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  typedef void (*GCEpilogueCallback)(Isolate* isolate,
4640528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                                     GCType type,
4641528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                                     GCCallbackFlags flags);
4642528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
4643528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  /**
4644528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org   * Enables the host application to receive a notification before a
46452904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org   * garbage collection. Allocations are allowed in the callback function,
46462904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org   * but the callback is not re-entrant: if the allocation inside it will
46472904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org   * trigger the garbage collection, the callback won't be called again.
46482904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org   * It is possible to specify the GCType filter for your callback. But it is
46492904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org   * not possible to register the same callback function two times with
46502904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org   * different GCType filters.
4651528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org   */
4652528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  void AddGCPrologueCallback(
4653528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      GCPrologueCallback callback, GCType gc_type_filter = kGCTypeAll);
4654528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
4655528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  /**
4656528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org   * This function removes callback which was installed by
4657528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org   * AddGCPrologueCallback function.
4658528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org   */
4659528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  void RemoveGCPrologueCallback(GCPrologueCallback callback);
4660528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
4661528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  /**
4662528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org   * Enables the host application to receive a notification after a
46632904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org   * garbage collection. Allocations are allowed in the callback function,
46642904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org   * but the callback is not re-entrant: if the allocation inside it will
46652904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org   * trigger the garbage collection, the callback won't be called again.
46662904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org   * It is possible to specify the GCType filter for your callback. But it is
46672904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org   * not possible to register the same callback function two times with
46682904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org   * different GCType filters.
4669528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org   */
4670528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  void AddGCEpilogueCallback(
4671528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      GCEpilogueCallback callback, GCType gc_type_filter = kGCTypeAll);
4672528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
4673528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  /**
4674528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org   * This function removes callback which was installed by
4675528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org   * AddGCEpilogueCallback function.
4676528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org   */
4677528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  void RemoveGCEpilogueCallback(GCEpilogueCallback callback);
4678528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
4679ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org  /**
4680ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org   * Request V8 to interrupt long running JavaScript code and invoke
4681ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org   * the given |callback| passing the given |data| to it. After |callback|
4682ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org   * returns control will be returned to the JavaScript code.
4683ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org   * At any given moment V8 can remember only a single callback for the very
4684ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org   * last interrupt request.
4685ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org   * Can be called from another thread without acquiring a |Locker|.
4686ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org   * Registered |callback| must not reenter interrupted Isolate.
4687ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org   */
4688ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org  void RequestInterrupt(InterruptCallback callback, void* data);
4689ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org
4690ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org  /**
4691ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org   * Clear interrupt request created by |RequestInterrupt|.
4692ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org   * Can be called from another thread without acquiring a |Locker|.
4693ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org   */
4694ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org  void ClearInterrupt();
4695ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org
46964ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  /**
46974ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org   * Request garbage collection in this Isolate. It is only valid to call this
46984ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org   * function if --expose_gc was specified.
46994ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org   *
47004ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org   * This should only be used for testing purposes and not to enforce a garbage
47014ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org   * collection schedule. It has strong negative impact on the garbage
47024ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org   * collection performance. Use IdleNotification() or LowMemoryNotification()
47034ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org   * instead to influence the garbage collection schedule.
47044ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org   */
47054ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  void RequestGarbageCollectionForTesting(GarbageCollectionType type);
47064ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org
4707ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  /**
4708ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org   * Set the callback to invoke for logging event.
4709ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org   */
4710ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  void SetEventLogger(LogEventCallback that);
4711ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
4712255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org  /**
4713255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org   * Adds a callback to notify the host application when a script finished
4714255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org   * running.  If a script re-enters the runtime during executing, the
4715255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org   * CallCompletedCallback is only invoked when the outer-most script
4716255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org   * execution ends.  Executing scripts inside the callback do not trigger
4717255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org   * further callbacks.
4718255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org   */
4719255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org  void AddCallCompletedCallback(CallCompletedCallback callback);
4720255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org
4721255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org  /**
4722255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org   * Removes callback that was installed by AddCallCompletedCallback.
4723255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org   */
4724255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org  void RemoveCallCompletedCallback(CallCompletedCallback callback);
4725255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org
4726c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org  /**
4727c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org   * Experimental: Runs the Microtask Work Queue until empty
4728e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org   * Any exceptions thrown by microtask callbacks are swallowed.
4729c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org   */
4730c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org  void RunMicrotasks();
4731c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org
4732c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org  /**
4733c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org   * Experimental: Enqueues the callback to the Microtask Work Queue
4734c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org   */
4735c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org  void EnqueueMicrotask(Handle<Function> microtask);
4736c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org
473738de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org  /**
473838de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org   * Experimental: Enqueues the callback to the Microtask Work Queue
473938de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org   */
474038de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org  void EnqueueMicrotask(MicrotaskCallback microtask, void* data = NULL);
474138de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org
4742c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org   /**
4743c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org   * Experimental: Controls whether the Microtask Work Queue is automatically
4744c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org   * run when the script call depth decrements to zero.
4745c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org   */
4746c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org  void SetAutorunMicrotasks(bool autorun);
4747c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org
4748a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org  /**
4749a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org   * Experimental: Returns whether the Microtask Work Queue is automatically
4750a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org   * run when the script call depth decrements to zero.
4751a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org   */
4752a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org  bool WillAutorunMicrotasks() const;
4753a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org
4754975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  /**
4755975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org   * Sets a callback for counting the number of times a feature of V8 is used.
4756975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org   */
4757975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  void SetUseCounterCallback(UseCounterCallback callback);
4758975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org
47596b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org  /**
47606b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org   * Enables the host application to provide a mechanism for recording
47616b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org   * statistics counters.
47626b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org   */
47636b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org  void SetCounterFunction(CounterLookupCallback);
47646b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org
47656b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org  /**
47666b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org   * Enables the host application to provide a mechanism for recording
47676b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org   * histograms. The CreateHistogram function returns a
47686b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org   * histogram which will later be passed to the AddHistogramSample
47696b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org   * function.
47706b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org   */
47716b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org  void SetCreateHistogramFunction(CreateHistogramCallback);
47726b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org  void SetAddHistogramSampleFunction(AddHistogramSampleCallback);
47736b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org
4774f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  /**
4775f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org   * Optional notification that the embedder is idle.
4776f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org   * V8 uses the notification to reduce memory footprint.
4777f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org   * This call can be used repeatedly if the embedder remains idle.
4778f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org   * Returns true if the embedder should stop calling IdleNotification
4779f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org   * until real work has been done.  This indicates that V8 has done
4780f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org   * as much cleanup as it will be able to do.
4781f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org   *
4782f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org   * The idle_time_in_ms argument specifies the time V8 has to do reduce
4783f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org   * the memory footprint. There is no guarantee that the actual work will be
4784f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org   * done within the time limit.
4785f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org   */
4786f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  bool IdleNotification(int idle_time_in_ms);
4787f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org
4788f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  /**
4789f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org   * Optional notification that the system is running low on memory.
4790f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org   * V8 uses these notifications to attempt to free memory.
4791f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org   */
4792f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  void LowMemoryNotification();
4793f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org
4794f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  /**
4795f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org   * Optional notification that a context has been disposed. V8 uses
4796f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org   * these notifications to guide the GC heuristic. Returns the number
4797f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org   * of context disposals - including this one - since the last time
4798f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org   * V8 had a chance to clean up.
4799f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org   */
4800f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  int ContextDisposedNotification();
4801f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org
48029e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  /**
48039e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org   * Allows the host application to provide the address of a function that is
48049e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org   * notified each time code is added, moved or removed.
48059e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org   *
48069e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org   * \param options options for the JIT code event handler.
48079e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org   * \param event_handler the JIT code event handler, which will be invoked
48089e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org   *     each time code is added, moved or removed.
48099e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org   * \note \p event_handler won't get notified of existent code.
48109e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org   * \note since code removal notifications are not currently issued, the
48119e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org   *     \p event_handler may get notifications of code that overlaps earlier
48129e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org   *     code notifications. This happens when code areas are reused, and the
48139e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org   *     earlier overlapping code areas should therefore be discarded.
48149e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org   * \note the events passed to \p event_handler and the strings they point to
48159e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org   *     are not guaranteed to live past each call. The \p event_handler must
48169e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org   *     copy strings and other parameters it needs to keep around.
48179e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org   * \note the set of events declared in JitCodeEvent::EventType is expected to
48189e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org   *     grow over time, and the JitCodeEvent structure is expected to accrue
48199e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org   *     new members. The \p event_handler function must ignore event codes
48209e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org   *     it does not recognize to maintain future compatibility.
48219e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org   * \note Use Isolate::CreateParams to get events for code executed during
48229e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org   *     Isolate setup.
48239e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org   */
48249e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  void SetJitCodeEventHandler(JitCodeEventOptions options,
48259e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org                              JitCodeEventHandler event_handler);
48269e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org
4827d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org  /**
4828d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org   * Modifies the stack limit for this Isolate.
4829d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org   *
4830d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org   * \param stack_limit An address beyond which the Vm's stack may not grow.
4831d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org   *
4832d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org   * \note  If you are using threads then you should hold the V8::Locker lock
4833d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org   *     while setting the stack limit and you must set a non-default stack
4834d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org   *     limit separately for each thread.
4835d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org   */
4836d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org  void SetStackLimit(uintptr_t stack_limit);
4837d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org
4838ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org private:
4839381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  template<class K, class V, class Traits> friend class PersistentValueMap;
4840381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org
4841ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Isolate();
4842ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Isolate(const Isolate&);
4843ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ~Isolate();
4844ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Isolate& operator=(const Isolate&);
4845ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void* operator new(size_t size);
4846ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void operator delete(void*, size_t);
4847ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4848690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org  void SetObjectGroupId(internal::Object** object, UniqueId id);
4849690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org  void SetReferenceFromGroup(UniqueId id, internal::Object** object);
4850690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org  void SetReference(internal::Object** parent, internal::Object** child);
48511e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  void CollectAllGarbage(const char* gc_reason);
4852690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org};
4853ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4854594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT StartupData {
48558e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org public:
48568e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  enum CompressionAlgorithm {
48578e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    kUncompressed,
48588e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    kBZip2
48598e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  };
48608e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
48618e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  const char* data;
48628e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  int compressed_size;
48638e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  int raw_size;
48648e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org};
48658e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
4866e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org
4867e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org/**
4868e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org * A helper class for driving V8 startup data decompression.  It is based on
4869e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org * "CompressedStartupData" API functions from the V8 class.  It isn't mandatory
4870e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org * for an embedder to use this class, instead, API functions can be used
4871e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org * directly.
4872e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org *
4873e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org * For an example of the class usage, see the "shell.cc" sample application.
4874e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org */
4875594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT StartupDataDecompressor {  // NOLINT
4876e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org public:
4877e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org  StartupDataDecompressor();
4878e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org  virtual ~StartupDataDecompressor();
4879e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org  int Decompress();
4880e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org
4881e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org protected:
4882e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org  virtual int DecompressData(char* raw_data,
4883e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org                             int* raw_data_size,
4884e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org                             const char* compressed_data,
4885e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org                             int compressed_data_size) = 0;
4886e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org
4887e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org private:
4888e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org  char** raw_data;
4889e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org};
4890e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org
489184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
489284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org/**
489384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org * EntropySource is used as a callback function when v8 needs a source
489484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org * of entropy.
489584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org */
489684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgtypedef bool (*EntropySource)(unsigned char* buffer, size_t length);
489784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
4898f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
4899f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com/**
4900967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org * ReturnAddressLocationResolver is used as a callback function when v8 is
4901967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org * resolving the location of a return address on the stack. Profilers that
4902967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org * change the return address on the stack can use this to resolve the stack
4903967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org * location to whereever the profiler stashed the original return address.
4904753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org *
4905753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org * \param return_addr_location points to a location on stack where a machine
4906753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org *    return address resides.
4907753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org * \returns either return_addr_location, or else a pointer to the profiler's
4908753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org *    copy of the original return address.
4909753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org *
4910753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org * \note the resolver function must not cause garbage collection.
4911967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org */
4912967e270a034432457500dbf950d2c4951a929e52ulan@chromium.orgtypedef uintptr_t (*ReturnAddressLocationResolver)(
4913967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org    uintptr_t return_addr_location);
4914967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org
4915967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org
4916967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org/**
491789e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org * Interface for iterating through all external resources in the heap.
4918f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com */
4919594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT ExternalResourceVisitor {  // NOLINT
4920f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com public:
4921f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  virtual ~ExternalResourceVisitor() {}
4922f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  virtual void VisitExternalString(Handle<String> string) {}
4923f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com};
4924f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
4925f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
4926ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org/**
492789e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org * Interface for iterating through all the persistent handles in the heap.
492889e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org */
4929594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT PersistentHandleVisitor {  // NOLINT
493089e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org public:
493189e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  virtual ~PersistentHandleVisitor() {}
4932b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  virtual void VisitPersistentHandle(Persistent<Value>* value,
4933b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org                                     uint16_t class_id) {}
493489e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org};
493589e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
493689e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
493789e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org/**
493843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Container class for static utility functions.
493943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
4940594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT V8 {
494143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
4942727e995b7bba3c57fb1e5c156d386ca11894f781v  /** Set the callback to invoke in case of fatal errors. */
494343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static void SetFatalErrorHandler(FatalErrorCallback that);
494443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4945727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
4946fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * Set the callback to invoke to check if code generation from
4947fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * strings should be allowed.
4948fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   */
4949fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  static void SetAllowCodeGenerationFromStringsCallback(
4950fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org      AllowCodeGenerationFromStringsCallback that);
4951fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
4952fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  /**
4953837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * Set allocator to use for ArrayBuffer memory.
4954837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * The allocator should be set only once. The allocator should be set
4955837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * before any code tha uses ArrayBuffers is executed.
4956837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * This allocator is used in all isolates.
4957837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   */
4958837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  static void SetArrayBufferAllocator(ArrayBuffer::Allocator* allocator);
4959837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org
4960837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  /**
49619258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * Check if V8 is dead and therefore unusable.  This is the case after
4962727e995b7bba3c57fb1e5c156d386ca11894f781v   * fatal errors such as out-of-memory situations.
4963727e995b7bba3c57fb1e5c156d386ca11894f781v   */
496443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static bool IsDead();
496543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
496643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
49678e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   * The following 4 functions are to be used when V8 is built with
49688e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   * the 'compress_startup_data' flag enabled. In this case, the
49698e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   * embedder must decompress startup data prior to initializing V8.
49708e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   *
49718e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   * This is how interaction with V8 should look like:
49728e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   *   int compressed_data_count = v8::V8::GetCompressedStartupDataCount();
49738e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   *   v8::StartupData* compressed_data =
49748e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   *     new v8::StartupData[compressed_data_count];
49758e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   *   v8::V8::GetCompressedStartupData(compressed_data);
49768e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   *   ... decompress data (compressed_data can be updated in-place) ...
49778e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   *   v8::V8::SetDecompressedStartupData(compressed_data);
49788e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   *   ... now V8 can be initialized
49798e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   *   ... make sure the decompressed data stays valid until V8 shutdown
4980e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org   *
4981e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org   * A helper class StartupDataDecompressor is provided. It implements
4982e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org   * the protocol of the interaction described above, and can be used in
4983e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org   * most cases instead of calling these API functions directly.
49848e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   */
49858e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  static StartupData::CompressionAlgorithm GetCompressedStartupDataAlgorithm();
49868e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  static int GetCompressedStartupDataCount();
49878e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  static void GetCompressedStartupData(StartupData* compressed_data);
49888e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  static void SetDecompressedStartupData(StartupData* decompressed_data);
49898e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
49908e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  /**
4991975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org   * Hand startup data to V8, in case the embedder has chosen to build
4992975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org   * V8 with external startup data.
4993975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org   *
4994975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org   * Note:
4995975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org   * - By default the startup data is linked into the V8 library, in which
4996975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org   *   case this function is not meaningful.
4997975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org   * - If this needs to be called, it needs to be called before V8
4998975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org   *   tries to make use of its built-ins.
4999975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org   * - To avoid unnecessary copies of data, V8 will point directly into the
5000975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org   *   given data blob, so pretty please keep it around until V8 exit.
5001975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org   * - Compression of the startup blob might be useful, but needs to
5002975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org   *   handled entirely on the embedders' side.
5003975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org   * - The call will abort if the data is invalid.
5004975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org   */
5005975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  static void SetNativesDataBlob(StartupData* startup_blob);
5006975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  static void SetSnapshotDataBlob(StartupData* startup_blob);
5007975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org
5008975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  /**
5009727e995b7bba3c57fb1e5c156d386ca11894f781v   * Adds a message listener.
5010727e995b7bba3c57fb1e5c156d386ca11894f781v   *
50117304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * The same message listener can be added more than once and in that
5012727e995b7bba3c57fb1e5c156d386ca11894f781v   * case it will be called more than once for each message.
50138432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org   *
50148432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org   * If data is specified, it will be passed to the callback when it is called.
50158432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org   * Otherwise, the exception object will be passed to the callback instead.
501643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
50178432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org  static bool AddMessageListener(MessageCallback that,
50188432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org                                 Handle<Value> data = Handle<Value>());
501943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
502043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
502143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Remove all message listeners from the specified callback function.
502243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
502343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static void RemoveMessageListeners(MessageCallback that);
502443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
502543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
50266a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org   * Tells V8 to capture current stack trace when uncaught exception occurs
50276a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org   * and report it to the message listeners. The option is off by default.
50286a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org   */
50296a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org  static void SetCaptureStackTraceForUncaughtExceptions(
50306a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org      bool capture,
50316a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org      int frame_limit = 10,
50326a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org      StackTrace::StackTraceOptions options = StackTrace::kOverview);
50336a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org
50346a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org  /**
5035727e995b7bba3c57fb1e5c156d386ca11894f781v   * Sets V8 flags from a string.
503643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
503743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static void SetFlagsFromString(const char* str, int length);
503843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
50399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  /**
5040727e995b7bba3c57fb1e5c156d386ca11894f781v   * Sets V8 flags from the command line.
50419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com   */
50429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  static void SetFlagsFromCommandLine(int* argc,
50439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                                      char** argv,
50449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                                      bool remove_flags);
50459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
50467276f14ca716596e0a0d17539516370c1f453847kasper.lund  /** Get the version string. */
50477276f14ca716596e0a0d17539516370c1f453847kasper.lund  static const char* GetVersion();
504843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
504943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /** Callback function for reporting failed access checks.*/
505043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static void SetFailedAccessCheckCallbackFunction(FailedAccessCheckCallback);
505143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
505243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
5053727e995b7bba3c57fb1e5c156d386ca11894f781v   * Enables the host application to receive a notification before a
50545d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * garbage collection.  Allocations are not allowed in the
50555d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * callback function, you therefore cannot manipulate objects (set
50565d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * or delete properties for example) since it is possible such
50575d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * operations will result in the allocation of objects. It is possible
50585d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * to specify the GCType filter for your callback. But it is not possible to
50595d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * register the same callback function two times with different
50605d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * GCType filters.
50615d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   */
50625d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  static void AddGCPrologueCallback(
50635d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org      GCPrologueCallback callback, GCType gc_type_filter = kGCTypeAll);
50645d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
50655d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  /**
50665d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * This function removes callback which was installed by
50675d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * AddGCPrologueCallback function.
50685d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   */
50695d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  static void RemoveGCPrologueCallback(GCPrologueCallback callback);
50705d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
50715d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  /**
5072727e995b7bba3c57fb1e5c156d386ca11894f781v   * Enables the host application to receive a notification after a
50735d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * garbage collection.  Allocations are not allowed in the
50745d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * callback function, you therefore cannot manipulate objects (set
50755d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * or delete properties for example) since it is possible such
50765d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * operations will result in the allocation of objects. It is possible
50775d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * to specify the GCType filter for your callback. But it is not possible to
50785d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * register the same callback function two times with different
50795d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * GCType filters.
50805d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   */
50815d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  static void AddGCEpilogueCallback(
50825d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org      GCEpilogueCallback callback, GCType gc_type_filter = kGCTypeAll);
50835d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
50845d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  /**
50855d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * This function removes callback which was installed by
50865d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * AddGCEpilogueCallback function.
50875d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   */
50885d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  static void RemoveGCEpilogueCallback(GCEpilogueCallback callback);
50895d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
50905d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  /**
50913cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org   * Enables the host application to provide a mechanism to be notified
50923cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org   * and perform custom logging when V8 Allocates Executable Memory.
50933cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org   */
50943cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org  static void AddMemoryAllocationCallback(MemoryAllocationCallback callback,
50953cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org                                          ObjectSpace space,
50963cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org                                          AllocationAction action);
50973cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org
50983cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org  /**
5099fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org   * Removes callback that was installed by AddMemoryAllocationCallback.
51003cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org   */
51013cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org  static void RemoveMemoryAllocationCallback(MemoryAllocationCallback callback);
51023cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org
51033cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org  /**
5104a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org   * Initializes V8. This function needs to be called before the first Isolate
5105a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org   * is created. It always returns true.
510643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
510743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static bool Initialize();
510843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
51097276f14ca716596e0a0d17539516370c1f453847kasper.lund  /**
511084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   * Allows the host application to provide a callback which can be used
511184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   * as a source of entropy for random number generators.
511284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   */
511384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  static void SetEntropySource(EntropySource source);
511484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
511584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  /**
5116967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org   * Allows the host application to provide a callback that allows v8 to
5117967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org   * cooperate with a profiler that rewrites return addresses on stack.
5118967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org   */
5119967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org  static void SetReturnAddressLocationResolver(
5120967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org      ReturnAddressLocationResolver return_address_resolver);
5121967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org
5122967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org  /**
5123ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * Forcefully terminate the current thread of JavaScript execution
5124e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org   * in the given isolate.
5125c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   *
5126c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * This method can be used by any thread even if that thread has not
5127c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * acquired the V8 lock with a Locker object.
5128ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   *
5129ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * \param isolate The isolate in which to terminate the current JS execution.
5130c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   */
5131e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org  static void TerminateExecution(Isolate* isolate);
51329085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
51332ab99526496cda7ff426115c76a1c475a1b4f4a5sgjesse@chromium.org  /**
51342ab99526496cda7ff426115c76a1c475a1b4f4a5sgjesse@chromium.org   * Is V8 terminating JavaScript execution.
51352ab99526496cda7ff426115c76a1c475a1b4f4a5sgjesse@chromium.org   *
51362ab99526496cda7ff426115c76a1c475a1b4f4a5sgjesse@chromium.org   * Returns true if JavaScript execution is currently terminating
51372ab99526496cda7ff426115c76a1c475a1b4f4a5sgjesse@chromium.org   * because of a call to TerminateExecution.  In that case there are
51382ab99526496cda7ff426115c76a1c475a1b4f4a5sgjesse@chromium.org   * still JavaScript frames on the stack and the termination
51392ab99526496cda7ff426115c76a1c475a1b4f4a5sgjesse@chromium.org   * exception is still active.
51406d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org   *
51416d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org   * \param isolate The isolate in which to check.
51422ab99526496cda7ff426115c76a1c475a1b4f4a5sgjesse@chromium.org   */
51436d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  static bool IsExecutionTerminating(Isolate* isolate = NULL);
51442ab99526496cda7ff426115c76a1c475a1b4f4a5sgjesse@chromium.org
51459085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  /**
514632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * Resume execution capability in the given isolate, whose execution
514732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * was previously forcefully terminated using TerminateExecution().
514832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   *
514932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * When execution is forcefully terminated using TerminateExecution(),
515032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * the isolate can not resume execution until all JavaScript frames
515132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * have propagated the uncatchable exception which is generated.  This
515232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * method allows the program embedding the engine to handle the
515332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * termination event and resume execution capability, even if
515432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * JavaScript frames remain on the stack.
515532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   *
515632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * This method can be used by any thread even if that thread has not
515732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * acquired the V8 lock with a Locker object.
515832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   *
515932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * \param isolate The isolate in which to resume execution capability.
516032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   */
516132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  static void CancelTerminateExecution(Isolate* isolate);
516232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
516332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  /**
516441826e77311db718135ef6517b846933dfd275f3ager@chromium.org   * Releases any resources used by v8 and stops any utility threads
516541826e77311db718135ef6517b846933dfd275f3ager@chromium.org   * that may be running.  Note that disposing v8 is permanent, it
516641826e77311db718135ef6517b846933dfd275f3ager@chromium.org   * cannot be reinitialized.
516741826e77311db718135ef6517b846933dfd275f3ager@chromium.org   *
516841826e77311db718135ef6517b846933dfd275f3ager@chromium.org   * It should generally not be necessary to dispose v8 before exiting
516941826e77311db718135ef6517b846933dfd275f3ager@chromium.org   * a process, this should happen automatically.  It is only necessary
517041826e77311db718135ef6517b846933dfd275f3ager@chromium.org   * to use if the process needs the resources taken up by v8.
517141826e77311db718135ef6517b846933dfd275f3ager@chromium.org   */
517241826e77311db718135ef6517b846933dfd275f3ager@chromium.org  static bool Dispose();
517341826e77311db718135ef6517b846933dfd275f3ager@chromium.org
5174add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org  /**
5175f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com   * Iterates through all external resources referenced from current isolate
5176e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org   * heap.  GC is not invoked prior to iterating, therefore there is no
5177e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org   * guarantee that visited objects are still alive.
5178f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com   */
5179f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  static void VisitExternalResources(ExternalResourceVisitor* visitor);
5180f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
5181f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  /**
518289e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org   * Iterates through all the persistent handles in the current isolate's heap
518389e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org   * that have class_ids.
518489e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org   */
518589e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  static void VisitHandlesWithClassIds(PersistentHandleVisitor* visitor);
518689e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
518789e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  /**
5188003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org   * Iterates through all the persistent handles in the current isolate's heap
5189003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org   * that have class_ids and are candidates to be marked as partially dependent
5190003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org   * handles. This will visit handles to young objects created since the last
5191003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org   * garbage collection but is free to visit an arbitrary superset of these
5192003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org   * objects.
5193003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org   */
5194003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  static void VisitHandlesForPartialDependence(
5195003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org      Isolate* isolate, PersistentHandleVisitor* visitor);
5196003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
5197003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  /**
5198169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org   * Initialize the ICU library bundled with V8. The embedder should only
5199169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org   * invoke this method when using the bundled ICU. Returns true on success.
5200b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org   *
5201b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org   * If V8 was compiled with the ICU data in an external file, the location
5202b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org   * of the data file has to be provided.
5203169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org   */
5204b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  static bool InitializeICU(const char* icu_data_file = NULL);
5205169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
520690dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org  /**
520790dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org   * Sets the v8::Platform to use. This should be invoked before V8 is
520890dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org   * initialized.
520990dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org   */
521090dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org  static void InitializePlatform(Platform* platform);
521190dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org
521290dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org  /**
521390dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org   * Clears all references to the v8::Platform. This should be invoked after
521490dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org   * V8 was disposed.
521590dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org   */
521690dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org  static void ShutdownPlatform();
521790dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org
521843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
521943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  V8();
522043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5221d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  static internal::Object** GlobalizeReference(internal::Isolate* isolate,
5222d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org                                               internal::Object** handle);
5223639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  static internal::Object** CopyPersistent(internal::Object** handle);
5224a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  static void DisposeGlobal(internal::Object** global_handle);
5225639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  typedef WeakCallbackData<Value, void>::Callback WeakCallback;
5226b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  static void MakeWeak(internal::Object** global_handle,
522732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org                       void* data,
52284f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org                       WeakCallback weak_callback);
5229381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  static void* ClearWeak(internal::Object** global_handle);
52301e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  static void Eternalize(Isolate* isolate,
52311e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                         Value* handle,
52321e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                         int* index);
52331e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  static Local<Value> GetEternal(Isolate* isolate, int index);
523443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
523543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  template <class T> friend class Handle;
523643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  template <class T> friend class Local;
52371e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  template <class T> friend class Eternal;
5238c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  template <class T> friend class PersistentBase;
5239639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  template <class T, class M> friend class Persistent;
524043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class Context;
524143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
524243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
524343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
524443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
524543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * An external exception handler.
524643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
5247594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT TryCatch {
524843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
524943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
525049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org   * Creates a new try/catch block and registers it with v8.  Note that
525149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org   * all TryCatch blocks should be stack allocated because the memory
525249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org   * location itself is compared against JavaScript try/catch blocks.
525343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
525443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  TryCatch();
525543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
525643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
525743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Unregisters and deletes this try/catch block.
525843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
525943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ~TryCatch();
526043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
526143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
526243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if an exception has been caught by this try/catch block.
526343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
52645a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  bool HasCaught() const;
526543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
526643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
526732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * For certain types of exceptions, it makes no sense to continue execution.
5268c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   *
526932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * If CanContinue returns false, the correct action is to perform any C++
527032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * cleanup needed and then return.  If CanContinue returns false and
527132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * HasTerminated returns true, it is possible to call
527232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * CancelTerminateExecution in order to continue calling into the engine.
5273c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   */
5274c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org  bool CanContinue() const;
5275c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org
5276c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org  /**
527732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * Returns true if an exception has been caught due to script execution
527832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * being terminated.
527932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   *
528032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * There is no JavaScript representation of an execution termination
528132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * exception.  Such exceptions are thrown when the TerminateExecution
528232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * methods are called to terminate a long-running script.
528332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   *
528432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * If such an exception has been thrown, HasTerminated will return true,
528532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * indicating that it is possible to call CancelTerminateExecution in order
528632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * to continue calling into the engine.
528732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   */
528832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  bool HasTerminated() const;
528932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
529032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  /**
5291b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com   * Throws the exception caught by this TryCatch in a way that avoids
5292b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com   * it being caught again by this same TryCatch.  As with ThrowException
5293b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com   * it is illegal to execute any JavaScript operations after calling
5294b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com   * ReThrow; the caller must return immediately to where the exception
5295b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com   * is caught.
5296b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com   */
5297b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com  Handle<Value> ReThrow();
5298b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com
5299b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com  /**
530043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns the exception caught by this try/catch block.  If no exception has
530143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * been caught an empty handle is returned.
530243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   *
530343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * The returned handle is valid until this TryCatch block has been destroyed.
530443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
53055a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  Local<Value> Exception() const;
530643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
530743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
5308911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org   * Returns the .stack property of the thrown object.  If no .stack
5309911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org   * property is present an empty handle is returned.
5310911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org   */
5311911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  Local<Value> StackTrace() const;
5312911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
5313911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  /**
53149258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * Returns the message associated with this exception.  If there is
53159258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * no message associated an empty handle is returned.
53169258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   *
53179258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * The returned handle is valid until this TryCatch block has been
53189258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * destroyed.
53199258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   */
53205a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  Local<v8::Message> Message() const;
53219258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
53229258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  /**
532343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Clears any exceptions that may have been caught by this try/catch block.
53248640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org   * After this method has been called, HasCaught() will return false. Cancels
53258640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org   * the scheduled exception if it is caught and ReThrow() is not called before.
532643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   *
532743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * It is not necessary to clear a try/catch block before using it again; if
532843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * another exception is thrown the previously caught exception will just be
532943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * overwritten.  However, it is often a good idea since it makes it easier
533043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * to determine which operation threw a given exception.
533143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
533243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void Reset();
533343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5334727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
5335727e995b7bba3c57fb1e5c156d386ca11894f781v   * Set verbosity of the external exception handler.
5336727e995b7bba3c57fb1e5c156d386ca11894f781v   *
5337727e995b7bba3c57fb1e5c156d386ca11894f781v   * By default, exceptions that are caught by an external exception
5338727e995b7bba3c57fb1e5c156d386ca11894f781v   * handler are not reported.  Call SetVerbose with true on an
5339727e995b7bba3c57fb1e5c156d386ca11894f781v   * external exception handler to have exceptions caught by the
5340727e995b7bba3c57fb1e5c156d386ca11894f781v   * handler reported as if they were not caught.
5341727e995b7bba3c57fb1e5c156d386ca11894f781v   */
534243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void SetVerbose(bool value);
534343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
53449258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  /**
53459258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * Set whether or not this TryCatch should capture a Message object
53469258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * which holds source information about where the exception
53479258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * occurred.  True by default.
53489258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   */
53499258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  void SetCaptureMessage(bool value);
53509258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
53516a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  /**
53526a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org   * There are cases when the raw address of C++ TryCatch object cannot be
53536a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org   * used for comparisons with addresses into the JS stack. The cases are:
53546a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org   * 1) ARM, ARM64 and MIPS simulators which have separate JS stack.
53556a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org   * 2) Address sanitizer allocates local C++ object in the heap when
53566a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org   *    UseAfterReturn mode is enabled.
53576a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org   * This method returns address that can be used for comparisons with
53586a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org   * addresses into the JS stack. When neither simulator nor ASAN's
53596a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org   * UseAfterReturn is enabled, then the address returned will be the address
53606a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org   * of the C++ try catch handler itself.
53616a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org   */
53626a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  static void* JSStackComparableAddress(v8::TryCatch* handler) {
53636a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org    if (handler == NULL) return NULL;
53646a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org    return handler->js_stack_comparable_address_;
53656a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  }
53666a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org
5367c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org private:
53688640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org  void ResetInternal();
53698640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org
537049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  // Make it hard to create heap-allocated TryCatch blocks.
537149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  TryCatch(const TryCatch&);
537249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  void operator=(const TryCatch&);
537349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  void* operator new(size_t size);
537449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  void operator delete(void*, size_t);
537549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
5376e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org  v8::internal::Isolate* isolate_;
53776a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  v8::TryCatch* next_;
537843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void* exception_;
537993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  void* message_obj_;
538093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  void* message_script_;
53816a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  void* js_stack_comparable_address_;
538293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  int message_start_pos_;
538393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  int message_end_pos_;
5384b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com  bool is_verbose_ : 1;
5385b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com  bool can_continue_ : 1;
5386b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com  bool capture_message_ : 1;
5387b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com  bool rethrow_ : 1;
538832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  bool has_terminated_ : 1;
5389c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
5390ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  friend class v8::internal::Isolate;
539143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
539243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
539343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5394fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Context ---
539543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
539643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
539743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
539826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org * A container for extension names.
539943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
5400594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT ExtensionConfiguration {
540143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
540226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  ExtensionConfiguration() : name_count_(0), names_(NULL) { }
540343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ExtensionConfiguration(int name_count, const char* names[])
540443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      : name_count_(name_count), names_(names) { }
540526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
540626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  const char** begin() const { return &names_[0]; }
540726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  const char** end()  const { return &names_[name_count_]; }
540826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
540943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
541026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  const int name_count_;
541143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  const char** names_;
541243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
541343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
541443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
541543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
541643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * A sandboxed execution context with its own set of built-in objects
541743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * and functions.
541843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
5419594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Context {
542043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
54217a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  /**
5422113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org   * Returns the global proxy object.
54237a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org   *
5424113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org   * Global proxy object is a thin wrapper whose prototype points to actual
5425113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org   * context's global object with the properties like Object, etc. This is done
5426113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org   * that way for security reasons (for more details see
54277a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org   * https://wiki.mozilla.org/Gecko:SplitWindow).
54287a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org   *
54297a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org   * Please note that changes to global proxy object prototype most probably
5430113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org   * would break VM---v8 expects only global object as a prototype of global
5431113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org   * proxy object.
54327a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org   */
543343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Local<Object> Global();
543443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
54355a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  /**
54365a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * Detaches the global object from its context before
54375a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * the global object can be reused to create a new context.
54385a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   */
54395a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  void DetachGlobal();
54405a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
5441df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org  /**
5442e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   * Creates a new context and returns a handle to the newly allocated
5443e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   * context.
54449155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org   *
5445e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   * \param isolate The isolate in which to create the context.
54465d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   *
54475d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   * \param extensions An optional extension configuration containing
54485d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   * the extensions to be installed in the newly created context.
54495d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   *
54505d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   * \param global_template An optional object template from which the
54515d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   * global object for the newly created context will be created.
54525d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   *
54535d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   * \param global_object An optional global object to be reused for
54545d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   * the newly created context. This global object must have been
54555d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   * created by a previous call to Context::New with the same global
54565d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   * template. The state of the global object will be completely reset
54575d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   * and only object identify will remain.
54589155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org   */
5459e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  static Local<Context> New(
5460e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      Isolate* isolate,
5461e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      ExtensionConfiguration* extensions = NULL,
5462e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      Handle<ObjectTemplate> global_template = Handle<ObjectTemplate>(),
5463e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      Handle<Value> global_object = Handle<Value>());
5464e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
54651bf0cd04f43405cf4353d7c5360e53149ecb9f2cager@chromium.org  /**
546643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Sets the security token for the context.  To access an object in
546743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * another context, the security tokens must match.
546843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
546943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void SetSecurityToken(Handle<Value> token);
547043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
54715a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  /** Restores the security token to the default value. */
54725a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  void UseDefaultSecurityToken();
54735a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
547443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /** Returns the security token of this context.*/
547543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Handle<Value> GetSecurityToken();
547643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5477727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
5478727e995b7bba3c57fb1e5c156d386ca11894f781v   * Enter this context.  After entering a context, all code compiled
5479727e995b7bba3c57fb1e5c156d386ca11894f781v   * and run is compiled and run in this context.  If another context
5480727e995b7bba3c57fb1e5c156d386ca11894f781v   * is already entered, this old context is saved so it can be
5481727e995b7bba3c57fb1e5c156d386ca11894f781v   * restored when the new context is exited.
5482727e995b7bba3c57fb1e5c156d386ca11894f781v   */
548343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void Enter();
5484727e995b7bba3c57fb1e5c156d386ca11894f781v
5485727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
5486727e995b7bba3c57fb1e5c156d386ca11894f781v   * Exit this context.  Exiting the current context restores the
5487727e995b7bba3c57fb1e5c156d386ca11894f781v   * context that was in place when entering the current context.
5488727e995b7bba3c57fb1e5c156d386ca11894f781v   */
548943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void Exit();
549043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
549146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  /** Returns an isolate associated with a current context. */
549246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  v8::Isolate* GetIsolate();
5493e19986e2807a2b21b2c4840812fed1d45b6fc227yangguo@chromium.org
5494e19986e2807a2b21b2c4840812fed1d45b6fc227yangguo@chromium.org  /**
5495eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * Gets the embedder data with the given index, which must have been set by a
5496eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * previous call to SetEmbedderData with the same index. Note that index 0
5497eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * currently has a special meaning for Chrome's debugger.
5498eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   */
54994a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE Local<Value> GetEmbedderData(int index);
5500eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
5501eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  /**
5502eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * Sets the embedder data with the given index, growing the data as
5503eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * needed. Note that index 0 currently has a special meaning for Chrome's
5504eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * debugger.
5505eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   */
5506eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  void SetEmbedderData(int index, Handle<Value> value);
5507eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
5508eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  /**
5509eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * Gets a 2-byte-aligned native pointer from the embedder data with the given
5510eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * index, which must have bees set by a previous call to
5511eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * SetAlignedPointerInEmbedderData with the same index. Note that index 0
5512eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * currently has a special meaning for Chrome's debugger.
5513eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   */
55144a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE void* GetAlignedPointerFromEmbedderData(int index);
5515eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
5516eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  /**
5517eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * Sets a 2-byte-aligned native pointer in the embedder data with the given
5518eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * index, growing the data as needed. Note that index 0 currently has a
5519eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * special meaning for Chrome's debugger.
5520eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   */
5521eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  void SetAlignedPointerInEmbedderData(int index, void* value);
55229085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
55239085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  /**
5524fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * Control whether code generation from strings is allowed. Calling
5525fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * this method with false will disable 'eval' and the 'Function'
5526fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * constructor for code running in this context. If 'eval' or the
5527fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * 'Function' constructor are used an exception will be thrown.
5528fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   *
5529fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * If code generation from strings is not allowed the
5530fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * V8::AllowCodeGenerationFromStrings callback will be invoked if
5531fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * set before blocking the call to 'eval' or the 'Function'
5532fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * constructor. If that callback returns true, the call will be
5533fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * allowed, otherwise an exception will be thrown. If no callback is
5534fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * set an exception will be thrown.
5535fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   */
5536fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  void AllowCodeGenerationFromStrings(bool allow);
5537fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
5538fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  /**
55391145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org   * Returns true if code generation from strings is allowed for the context.
55401145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org   * For more details see AllowCodeGenerationFromStrings(bool) documentation.
55411145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org   */
55421145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org  bool IsCodeGenerationFromStringsAllowed();
55431145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org
55441145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org  /**
554556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org   * Sets the error description for the exception that is thrown when
554656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org   * code generation from strings is not allowed and 'eval' or the 'Function'
554756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org   * constructor are called.
554856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org   */
554956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  void SetErrorMessageForCodeGenerationFromStrings(Handle<String> message);
555056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
555156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  /**
555243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Stack-allocated class which sets the execution context for all
555343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * operations executed within a local scope.
555443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
555569ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org  class Scope {
555643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   public:
55574a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org    explicit V8_INLINE Scope(Handle<Context> context) : context_(context) {
555843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      context_->Enter();
555943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
55604a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org    V8_INLINE ~Scope() { context_->Exit(); }
556157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
556243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   private:
556343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Handle<Context> context_;
556443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  };
556543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
556643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
556743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class Value;
556843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class Script;
556943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class Object;
557043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class Function;
5571eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
5572eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  Local<Value> SlowGetEmbedderData(int index);
5573eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  void* SlowGetAlignedPointerFromEmbedderData(int index);
557443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
557543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
557643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
557743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
557846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * Multiple threads in V8 are allowed, but only one thread at a time is allowed
557946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * to use any given V8 isolate, see the comments in the Isolate class. The
558046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * definition of 'using a V8 isolate' includes accessing handles or holding onto
558146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * object pointers obtained from V8 handles while in the particular V8 isolate.
558246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * It is up to the user of V8 to ensure, perhaps with locking, that this
558346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * constraint is not violated. In addition to any other synchronization
558446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * mechanism that may be used, the v8::Locker and v8::Unlocker classes must be
558546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * used to signal thead switches to V8.
5586ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org *
558746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * v8::Locker is a scoped lock object. While it's active, i.e. between its
558846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * construction and destruction, the current thread is allowed to use the locked
558946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * isolate. V8 guarantees that an isolate can be locked by at most one thread at
559046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * any time. In other words, the scope of a v8::Locker is a critical section.
559143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
55921c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org * Sample usage:
55931c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org* \code
559443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * ...
559543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * {
55961c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org *   v8::Locker locker(isolate);
55971c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org *   v8::Isolate::Scope isolate_scope(isolate);
559843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   ...
55991c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org *   // Code using V8 and isolate goes here.
560043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   ...
560143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * } // Destructor called here
5602727e995b7bba3c57fb1e5c156d386ca11894f781v * \endcode
560343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
560446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * If you wish to stop using V8 in a thread A you can do this either by
560546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * destroying the v8::Locker object as above or by constructing a v8::Unlocker
560646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * object:
560743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
5608727e995b7bba3c57fb1e5c156d386ca11894f781v * \code
560943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * {
56101c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org *   isolate->Exit();
56111c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org *   v8::Unlocker unlocker(isolate);
561243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   ...
561343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   // Code not using V8 goes here while V8 can run in another thread.
561443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   ...
561543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * } // Destructor called here.
56161c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org * isolate->Enter();
5617727e995b7bba3c57fb1e5c156d386ca11894f781v * \endcode
561843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
561946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * The Unlocker object is intended for use in a long-running callback from V8,
562046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * where you want to release the V8 lock for other threads to use.
562143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
562246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * The v8::Locker is a recursive lock, i.e. you can lock more than once in a
562346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * given thread. This can be useful if you have code that can be called either
562446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * from code that holds the lock or from code that does not. The Unlocker is
562546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * not recursive so you can not have several Unlockers on the stack at once, and
562646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * you can not use an Unlocker in a thread that is not inside a Locker's scope.
562743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
562846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * An unlocker will unlock several lockers if it has to and reinstate the
562946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * correct depth of locking on its destruction, e.g.:
563043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
5631727e995b7bba3c57fb1e5c156d386ca11894f781v * \code
563243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * // V8 not locked.
563343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * {
56341c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org *   v8::Locker locker(isolate);
56351c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org *   Isolate::Scope isolate_scope(isolate);
563643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   // V8 locked.
563743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   {
56381c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org *     v8::Locker another_locker(isolate);
563943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     // V8 still locked (2 levels).
564043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     {
56411c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org *       isolate->Exit();
56421c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org *       v8::Unlocker unlocker(isolate);
564343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *       // V8 not locked.
564443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     }
56451c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org *     isolate->Enter();
564643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     // V8 locked again (2 levels).
564743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   }
564843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   // V8 still locked (1 level).
564943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * }
565043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * // V8 Now no longer locked.
5651727e995b7bba3c57fb1e5c156d386ca11894f781v * \endcode
565243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
5653594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Unlocker {
565443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
56551c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  /**
565646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org   * Initialize Unlocker for a given Isolate.
56571c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org   */
56584a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE explicit Unlocker(Isolate* isolate) { Initialize(isolate); }
565946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
566043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ~Unlocker();
56611c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org private:
566246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void Initialize(Isolate* isolate);
566346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
56641c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  internal::Isolate* isolate_;
566543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
566643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
566743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5668594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Locker {
566943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
56701c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  /**
567146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org   * Initialize Locker for a given Isolate.
56721c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org   */
56734a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE explicit Locker(Isolate* isolate) { Initialize(isolate); }
567446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
567543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ~Locker();
5676727e995b7bba3c57fb1e5c156d386ca11894f781v
56779258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  /**
567846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org   * Returns whether or not the locker for a given isolate, is locked by the
567946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org   * current thread.
56809258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   */
568146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static bool IsLocked(Isolate* isolate);
56829258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
5683ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  /**
5684ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org   * Returns whether v8::Locker is being used by this V8 instance.
5685ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org   */
56867c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  static bool IsActive();
5687ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
568843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
568946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void Initialize(Isolate* isolate);
569046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
569143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool has_lock_;
569243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool top_level_;
56931c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  internal::Isolate* isolate_;
569441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
5695ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  static bool active_;
5696ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
569741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org  // Disallow copying and assigning.
569841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org  Locker(const Locker&);
569941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org  void operator=(const Locker&);
570043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
570143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
570243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5703fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Implementation ---
570443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
570518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
570618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgnamespace internal {
570718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
57081b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgconst int kApiPointerSize = sizeof(void*);  // NOLINT
57091b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgconst int kApiIntSize = sizeof(int);  // NOLINT
57101e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgconst int kApiInt64Size = sizeof(int64_t);  // NOLINT
571118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
571218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org// Tag information for HeapObject.
571318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgconst int kHeapObjectTag = 1;
571418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgconst int kHeapObjectTagSize = 2;
571518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgconst intptr_t kHeapObjectTagMask = (1 << kHeapObjectTagSize) - 1;
571618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
571718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org// Tag information for Smi.
571818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgconst int kSmiTag = 0;
571918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgconst int kSmiTagSize = 1;
572018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgconst intptr_t kSmiTagMask = (1 << kSmiTagSize) - 1;
572118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
5722c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgtemplate <size_t ptr_size> struct SmiTagging;
57239d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
5724bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<int kSmiShiftSize>
57254a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.orgV8_INLINE internal::Object* IntToSmi(int value) {
5726bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  int smi_shift_bits = kSmiTagSize + kSmiShiftSize;
57272c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  uintptr_t tagged_value =
57282c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      (static_cast<uintptr_t>(value) << smi_shift_bits) | kSmiTag;
5729bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  return reinterpret_cast<internal::Object*>(tagged_value);
5730bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
5731bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
57329d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com// Smi constants for 32-bit systems.
5733c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgtemplate <> struct SmiTagging<4> {
5734ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  enum { kSmiShiftSize = 0, kSmiValueSize = 31 };
5735ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  static int SmiShiftSize() { return kSmiShiftSize; }
5736ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  static int SmiValueSize() { return kSmiValueSize; }
57374b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  V8_INLINE static int SmiToInt(const internal::Object* value) {
57389d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    int shift_bits = kSmiTagSize + kSmiShiftSize;
57399d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    // Throw away top 32 bits and shift down (requires >> to be sign extending).
57409d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    return static_cast<int>(reinterpret_cast<intptr_t>(value)) >> shift_bits;
57419d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  }
57424a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static internal::Object* IntToSmi(int value) {
5743bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    return internal::IntToSmi<kSmiShiftSize>(value);
5744bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  }
57454a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static bool IsValidSmi(intptr_t value) {
5746bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    // To be representable as an tagged small integer, the two
5747bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    // most-significant bits of 'value' must be either 00 or 11 due to
5748bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    // sign-extension. To check this we add 01 to the two
5749bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    // most-significant bits, and check if the most-significant bit is 0
5750bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    //
5751bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    // CAUTION: The original code below:
5752bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    // bool result = ((value + 0x40000000) & 0x80000000) == 0;
5753bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    // may lead to incorrect results according to the C language spec, and
5754bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    // in fact doesn't work correctly with gcc4.1.1 in some cases: The
5755bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    // compiler may produce undefined results in case of signed integer
5756bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    // overflow. The computation must be done w/ unsigned ints.
5757bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    return static_cast<uintptr_t>(value + 0x40000000U) < 0x80000000U;
5758bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  }
57599d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com};
57609d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
57619d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com// Smi constants for 64-bit systems.
5762c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgtemplate <> struct SmiTagging<8> {
5763ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  enum { kSmiShiftSize = 31, kSmiValueSize = 32 };
5764ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  static int SmiShiftSize() { return kSmiShiftSize; }
5765ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  static int SmiValueSize() { return kSmiValueSize; }
57664b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  V8_INLINE static int SmiToInt(const internal::Object* value) {
57679d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    int shift_bits = kSmiTagSize + kSmiShiftSize;
57689d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    // Shift down and throw away top 32 bits.
57699d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    return static_cast<int>(reinterpret_cast<intptr_t>(value) >> shift_bits);
57709d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  }
57714a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static internal::Object* IntToSmi(int value) {
5772bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    return internal::IntToSmi<kSmiShiftSize>(value);
5773bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  }
57744a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static bool IsValidSmi(intptr_t value) {
5775bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    // To be representable as a long smi, the value must be a 32-bit integer.
5776bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    return (value == static_cast<int32_t>(value));
5777bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  }
57789d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com};
57799d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
5780c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgtypedef SmiTagging<kApiPointerSize> PlatformSmiTagging;
5781c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgconst int kSmiShiftSize = PlatformSmiTagging::kSmiShiftSize;
5782c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgconst int kSmiValueSize = PlatformSmiTagging::kSmiValueSize;
57834a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.orgV8_INLINE static bool SmiValuesAre31Bits() { return kSmiValueSize == 31; }
57844a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.orgV8_INLINE static bool SmiValuesAre32Bits() { return kSmiValueSize == 32; }
578518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
578618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org/**
578718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org * This class exports constants and functionality from within v8 that
578818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org * is necessary to implement inline functions in the v8 api.  Don't
578918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org * depend on functions and constants defined here.
579018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org */
579118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgclass Internals {
579218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org public:
579318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  // These values match non-compiler-dependent values defined within
579418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  // the implementation of v8.
579518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  static const int kHeapObjectMapOffset = 0;
57964b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  static const int kMapInstanceTypeAndBitFieldOffset =
57974b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org      1 * kApiPointerSize + kApiIntSize;
5798efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  static const int kStringResourceOffset = 3 * kApiPointerSize;
5799ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org
5800fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  static const int kOddballKindOffset = 3 * kApiPointerSize;
5801ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  static const int kForeignAddressOffset = kApiPointerSize;
58024a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com  static const int kJSObjectHeaderSize = 3 * kApiPointerSize;
5803eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  static const int kFixedArrayHeaderSize = 2 * kApiPointerSize;
5804eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  static const int kContextHeaderSize = 2 * kApiPointerSize;
58057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  static const int kContextEmbedderDataIndex = 95;
580618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  static const int kFullStringRepresentationMask = 0x07;
580756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  static const int kStringEncodingMask = 0x4;
580882dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  static const int kExternalTwoByteRepresentationTag = 0x02;
58092c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  static const int kExternalOneByteRepresentationTag = 0x06;
581018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
58117ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  static const int kIsolateEmbedderDataOffset = 0 * kApiPointerSize;
58121e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  static const int kAmountOfExternalAllocatedMemoryOffset =
58131e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org      4 * kApiPointerSize;
58141e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  static const int kAmountOfExternalAllocatedMemoryAtLastGlobalGCOffset =
58151e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org      kAmountOfExternalAllocatedMemoryOffset + kApiInt64Size;
58161e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  static const int kIsolateRootsOffset =
58171e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org      kAmountOfExternalAllocatedMemoryAtLastGlobalGCOffset + kApiInt64Size +
58181e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org      kApiPointerSize;
5819efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  static const int kUndefinedValueRootIndex = 5;
5820efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  static const int kNullValueRootIndex = 7;
5821efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  static const int kTrueValueRootIndex = 8;
5822efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  static const int kFalseValueRootIndex = 9;
58236474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  static const int kEmptyStringRootIndex = 164;
5824efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
58251e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  // The external allocation limit should be below 256 MB on all architectures
58261e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  // to avoid that resource-constrained embedders run low on memory.
58271e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  static const int kExternalAllocationLimit = 192 * 1024 * 1024;
58281e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
5829d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  static const int kNodeClassIdOffset = 1 * kApiPointerSize;
5830d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  static const int kNodeFlagsOffset = 1 * kApiPointerSize + 3;
5831d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  static const int kNodeStateMask = 0xf;
5832d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  static const int kNodeStateIsWeakValue = 2;
5833c16e8281e6e3e3b57e157b62d5a1ca530e23e4bfdanno@chromium.org  static const int kNodeStateIsPendingValue = 3;
5834d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  static const int kNodeStateIsNearDeathValue = 4;
583546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static const int kNodeIsIndependentShift = 4;
583646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static const int kNodeIsPartiallyDependentShift = 5;
583746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
583858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  static const int kJSObjectType = 0xbc;
58395ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org  static const int kFirstNonstringType = 0x80;
58404a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  static const int kOddballType = 0x83;
584158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  static const int kForeignType = 0x88;
584218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
5843fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  static const int kUndefinedOddballKind = 5;
5844fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  static const int kNullOddballKind = 3;
5845fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org
58467ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  static const uint32_t kNumIsolateDataSlots = 4;
58477ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org
5848cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  V8_EXPORT static void CheckInitializedImpl(v8::Isolate* isolate);
58494a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static void CheckInitialized(v8::Isolate* isolate) {
58501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#ifdef V8_ENABLE_CHECKS
585193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org    CheckInitializedImpl(isolate);
58521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#endif
585393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  }
58541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
58554b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  V8_INLINE static bool HasHeapObjectTag(const internal::Object* value) {
585618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    return ((reinterpret_cast<intptr_t>(value) & kHeapObjectTagMask) ==
585718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org            kHeapObjectTag);
585818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  }
5859c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
58604b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  V8_INLINE static int SmiValue(const internal::Object* value) {
5861c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    return PlatformSmiTagging::SmiToInt(value);
58629d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  }
58639d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
58644a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static internal::Object* IntToSmi(int value) {
5865bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    return PlatformSmiTagging::IntToSmi(value);
5866bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  }
5867bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
58684a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static bool IsValidSmi(intptr_t value) {
5869bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    return PlatformSmiTagging::IsValidSmi(value);
5870bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  }
5871bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
58724b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  V8_INLINE static int GetInstanceType(const internal::Object* obj) {
58739d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    typedef internal::Object O;
58749d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    O* map = ReadField<O*>(obj, kHeapObjectMapOffset);
58754b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org    // Map::InstanceType is defined so that it will always be loaded into
58764b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org    // the LS 8 bits of one 16-bit word, regardless of endianess.
58774b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org    return ReadField<uint16_t>(map, kMapInstanceTypeAndBitFieldOffset) & 0xff;
58789d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  }
58799d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
58804b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  V8_INLINE static int GetOddballKind(const internal::Object* obj) {
5881fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org    typedef internal::Object O;
5882fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org    return SmiValue(ReadField<O*>(obj, kOddballKindOffset));
5883fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  }
5884fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org
58854a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static bool IsExternalTwoByteString(int instance_type) {
588618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    int representation = (instance_type & kFullStringRepresentationMask);
588718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    return representation == kExternalTwoByteRepresentationTag;
588818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  }
588918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
58904a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static uint8_t GetNodeFlag(internal::Object** obj, int shift) {
589146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org      uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
5892594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org      return *addr & static_cast<uint8_t>(1U << shift);
589346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  }
589446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
58954a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static void UpdateNodeFlag(internal::Object** obj,
58964a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org                                       bool value, int shift) {
589746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org      uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
58982c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      uint8_t mask = static_cast<uint8_t>(1U << shift);
5899594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org      *addr = static_cast<uint8_t>((*addr & ~mask) | (value << shift));
590046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  }
590146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
59024a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static uint8_t GetNodeState(internal::Object** obj) {
5903d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org    uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
5904d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org    return *addr & kNodeStateMask;
5905d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  }
5906d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
59074a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static void UpdateNodeState(internal::Object** obj,
59084a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org                                        uint8_t value) {
5909d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org    uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
5910594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    *addr = static_cast<uint8_t>((*addr & ~kNodeStateMask) | value);
5911d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  }
5912d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
59134b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  V8_INLINE static void SetEmbedderData(v8::Isolate* isolate,
59147ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org                                        uint32_t slot,
59154b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org                                        void* data) {
59167ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org    uint8_t *addr = reinterpret_cast<uint8_t *>(isolate) +
59177ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org                    kIsolateEmbedderDataOffset + slot * kApiPointerSize;
5918efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org    *reinterpret_cast<void**>(addr) = data;
5919efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  }
5920efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
59214b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  V8_INLINE static void* GetEmbedderData(const v8::Isolate* isolate,
59224b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org                                         uint32_t slot) {
59234b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org    const uint8_t* addr = reinterpret_cast<const uint8_t*>(isolate) +
59247ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org        kIsolateEmbedderDataOffset + slot * kApiPointerSize;
59254b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org    return *reinterpret_cast<void* const*>(addr);
5926efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  }
5927efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
59284a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  V8_INLINE static internal::Object** GetRoot(v8::Isolate* isolate,
59294a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org                                              int index) {
5930efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org    uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + kIsolateRootsOffset;
5931efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org    return reinterpret_cast<internal::Object**>(addr + index * kApiPointerSize);
5932efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  }
5933efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
59347e6132b924829c353864933f29124419916db550machenbach@chromium.org  template <typename T>
59354b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  V8_INLINE static T ReadField(const internal::Object* ptr, int offset) {
59364b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org    const uint8_t* addr =
59374b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org        reinterpret_cast<const uint8_t*>(ptr) + offset - kHeapObjectTag;
59384b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org    return *reinterpret_cast<const T*>(addr);
593918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  }
5940ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
5941eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  template <typename T>
59424b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  V8_INLINE static T ReadEmbedderData(const v8::Context* context, int index) {
5943eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    typedef internal::Object O;
5944eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    typedef internal::Internals I;
59454b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org    O* ctx = *reinterpret_cast<O* const*>(context);
5946eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    int embedder_data_offset = I::kContextHeaderSize +
5947eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org        (internal::kApiPointerSize * I::kContextEmbedderDataIndex);
5948eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    O* embedder_data = I::ReadField<O*>(ctx, embedder_data_offset);
5949eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    int value_offset =
5950eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org        I::kFixedArrayHeaderSize + (internal::kApiPointerSize * index);
5951eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    return I::ReadField<T>(embedder_data, value_offset);
5952eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  }
595318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org};
595418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
5955f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org}  // namespace internal
595618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
595718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
595843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentemplate <class T>
595943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenLocal<T>::Local() : Handle<T>() { }
596043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
596143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
596243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentemplate <class T>
5963d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.orgLocal<T> Local<T>::New(Isolate* isolate, Handle<T> that) {
596457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  return New(isolate, that.val_);
596557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org}
596657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
596757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgtemplate <class T>
5968c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgLocal<T> Local<T>::New(Isolate* isolate, const PersistentBase<T>& that) {
596957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  return New(isolate, that.val_);
597057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org}
597157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
597257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgtemplate <class T>
597357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgHandle<T> Handle<T>::New(Isolate* isolate, T* that) {
597457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  if (that == NULL) return Handle<T>();
597557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  T* that_ptr = that;
597657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr);
597757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  return Handle<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(
597857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org      reinterpret_cast<internal::Isolate*>(isolate), *p)));
597957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org}
598057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
598157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
598257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgtemplate <class T>
598357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgLocal<T> Local<T>::New(Isolate* isolate, T* that) {
598457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  if (that == NULL) return Local<T>();
598557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  T* that_ptr = that;
598632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr);
598732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(
598832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org      reinterpret_cast<internal::Isolate*>(isolate), *p)));
598932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org}
599032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
599132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
5992594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgtemplate<class T>
59931e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgtemplate<class S>
59941e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgvoid Eternal<T>::Set(Isolate* isolate, Local<S> handle) {
59951e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  TYPE_CHECK(T, S);
5996dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  V8::Eternalize(isolate, reinterpret_cast<Value*>(*handle), &this->index_);
5997594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org}
5998594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
5999594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
6000594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgtemplate<class T>
60011e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgLocal<T> Eternal<T>::Get(Isolate* isolate) {
6002dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  return Local<T>(reinterpret_cast<T*>(*V8::GetEternal(isolate, index_)));
6003594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org}
6004594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
6005594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
6006c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgtemplate <class T>
6007c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgT* PersistentBase<T>::New(Isolate* isolate, T* that) {
6008f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org  if (that == NULL) return NULL;
600957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  internal::Object** p = reinterpret_cast<internal::Object**>(that);
6010f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org  return reinterpret_cast<T*>(
6011d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org      V8::GlobalizeReference(reinterpret_cast<internal::Isolate*>(isolate),
6012f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org                             p));
601343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
601443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
601543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6016639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgtemplate <class T, class M>
6017639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgtemplate <class S, class M2>
6018639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgvoid Persistent<T, M>::Copy(const Persistent<S, M2>& that) {
6019639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  TYPE_CHECK(T, S);
6020c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  this->Reset();
6021639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  if (that.IsEmpty()) return;
6022639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  internal::Object** p = reinterpret_cast<internal::Object**>(that.val_);
6023639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  this->val_ = reinterpret_cast<T*>(V8::CopyPersistent(p));
6024639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  M::Copy(that, this);
6025639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org}
6026639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
6027639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
6028c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgtemplate <class T>
6029c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgbool PersistentBase<T>::IsIndependent() const {
603046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  typedef internal::Internals I;
6031e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  if (this->IsEmpty()) return false;
603257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  return I::GetNodeFlag(reinterpret_cast<internal::Object**>(this->val_),
603346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                        I::kNodeIsIndependentShift);
6034e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org}
6035e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
6036e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
6037c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgtemplate <class T>
6038c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgbool PersistentBase<T>::IsNearDeath() const {
6039d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  typedef internal::Internals I;
604043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this->IsEmpty()) return false;
6041c16e8281e6e3e3b57e157b62d5a1ca530e23e4bfdanno@chromium.org  uint8_t node_state =
6042c16e8281e6e3e3b57e157b62d5a1ca530e23e4bfdanno@chromium.org      I::GetNodeState(reinterpret_cast<internal::Object**>(this->val_));
6043c16e8281e6e3e3b57e157b62d5a1ca530e23e4bfdanno@chromium.org  return node_state == I::kNodeStateIsNearDeathValue ||
6044c16e8281e6e3e3b57e157b62d5a1ca530e23e4bfdanno@chromium.org      node_state == I::kNodeStateIsPendingValue;
604543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
604643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
604743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6048c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgtemplate <class T>
6049c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgbool PersistentBase<T>::IsWeak() const {
6050d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  typedef internal::Internals I;
605132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  if (this->IsEmpty()) return false;
605257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  return I::GetNodeState(reinterpret_cast<internal::Object**>(this->val_)) ==
6053d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org      I::kNodeStateIsWeakValue;
605432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org}
605532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
605632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
6057c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgtemplate <class T>
6058c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgvoid PersistentBase<T>::Reset() {
6059a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  if (this->IsEmpty()) return;
6060a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  V8::DisposeGlobal(reinterpret_cast<internal::Object**>(this->val_));
6061a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  val_ = 0;
606243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
606343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
606443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6065c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgtemplate <class T>
6066639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgtemplate <class S>
6067c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgvoid PersistentBase<T>::Reset(Isolate* isolate, const Handle<S>& other) {
6068639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  TYPE_CHECK(T, S);
6069639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  Reset();
6070639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  if (other.IsEmpty()) return;
6071639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  this->val_ = New(isolate, other.val_);
6072639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org}
6073639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
6074639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
6075c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgtemplate <class T>
6076c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgtemplate <class S>
6077c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgvoid PersistentBase<T>::Reset(Isolate* isolate,
6078c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org                              const PersistentBase<S>& other) {
6079639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  TYPE_CHECK(T, S);
6080639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  Reset();
6081639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  if (other.IsEmpty()) return;
6082639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  this->val_ = New(isolate, other.val_);
6083639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org}
6084639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
6085639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
6086c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgtemplate <class T>
608757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgtemplate <typename S, typename P>
6088c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgvoid PersistentBase<T>::SetWeak(
6089639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    P* parameter,
6090639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    typename WeakCallbackData<S, P>::Callback callback) {
609157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  TYPE_CHECK(S, T);
6092639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  typedef typename WeakCallbackData<Value, void>::Callback Callback;
6093b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  V8::MakeWeak(reinterpret_cast<internal::Object**>(this->val_),
6094639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org               parameter,
60954f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org               reinterpret_cast<Callback>(callback));
609643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
609743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
609857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
6099c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgtemplate <class T>
610057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgtemplate <typename P>
6101c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgvoid PersistentBase<T>::SetWeak(
6102639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    P* parameter,
6103639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    typename WeakCallbackData<T, P>::Callback callback) {
6104639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  SetWeak<T, P>(parameter, callback);
610557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org}
610657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
610757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
6108c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgtemplate <class T>
6109381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.orgtemplate<typename P>
6110381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.orgP* PersistentBase<T>::ClearWeak() {
6111381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  return reinterpret_cast<P*>(
6112381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    V8::ClearWeak(reinterpret_cast<internal::Object**>(this->val_)));
6113d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org}
6114d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
611543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6116c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgtemplate <class T>
6117c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgvoid PersistentBase<T>::MarkIndependent() {
611846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  typedef internal::Internals I;
611946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  if (this->IsEmpty()) return;
612057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(this->val_),
6121d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org                    true,
6122d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org                    I::kNodeIsIndependentShift);
6123e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org}
6124e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
6125e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
6126c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgtemplate <class T>
6127c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgvoid PersistentBase<T>::MarkPartiallyDependent() {
612846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  typedef internal::Internals I;
612946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  if (this->IsEmpty()) return;
613057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(this->val_),
6131d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org                    true,
6132d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org                    I::kNodeIsPartiallyDependentShift);
6133e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org}
6134e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
6135906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org
6136639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgtemplate <class T, class M>
6137639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgT* Persistent<T, M>::ClearAndLeak() {
6138906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  T* old;
6139c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  old = this->val_;
6140c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  this->val_ = NULL;
6141906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  return old;
6142906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org}
6143906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org
6144906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org
6145c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgtemplate <class T>
6146c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgvoid PersistentBase<T>::SetWrapperClassId(uint16_t class_id) {
614746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  typedef internal::Internals I;
6148d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  if (this->IsEmpty()) return;
614957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  internal::Object** obj = reinterpret_cast<internal::Object**>(this->val_);
615046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset;
615146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  *reinterpret_cast<uint16_t*>(addr) = class_id;
6152b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org}
615369ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
6154d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
6155c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgtemplate <class T>
6156c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orguint16_t PersistentBase<T>::WrapperClassId() const {
615746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  typedef internal::Internals I;
6158d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  if (this->IsEmpty()) return 0;
615957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  internal::Object** obj = reinterpret_cast<internal::Object**>(this->val_);
616046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset;
616146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  return *reinterpret_cast<uint16_t*>(addr);
616289e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org}
616389e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
6164bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
6165bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6166bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgReturnValue<T>::ReturnValue(internal::Object** slot) : value_(slot) {}
6167bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
6168bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6169c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgtemplate<typename S>
6170c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid ReturnValue<T>::Set(const Persistent<S>& handle) {
6171c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  TYPE_CHECK(T, S);
6172b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  if (V8_UNLIKELY(handle.IsEmpty())) {
61738a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org    *value_ = GetDefaultValue();
6174b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  } else {
6175b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org    *value_ = *reinterpret_cast<internal::Object**>(*handle);
6176b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  }
6177bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
6178bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
6179bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6180c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgtemplate<typename S>
6181c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid ReturnValue<T>::Set(const Handle<S> handle) {
6182c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  TYPE_CHECK(T, S);
6183b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  if (V8_UNLIKELY(handle.IsEmpty())) {
61848a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org    *value_ = GetDefaultValue();
6185b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  } else {
6186b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org    *value_ = *reinterpret_cast<internal::Object**>(*handle);
6187b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  }
6188bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
6189bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
6190bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
619153ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.orgvoid ReturnValue<T>::Set(double i) {
6192b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  TYPE_CHECK(T, Number);
619353ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  Set(Number::New(GetIsolate(), i));
6194bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
6195bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
6196bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
619753ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.orgvoid ReturnValue<T>::Set(int32_t i) {
6198b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  TYPE_CHECK(T, Integer);
6199bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  typedef internal::Internals I;
6200bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  if (V8_LIKELY(I::IsValidSmi(i))) {
6201bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    *value_ = I::IntToSmi(i);
6202bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    return;
6203bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  }
62040f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org  Set(Integer::New(GetIsolate(), i));
6205bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
6206bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
6207bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
620853ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.orgvoid ReturnValue<T>::Set(uint32_t i) {
6209b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  TYPE_CHECK(T, Integer);
62101fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  // Can't simply use INT32_MAX here for whatever reason.
6211594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  bool fits_into_int32_t = (i & (1U << 31)) == 0;
62121fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  if (V8_LIKELY(fits_into_int32_t)) {
62131fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    Set(static_cast<int32_t>(i));
6214bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    return;
6215bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  }
62160f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org  Set(Integer::NewFromUnsigned(GetIsolate(), i));
6217bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
6218bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
6219bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
622053ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.orgvoid ReturnValue<T>::Set(bool value) {
6221b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  TYPE_CHECK(T, Boolean);
622253ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  typedef internal::Internals I;
622353ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  int root_index;
6224bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  if (value) {
622553ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org    root_index = I::kTrueValueRootIndex;
6226bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  } else {
622753ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org    root_index = I::kFalseValueRootIndex;
6228bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  }
622953ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  *value_ = *I::GetRoot(GetIsolate(), root_index);
6230bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
6231bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
6232bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
623353ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.orgvoid ReturnValue<T>::SetNull() {
6234b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  TYPE_CHECK(T, Primitive);
6235bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  typedef internal::Internals I;
623653ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  *value_ = *I::GetRoot(GetIsolate(), I::kNullValueRootIndex);
6237bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
6238bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
6239bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
624053ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.orgvoid ReturnValue<T>::SetUndefined() {
6241b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  TYPE_CHECK(T, Primitive);
6242bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  typedef internal::Internals I;
624353ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  *value_ = *I::GetRoot(GetIsolate(), I::kUndefinedValueRootIndex);
6244bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
6245bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
6246bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6247837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.orgvoid ReturnValue<T>::SetEmptyString() {
6248b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  TYPE_CHECK(T, String);
6249837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  typedef internal::Internals I;
6250837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  *value_ = *I::GetRoot(GetIsolate(), I::kEmptyStringRootIndex);
6251837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org}
6252837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org
6253837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.orgtemplate<typename T>
625453ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.orgIsolate* ReturnValue<T>::GetIsolate() {
62558a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org  // Isolate is always the pointer below the default value on the stack.
62568a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org  return *reinterpret_cast<Isolate**>(&value_[-2]);
62578a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org}
62588a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org
62598a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.orgtemplate<typename T>
62603c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.orgtemplate<typename S>
62613c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.orgvoid ReturnValue<T>::Set(S* whatever) {
62623c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  // Uncompilable to prevent inadvertent misuse.
62633c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  TYPE_CHECK(S*, Primitive);
62643c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org}
62653c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org
62663c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.orgtemplate<typename T>
62678a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.orginternal::Object* ReturnValue<T>::GetDefaultValue() {
62688a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org  // Default value is always the pointer below value_ on the stack.
62698a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org  return value_[-1];
6270bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
6271bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
6272bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
6273bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6274bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgFunctionCallbackInfo<T>::FunctionCallbackInfo(internal::Object** implicit_args,
6275bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                                              internal::Object** values,
6276bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                                              int length,
6277bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                                              bool is_construct_call)
6278e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    : implicit_args_(implicit_args),
6279e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org      values_(values),
6280e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org      length_(length),
6281e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org      is_construct_call_(is_construct_call) { }
628269ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
628369ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
6284bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6285bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgLocal<Value> FunctionCallbackInfo<T>::operator[](int i) const {
6286cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  if (i < 0 || length_ <= i) return Local<Value>(*Undefined(GetIsolate()));
628743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return Local<Value>(reinterpret_cast<Value*>(values_ - i));
628843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
628943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
629043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6291bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6292bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgLocal<Function> FunctionCallbackInfo<T>::Callee() const {
6293e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  return Local<Function>(reinterpret_cast<Function*>(
6294e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org      &implicit_args_[kCalleeIndex]));
629543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
629643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
629743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6298bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6299bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgLocal<Object> FunctionCallbackInfo<T>::This() const {
630043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return Local<Object>(reinterpret_cast<Object*>(values_ + 1));
630143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
630243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
630343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6304bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6305bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgLocal<Object> FunctionCallbackInfo<T>::Holder() const {
6306e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  return Local<Object>(reinterpret_cast<Object*>(
6307e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org      &implicit_args_[kHolderIndex]));
630843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
630943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
631043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6311bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6312bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgLocal<Value> FunctionCallbackInfo<T>::Data() const {
6313e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  return Local<Value>(reinterpret_cast<Value*>(&implicit_args_[kDataIndex]));
631443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
631543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
631643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6317bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6318bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgIsolate* FunctionCallbackInfo<T>::GetIsolate() const {
631928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  return *reinterpret_cast<Isolate**>(&implicit_args_[kIsolateIndex]);
632028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org}
632128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
632228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
6323bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6324bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgReturnValue<T> FunctionCallbackInfo<T>::GetReturnValue() const {
6325bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  return ReturnValue<T>(&implicit_args_[kReturnValueIndex]);
6326bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
6327bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
6328bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
6329bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6330bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgbool FunctionCallbackInfo<T>::IsConstructCall() const {
633143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return is_construct_call_;
633243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
633343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
633443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6335bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6336bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgint FunctionCallbackInfo<T>::Length() const {
633743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return length_;
633843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
633943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
634043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
63415a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgHandle<Value> ScriptOrigin::ResourceName() const {
634243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return resource_name_;
634343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
634443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
634543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
63465a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgHandle<Integer> ScriptOrigin::ResourceLineOffset() const {
634743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return resource_line_offset_;
634843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
634943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
635043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
63515a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgHandle<Integer> ScriptOrigin::ResourceColumnOffset() const {
635243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return resource_column_offset_;
635343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
635443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6355f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org
6356d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgHandle<Boolean> ScriptOrigin::ResourceIsSharedCrossOrigin() const {
6357d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  return resource_is_shared_cross_origin_;
6358d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org}
6359d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
636043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6361f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgHandle<Integer> ScriptOrigin::ScriptID() const {
6362f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return script_id_;
6363f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org}
6364f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org
6365f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org
6366a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgScriptCompiler::Source::Source(Local<String> string, const ScriptOrigin& origin,
6367a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org                               CachedData* data)
6368a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    : source_string(string),
6369a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org      resource_name(origin.ResourceName()),
6370a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org      resource_line_offset(origin.ResourceLineOffset()),
6371a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org      resource_column_offset(origin.ResourceColumnOffset()),
6372a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org      resource_is_shared_cross_origin(origin.ResourceIsSharedCrossOrigin()),
6373a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org      cached_data(data) {}
6374a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org
6375a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org
6376a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgScriptCompiler::Source::Source(Local<String> string,
6377a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org                               CachedData* data)
6378a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    : source_string(string), cached_data(data) {}
6379a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org
6380a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org
6381a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgScriptCompiler::Source::~Source() {
6382a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  delete cached_data;
6383a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org}
6384a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org
6385a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org
6386a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgconst ScriptCompiler::CachedData* ScriptCompiler::Source::GetCachedData()
6387a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    const {
6388a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  return cached_data;
6389a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org}
6390a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org
6391a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org
639237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgHandle<Boolean> Boolean::New(Isolate* isolate, bool value) {
6393cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  return value ? True(isolate) : False(isolate);
639443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
639543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
639643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
639737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgvoid Template::Set(Isolate* isolate, const char* name, v8::Handle<Data> value) {
639837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  Set(v8::String::NewFromUtf8(isolate, name), value);
639937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org}
640037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org
640137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org
640218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgLocal<Value> Object::GetInternalField(int index) {
640318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifndef V8_ENABLE_CHECKS
640418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  typedef internal::Object O;
6405cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  typedef internal::HeapObject HO;
640618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  typedef internal::Internals I;
640718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  O* obj = *reinterpret_cast<O**>(this);
6408eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  // Fast path: If the object is a plain JSObject, which is the common case, we
6409eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  // know where to find the internal fields and can return the value directly.
64109d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  if (I::GetInstanceType(obj) == I::kJSObjectType) {
64114a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com    int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index);
641218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    O* value = I::ReadField<O*>(obj, offset);
6413cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org    O** result = HandleScope::CreateHandle(reinterpret_cast<HO*>(obj), value);
641418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    return Local<Value>(reinterpret_cast<Value*>(result));
641518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  }
641618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
6417eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  return SlowGetInternalField(index);
641818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
641918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
642018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
6421eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgvoid* Object::GetAlignedPointerFromInternalField(int index) {
6422eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org#ifndef V8_ENABLE_CHECKS
64239d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  typedef internal::Object O;
64249d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  typedef internal::Internals I;
64259d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  O* obj = *reinterpret_cast<O**>(this);
6426eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  // Fast path: If the object is a plain JSObject, which is the common case, we
6427eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  // know where to find the internal fields and can return the value directly.
6428ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  if (V8_LIKELY(I::GetInstanceType(obj) == I::kJSObjectType)) {
64294a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com    int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index);
6430eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    return I::ReadField<void*>(obj, offset);
64319d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  }
6432eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org#endif
6433eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  return SlowGetAlignedPointerFromInternalField(index);
643418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
643518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
643618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
643718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgString* String::Cast(v8::Value* value) {
643818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
643918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  CheckCast(value);
644018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
644118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return static_cast<String*>(value);
644218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
644318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
644418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
6445efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgLocal<String> String::Empty(Isolate* isolate) {
6446efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  typedef internal::Object* S;
6447efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  typedef internal::Internals I;
64481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  I::CheckInitialized(isolate);
64494a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  S* slot = I::GetRoot(isolate, I::kEmptyStringRootIndex);
6450efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  return Local<String>(reinterpret_cast<String*>(slot));
6451efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org}
6452efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
6453efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
645418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgString::ExternalStringResource* String::GetExternalStringResource() const {
645518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  typedef internal::Object O;
645618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  typedef internal::Internals I;
645708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  O* obj = *reinterpret_cast<O* const*>(this);
645818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  String::ExternalStringResource* result;
64599d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  if (I::IsExternalTwoByteString(I::GetInstanceType(obj))) {
646018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    void* value = I::ReadField<void*>(obj, I::kStringResourceOffset);
646118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    result = reinterpret_cast<String::ExternalStringResource*>(value);
646218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  } else {
646318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    result = NULL;
646418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  }
646518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
646618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  VerifyExternalStringResource(result);
646718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
646818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return result;
646918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
647018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
647118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
647256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.orgString::ExternalStringResourceBase* String::GetExternalStringResourceBase(
647356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    String::Encoding* encoding_out) const {
647456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  typedef internal::Object O;
647556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  typedef internal::Internals I;
647608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  O* obj = *reinterpret_cast<O* const*>(this);
647756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  int type = I::GetInstanceType(obj) & I::kFullStringRepresentationMask;
647856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  *encoding_out = static_cast<Encoding>(type & I::kStringEncodingMask);
647956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  ExternalStringResourceBase* resource = NULL;
64802c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  if (type == I::kExternalOneByteRepresentationTag ||
648156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org      type == I::kExternalTwoByteRepresentationTag) {
648256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    void* value = I::ReadField<void*>(obj, I::kStringResourceOffset);
648356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    resource = static_cast<ExternalStringResourceBase*>(value);
648456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  }
648556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org#ifdef V8_ENABLE_CHECKS
648656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    VerifyExternalStringResourceBase(resource, *encoding_out);
648756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org#endif
648856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  return resource;
648956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org}
649056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
649156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
6492fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.orgbool Value::IsUndefined() const {
6493fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org#ifdef V8_ENABLE_CHECKS
6494fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  return FullIsUndefined();
6495fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org#else
6496fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  return QuickIsUndefined();
6497fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org#endif
6498fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org}
6499fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org
6500fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.orgbool Value::QuickIsUndefined() const {
6501fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  typedef internal::Object O;
6502fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  typedef internal::Internals I;
650308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  O* obj = *reinterpret_cast<O* const*>(this);
6504fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  if (!I::HasHeapObjectTag(obj)) return false;
6505fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  if (I::GetInstanceType(obj) != I::kOddballType) return false;
6506fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  return (I::GetOddballKind(obj) == I::kUndefinedOddballKind);
6507fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org}
6508fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org
6509fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org
6510fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.orgbool Value::IsNull() const {
6511fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org#ifdef V8_ENABLE_CHECKS
6512fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  return FullIsNull();
6513fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org#else
6514fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  return QuickIsNull();
6515fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org#endif
6516fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org}
6517fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org
6518fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.orgbool Value::QuickIsNull() const {
6519fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  typedef internal::Object O;
6520fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  typedef internal::Internals I;
652108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  O* obj = *reinterpret_cast<O* const*>(this);
6522fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  if (!I::HasHeapObjectTag(obj)) return false;
6523fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  if (I::GetInstanceType(obj) != I::kOddballType) return false;
6524fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  return (I::GetOddballKind(obj) == I::kNullOddballKind);
6525fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org}
6526fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org
6527fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org
652818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgbool Value::IsString() const {
652918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
653018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return FullIsString();
653118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#else
653218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return QuickIsString();
653318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
653418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
653518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
653618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgbool Value::QuickIsString() const {
653718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  typedef internal::Object O;
653818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  typedef internal::Internals I;
653908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  O* obj = *reinterpret_cast<O* const*>(this);
654018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  if (!I::HasHeapObjectTag(obj)) return false;
65419d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  return (I::GetInstanceType(obj) < I::kFirstNonstringType);
654218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
654318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
654418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
65451fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgtemplate <class T> Value* Value::Cast(T* value) {
65461fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  return static_cast<Value*>(value);
65471fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org}
65481fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
65491fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
6550e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgName* Name::Cast(v8::Value* value) {
6551e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org#ifdef V8_ENABLE_CHECKS
6552e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  CheckCast(value);
6553e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org#endif
6554e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  return static_cast<Name*>(value);
6555e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org}
6556e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
6557e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
6558e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgSymbol* Symbol::Cast(v8::Value* value) {
6559e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#ifdef V8_ENABLE_CHECKS
6560e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CheckCast(value);
6561e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif
6562e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return static_cast<Symbol*>(value);
6563e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
6564e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
6565e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
656618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgNumber* Number::Cast(v8::Value* value) {
656718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
656818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  CheckCast(value);
656918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
657018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return static_cast<Number*>(value);
657118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
657218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
657318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
657418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgInteger* Integer::Cast(v8::Value* value) {
657518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
657618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  CheckCast(value);
657718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
657818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return static_cast<Integer*>(value);
657918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
658018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
658118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
658218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgDate* Date::Cast(v8::Value* value) {
658318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
658418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  CheckCast(value);
658518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
658618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return static_cast<Date*>(value);
658718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
658818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
658918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
659084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgStringObject* StringObject::Cast(v8::Value* value) {
659184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org#ifdef V8_ENABLE_CHECKS
659284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  CheckCast(value);
659384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org#endif
659484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  return static_cast<StringObject*>(value);
659584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org}
659684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
659784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
6598e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgSymbolObject* SymbolObject::Cast(v8::Value* value) {
6599e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#ifdef V8_ENABLE_CHECKS
6600e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CheckCast(value);
6601e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif
6602e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return static_cast<SymbolObject*>(value);
6603e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
6604e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
6605e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
660684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgNumberObject* NumberObject::Cast(v8::Value* value) {
660784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org#ifdef V8_ENABLE_CHECKS
660884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  CheckCast(value);
660984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org#endif
661084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  return static_cast<NumberObject*>(value);
661184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org}
661284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
661384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
661484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgBooleanObject* BooleanObject::Cast(v8::Value* value) {
661584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org#ifdef V8_ENABLE_CHECKS
661684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  CheckCast(value);
661784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org#endif
661884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  return static_cast<BooleanObject*>(value);
661984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org}
662084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
662184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
6622b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.orgRegExp* RegExp::Cast(v8::Value* value) {
6623b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org#ifdef V8_ENABLE_CHECKS
6624b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  CheckCast(value);
6625b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org#endif
6626b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  return static_cast<RegExp*>(value);
6627b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org}
6628b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org
6629b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org
663018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgObject* Object::Cast(v8::Value* value) {
663118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
663218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  CheckCast(value);
663318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
663418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return static_cast<Object*>(value);
663518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
663618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
663718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
663818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgArray* Array::Cast(v8::Value* value) {
663918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
664018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  CheckCast(value);
664118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
664218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return static_cast<Array*>(value);
664318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
664418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
664518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
6646486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.orgPromise* Promise::Cast(v8::Value* value) {
6647486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org#ifdef V8_ENABLE_CHECKS
6648486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  CheckCast(value);
6649486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org#endif
6650486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  return static_cast<Promise*>(value);
6651486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org}
6652486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org
6653486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org
66542904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.orgPromise::Resolver* Promise::Resolver::Cast(v8::Value* value) {
66552904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org#ifdef V8_ENABLE_CHECKS
66562904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org  CheckCast(value);
66572904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org#endif
66582904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org  return static_cast<Promise::Resolver*>(value);
66592904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org}
66602904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org
66612904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org
6662ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.orgArrayBuffer* ArrayBuffer::Cast(v8::Value* value) {
6663ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org#ifdef V8_ENABLE_CHECKS
6664ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  CheckCast(value);
6665ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org#endif
6666ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  return static_cast<ArrayBuffer*>(value);
6667ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org}
6668ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
6669ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
66701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgArrayBufferView* ArrayBufferView::Cast(v8::Value* value) {
66711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#ifdef V8_ENABLE_CHECKS
66721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CheckCast(value);
66731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#endif
66741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  return static_cast<ArrayBufferView*>(value);
66751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
66761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
66771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
6678f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgTypedArray* TypedArray::Cast(v8::Value* value) {
6679f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#ifdef V8_ENABLE_CHECKS
6680f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  CheckCast(value);
6681f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#endif
6682f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return static_cast<TypedArray*>(value);
6683f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
6684f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6685f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6686f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgUint8Array* Uint8Array::Cast(v8::Value* value) {
6687f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#ifdef V8_ENABLE_CHECKS
6688f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  CheckCast(value);
6689f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#endif
6690f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return static_cast<Uint8Array*>(value);
6691f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
6692f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6693f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6694f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgInt8Array* Int8Array::Cast(v8::Value* value) {
6695f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#ifdef V8_ENABLE_CHECKS
6696f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  CheckCast(value);
6697f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#endif
6698f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return static_cast<Int8Array*>(value);
6699f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
6700f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6701f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6702f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgUint16Array* Uint16Array::Cast(v8::Value* value) {
6703f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#ifdef V8_ENABLE_CHECKS
6704f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  CheckCast(value);
6705f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#endif
6706f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return static_cast<Uint16Array*>(value);
6707f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
6708f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6709f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6710f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgInt16Array* Int16Array::Cast(v8::Value* value) {
6711f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#ifdef V8_ENABLE_CHECKS
6712f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  CheckCast(value);
6713f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#endif
6714f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return static_cast<Int16Array*>(value);
6715f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
6716f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6717f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6718f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgUint32Array* Uint32Array::Cast(v8::Value* value) {
6719f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#ifdef V8_ENABLE_CHECKS
6720f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  CheckCast(value);
6721f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#endif
6722f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return static_cast<Uint32Array*>(value);
6723f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
6724f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6725f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6726f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgInt32Array* Int32Array::Cast(v8::Value* value) {
6727f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#ifdef V8_ENABLE_CHECKS
6728f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  CheckCast(value);
6729f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#endif
6730f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return static_cast<Int32Array*>(value);
6731f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
6732f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6733f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6734f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgFloat32Array* Float32Array::Cast(v8::Value* value) {
6735f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#ifdef V8_ENABLE_CHECKS
6736f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  CheckCast(value);
6737f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#endif
6738f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return static_cast<Float32Array*>(value);
6739f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
6740f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6741f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6742f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgFloat64Array* Float64Array::Cast(v8::Value* value) {
6743f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#ifdef V8_ENABLE_CHECKS
6744f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  CheckCast(value);
6745f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#endif
6746f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return static_cast<Float64Array*>(value);
6747f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
6748f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6749f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
67501fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgUint8ClampedArray* Uint8ClampedArray::Cast(v8::Value* value) {
67511fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org#ifdef V8_ENABLE_CHECKS
67521fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  CheckCast(value);
67531fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org#endif
67541fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  return static_cast<Uint8ClampedArray*>(value);
67551fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org}
67561fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
67571fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
67581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgDataView* DataView::Cast(v8::Value* value) {
67591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#ifdef V8_ENABLE_CHECKS
67601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CheckCast(value);
67611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#endif
67621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  return static_cast<DataView*>(value);
67631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
67641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
67651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
676618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgFunction* Function::Cast(v8::Value* value) {
676718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
676818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  CheckCast(value);
676918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
677018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return static_cast<Function*>(value);
677118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
677218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
677318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
677418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgExternal* External::Cast(v8::Value* value) {
677518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
677618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  CheckCast(value);
677718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
677818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return static_cast<External*>(value);
677918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
678018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
678118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
6782bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6783bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgIsolate* PropertyCallbackInfo<T>::GetIsolate() const {
6784bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  return *reinterpret_cast<Isolate**>(&args_[kIsolateIndex]);
6785bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
6786bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
6787bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
6788bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6789bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgLocal<Value> PropertyCallbackInfo<T>::Data() const {
6790bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  return Local<Value>(reinterpret_cast<Value*>(&args_[kDataIndex]));
679128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org}
679228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
679328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
6794bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6795aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.orgLocal<Object> PropertyCallbackInfo<T>::This() const {
6796aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org  return Local<Object>(reinterpret_cast<Object*>(&args_[kThisIndex]));
6797c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org}
6798c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
6799c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
6800bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6801bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgLocal<Object> PropertyCallbackInfo<T>::Holder() const {
6802bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  return Local<Object>(reinterpret_cast<Object*>(&args_[kHolderIndex]));
6803c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org}
6804c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
6805c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
6806bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6807bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgReturnValue<T> PropertyCallbackInfo<T>::GetReturnValue() const {
6808bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  return ReturnValue<T>(&args_[kReturnValueIndex]);
6809c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org}
6810c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
6811c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
6812efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgHandle<Primitive> Undefined(Isolate* isolate) {
6813efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  typedef internal::Object* S;
6814efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  typedef internal::Internals I;
68151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  I::CheckInitialized(isolate);
6816efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  S* slot = I::GetRoot(isolate, I::kUndefinedValueRootIndex);
6817efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  return Handle<Primitive>(reinterpret_cast<Primitive*>(slot));
6818efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org}
6819efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
6820efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
6821efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgHandle<Primitive> Null(Isolate* isolate) {
6822efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  typedef internal::Object* S;
6823efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  typedef internal::Internals I;
68241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  I::CheckInitialized(isolate);
6825efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  S* slot = I::GetRoot(isolate, I::kNullValueRootIndex);
6826efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  return Handle<Primitive>(reinterpret_cast<Primitive*>(slot));
6827efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org}
6828efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
6829efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
6830efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgHandle<Boolean> True(Isolate* isolate) {
6831efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  typedef internal::Object* S;
6832efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  typedef internal::Internals I;
68331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  I::CheckInitialized(isolate);
6834efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  S* slot = I::GetRoot(isolate, I::kTrueValueRootIndex);
6835efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  return Handle<Boolean>(reinterpret_cast<Boolean*>(slot));
6836efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org}
6837efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
6838efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
6839efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgHandle<Boolean> False(Isolate* isolate) {
6840efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  typedef internal::Object* S;
6841efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  typedef internal::Internals I;
68421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  I::CheckInitialized(isolate);
6843efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  S* slot = I::GetRoot(isolate, I::kFalseValueRootIndex);
6844efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  return Handle<Boolean>(reinterpret_cast<Boolean*>(slot));
6845efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org}
6846efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
6847efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
68487ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.orgvoid Isolate::SetData(uint32_t slot, void* data) {
68497ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  typedef internal::Internals I;
68507ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  I::SetEmbedderData(this, slot, data);
68517ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org}
68527ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org
68537ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org
68547ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.orgvoid* Isolate::GetData(uint32_t slot) {
68557ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  typedef internal::Internals I;
68567ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  return I::GetEmbedderData(this, slot);
68577ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org}
68587ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org
68597ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org
68607ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.orguint32_t Isolate::GetNumberOfDataSlots() {
68617ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  typedef internal::Internals I;
68627ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  return I::kNumIsolateDataSlots;
6863efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org}
6864efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
6865efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
68661e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgint64_t Isolate::AdjustAmountOfExternalAllocatedMemory(
68671e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org    int64_t change_in_bytes) {
68681e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  typedef internal::Internals I;
68691e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  int64_t* amount_of_external_allocated_memory =
68701e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org      reinterpret_cast<int64_t*>(reinterpret_cast<uint8_t*>(this) +
68711e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org                                 I::kAmountOfExternalAllocatedMemoryOffset);
68721e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  int64_t* amount_of_external_allocated_memory_at_last_global_gc =
68731e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org      reinterpret_cast<int64_t*>(
68741e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org          reinterpret_cast<uint8_t*>(this) +
68751e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org          I::kAmountOfExternalAllocatedMemoryAtLastGlobalGCOffset);
68761e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  int64_t amount = *amount_of_external_allocated_memory + change_in_bytes;
68771e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  if (change_in_bytes > 0 &&
68781e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org      amount - *amount_of_external_allocated_memory_at_last_global_gc >
68791e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org          I::kExternalAllocationLimit) {
68801e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org    CollectAllGarbage("external memory allocation limit reached.");
68811e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  } else {
68821e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org    *amount_of_external_allocated_memory = amount;
68831e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  }
68841e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  return *amount_of_external_allocated_memory;
68851e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org}
68861e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
68871e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
6888690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.orgtemplate<typename T>
6889690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.orgvoid Isolate::SetObjectGroupId(const Persistent<T>& object,
6890690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org                               UniqueId id) {
6891690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org  TYPE_CHECK(Value, T);
6892690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org  SetObjectGroupId(reinterpret_cast<v8::internal::Object**>(object.val_), id);
6893690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org}
6894690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org
6895690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org
6896690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.orgtemplate<typename T>
6897690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.orgvoid Isolate::SetReferenceFromGroup(UniqueId id,
6898690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org                                    const Persistent<T>& object) {
6899690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org  TYPE_CHECK(Value, T);
6900690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org  SetReferenceFromGroup(id,
6901690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org                        reinterpret_cast<v8::internal::Object**>(object.val_));
6902690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org}
6903690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org
6904690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org
6905690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.orgtemplate<typename T, typename S>
6906690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.orgvoid Isolate::SetReference(const Persistent<T>& parent,
6907690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org                           const Persistent<S>& child) {
6908690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org  TYPE_CHECK(Object, T);
6909690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org  TYPE_CHECK(Value, S);
6910690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org  SetReference(reinterpret_cast<v8::internal::Object**>(parent.val_),
6911690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org               reinterpret_cast<v8::internal::Object**>(child.val_));
6912690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org}
6913690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org
6914690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org
6915eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgLocal<Value> Context::GetEmbedderData(int index) {
6916eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org#ifndef V8_ENABLE_CHECKS
6917eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  typedef internal::Object O;
6918cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  typedef internal::HeapObject HO;
6919eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  typedef internal::Internals I;
6920cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  HO* context = *reinterpret_cast<HO**>(this);
6921cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  O** result =
6922cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org      HandleScope::CreateHandle(context, I::ReadEmbedderData<O*>(this, index));
6923eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  return Local<Value>(reinterpret_cast<Value*>(result));
6924eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org#else
6925eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  return SlowGetEmbedderData(index);
6926eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org#endif
6927eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org}
6928eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
6929eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
6930eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgvoid* Context::GetAlignedPointerFromEmbedderData(int index) {
6931eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org#ifndef V8_ENABLE_CHECKS
6932eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  typedef internal::Internals I;
6933eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  return I::ReadEmbedderData<void*>(this, index);
6934eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org#else
6935eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  return SlowGetAlignedPointerFromEmbedderData(index);
6936eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org#endif
6937eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org}
6938eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
6939eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
694043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
6941727e995b7bba3c57fb1e5c156d386ca11894f781v * \example shell.cc
6942727e995b7bba3c57fb1e5c156d386ca11894f781v * A simple shell that takes a list of expressions on the
694343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * command-line and executes them.
694443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
694543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
694643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
694743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
694843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * \example process.cc
694943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
695043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
695143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
695243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}  // namespace v8
695343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
695443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
695543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef TYPE_CHECK
695643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
695743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
69589258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org#endif  // V8_H_
6959