128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Redistribution and use in source and binary forms, with or without
343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// modification, are permitted provided that the following conditions are
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// met:
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Redistributions of source code must retain the above copyright
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       notice, this list of conditions and the following disclaimer.
843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Redistributions in binary form must reproduce the above
943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       copyright notice, this list of conditions and the following
1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       disclaimer in the documentation and/or other materials provided
1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       with the distribution.
1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Neither the name of Google Inc. nor the names of its
1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       contributors may be used to endorse or promote products derived
1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       from this software without specific prior written permission.
1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
28727e995b7bba3c57fb1e5c156d386ca11894f781v/** \mainpage V8 API Reference Guide
299258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org *
309258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org * V8 is Google's open source JavaScript engine.
31727e995b7bba3c57fb1e5c156d386ca11894f781v *
32727e995b7bba3c57fb1e5c156d386ca11894f781v * This set of documents provides reference material generated from the
33727e995b7bba3c57fb1e5c156d386ca11894f781v * V8 header file, include/v8.h.
34727e995b7bba3c57fb1e5c156d386ca11894f781v *
35727e995b7bba3c57fb1e5c156d386ca11894f781v * For other documentation see http://code.google.com/apis/v8/
3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
37727e995b7bba3c57fb1e5c156d386ca11894f781v
389258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org#ifndef V8_H_
399258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org#define V8_H_
4043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
41f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org#include "v8stdint.h"
4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
43594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// We reserve the V8_* prefix for macros defined in V8 public API and
44594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// assume there are no name conflicts with the embedder's code.
45594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifdef _WIN32
479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Setup for Windows DLL export/import. When building the V8 DLL the
499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// BUILDING_V8_SHARED needs to be defined. When building a program which uses
509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// the V8 DLL USING_V8_SHARED needs to be defined. When either building the V8
519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// static library or building a program which uses the V8 static library neither
529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// BUILDING_V8_SHARED nor USING_V8_SHARED should be defined.
539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#if defined(BUILDING_V8_SHARED) && defined(USING_V8_SHARED)
549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#error both BUILDING_V8_SHARED and USING_V8_SHARED are set - please check the\
559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  build configuration to ensure that at most one of these is set
569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#endif
579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#ifdef BUILDING_V8_SHARED
59594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org#define V8_EXPORT __declspec(dllexport)
609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#elif USING_V8_SHARED
61594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org#define V8_EXPORT __declspec(dllimport)
6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#else
63594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org#define V8_EXPORT
649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#endif  // BUILDING_V8_SHARED
659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#else  // _WIN32
679085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
68d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org// Setup for Linux shared library export.
69b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org#if defined(__GNUC__) && ((__GNUC__ >= 4) || \
70b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org    (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(V8_SHARED)
71d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org#ifdef BUILDING_V8_SHARED
72594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org#define V8_EXPORT __attribute__ ((visibility("default")))
73d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org#else
74594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org#define V8_EXPORT
75d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org#endif
76b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org#else
77594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org#define V8_EXPORT
78b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org#endif
799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#endif  // _WIN32
8143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org#if defined(__GNUC__) && !defined(DEBUG)
8332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org#define V8_INLINE(declarator) inline __attribute__((always_inline)) declarator
8432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org#elif defined(_MSC_VER) && !defined(DEBUG)
8532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org#define V8_INLINE(declarator) __forceinline declarator
8632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org#else
8732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org#define V8_INLINE(declarator) inline declarator
8832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org#endif
8932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
908e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org#if defined(__GNUC__) && !V8_DISABLE_DEPRECATIONS
9132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org#define V8_DEPRECATED(declarator) declarator __attribute__ ((deprecated))
928e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org#elif defined(_MSC_VER) && !V8_DISABLE_DEPRECATIONS
9332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org#define V8_DEPRECATED(declarator) __declspec(deprecated) declarator
94eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org#else
9532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org#define V8_DEPRECATED(declarator) declarator
96eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org#endif
97eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
98ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org#if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))
99ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  #define V8_UNLIKELY(condition) __builtin_expect((condition), 0)
100ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  #define V8_LIKELY(condition) __builtin_expect((condition), 1)
101ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org#else
102ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  #define V8_UNLIKELY(condition) (condition)
103ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  #define V8_LIKELY(condition) (condition)
104ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org#endif
105ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
10643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
107727e995b7bba3c57fb1e5c156d386ca11894f781v * The v8 JavaScript engine.
10843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
10943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansennamespace v8 {
11043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1114c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass AccessorInfo;
1124c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass AccessorSignature;
11343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Array;
11443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Boolean;
11584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgclass BooleanObject;
1164c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Context;
117f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgclass CpuProfiler;
1184c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Data;
11943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Date;
1204c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass DeclaredAccessorDescriptor;
1214c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass External;
1224c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Function;
1234c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass FunctionTemplate;
124f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgclass HeapProfiler;
12543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass ImplementationUtilities;
1264c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Int32;
1274c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Integer;
1284c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Isolate;
1294c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Number;
1304c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass NumberObject;
1314c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Object;
1324c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass ObjectOperationDescriptor;
1334c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass ObjectTemplate;
1344c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Primitive;
1354c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass RawOperationDescriptor;
13643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Signature;
1374c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass StackFrame;
1384c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass StackTrace;
1394c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass String;
1404c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass StringObject;
141e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgclass Symbol;
142e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgclass SymbolObject;
1434c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Uint32;
1444c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Utils;
1454c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Value;
14643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentemplate <class T> class Handle;
14743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentemplate <class T> class Local;
14843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentemplate <class T> class Persistent;
149bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgclass FunctionTemplate;
150bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgclass ObjectTemplate;
151bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgclass Data;
152bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgclass AccessorInfo;
153bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T> class PropertyCallbackInfo;
154bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgclass StackTrace;
155bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgclass StackFrame;
156bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgclass Isolate;
157bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgclass DeclaredAccessorDescriptor;
158bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgclass ObjectOperationDescriptor;
159bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgclass RawOperationDescriptor;
1601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass CallHandlerHelper;
16143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgnamespace internal {
163c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgclass Arguments;
1642356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.orgclass Heap;
165ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgclass HeapObject;
166ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgclass Isolate;
1674c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgclass Object;
168f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.orgtemplate<typename T> class CustomArguments;
169bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgclass PropertyCallbackArguments;
170bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgclass FunctionCallbackArguments;
17118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
17218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
17343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
174ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org/**
175ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org * General purpose unique identifier.
176ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org */
177ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.orgclass UniqueId {
178ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org public:
179ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  explicit UniqueId(intptr_t data)
180ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org      : data_(data) {}
181ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
182ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  bool operator==(const UniqueId& other) const {
183ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    return data_ == other.data_;
184ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  }
185ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
186ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  bool operator!=(const UniqueId& other) const {
187ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    return data_ != other.data_;
188ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  }
189ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
190ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  bool operator<(const UniqueId& other) const {
191ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    return data_ < other.data_;
192ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  }
193ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
194ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org private:
195ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  intptr_t data_;
196ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org};
197ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
198ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
199fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Weak Handles ---
20043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
20343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * A weak reference callback function.
20443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
205ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org * This callback should either explicitly invoke Dispose on |object| if
206ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org * V8 wrapper is not needed anymore, or 'revive' it by invocation of MakeWeak.
207ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org *
20843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * \param object the weak global object to be reclaimed by the garbage collector
20943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * \param parameter the value passed in when making the weak global object
21043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
21157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgtemplate<typename T, typename P>
21257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgclass WeakReferenceCallbacks {
21357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org public:
21457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  typedef void (*Revivable)(Isolate* isolate,
21557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org                            Persistent<T>* object,
21657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org                            P* parameter);
21757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org};
21843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
219fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Handles ---
22043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
221ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org#define TYPE_CHECK(T, S)                                       \
222ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org  while (false) {                                              \
223ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org    *(static_cast<T* volatile*>(0)) = static_cast<S*>(0);      \
22443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
22543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
22743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
22843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * An object reference managed by the v8 garbage collector.
22943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
23043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * All objects returned from v8 have to be tracked by the garbage
23143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * collector so that it knows that the objects are still alive.  Also,
23243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * because the garbage collector may move objects, it is unsafe to
23343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * point directly to an object.  Instead, all objects are stored in
23443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * handles which are known by the garbage collector and updated
23543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * whenever an object moves.  Handles should always be passed by value
23643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * (except in cases like out-parameters) and they should never be
23743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * allocated on the heap.
23843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
23943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * There are two types of handles: local and persistent handles.
24043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Local handles are light-weight and transient and typically used in
24143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * local operations.  They are managed by HandleScopes.  Persistent
24243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * handles can be used when storing objects across several independent
24343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * operations and have to be explicitly deallocated when they're no
24443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * longer used.
24543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
24643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * It is safe to extract the object stored in the handle by
24743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * dereferencing the handle (for instance, to extract the Object* from
2487304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org * a Handle<Object>); the value will still be governed by a handle
24943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * behind the scenes and the same rules apply to these values as to
25043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * their handles.
25143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
25269ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgtemplate <class T> class Handle {
25343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
25443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
25543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Creates an empty handle.
25643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
25732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(Handle()) : val_(0) {}
25843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
25957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#ifdef V8_USE_UNSAFE_HANDLES
26043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
26143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Creates a new handle for the specified value.
26243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
26332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(explicit Handle(T* val)) : val_(val) {}
26457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#endif
26543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
26643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
26743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Creates a handle for the contents of the specified handle.  This
26843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * constructor allows you to pass handles as arguments by value and
269727e995b7bba3c57fb1e5c156d386ca11894f781v   * to assign between handles.  However, if you try to assign between
27043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * incompatible handles, for instance from a Handle<String> to a
2717304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * Handle<Number> it will cause a compile-time error.  Assigning
27243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * between compatible handles, for instance assigning a
27343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Handle<String> to a variable declared as Handle<Value>, is legal
27443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * because String is a subclass of Value.
27543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
27632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  template <class S> V8_INLINE(Handle(Handle<S> that))
27743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      : val_(reinterpret_cast<T*>(*that)) {
27843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    /**
27943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     * This check fails when trying to convert between incompatible
28043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     * handles. For example, converting from a Handle<String> to a
28143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     * Handle<Number>.
28243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     */
28343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    TYPE_CHECK(T, S);
28443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
28543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
28643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
28743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if the handle is empty.
28843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
28932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(bool IsEmpty() const) { return val_ == 0; }
29043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
29143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
29243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Sets the handle to be empty. IsEmpty() will then return true.
29343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
29432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(void Clear()) { val_ = 0; }
295b645116853c677aca8a316381b87441ba6004f67danno@chromium.org
29632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(T* operator->() const) { return val_; }
297b645116853c677aca8a316381b87441ba6004f67danno@chromium.org
29832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(T* operator*() const) { return val_; }
29943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
30043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
30143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Checks whether two handles are the same.
30243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if both are empty, or if the objects
30343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * to which they refer are identical.
30443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * The handles' references are not checked.
30543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
30657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  template <class S> V8_INLINE(bool operator==(const Handle<S> that) const) {
30718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    internal::Object** a = reinterpret_cast<internal::Object**>(**this);
30818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    internal::Object** b = reinterpret_cast<internal::Object**>(*that);
30943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (a == 0) return b == 0;
31043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (b == 0) return false;
31143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return *a == *b;
31243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
31343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#ifndef V8_USE_UNSAFE_HANDLES
31557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  template <class S> V8_INLINE(
31657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org      bool operator==(const Persistent<S>& that) const) {
31757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    internal::Object** a = reinterpret_cast<internal::Object**>(**this);
31857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    internal::Object** b = reinterpret_cast<internal::Object**>(*that);
31957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    if (a == 0) return b == 0;
32057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    if (b == 0) return false;
32157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    return *a == *b;
32257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
32357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#endif
32457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
32543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
32643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Checks whether two handles are different.
32743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if only one of the handles is empty, or if
32843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * the objects to which they refer are different.
32943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * The handles' references are not checked.
33043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
33132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  template <class S> V8_INLINE(bool operator!=(Handle<S> that) const) {
33243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return !operator==(that);
33343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
33443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
33532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  template <class S> V8_INLINE(static Handle<T> Cast(Handle<S> that)) {
33618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
33718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    // If we're going to perform the type check then we have to check
33818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    // that the handle isn't empty before doing the checked cast.
33943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (that.IsEmpty()) return Handle<T>();
34018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
34143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return Handle<T>(T::Cast(*that));
34243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
34343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  template <class S> V8_INLINE(Handle<S> As()) {
345ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    return Handle<S>::Cast(*this);
346ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
347ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
34857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#ifndef V8_USE_UNSAFE_HANDLES
34957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  V8_INLINE(static Handle<T> New(Isolate* isolate, Handle<T> that)) {
35057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    return New(isolate, that.val_);
35157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
35257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  // TODO(dcarney): remove before cutover
35357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  V8_INLINE(static Handle<T> New(Isolate* isolate, const Persistent<T>& that)) {
35457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    return New(isolate, that.val_);
35557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
35657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
35757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#ifndef V8_ALLOW_ACCESS_TO_RAW_HANDLE_CONSTRUCTOR
35857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
35957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org private:
36057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#endif
36157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
36257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Creates a new handle for the specified value.
36357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
36457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  V8_INLINE(explicit Handle(T* val)) : val_(val) {}
36557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#endif
36657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
36743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
368f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org  friend class Utils;
369b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  template<class F> friend class Persistent;
370b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  template<class F> friend class Local;
37157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  friend class Arguments;
372b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  template<class F> friend class FunctionCallbackInfo;
373b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  template<class F> friend class PropertyCallbackInfo;
374f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org  template<class F> friend class internal::CustomArguments;
37557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  friend class AccessorInfo;
37657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  friend Handle<Primitive> Undefined(Isolate* isolate);
37757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  friend Handle<Primitive> Null(Isolate* isolate);
37857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  friend Handle<Boolean> True(Isolate* isolate);
37957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  friend Handle<Boolean> False(Isolate* isolate);
38057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  friend class Context;
381b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  friend class HandleScope;
38257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
38357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#ifndef V8_USE_UNSAFE_HANDLES
38457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  V8_INLINE(static Handle<T> New(Isolate* isolate, T* that));
38557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#endif
38657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
38743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  T* val_;
38843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
38943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
39043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
391594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// A value which will never be returned by Local::Eternalize
392594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// Useful for static initialization
393594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgconst int kUninitializedEternalIndex = -1;
394594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
395594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
39643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
39743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * A light-weight stack-allocated object handle.  All operations
39843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * that return objects from within v8 return them in local handles.  They
39943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * are created within HandleScopes, and all local handles allocated within a
40043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * handle scope are destroyed when the handle scope is destroyed.  Hence it
40143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * is not necessary to explicitly deallocate local handles.
40243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
40357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org// TODO(dcarney): deprecate entire class
40469ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgtemplate <class T> class Local : public Handle<T> {
40543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
40632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(Local());
40732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  template <class S> V8_INLINE(Local(Local<S> that))
40843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      : Handle<T>(reinterpret_cast<T*>(*that)) {
40943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    /**
41043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     * This check fails when trying to convert between incompatible
41143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     * handles. For example, converting from a Handle<String> to a
41243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     * Handle<Number>.
41343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     */
41443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    TYPE_CHECK(T, S);
41543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
41657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
41757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
41857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#ifdef V8_USE_UNSAFE_HANDLES
41932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  template <class S> V8_INLINE(Local(S* that) : Handle<T>(that)) { }
42057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#endif
42157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
42232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  template <class S> V8_INLINE(static Local<T> Cast(Local<S> that)) {
42318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
42418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    // If we're going to perform the type check then we have to check
42518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    // that the handle isn't empty before doing the checked cast.
42643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (that.IsEmpty()) return Local<T>();
42718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
42843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return Local<T>(T::Cast(*that));
42943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
43057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#ifndef V8_USE_UNSAFE_HANDLES
43157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  template <class S> V8_INLINE(Local(Handle<S> that))
43257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org      : Handle<T>(reinterpret_cast<T*>(*that)) {
43357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    TYPE_CHECK(T, S);
43457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
43557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#endif
43643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
43732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  template <class S> V8_INLINE(Local<S> As()) {
438ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    return Local<S>::Cast(*this);
439ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
440ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
441594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  // Keep this Local alive for the lifetime of the Isolate.
442594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  // It remains retrievable via the returned index,
443594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  V8_INLINE(int Eternalize(Isolate* isolate));
444594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  V8_INLINE(static Local<T> GetEternal(Isolate* isolate, int index));
445594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
44632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  /**
44732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org   * Create a local handle for the content of another handle.
44832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org   * The referee is kept alive by the local handle even when
44932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org   * the original handle is destroyed/disposed.
45043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
45132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static Local<T> New(Handle<T> that));
45232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static Local<T> New(Isolate* isolate, Handle<T> that));
45357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#ifndef V8_USE_UNSAFE_HANDLES
45457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  // TODO(dcarney): remove before cutover
45557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  V8_INLINE(static Local<T> New(Isolate* isolate, const Persistent<T>& that));
45643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
45757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#ifndef V8_ALLOW_ACCESS_TO_RAW_HANDLE_CONSTRUCTOR
45857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
45957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org private:
46057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#endif
46157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  template <class S> V8_INLINE(Local(S* that) : Handle<T>(that)) { }
46257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#endif
46357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
46457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org private:
465f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org  friend class Utils;
466b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  template<class F> friend class Persistent;
467b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  template<class F> friend class Handle;
46857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  friend class Arguments;
469b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  template<class F> friend class FunctionCallbackInfo;
470b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  template<class F> friend class PropertyCallbackInfo;
47157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  friend class String;
47257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  friend class Object;
47357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  friend class AccessorInfo;
47457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  friend class Context;
475f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org  template<class F> friend class internal::CustomArguments;
476b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  friend class HandleScope;
47757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
47857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  V8_INLINE(static Local<T> New(Isolate* isolate, T* that));
47957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org};
48043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
48243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * An object reference that is independent of any handle scope.  Where
483727e995b7bba3c57fb1e5c156d386ca11894f781v * a Local handle only lives as long as the HandleScope in which it was
48443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * allocated, a Persistent handle remains valid until it is explicitly
48543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * disposed.
48643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
48743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * A persistent handle contains a reference to a storage cell within
48843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * the v8 engine which holds an object value and which is updated by
48943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * the garbage collector whenever the object is moved.  A new storage
49043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * cell can be created using Persistent::New and existing handles can
49143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * be disposed using Persistent::Dispose.  Since persistent handles
49243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * are passed by value you may have many persistent handle objects
49343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * that point to the same storage cell.  For instance, if you pass a
49443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * persistent handle as an argument to a function you will not get two
49543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * different storage cells but rather two references to the same
49643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * storage cell.
49743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
49857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgtemplate <class T> class Persistent // NOLINT
49957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#ifdef V8_USE_UNSAFE_HANDLES
50057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    : public Handle<T> {
50157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#else
50257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  { // NOLINT
50357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#endif
50443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
50557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#ifndef V8_USE_UNSAFE_HANDLES
50657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  V8_INLINE(Persistent()) : val_(0) { }
507b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  // TODO(dcarney): add this back before cutover.
508b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org//  V8_INLINE(~Persistent()) {
509b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org//  Dispose();
510b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org//  }
51157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  V8_INLINE(bool IsEmpty() const) { return val_ == 0; }
51257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  // TODO(dcarney): remove somehow before cutover
51357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  // The handle should either be 0, or a pointer to a live cell.
51457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  V8_INLINE(void Clear()) { val_ = 0; }
51557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
51657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
51757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * A constructor that creates a new global cell pointing to that. In contrast
51857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * to the copy constructor, this creates a new persistent handle which needs
51957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * to be separately disposed.
52057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
52157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  template <class S> V8_INLINE(Persistent(Isolate* isolate, Handle<S> that))
522f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org      : val_(New(isolate, *that)) { }
52357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
524b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  template <class S> V8_INLINE(Persistent(Isolate* isolate,
5251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                          const Persistent<S>& that)) // NOLINT
526f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org      : val_(New(isolate, *that)) { }
527b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org
52857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#else
52943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
53043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Creates an empty persistent handle that doesn't point to any
53143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * storage cell.
53243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
53357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  V8_INLINE(Persistent()) : Handle<T>() { }
53443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
53543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
53643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Creates a persistent handle for the same storage cell as the
53743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * specified handle.  This constructor allows you to pass persistent
53843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * handles as arguments by value and to assign between persistent
539727e995b7bba3c57fb1e5c156d386ca11894f781v   * handles.  However, attempting to assign between incompatible
54043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * persistent handles, for instance from a Persistent<String> to a
5417304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * Persistent<Number> will cause a compile-time error.  Assigning
54243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * between compatible persistent handles, for instance assigning a
54343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Persistent<String> to a variable declared as Persistent<Value>,
544727e995b7bba3c57fb1e5c156d386ca11894f781v   * is allowed as String is a subclass of Value.
54543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
54632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  template <class S> V8_INLINE(Persistent(Persistent<S> that))
54743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      : Handle<T>(reinterpret_cast<T*>(*that)) {
54843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    /**
54943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     * This check fails when trying to convert between incompatible
55043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     * handles. For example, converting from a Handle<String> to a
55143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     * Handle<Number>.
55243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     */
55343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    TYPE_CHECK(T, S);
55443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
55543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
55632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  template <class S> V8_INLINE(Persistent(S* that)) : Handle<T>(that) { }
55743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5585a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  /**
559ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * A constructor that creates a new global cell pointing to that. In contrast
560ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * to the copy constructor, this creates a new persistent handle which needs
561ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * to be separately disposed.
562ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   */
563ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  template <class S> V8_INLINE(Persistent(Isolate* isolate, Handle<S> that))
564ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org      : Handle<T>(New(isolate, that)) { }
565ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
566ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  /**
5675a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * "Casts" a plain handle which is known to be a persistent handle
5685a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * to a persistent handle.
5695a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   */
57032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  template <class S> explicit V8_INLINE(Persistent(Handle<S> that))
57143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      : Handle<T>(*that) { }
57243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
57357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#endif
57457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
575c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#ifdef V8_USE_UNSAFE_HANDLES
57632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  template <class S> V8_INLINE(static Persistent<T> Cast(Persistent<S> that)) {
57718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
57818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    // If we're going to perform the type check then we have to check
57918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    // that the handle isn't empty before doing the checked cast.
58043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (that.IsEmpty()) return Persistent<T>();
58118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
58243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return Persistent<T>(T::Cast(*that));
58343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
58443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
58532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  template <class S> V8_INLINE(Persistent<S> As()) {
586ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    return Persistent<S>::Cast(*this);
587ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
588ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
589c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#else
590c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  template <class S>
591c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  V8_INLINE(static Persistent<T>& Cast(Persistent<S>& that)) { // NOLINT
592c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#ifdef V8_ENABLE_CHECKS
593c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    // If we're going to perform the type check then we have to check
594c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    // that the handle isn't empty before doing the checked cast.
595c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    if (!that.IsEmpty()) T::Cast(*that);
596c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#endif
597c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    return reinterpret_cast<Persistent<T>&>(that);
598c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  }
599c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
600c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  template <class S> V8_INLINE(Persistent<S>& As()) { // NOLINT
601c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    return Persistent<S>::Cast(*this);
602c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  }
603c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#endif
604c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
605f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org#ifdef V8_USE_UNSAFE_HANDLES
606d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  V8_DEPRECATED(static Persistent<T> New(Handle<T> that));
607d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  V8_INLINE(static Persistent<T> New(Isolate* isolate, Handle<T> that));
60857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  V8_INLINE(static Persistent<T> New(Isolate* isolate, Persistent<T> that));
60957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#endif
610d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
61157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#ifndef V8_USE_UNSAFE_HANDLES
61257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  template <class S> V8_INLINE(
61357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org      bool operator==(const Persistent<S>& that) const) {
61457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    internal::Object** a = reinterpret_cast<internal::Object**>(**this);
61557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    internal::Object** b = reinterpret_cast<internal::Object**>(*that);
61657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    if (a == 0) return b == 0;
61757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    if (b == 0) return false;
61857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    return *a == *b;
61957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
62057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
62157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  template <class S> V8_INLINE(bool operator==(const Handle<S> that) const) {
62257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    internal::Object** a = reinterpret_cast<internal::Object**>(**this);
62357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    internal::Object** b = reinterpret_cast<internal::Object**>(*that);
62457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    if (a == 0) return b == 0;
62557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    if (b == 0) return false;
62657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    return *a == *b;
62757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
62857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#endif
62957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
63057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  V8_INLINE(void Dispose());
63143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
63243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
63343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Releases the storage cell referenced by this persistent handle.
63443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Does not remove the reference to the cell from any handles.
6357304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * This handle's reference, and any other references to the storage
63643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * cell remain and IsEmpty will still return false.
63743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
638b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  // TODO(dcarney): deprecate
639b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  V8_INLINE(void Dispose(Isolate* isolate)) { Dispose(); }
64043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
641b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  /**
642b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org   * Make the reference to this object weak.  When only weak handles
643b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org   * refer to the object, the garbage collector will perform a
644b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org   * callback to the given V8::NearDeathCallback function, passing
645b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org   * it the object reference and the given parameters.
646b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org   */
64757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  template<typename S, typename P>
64857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  V8_INLINE(void MakeWeak(
64957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org      P* parameters,
65057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org      typename WeakReferenceCallbacks<S, P>::Revivable callback));
65157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
65257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  template<typename P>
65357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  V8_INLINE(void MakeWeak(
65457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org      P* parameters,
65557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org      typename WeakReferenceCallbacks<T, P>::Revivable callback));
656d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
657b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  template<typename S, typename P>
658f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org  V8_DEPRECATED(void MakeWeak(
659b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org      Isolate* isolate,
660b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org      P* parameters,
661f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org      typename WeakReferenceCallbacks<S, P>::Revivable callback));
662b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org
663b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  template<typename P>
664f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org  V8_DEPRECATED(void MakeWeak(
665b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org      Isolate* isolate,
666b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org      P* parameters,
667f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org      typename WeakReferenceCallbacks<T, P>::Revivable callback));
668b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org
66957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  V8_INLINE(void ClearWeak());
67043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
671b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  // TODO(dcarney): deprecate
672b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  V8_INLINE(void ClearWeak(Isolate* isolate)) { ClearWeak(); }
67343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
67443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
675d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org   * Marks the reference to this object independent. Garbage collector is free
676d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org   * to ignore any object groups containing this object. Weak callback for an
677d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org   * independent handle should not assume that it will be preceded by a global
678d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org   * GC prologue callback or followed by a global GC epilogue callback.
679c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org   */
680b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  V8_INLINE(void MarkIndependent());
681e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
682b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  // TODO(dcarney): deprecate
683b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  V8_INLINE(void MarkIndependent(Isolate* isolate)) { MarkIndependent(); }
684d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
685e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  /**
686d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org   * Marks the reference to this object partially dependent. Partially dependent
687d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org   * handles only depend on other partially dependent handles and these
688d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org   * dependencies are provided through object groups. It provides a way to build
689d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org   * smaller object groups for young objects that represent only a subset of all
690d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org   * external dependencies. This mark is automatically cleared after each
691d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org   * garbage collection.
692e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org   */
693b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  V8_INLINE(void MarkPartiallyDependent());
694c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org
695b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  // TODO(dcarney): deprecate
696b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  V8_INLINE(void MarkPartiallyDependent(Isolate* isolate)) {
697b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org    MarkPartiallyDependent();
698b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  }
699d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
700b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  V8_INLINE(bool IsIndependent() const);
70189e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
702b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  // TODO(dcarney): deprecate
703b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  V8_INLINE(bool IsIndependent(Isolate* isolate) const) {
704b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org    return IsIndependent();
705b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  }
706d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
70789e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  /** Checks if the handle holds the only reference to an object. */
708b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  V8_INLINE(bool IsNearDeath() const);
709d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
710b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  // TODO(dcarney): deprecate
711b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  V8_INLINE(bool IsNearDeath(Isolate* isolate) const) { return IsNearDeath(); }
71243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
71389e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  /** Returns true if the handle's reference is weak.  */
714b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  V8_INLINE(bool IsWeak() const);
71543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
716b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  // TODO(dcarney): deprecate
717b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  V8_INLINE(bool IsWeak(Isolate* isolate) const) { return IsWeak(); }
718d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
719b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org  /**
720d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org   * Assigns a wrapper class ID to the handle. See RetainedObjectInfo interface
721d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org   * description in v8-profiler.h for details.
722b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org   */
723b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  V8_INLINE(void SetWrapperClassId(uint16_t class_id));
724d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
725b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  // TODO(dcarney): deprecate
726b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  V8_INLINE(void SetWrapperClassId(Isolate* isolate, uint16_t class_id)) {
727b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org    SetWrapperClassId(class_id);
728b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  }
729b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org
73089e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  /**
731d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org   * Returns the class ID previously assigned to this handle or 0 if no class ID
732d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org   * was previously assigned.
73389e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org   */
734b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  V8_INLINE(uint16_t WrapperClassId() const);
735b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org
736b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  // TODO(dcarney): deprecate
737b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  V8_INLINE(uint16_t WrapperClassId(Isolate* isolate) const) {
738b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org    return WrapperClassId();
739b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  }
74089e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
74157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
74257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Disposes the current contents of the handle and replaces it.
74357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
74457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  V8_INLINE(void Reset(Isolate* isolate, const Handle<T>& other));
74557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
746b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org#ifndef V8_USE_UNSAFE_HANDLES
747b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  V8_INLINE(void Reset(Isolate* isolate, const Persistent<T>& other));
748b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org#endif
749b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org
750906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  /**
751906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org   * Returns the underlying raw pointer and clears the handle. The caller is
752906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org   * responsible of eventually destroying the underlying object (by creating a
753906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org   * Persistent handle which points to it and Disposing it). In the future,
754906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org   * destructing a Persistent will also Dispose it. With this function, the
755906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org   * embedder can let the Persistent go out of scope without it getting
756906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org   * disposed.
757906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org   */
758906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  V8_INLINE(T* ClearAndLeak());
759906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org
76057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#ifndef V8_USE_UNSAFE_HANDLES
76157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
76243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
76357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  // TODO(dcarney): make unlinkable before cutover
76457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  V8_INLINE(Persistent(const Persistent& that)) : val_(that.val_) {}
76557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  // TODO(dcarney): make unlinkable before cutover
76657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  V8_INLINE(Persistent& operator=(const Persistent& that)) {  // NOLINT
76757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    this->val_ = that.val_;
76857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    return *this;
76957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
77057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
77157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org public:
77257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#ifndef V8_ALLOW_ACCESS_TO_RAW_HANDLE_CONSTRUCTOR
77357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
77457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org private:
77557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#endif
77657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  // TODO(dcarney): remove before cutover
77757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  template <class S> V8_INLINE(Persistent(S* that)) : val_(that) { }
778f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org
77957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  // TODO(dcarney): remove before cutover
78057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  V8_INLINE(T* operator*() const) { return val_; }
78157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
78257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org private:
78357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  // TODO(dcarney): remove before cutover
78457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  V8_INLINE(T* operator->() const) { return val_; }
78557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org public:
78657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#endif
78757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
78857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org private:
789f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org  friend class Utils;
790b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  template<class F> friend class Handle;
791b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  template<class F> friend class Local;
792f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org  template<class F> friend class Persistent;
7931fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  template<class F> friend class ReturnValue;
79457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
795f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org  V8_INLINE(static T* New(Isolate* isolate, T* that));
79657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
79757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#ifndef V8_USE_UNSAFE_HANDLES
79857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  T* val_;
79957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#endif
80043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
80143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
80243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
803727e995b7bba3c57fb1e5c156d386ca11894f781v /**
80443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * A stack-allocated class that governs a number of local handles.
80543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * After a handle scope has been created, all local handles will be
80643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * allocated within that handle scope until either the handle scope is
80743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * deleted or another handle scope is created.  If there is already a
80843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * handle scope and a new one is created, all allocations will take
809727e995b7bba3c57fb1e5c156d386ca11894f781v * place in the new handle scope until it is deleted.  After that,
81043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * new handles will again be allocated in the original handle scope.
81143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
81243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * After the handle scope of a local handle has been deleted the
81343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * garbage collector will no longer track the object stored in the
81443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * handle and may deallocate it.  The behavior of accessing a handle
81543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * for which the handle scope has been deleted is undefined.
81643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
817594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT HandleScope {
81843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
8192bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  // TODO(svenpanne) Deprecate me when Chrome is fixed!
820ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  HandleScope();
82143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8222bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope(Isolate* isolate);
8232bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org
824ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  ~HandleScope();
82543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
82643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
82743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Closes the handle scope and returns the value as a handle in the
82843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * previous scope, which is the new current scope after the call.
82943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
83043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  template <class T> Local<T> Close(Handle<T> value);
83143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
83243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
83343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Counts the number of allocated handles.
83443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
83543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static int NumberOfHandles();
83643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
83743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
83843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Creates a new handle with the given value.
83943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
84018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  static internal::Object** CreateHandle(internal::Object* value);
84132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  static internal::Object** CreateHandle(internal::Isolate* isolate,
84232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org                                         internal::Object* value);
843ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Faster version, uses HeapObject to obtain the current Isolate.
844ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  static internal::Object** CreateHandle(internal::HeapObject* value);
84543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
84643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
84749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  // Make it hard to create heap-allocated or illegal handle scopes by
84849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  // disallowing certain operations.
84943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  HandleScope(const HandleScope&);
85043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void operator=(const HandleScope&);
85143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void* operator new(size_t size);
85243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void operator delete(void*, size_t);
85343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8543811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  // This Data class is accessible internally as HandleScopeData through a
8553811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  // typedef in the ImplementationUtilities class.
856594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  class V8_EXPORT Data {
85743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   public:
85818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    internal::Object** next;
85918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    internal::Object** limit;
860303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org    int level;
86132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    V8_INLINE(void Initialize()) {
86243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      next = limit = NULL;
863303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org      level = 0;
86443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
86543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  };
866f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org
8672bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  void Initialize(Isolate* isolate);
868303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  void Leave();
86943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
870ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  internal::Isolate* isolate_;
871303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  internal::Object** prev_next_;
872303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  internal::Object** prev_limit_;
87343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
874ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  // Allow for the active closing of HandleScopes which allows to pass a handle
875ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  // from the HandleScope being closed to the next top most HandleScope.
87643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool is_closed_;
87718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  internal::Object** RawClose(internal::Object** value);
87843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
87943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class ImplementationUtilities;
88043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
88143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
88243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
883fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Special objects ---
88443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
88543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
88643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
88743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * The superclass of values and API object templates.
88843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
889594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Data {
89043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
89143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Data();
89243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
89343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
89443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
89543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
89643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Pre-compilation data that can be associated with a script.  This
89743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * data can be calculated for a script in advance of actually
8989258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org * compiling it, and can be stored between compilations.  When script
899727e995b7bba3c57fb1e5c156d386ca11894f781v * data is given to the compile method compilation will be faster.
90043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
901594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT ScriptData {  // NOLINT
90243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
90343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  virtual ~ScriptData() { }
9042356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
9059155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  /**
9069155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org   * Pre-compiles the specified script (context-independent).
9079155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org   *
9089155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org   * \param input Pointer to UTF-8 script source code.
9099155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org   * \param length Length of UTF-8 script source code.
9109155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org   */
91143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static ScriptData* PreCompile(const char* input, int length);
91243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9139155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  /**
9142356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org   * Pre-compiles the specified script (context-independent).
9152356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org   *
9162356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org   * NOTE: Pre-compilation using this method cannot happen on another thread
9172356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org   * without using Lockers.
9182356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org   *
9192356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org   * \param source Script source code.
9202356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org   */
9212356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  static ScriptData* PreCompile(Handle<String> source);
9222356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
9232356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  /**
9249155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org   * Load previous pre-compilation data.
9259155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org   *
9269155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org   * \param data Pointer to data returned by a call to Data() of a previous
9279155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org   *   ScriptData. Ownership is not transferred.
9289155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org   * \param length Length of data.
9299155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org   */
9309155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  static ScriptData* New(const char* data, int length);
9319155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
9329155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  /**
9339155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org   * Returns the length of Data().
9349155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org   */
93543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  virtual int Length() = 0;
9369155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
9379155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  /**
9389155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org   * Returns a serialized representation of this ScriptData that can later be
9399155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org   * passed to New(). NOTE: Serialized data is platform-dependent.
9409155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org   */
9419155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  virtual const char* Data() = 0;
9429155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
9439155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  /**
9449155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org   * Returns true if the source code could not be parsed.
9459155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org   */
9460c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  virtual bool HasError() = 0;
94743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
94843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
94943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
95043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
95143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * The origin, within a file, of a script.
95243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
9536bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.orgclass ScriptOrigin {
95443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
95532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(ScriptOrigin(
95669ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org      Handle<Value> resource_name,
95769ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org      Handle<Integer> resource_line_offset = Handle<Integer>(),
958d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      Handle<Integer> resource_column_offset = Handle<Integer>(),
959d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      Handle<Boolean> resource_is_shared_cross_origin = Handle<Boolean>()))
96043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      : resource_name_(resource_name),
96143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        resource_line_offset_(resource_line_offset),
962d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org        resource_column_offset_(resource_column_offset),
963d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org        resource_is_shared_cross_origin_(resource_is_shared_cross_origin) { }
96432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(Handle<Value> ResourceName() const);
96532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(Handle<Integer> ResourceLineOffset() const);
96632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(Handle<Integer> ResourceColumnOffset() const);
967d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  V8_INLINE(Handle<Boolean> ResourceIsSharedCrossOrigin() const);
96843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
969cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager  Handle<Value> resource_name_;
97043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Handle<Integer> resource_line_offset_;
97143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Handle<Integer> resource_column_offset_;
972d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  Handle<Boolean> resource_is_shared_cross_origin_;
97343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
97443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
97543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
97643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
977727e995b7bba3c57fb1e5c156d386ca11894f781v * A compiled JavaScript script.
97843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
979594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Script {
98043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
9815c838251403b0be9a882540f1922577abba4c872ager@chromium.org  /**
9825c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * Compiles the specified script (context-independent).
9835c838251403b0be9a882540f1922577abba4c872ager@chromium.org   *
9845c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * \param source Script source code.
985ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org   * \param origin Script origin, owned by caller, no references are kept
9865c838251403b0be9a882540f1922577abba4c872ager@chromium.org   *   when New() returns
9875c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * \param pre_data Pre-parsing data, as obtained by ScriptData::PreCompile()
9885c838251403b0be9a882540f1922577abba4c872ager@chromium.org   *   using pre_data speeds compilation if it's done multiple times.
9895c838251403b0be9a882540f1922577abba4c872ager@chromium.org   *   Owned by caller, no references are kept when New() returns.
9905c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * \param script_data Arbitrary data associated with script. Using
991ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org   *   this has same effect as calling SetData(), but allows data to be
9925c838251403b0be9a882540f1922577abba4c872ager@chromium.org   *   available to compile event handlers.
9935c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * \return Compiled script object (context independent; when run it
9945c838251403b0be9a882540f1922577abba4c872ager@chromium.org   *   will use the currently entered context).
9955c838251403b0be9a882540f1922577abba4c872ager@chromium.org   */
9965c838251403b0be9a882540f1922577abba4c872ager@chromium.org  static Local<Script> New(Handle<String> source,
9975c838251403b0be9a882540f1922577abba4c872ager@chromium.org                           ScriptOrigin* origin = NULL,
9985c838251403b0be9a882540f1922577abba4c872ager@chromium.org                           ScriptData* pre_data = NULL,
9995c838251403b0be9a882540f1922577abba4c872ager@chromium.org                           Handle<String> script_data = Handle<String>());
1000911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
10015c838251403b0be9a882540f1922577abba4c872ager@chromium.org  /**
10025c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * Compiles the specified script using the specified file name
10035c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * object (typically a string) as the script's origin.
10045c838251403b0be9a882540f1922577abba4c872ager@chromium.org   *
10055c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * \param source Script source code.
1006ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org   * \param file_name file name object (typically a string) to be used
10075c838251403b0be9a882540f1922577abba4c872ager@chromium.org   *   as the script's origin.
10085c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * \return Compiled script object (context independent; when run it
10095c838251403b0be9a882540f1922577abba4c872ager@chromium.org   *   will use the currently entered context).
10105c838251403b0be9a882540f1922577abba4c872ager@chromium.org   */
10115c838251403b0be9a882540f1922577abba4c872ager@chromium.org  static Local<Script> New(Handle<String> source,
10125c838251403b0be9a882540f1922577abba4c872ager@chromium.org                           Handle<Value> file_name);
10135c838251403b0be9a882540f1922577abba4c872ager@chromium.org
10145c838251403b0be9a882540f1922577abba4c872ager@chromium.org  /**
10155c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * Compiles the specified script (bound to current context).
1016911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org   *
10175c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * \param source Script source code.
1018ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org   * \param origin Script origin, owned by caller, no references are kept
10195c838251403b0be9a882540f1922577abba4c872ager@chromium.org   *   when Compile() returns
10205c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * \param pre_data Pre-parsing data, as obtained by ScriptData::PreCompile()
10215c838251403b0be9a882540f1922577abba4c872ager@chromium.org   *   using pre_data speeds compilation if it's done multiple times.
10225c838251403b0be9a882540f1922577abba4c872ager@chromium.org   *   Owned by caller, no references are kept when Compile() returns.
10235c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * \param script_data Arbitrary data associated with script. Using
10245c838251403b0be9a882540f1922577abba4c872ager@chromium.org   *   this has same effect as calling SetData(), but makes data available
10255c838251403b0be9a882540f1922577abba4c872ager@chromium.org   *   earlier (i.e. to compile event handlers).
10265c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * \return Compiled script object, bound to the context that was active
10275c838251403b0be9a882540f1922577abba4c872ager@chromium.org   *   when this function was called.  When run it will always use this
10285c838251403b0be9a882540f1922577abba4c872ager@chromium.org   *   context.
102943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
103043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static Local<Script> Compile(Handle<String> source,
103143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                               ScriptOrigin* origin = NULL,
10325c838251403b0be9a882540f1922577abba4c872ager@chromium.org                               ScriptData* pre_data = NULL,
10335c838251403b0be9a882540f1922577abba4c872ager@chromium.org                               Handle<String> script_data = Handle<String>());
103443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1035cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager  /**
1036cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager   * Compiles the specified script using the specified file name
1037cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager   * object (typically a string) as the script's origin.
1038911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org   *
10395c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * \param source Script source code.
10405c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * \param file_name File name to use as script's origin
10415c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * \param script_data Arbitrary data associated with script. Using
10425c838251403b0be9a882540f1922577abba4c872ager@chromium.org   *   this has same effect as calling SetData(), but makes data available
10435c838251403b0be9a882540f1922577abba4c872ager@chromium.org   *   earlier (i.e. to compile event handlers).
10445c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * \return Compiled script object, bound to the context that was active
10455c838251403b0be9a882540f1922577abba4c872ager@chromium.org   *   when this function was called.  When run it will always use this
10465c838251403b0be9a882540f1922577abba4c872ager@chromium.org   *   context.
1047cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager   */
1048cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager  static Local<Script> Compile(Handle<String> source,
10495c838251403b0be9a882540f1922577abba4c872ager@chromium.org                               Handle<Value> file_name,
10505c838251403b0be9a882540f1922577abba4c872ager@chromium.org                               Handle<String> script_data = Handle<String>());
1051cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager
1052727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
1053911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org   * Runs the script returning the resulting value.  If the script is
1054911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org   * context independent (created using ::New) it will be run in the
1055911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org   * currently entered context.  If it is context specific (created
1056911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org   * using ::Compile) it will be run in the context in which it was
1057911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org   * compiled.
1058727e995b7bba3c57fb1e5c156d386ca11894f781v   */
105943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Local<Value> Run();
10607be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
10617be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  /**
10627be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org   * Returns the script id value.
10631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * DEPRECATED: Please use GetId().
10647be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org   */
10657be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  Local<Value> Id();
106665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
106765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  /**
10681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * Returns the script id.
10691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   */
10701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  int GetId();
10711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
10721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  /**
107365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   * Associate an additional data object with the script. This is mainly used
107465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   * with the debugger as this data object is only available through the
107565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   * debugger API.
107665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   */
1077499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  void SetData(Handle<String> data);
1078e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1079e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  /**
1080e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   * Returns the name value of one Script.
1081e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   */
1082e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Handle<Value> GetScriptName();
1083e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1084e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  /**
1085e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   * Returns zero based line number of the code_pos location in the script.
1086e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   * -1 will be returned if no information available.
1087e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   */
1088e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  int GetLineNumber(int code_pos);
10891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
10901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  static const int kNoScriptId = 0;
109143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
109243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
109343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
109443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
109543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * An error message.
109643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
1097594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Message {
109843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
10993291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  Local<String> Get() const;
11003291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  Local<String> GetSourceLine() const;
110143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
110265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  /**
110365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   * Returns the resource name for the script from where the function causing
110465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   * the error originates.
110565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   */
11063291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  Handle<Value> GetScriptResourceName() const;
110743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11089258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  /**
110965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   * Returns the resource data for the script from where the function causing
111065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   * the error originates.
111165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org   */
111265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  Handle<Value> GetScriptData() const;
111365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
111465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  /**
11156a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org   * Exception stack trace. By default stack traces are not captured for
11166a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org   * uncaught exceptions. SetCaptureStackTraceForUncaughtExceptions allows
11176a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org   * to change this option.
11186a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org   */
11196a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org  Handle<StackTrace> GetStackTrace() const;
11206a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org
11216a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org  /**
11229258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * Returns the number, 1-based, of the line where the error occurred.
11239258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   */
11243291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  int GetLineNumber() const;
112543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11269258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  /**
11279258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * Returns the index within the script of the first character where
11289258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * the error occurred.
11299258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   */
11303291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  int GetStartPosition() const;
11319258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
11329258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  /**
11339258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * Returns the index within the script of the last character where
11349258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * the error occurred.
11359258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   */
11363291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  int GetEndPosition() const;
11379258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
11389258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  /**
11399258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * Returns the index within the line of the first character where
11409258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * the error occurred.
11419258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   */
11423291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  int GetStartColumn() const;
11439258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
11449258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  /**
11459258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * Returns the index within the line of the last character where
11469258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * the error occurred.
11479258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   */
11483291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  int GetEndColumn() const;
11499258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
1150d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  /**
1151d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org   * Passes on the value set by the embedder when it fed the script from which
1152d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org   * this Message was generated to V8.
1153d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org   */
1154d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  bool IsSharedCrossOrigin() const;
1155d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
115643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // TODO(1245381): Print to a string instead of on a FILE.
115743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static void PrintCurrentStackTrace(FILE* out);
1158720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1159720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  static const int kNoLineNumberInfo = 0;
1160720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  static const int kNoColumnInfo = 0;
1161720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org};
1162720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1163720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1164720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org/**
1165720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org * Representation of a JavaScript stack trace. The information collected is a
1166720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org * snapshot of the execution stack and the information remains valid after
1167720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org * execution continues.
1168720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org */
1169594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT StackTrace {
1170720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org public:
1171720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  /**
1172720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * Flags that determine what information is placed captured for each
1173720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * StackFrame when grabbing the current stack trace.
1174720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   */
1175720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  enum StackTraceOptions {
1176720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org    kLineNumber = 1,
1177720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org    kColumnOffset = 1 << 1 | kLineNumber,
1178720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org    kScriptName = 1 << 2,
1179720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org    kFunctionName = 1 << 3,
1180720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org    kIsEval = 1 << 4,
1181720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org    kIsConstructor = 1 << 5,
1182b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org    kScriptNameOrSourceURL = 1 << 6,
1183720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org    kOverview = kLineNumber | kColumnOffset | kScriptName | kFunctionName,
1184b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org    kDetailed = kOverview | kIsEval | kIsConstructor | kScriptNameOrSourceURL
1185720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  };
1186720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1187720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  /**
1188720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * Returns a StackFrame at a particular index.
1189720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   */
1190720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  Local<StackFrame> GetFrame(uint32_t index) const;
1191720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1192720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  /**
1193720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * Returns the number of StackFrames.
1194720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   */
1195720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  int GetFrameCount() const;
1196720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1197720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  /**
1198720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * Returns StackTrace as a v8::Array that contains StackFrame objects.
1199720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   */
1200720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  Local<Array> AsArray();
1201720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1202720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  /**
12037304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * Grab a snapshot of the current JavaScript execution stack.
1204720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   *
1205720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * \param frame_limit The maximum number of stack frames we want to capture.
1206720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * \param options Enumerates the set of things we will capture for each
1207720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   *   StackFrame.
1208720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   */
1209720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  static Local<StackTrace> CurrentStackTrace(
1210720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org      int frame_limit,
1211720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org      StackTraceOptions options = kOverview);
1212720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org};
1213720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1214720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1215720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org/**
1216720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org * A single JavaScript stack frame.
1217720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org */
1218594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT StackFrame {
1219720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org public:
1220720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  /**
1221720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * Returns the number, 1-based, of the line for the associate function call.
1222720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * This method will return Message::kNoLineNumberInfo if it is unable to
1223720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * retrieve the line number, or if kLineNumber was not passed as an option
1224720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * when capturing the StackTrace.
1225720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   */
1226720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  int GetLineNumber() const;
1227720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1228720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  /**
1229720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * Returns the 1-based column offset on the line for the associated function
1230720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * call.
1231720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * This method will return Message::kNoColumnInfo if it is unable to retrieve
1232720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * the column number, or if kColumnOffset was not passed as an option when
1233720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * capturing the StackTrace.
1234720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   */
1235720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  int GetColumn() const;
1236720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1237720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  /**
1238720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * Returns the name of the resource that contains the script for the
1239720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * function for this StackFrame.
1240720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   */
1241720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  Local<String> GetScriptName() const;
1242720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1243720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  /**
1244b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org   * Returns the name of the resource that contains the script for the
1245b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org   * function for this StackFrame or sourceURL value if the script name
1246b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org   * is undefined and its source ends with //# sourceURL=... string or
1247b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org   * deprecated //@ sourceURL=... string.
1248b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org   */
1249b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  Local<String> GetScriptNameOrSourceURL() const;
1250b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org
1251b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  /**
1252720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * Returns the name of the function associated with this stack frame.
1253720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   */
1254720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  Local<String> GetFunctionName() const;
1255720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1256720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  /**
1257720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * Returns whether or not the associated function is compiled via a call to
1258720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * eval().
1259720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   */
1260720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  bool IsEval() const;
1261720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
1262720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  /**
12637304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * Returns whether or not the associated function is called as a
1264720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   * constructor via "new".
1265720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org   */
1266720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  bool IsConstructor() const;
126743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
126843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
126943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1270594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org/**
1271594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org * A JSON Parser.
1272594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org */
1273594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT JSON {
1274594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org public:
1275594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  /**
1276594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org   * Tries to parse the string |json_string| and returns it as value if
1277594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org   * successful.
1278594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org   *
1279594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org   * \param json_string The string to parse.
1280594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org   * \return The corresponding value if successfully parsed.
1281594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org   */
1282594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  static Local<Value> Parse(Local<String> json_string);
1283594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org};
1284594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
1285594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
1286fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Value ---
128743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
128843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
128943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
1290727e995b7bba3c57fb1e5c156d386ca11894f781v * The superclass of all JavaScript values and objects.
129143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
1292594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Value : public Data {
129343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
129443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
129543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is the undefined value.  See ECMA-262
129643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * 4.3.10.
129743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
129832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(bool IsUndefined() const);
129943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
130043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
130143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is the null value.  See ECMA-262
130243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * 4.3.11.
130343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
130432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(bool IsNull() const);
130543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
130643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   /**
130743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is true.
130843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
130946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsTrue() const;
131043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
131143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
131243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is false.
131343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
131446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsFalse() const;
131543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
131643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
131743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is an instance of the String type.
131843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * See ECMA-262 8.4.
131943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
132032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(bool IsString() const);
132143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
132243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
1323e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   * Returns true if this value is a symbol.
1324e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   * This is an experimental feature.
1325e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   */
1326e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  bool IsSymbol() const;
1327e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1328e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  /**
132943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is a function.
133043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
133146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsFunction() const;
133243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
133343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
133443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is an array.
133543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
133646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsArray() const;
133743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1338727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
133943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is an object.
134043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
134146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsObject() const;
134243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1343727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
134443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is boolean.
134543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
134646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsBoolean() const;
13479258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
1348727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
134943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is a number.
135043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
135146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsNumber() const;
135243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1353727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
135443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is external.
135543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
135646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsExternal() const;
135743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1358727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
135943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if this value is a 32-bit signed integer.
136043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
136146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsInt32() const;
136243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13635a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  /**
1364c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.org   * Returns true if this value is a 32-bit unsigned integer.
1365ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org   */
136646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsUint32() const;
1367ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
1368ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  /**
13695a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * Returns true if this value is a Date.
13705a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   */
137146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsDate() const;
13725a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
137326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org  /**
137484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   * Returns true if this value is a Boolean object.
137584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   */
137646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsBooleanObject() const;
137784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
137884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  /**
137984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   * Returns true if this value is a Number object.
138084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   */
138146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsNumberObject() const;
138284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
138384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  /**
138484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   * Returns true if this value is a String object.
138584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   */
138646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsStringObject() const;
138784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
138884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  /**
1389e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   * Returns true if this value is a Symbol object.
1390e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   * This is an experimental feature.
1391e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   */
1392e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  bool IsSymbolObject() const;
1393e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1394e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  /**
139584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   * Returns true if this value is a NativeError.
139684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   */
139746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsNativeError() const;
139884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
139984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  /**
140026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org   * Returns true if this value is a RegExp.
140126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org   */
140246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsRegExp() const;
140326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org
140457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
140557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
140657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Returns true if this value is an ArrayBuffer.
140757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * This is an experimental feature.
140857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
140957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool IsArrayBuffer() const;
141057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
141157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
14121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * Returns true if this value is an ArrayBufferView.
14131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * This is an experimental feature.
14141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   */
14151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  bool IsArrayBufferView() const;
14161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
14171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  /**
141857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Returns true if this value is one of TypedArrays.
141957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * This is an experimental feature.
142057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
142157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool IsTypedArray() const;
142257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
142357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
142457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Returns true if this value is an Uint8Array.
142557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * This is an experimental feature.
142657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
142757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool IsUint8Array() const;
142857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
142957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
143057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Returns true if this value is an Uint8ClampedArray.
143157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * This is an experimental feature.
143257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
143357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool IsUint8ClampedArray() const;
143457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
143557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
143657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Returns true if this value is an Int8Array.
143757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * This is an experimental feature.
143857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
143957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool IsInt8Array() const;
144057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
144157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
144257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Returns true if this value is an Uint16Array.
144357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * This is an experimental feature.
144457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
144557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool IsUint16Array() const;
144657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
144757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
144857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Returns true if this value is an Int16Array.
144957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * This is an experimental feature.
145057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
145157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool IsInt16Array() const;
145257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
145357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
145457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Returns true if this value is an Uint32Array.
145557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * This is an experimental feature.
145657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
145757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool IsUint32Array() const;
145857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
145957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
146057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Returns true if this value is an Int32Array.
146157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * This is an experimental feature.
146257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
146357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool IsInt32Array() const;
146457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
146557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
146657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Returns true if this value is a Float32Array.
146757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * This is an experimental feature.
146857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
146957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool IsFloat32Array() const;
147057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
147157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  /**
147257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * Returns true if this value is a Float64Array.
147357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   * This is an experimental feature.
147457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org   */
147557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool IsFloat64Array() const;
147657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
14771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  /**
14781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * Returns true if this value is a DataView.
14791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * This is an experimental feature.
14801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   */
14811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  bool IsDataView() const;
14821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
148346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Boolean> ToBoolean() const;
148446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Number> ToNumber() const;
148546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<String> ToString() const;
148646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<String> ToDetailString() const;
148746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Object> ToObject() const;
148846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Integer> ToInteger() const;
148946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Uint32> ToUint32() const;
149046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Int32> ToInt32() const;
149143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
149243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
149343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Attempts to convert a string to an array index.
149443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns an empty handle if the conversion fails.
149543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
149646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Uint32> ToArrayIndex() const;
149743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
149846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool BooleanValue() const;
149946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  double NumberValue() const;
150046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int64_t IntegerValue() const;
150146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  uint32_t Uint32Value() const;
150246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int32_t Int32Value() const;
150343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
150443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /** JS == */
150546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool Equals(Handle<Value> that) const;
150646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool StrictEquals(Handle<Value> that) const;
15079d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
15081fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  template <class T> V8_INLINE(static Value* Cast(T* value));
15091fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
151018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org private:
151132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(bool QuickIsUndefined() const);
151232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(bool QuickIsNull() const);
151332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(bool QuickIsString() const);
151446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool FullIsUndefined() const;
151546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool FullIsNull() const;
151646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool FullIsString() const;
151743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
151843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
151943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
152043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
152143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * The superclass of primitive values.  See ECMA-262 4.3.2.
152243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
1523594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Primitive : public Value { };
152443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
152543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
152643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
152743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * A primitive boolean value (ECMA-262, 4.3.14).  Either the true
152843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * or false value.
152943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
1530594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Boolean : public Primitive {
153143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
153246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool Value() const;
153332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static Handle<Boolean> New(bool value));
153443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
153543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
153643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
153743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
1538727e995b7bba3c57fb1e5c156d386ca11894f781v * A JavaScript string value (ECMA-262, 4.3.17).
153943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
1540594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT String : public Primitive {
154143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
154256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  enum Encoding {
154356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    UNKNOWN_ENCODING = 0x1,
154456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    TWO_BYTE_ENCODING = 0x0,
154546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    ASCII_ENCODING = 0x4,
154646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    ONE_BYTE_ENCODING = 0x4
154756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  };
15489258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  /**
15499258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * Returns the number of characters in this string.
15509258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   */
155146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int Length() const;
155243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1553727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
15549258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * Returns the number of bytes in the UTF-8 encoded
15559258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * representation of this string.
15569258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   */
155746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int Utf8Length() const;
15589258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
15599258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  /**
1560ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * This function is no longer useful.
15612c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org   */
156257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  V8_DEPRECATED(V8_INLINE(bool MayContainNonAscii()) const) { return true; }
156346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
156446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  /**
1565dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org   * Returns whether this string is known to contain only one byte data.
1566dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org   * Does not read the string.
1567dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org   * False negatives are possible.
156846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org   */
156946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsOneByte() const;
15702c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org
15712c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  /**
1572dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org   * Returns whether this string contain only one byte data.
1573dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org   * Will read the entire string in some cases.
1574dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org   */
1575dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  bool ContainsOnlyOneByte() const;
1576dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
1577dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  /**
1578727e995b7bba3c57fb1e5c156d386ca11894f781v   * Write the contents of the string to an external buffer.
1579727e995b7bba3c57fb1e5c156d386ca11894f781v   * If no arguments are given, expects the buffer to be large
1580727e995b7bba3c57fb1e5c156d386ca11894f781v   * enough to hold the entire string and NULL terminator. Copies
1581727e995b7bba3c57fb1e5c156d386ca11894f781v   * the contents of the string and the NULL terminator into the
1582727e995b7bba3c57fb1e5c156d386ca11894f781v   * buffer.
1583727e995b7bba3c57fb1e5c156d386ca11894f781v   *
15845f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org   * WriteUtf8 will not write partial UTF-8 sequences, preferring to stop
15855f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org   * before the end of the buffer.
15865f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org   *
1587727e995b7bba3c57fb1e5c156d386ca11894f781v   * Copies up to length characters into the output buffer.
1588727e995b7bba3c57fb1e5c156d386ca11894f781v   * Only null-terminates if there is enough space in the buffer.
1589727e995b7bba3c57fb1e5c156d386ca11894f781v   *
1590727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param buffer The buffer into which the string will be copied.
1591727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param start The starting position within the string at which
1592727e995b7bba3c57fb1e5c156d386ca11894f781v   * copying begins.
15935f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org   * \param length The number of characters to copy from the string.  For
15945f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org   *    WriteUtf8 the number of bytes in the buffer.
1595357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org   * \param nchars_ref The number of characters written, can be NULL.
1596ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org   * \param options Various options that might affect performance of this or
1597c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org   *    subsequent operations.
15985f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org   * \return The number of characters copied to the buffer excluding the null
15995f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org   *    terminator.  For WriteUtf8: The number of bytes copied to the buffer
1600ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org   *    including the null terminator (if written).
1601727e995b7bba3c57fb1e5c156d386ca11894f781v   */
1602ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  enum WriteOptions {
1603ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org    NO_OPTIONS = 0,
1604ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org    HINT_MANY_WRITES_EXPECTED = 1,
1605304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    NO_NULL_TERMINATION = 2,
1606304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    PRESERVE_ASCII_NULL = 4
1607b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org  };
1608b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org
160934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  // 16-bit character codes.
161046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int Write(uint16_t* buffer,
161146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org            int start = 0,
161246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org            int length = -1,
161346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org            int options = NO_OPTIONS) const;
161434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  // ASCII characters.
161557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  V8_DEPRECATED(int WriteAscii(char* buffer,
161657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org                               int start = 0,
161757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org                               int length = -1,
161857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org                               int options = NO_OPTIONS) const);
161946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  // One byte characters.
162046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int WriteOneByte(uint8_t* buffer,
162146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                   int start = 0,
162246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                   int length = -1,
162346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                   int options = NO_OPTIONS) const;
162434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  // UTF-8 encoded characters.
162546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int WriteUtf8(char* buffer,
162646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                int length = -1,
162746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                int* nchars_ref = NULL,
162846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                int options = NO_OPTIONS) const;
162943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1630727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
1631563b8dce8453a0464b60f21746e2f95a893f7a3aager@chromium.org   * A zero length string.
1632563b8dce8453a0464b60f21746e2f95a893f7a3aager@chromium.org   */
163346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static v8::Local<v8::String> Empty();
163432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static v8::Local<v8::String> Empty(Isolate* isolate));
1635563b8dce8453a0464b60f21746e2f95a893f7a3aager@chromium.org
1636563b8dce8453a0464b60f21746e2f95a893f7a3aager@chromium.org  /**
1637727e995b7bba3c57fb1e5c156d386ca11894f781v   * Returns true if the string is external
1638727e995b7bba3c57fb1e5c156d386ca11894f781v   */
163946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsExternal() const;
164043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1641727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
164234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org   * Returns true if the string is both external and ASCII
1643727e995b7bba3c57fb1e5c156d386ca11894f781v   */
164446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsExternalAscii() const;
164513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org
1646594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  class V8_EXPORT ExternalStringResourceBase {  // NOLINT
164713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org   public:
164813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org    virtual ~ExternalStringResourceBase() {}
16492356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
165013bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org   protected:
165113bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org    ExternalStringResourceBase() {}
16522356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
16532356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org    /**
16542356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org     * Internally V8 will call this Dispose method when the external string
16552356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org     * resource is no longer needed. The default implementation will use the
16562356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org     * delete operator. This method can be overridden in subclasses to
16572356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org     * control how allocated external string resources are disposed.
16582356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org     */
16592356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org    virtual void Dispose() { delete this; }
16602356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
166113bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org   private:
166213bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org    // Disallow copying and assigning.
166313bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org    ExternalStringResourceBase(const ExternalStringResourceBase&);
166413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org    void operator=(const ExternalStringResourceBase&);
16652356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
16662356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org    friend class v8::internal::Heap;
166713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  };
166813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org
1669727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
1670727e995b7bba3c57fb1e5c156d386ca11894f781v   * An ExternalStringResource is a wrapper around a two-byte string
1671727e995b7bba3c57fb1e5c156d386ca11894f781v   * buffer that resides outside V8's heap. Implement an
1672727e995b7bba3c57fb1e5c156d386ca11894f781v   * ExternalStringResource to manage the life cycle of the underlying
16739258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * buffer.  Note that the string data must be immutable.
1674727e995b7bba3c57fb1e5c156d386ca11894f781v   */
1675594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  class V8_EXPORT ExternalStringResource
167613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org      : public ExternalStringResourceBase {
167743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   public:
167843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    /**
167943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     * Override the destructor to manage the life cycle of the underlying
168043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     * buffer.
168143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     */
168243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    virtual ~ExternalStringResource() {}
16832356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
16842356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org    /**
16852356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org     * The string data from the underlying buffer.
16862356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org     */
168743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    virtual const uint16_t* data() const = 0;
16882356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
16892356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org    /**
16902356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org     * The length of the string. That is, the number of two-byte characters.
16912356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org     */
169243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    virtual size_t length() const = 0;
16932356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
169443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   protected:
169543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ExternalStringResource() {}
169643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  };
169743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
169843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
169934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org   * An ExternalAsciiStringResource is a wrapper around an ASCII
1700727e995b7bba3c57fb1e5c156d386ca11894f781v   * string buffer that resides outside V8's heap. Implement an
1701727e995b7bba3c57fb1e5c156d386ca11894f781v   * ExternalAsciiStringResource to manage the life cycle of the
17029258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * underlying buffer.  Note that the string data must be immutable
170334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org   * and that the data must be strict (7-bit) ASCII, not Latin-1 or
17049258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * UTF-8, which would require special treatment internally in the
17059258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * engine and, in the case of UTF-8, do not allow efficient indexing.
17069258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * Use String::New or convert to 16 bit data for non-ASCII.
1707727e995b7bba3c57fb1e5c156d386ca11894f781v   */
170843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1709594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  class V8_EXPORT ExternalAsciiStringResource
171013bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org      : public ExternalStringResourceBase {
171143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   public:
171243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    /**
171343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     * Override the destructor to manage the life cycle of the underlying
171443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     * buffer.
171543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     */
171643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    virtual ~ExternalAsciiStringResource() {}
171743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    /** The string data from the underlying buffer.*/
171843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    virtual const char* data() const = 0;
171934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org    /** The number of ASCII characters in the string.*/
172043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    virtual size_t length() const = 0;
172143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   protected:
172243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ExternalAsciiStringResource() {}
172343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  };
172443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
172546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  typedef ExternalAsciiStringResource ExternalOneByteStringResource;
172646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
172743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
172856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org   * If the string is an external string, return the ExternalStringResourceBase
172956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org   * regardless of the encoding, otherwise return NULL.  The encoding of the
173056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org   * string is returned in encoding_out.
173156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org   */
173232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(ExternalStringResourceBase* GetExternalStringResourceBase(
173332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org      Encoding* encoding_out) const);
173456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
173556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  /**
17369085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org   * Get the ExternalStringResource for an external string.  Returns
17379085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org   * NULL if IsExternal() doesn't return true.
173843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
173932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(ExternalStringResource* GetExternalStringResource() const);
174043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
174143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
174234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org   * Get the ExternalAsciiStringResource for an external ASCII string.
17439085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org   * Returns NULL if IsExternalAscii() doesn't return true.
174443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
174546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  const ExternalAsciiStringResource* GetExternalAsciiStringResource() const;
174643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
174732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static String* Cast(v8::Value* obj));
174843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
174932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  // TODO(dcarney): deprecate
175043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
175134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org   * Allocates a new string from either UTF-8 encoded or ASCII data.
1752a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org   * The second parameter 'length' gives the buffer length. If omitted,
1753a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org   * the function calls 'strlen' to determine the buffer length.
175443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
175532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  V8_INLINE(static Local<String> New(const char* data, int length = -1));
175643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
175732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  // TODO(dcarney): deprecate
175834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  /** Allocates a new string from 16-bit character codes.*/
175932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  V8_INLINE(static Local<String> New(const uint16_t* data, int length = -1));
176043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
176132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  // TODO(dcarney): deprecate
1762e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  /**
1763e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   * Creates an internalized string (historically called a "symbol",
1764e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   * not to be confused with ES6 symbols). Returns one if it exists already.
1765e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   */
176632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  V8_INLINE(static Local<String> NewSymbol(const char* data, int length = -1));
176732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
176832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  enum NewStringType {
176932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org    kNormalString, kInternalizedString, kUndetectableString
177032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  };
177132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
177232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  /** Allocates a new string from UTF-8 data.*/
177332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  static Local<String> NewFromUtf8(Isolate* isolate,
177432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org                                  const char* data,
177532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org                                  NewStringType type = kNormalString,
177632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org                                  int length = -1);
177732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
177832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  /** Allocates a new string from Latin-1 data.*/
177932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  static Local<String> NewFromOneByte(
178032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org      Isolate* isolate,
178132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org      const uint8_t* data,
178232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org      NewStringType type = kNormalString,
178332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org      int length = -1);
178432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
178532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  /** Allocates a new string from UTF-16 data.*/
178632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  static Local<String> NewFromTwoByte(
178732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org      Isolate* isolate,
178832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org      const uint16_t* data,
178932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org      NewStringType type = kNormalString,
179032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org      int length = -1);
179143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1792727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
17939d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com   * Creates a new string by concatenating the left and the right strings
17949d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com   * passed in as parameters.
17959d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com   */
179646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static Local<String> Concat(Handle<String> left, Handle<String> right);
17979d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
17989d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  /**
1799727e995b7bba3c57fb1e5c156d386ca11894f781v   * Creates a new external string using the data defined in the given
18001af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org   * resource. When the external string is no longer live on V8's heap the
18012356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org   * resource will be disposed by calling its Dispose method. The caller of
18022356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org   * this function should not otherwise delete or modify the resource. Neither
18032356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org   * should the underlying buffer be deallocated or modified except through the
18042356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org   * destructor of the external string resource.
1805727e995b7bba3c57fb1e5c156d386ca11894f781v   */
180646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static Local<String> NewExternal(ExternalStringResource* resource);
1807bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
18086f10e41fef1524c70846d970268de222e41c594cager@chromium.org  /**
18096f10e41fef1524c70846d970268de222e41c594cager@chromium.org   * Associate an external string resource with this string by transforming it
18106f10e41fef1524c70846d970268de222e41c594cager@chromium.org   * in place so that existing references to this string in the JavaScript heap
18116f10e41fef1524c70846d970268de222e41c594cager@chromium.org   * will use the external string resource. The external string resource's
18127304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * character contents need to be equivalent to this string.
18136f10e41fef1524c70846d970268de222e41c594cager@chromium.org   * Returns true if the string has been changed to be an external string.
18141af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org   * The string is not modified if the operation fails. See NewExternal for
18151af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org   * information on the lifetime of the resource.
18166f10e41fef1524c70846d970268de222e41c594cager@chromium.org   */
181746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool MakeExternal(ExternalStringResource* resource);
181843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1819727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
182034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org   * Creates a new external string using the ASCII data defined in the given
18211af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org   * resource. When the external string is no longer live on V8's heap the
18222356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org   * resource will be disposed by calling its Dispose method. The caller of
18232356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org   * this function should not otherwise delete or modify the resource. Neither
18242356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org   * should the underlying buffer be deallocated or modified except through the
18252356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org   * destructor of the external string resource.
182646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org   */
182746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static Local<String> NewExternal(ExternalAsciiStringResource* resource);
1828bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
18296f10e41fef1524c70846d970268de222e41c594cager@chromium.org  /**
18306f10e41fef1524c70846d970268de222e41c594cager@chromium.org   * Associate an external string resource with this string by transforming it
18316f10e41fef1524c70846d970268de222e41c594cager@chromium.org   * in place so that existing references to this string in the JavaScript heap
18326f10e41fef1524c70846d970268de222e41c594cager@chromium.org   * will use the external string resource. The external string resource's
18337304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * character contents need to be equivalent to this string.
18346f10e41fef1524c70846d970268de222e41c594cager@chromium.org   * Returns true if the string has been changed to be an external string.
18351af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org   * The string is not modified if the operation fails. See NewExternal for
18361af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org   * information on the lifetime of the resource.
18376f10e41fef1524c70846d970268de222e41c594cager@chromium.org   */
183846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool MakeExternal(ExternalAsciiStringResource* resource);
183943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18405a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com  /**
18415a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com   * Returns true if this string can be made external.
18425a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com   */
184346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool CanMakeExternal();
18445a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com
184532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  // TODO(dcarney): deprecate
184634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  /** Creates an undetectable string from the supplied ASCII or UTF-8 data.*/
184732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  V8_INLINE(
184832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org      static Local<String> NewUndetectable(const char* data, int length = -1));
184943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
185032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  // TODO(dcarney): deprecate
185134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  /** Creates an undetectable string from the supplied 16-bit character codes.*/
185232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  V8_INLINE(static Local<String> NewUndetectable(
185332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org      const uint16_t* data, int length = -1));
185443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
185543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
185634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org   * Converts an object to a UTF-8-encoded character array.  Useful if
185771daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org   * you want to print the object.  If conversion to a string fails
185834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org   * (e.g. due to an exception in the toString() method of the object)
185971daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org   * then the length() method returns 0 and the * operator returns
186071daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org   * NULL.
18619258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   */
1862594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  class V8_EXPORT Utf8Value {
18639258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   public:
18649258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org    explicit Utf8Value(Handle<v8::Value> obj);
18659258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org    ~Utf8Value();
1866a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org    char* operator*() { return str_; }
1867a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org    const char* operator*() const { return str_; }
1868a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org    int length() const { return length_; }
18699258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   private:
18709258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org    char* str_;
18719258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org    int length_;
187241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
187341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    // Disallow copying and assigning.
187441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    Utf8Value(const Utf8Value&);
187541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    void operator=(const Utf8Value&);
18769258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  };
18779258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
18789258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  /**
187934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org   * Converts an object to an ASCII string.
188043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Useful if you want to print the object.
188171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org   * If conversion to a string fails (eg. due to an exception in the toString()
188271daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org   * method of the object) then the length() method returns 0 and the * operator
188371daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org   * returns NULL.
188443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
1885594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  class V8_EXPORT AsciiValue {
188643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   public:
1887906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    // TODO(dcarney): deprecate
188843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    explicit AsciiValue(Handle<v8::Value> obj);
188943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ~AsciiValue();
1890a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org    char* operator*() { return str_; }
1891a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org    const char* operator*() const { return str_; }
1892a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org    int length() const { return length_; }
189343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   private:
189443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    char* str_;
18959258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org    int length_;
189641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
189741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    // Disallow copying and assigning.
189841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    AsciiValue(const AsciiValue&);
189941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    void operator=(const AsciiValue&);
190043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  };
190143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
190243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
190343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Converts an object to a two-byte string.
190471daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org   * If conversion to a string fails (eg. due to an exception in the toString()
190571daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org   * method of the object) then the length() method returns 0 and the * operator
190671daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org   * returns NULL.
190743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
1908594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  class V8_EXPORT Value {
190943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   public:
191043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    explicit Value(Handle<v8::Value> obj);
191143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ~Value();
1912a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org    uint16_t* operator*() { return str_; }
1913a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org    const uint16_t* operator*() const { return str_; }
1914a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org    int length() const { return length_; }
191543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   private:
191643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    uint16_t* str_;
19179258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org    int length_;
191841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
191941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    // Disallow copying and assigning.
192041044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    Value(const Value&);
192141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    void operator=(const Value&);
192243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  };
19239d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
192418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org private:
192546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void VerifyExternalStringResourceBase(ExternalStringResourceBase* v,
192646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                                        Encoding encoding) const;
192746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void VerifyExternalStringResource(ExternalStringResource* val) const;
192846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(v8::Value* obj);
192943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
193043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
193143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
193243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
1933e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org * A JavaScript symbol (ECMA-262 edition 6)
1934e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org *
1935e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org * This is an experimental feature. Use at your own risk.
1936e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org */
1937594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Symbol : public Primitive {
1938e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org public:
1939e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // Returns the print name string of the symbol, or undefined if none.
1940e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Local<Value> Name() const;
1941e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1942e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // Create a symbol without a print name.
1943e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  static Local<Symbol> New(Isolate* isolate);
1944e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1945e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // Create a symbol with a print name.
1946e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  static Local<Symbol> New(Isolate *isolate, const char* data, int length = -1);
1947e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1948e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  V8_INLINE(static Symbol* Cast(v8::Value* obj));
1949e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org private:
1950e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Symbol();
1951e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  static void CheckCast(v8::Value* obj);
1952e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org};
1953e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1954e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1955e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org/**
1956727e995b7bba3c57fb1e5c156d386ca11894f781v * A JavaScript number value (ECMA-262, 4.3.20)
195743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
1958594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Number : public Primitive {
195943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
196046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  double Value() const;
196146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static Local<Number> New(double value);
1962bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  static Local<Number> New(Isolate* isolate, double value);
196332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static Number* Cast(v8::Value* obj));
196443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
196546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Number();
196646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(v8::Value* obj);
196743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
196843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
196943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
197043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
1971727e995b7bba3c57fb1e5c156d386ca11894f781v * A JavaScript value representing a signed integer.
197243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
1973594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Integer : public Number {
197443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
197546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static Local<Integer> New(int32_t value);
197646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static Local<Integer> NewFromUnsigned(uint32_t value);
197746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static Local<Integer> New(int32_t value, Isolate*);
197846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static Local<Integer> NewFromUnsigned(uint32_t value, Isolate*);
197946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int64_t Value() const;
198032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static Integer* Cast(v8::Value* obj));
198143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
198246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Integer();
198346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(v8::Value* obj);
198443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
198543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
198643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
198743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
1988727e995b7bba3c57fb1e5c156d386ca11894f781v * A JavaScript value representing a 32-bit signed integer.
198943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
1990594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Int32 : public Integer {
199143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
199246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int32_t Value() const;
199343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
199446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Int32();
199543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
199643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
199743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
199843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
1999727e995b7bba3c57fb1e5c156d386ca11894f781v * A JavaScript value representing a 32-bit unsigned integer.
200043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
2001594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Uint32 : public Integer {
200243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
200346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  uint32_t Value() const;
200443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
200546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Uint32();
200643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
200743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
200843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
200943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenenum PropertyAttribute {
201043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  None       = 0,
201143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ReadOnly   = 1 << 0,
201243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  DontEnum   = 1 << 1,
201343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  DontDelete = 1 << 2
201443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
201543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20163811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgenum ExternalArrayType {
20173811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  kExternalByteArray = 1,
20183811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  kExternalUnsignedByteArray,
20193811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  kExternalShortArray,
20203811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  kExternalUnsignedShortArray,
20213811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  kExternalIntArray,
20223811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  kExternalUnsignedIntArray,
20234d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org  kExternalFloatArray,
20243847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  kExternalDoubleArray,
20254d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org  kExternalPixelArray
20263811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org};
20273811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
202843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
20299155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org * Accessor[Getter|Setter] are used as callback functions when
20309155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org * setting|getting a particular property. See Object and ObjectTemplate's
20319155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org * method SetAccessor.
20329155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org */
20339155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgtypedef Handle<Value> (*AccessorGetter)(Local<String> property,
20349155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org                                        const AccessorInfo& info);
2035bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*AccessorGetterCallback)(
2036bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    Local<String> property,
2037bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<Value>& info);
20389155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
20399155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
20409155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgtypedef void (*AccessorSetter)(Local<String> property,
20419155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org                               Local<Value> value,
20429155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org                               const AccessorInfo& info);
2043bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*AccessorSetterCallback)(
2044bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    Local<String> property,
2045bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    Local<Value> value,
2046bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<void>& info);
20479155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
20489155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
20499155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org/**
20509155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org * Access control specifications.
20519155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org *
20529155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org * Some accessors should be accessible across contexts.  These
20539155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org * accessors have an explicit access control parameter which specifies
20549155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org * the kind of cross-context access that should be allowed.
20559155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org *
20569155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org * Additionally, for security, accessors can prohibit overwriting by
20579155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org * accessors defined in JavaScript.  For objects that have such
20589155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org * accessors either locally or in their prototype chain it is not
20599155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org * possible to overwrite the accessor by using __defineGetter__ or
20609155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org * __defineSetter__ from JavaScript code.
20619155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org */
20629155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgenum AccessControl {
20639155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  DEFAULT               = 0,
20649155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  ALL_CAN_READ          = 1,
20659155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  ALL_CAN_WRITE         = 1 << 1,
20669155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  PROHIBITS_OVERWRITING = 1 << 2
20679155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org};
20689155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
20699155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
20709155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org/**
2071727e995b7bba3c57fb1e5c156d386ca11894f781v * A JavaScript object (ECMA-262, 4.3.3)
207243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
2073594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Object : public Value {
207443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
207546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool Set(Handle<Value> key,
207646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org           Handle<Value> value,
207746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org           PropertyAttribute attribs = None);
207865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
207946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool Set(uint32_t index, Handle<Value> value);
2080ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
2081e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  // Sets a local property on this object bypassing interceptors and
208265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  // overriding accessors or read-only properties.
208365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  //
208465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  // Note that if the object has an interceptor the property will be set
208565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  // locally, but since the interceptor takes precedence the local property
208665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  // will only be returned if the interceptor doesn't return a value.
208765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  //
208865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  // Note also that this only works for named properties.
208946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool ForceSet(Handle<Value> key,
209046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                Handle<Value> value,
209146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                PropertyAttribute attribs = None);
2092e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
209346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Value> Get(Handle<Value> key);
209443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
209546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Value> Get(uint32_t index);
2096ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
2097717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org  /**
2098717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org   * Gets the property attributes of a property which can be None or
2099717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org   * any combination of ReadOnly, DontEnum and DontDelete. Returns
2100717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org   * None when the property doesn't exist.
2101717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org   */
210246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  PropertyAttribute GetPropertyAttributes(Handle<Value> key);
2103717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org
2104e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  bool Has(Handle<Value> key);
2105e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
2106e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  bool Delete(Handle<Value> key);
2107e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
2108e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  // Delete a property on this object bypassing interceptors and
2109e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  // ignoring dont-delete attributes.
211046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool ForceDelete(Handle<Value> key);
2111e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
211246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool Has(uint32_t index);
2113e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
211446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool Delete(uint32_t index);
211543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
21161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  V8_DEPRECATED(bool SetAccessor(Handle<String> name,
21171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                 AccessorGetter getter,
21181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                 AccessorSetter setter = 0,
21191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                 Handle<Value> data = Handle<Value>(),
21201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                 AccessControl settings = DEFAULT,
21211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                 PropertyAttribute attribute = None));
2122bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  bool SetAccessor(Handle<String> name,
2123bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                   AccessorGetterCallback getter,
2124bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                   AccessorSetterCallback setter = 0,
2125bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                   Handle<Value> data = Handle<Value>(),
2126bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                   AccessControl settings = DEFAULT,
2127bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                   PropertyAttribute attribute = None);
21289155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
2129750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  // This function is not yet stable and should not be used at this time.
2130750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  bool SetAccessor(Handle<String> name,
2131750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                   Handle<DeclaredAccessorDescriptor> descriptor,
2132750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                   AccessControl settings = DEFAULT,
2133750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                   PropertyAttribute attribute = None);
2134750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
213543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
21365a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * Returns an array containing the names of the enumerable properties
21375a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * of this object, including properties from prototype objects.  The
21385a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * array returned by this method contains the same values as would
21395a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * be enumerated by a for-in statement over this object.
21405a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   */
214146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Array> GetPropertyNames();
21425a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
21435a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  /**
21446d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org   * This function has the same functionality as GetPropertyNames but
21456d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org   * the returned array doesn't contain the names of properties from
21466d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org   * prototype objects.
21476d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org   */
214846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Array> GetOwnPropertyNames();
21496d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
21506d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  /**
215143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Get the prototype object.  This does not skip objects marked to
215243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * be skipped by __proto__ and it does not consult the security
215343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * handler.
215443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
215546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Value> GetPrototype();
215643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
215743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
21585c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * Set the prototype object.  This does not skip objects marked to
21595c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * be skipped by __proto__ and it does not consult the security
21605c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * handler.
21615c838251403b0be9a882540f1922577abba4c872ager@chromium.org   */
216246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool SetPrototype(Handle<Value> prototype);
21635c838251403b0be9a882540f1922577abba4c872ager@chromium.org
21645c838251403b0be9a882540f1922577abba4c872ager@chromium.org  /**
2165900d3b7262f6cf66f9e2d89ceb64ffd929c6cca0sgjesse@chromium.org   * Finds an instance of the given function template in the prototype
2166900d3b7262f6cf66f9e2d89ceb64ffd929c6cca0sgjesse@chromium.org   * chain.
2167900d3b7262f6cf66f9e2d89ceb64ffd929c6cca0sgjesse@chromium.org   */
216846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Object> FindInstanceInPrototypeChain(Handle<FunctionTemplate> tmpl);
2169900d3b7262f6cf66f9e2d89ceb64ffd929c6cca0sgjesse@chromium.org
2170900d3b7262f6cf66f9e2d89ceb64ffd929c6cca0sgjesse@chromium.org  /**
217143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Call builtin Object.prototype.toString on this object.
217243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * This is different from Value::ToString() that may call
217343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * user-defined toString function. This one does not.
217443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
217546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<String> ObjectProtoToString();
217643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2177beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  /**
2178c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org   * Returns the function invoked as a constructor for this object.
2179c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org   * May be the null value.
2180c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org   */
218146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Value> GetConstructor();
2182c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org
2183c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org  /**
2184beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org   * Returns the name of the function invoked as a constructor for this object.
2185beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org   */
218646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<String> GetConstructorName();
2187beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
2188212ac23f8231d169b4aa6737d762099993020826kasper.lund  /** Gets the number of internal fields for this Object. */
218946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int InternalFieldCount();
2190eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
2191eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  /** Gets the value from an internal field. */
219232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(Local<Value> GetInternalField(int index));
2193eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
2194212ac23f8231d169b4aa6737d762099993020826kasper.lund  /** Sets the value in an internal field. */
219546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void SetInternalField(int index, Handle<Value> value);
21969d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
2197eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  /**
2198eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * Gets a 2-byte-aligned native pointer from an internal field. This field
2199eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * must have been set by SetAlignedPointerInInternalField, everything else
2200eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * leads to undefined behavior.
2201eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   */
220232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(void* GetAlignedPointerFromInternalField(int index));
2203eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
2204eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  /**
2205eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * Sets a 2-byte-aligned native pointer in an internal field. To retrieve such
2206eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * a field, GetAlignedPointerFromInternalField must be used, everything else
2207eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * leads to undefined behavior.
2208eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   */
220946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void SetAlignedPointerInInternalField(int index, void* value);
2210e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org
221143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Testers for local properties.
221246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool HasOwnProperty(Handle<String> key);
221346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool HasRealNamedProperty(Handle<String> key);
221446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool HasRealIndexedProperty(uint32_t index);
221546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool HasRealNamedCallbackProperty(Handle<String> key);
221643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
221743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
221843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * If result.IsEmpty() no real property was located in the prototype chain.
221943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * This means interceptors in the prototype chain are not called.
222043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
222146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Value> GetRealNamedPropertyInPrototypeChain(Handle<String> key);
222298aff2fe110015974dbb787dc353f9760034df71sgjesse@chromium.org
222398aff2fe110015974dbb787dc353f9760034df71sgjesse@chromium.org  /**
222498aff2fe110015974dbb787dc353f9760034df71sgjesse@chromium.org   * If result.IsEmpty() no real property was located on the object or
222598aff2fe110015974dbb787dc353f9760034df71sgjesse@chromium.org   * in the prototype chain.
222698aff2fe110015974dbb787dc353f9760034df71sgjesse@chromium.org   * This means interceptors in the prototype chain are not called.
222798aff2fe110015974dbb787dc353f9760034df71sgjesse@chromium.org   */
222846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Value> GetRealNamedProperty(Handle<String> key);
222943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
223043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /** Tests for a named lookup interceptor.*/
223146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool HasNamedLookupInterceptor();
223243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2233212ac23f8231d169b4aa6737d762099993020826kasper.lund  /** Tests for an index lookup interceptor.*/
223446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool HasIndexedLookupInterceptor();
223543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22365a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  /**
22375a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * Turns on access check on the object if the object is an instance of
22385a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * a template that has access check callbacks. If an object has no
22395a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * access check info, the object cannot be accessed by anyone.
22405a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   */
224146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void TurnOnAccessCheck();
224241826e77311db718135ef6517b846933dfd275f3ager@chromium.org
22433b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org  /**
22447304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * Returns the identity hash for this object. The current implementation
22457304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * uses a hidden property on the object to store the identity hash.
22465ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org   *
22479085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org   * The return value will never be 0. Also, it is not guaranteed to be
22485ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org   * unique.
22493b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org   */
225046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int GetIdentityHash();
225141826e77311db718135ef6517b846933dfd275f3ager@chromium.org
22523b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org  /**
22533b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org   * Access hidden properties on JavaScript objects. These properties are
22543b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org   * hidden from the executing JavaScript and only accessible through the V8
22553b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org   * C++ API. Hidden properties introduced by V8 internally (for example the
22563b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org   * identity hash) are prefixed with "v8::".
22573b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org   */
225846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool SetHiddenValue(Handle<String> key, Handle<Value> value);
225946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Value> GetHiddenValue(Handle<String> key);
226046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool DeleteHiddenValue(Handle<String> key);
22619d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
22622bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com  /**
22632bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com   * Returns true if this is an instance of an api function (one
22642bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com   * created from a function created from a function template) and has
22652bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com   * been modified since it was created.  Note that this method is
22662bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com   * conservative and may return true for objects that haven't actually
22672bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com   * been modified.
22682bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com   */
226946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsDirty();
22703b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org
22713b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org  /**
22723b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org   * Clone this object with a fast but shallow copy.  Values will point
22733b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org   * to the same values as the original object.
22743b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org   */
227546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Object> Clone();
227643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22770b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org  /**
2278c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org   * Returns the context in which the object was created.
2279c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org   */
228046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Context> CreationContext();
2281c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
2282c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  /**
22830b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org   * Set the backing store of the indexed properties to be managed by the
22840b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org   * embedding layer. Access to the indexed properties will follow the rules
22850b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org   * spelled out in CanvasPixelArray.
22860b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org   * Note: The embedding program still owns the data and needs to ensure that
22870b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org   *       the backing store is preserved while V8 has a reference.
22880b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org   */
228946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void SetIndexedPropertiesToPixelData(uint8_t* data, int length);
229046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool HasIndexedPropertiesInPixelData();
229146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  uint8_t* GetIndexedPropertiesPixelData();
229246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int GetIndexedPropertiesPixelDataLength();
22930b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
22943811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  /**
22953811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org   * Set the backing store of the indexed properties to be managed by the
22963811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org   * embedding layer. Access to the indexed properties will follow the rules
22973811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org   * spelled out for the CanvasArray subtypes in the WebGL specification.
22983811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org   * Note: The embedding program still owns the data and needs to ensure that
22993811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org   *       the backing store is preserved while V8 has a reference.
23003811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org   */
230146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void SetIndexedPropertiesToExternalArrayData(void* data,
230246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                                               ExternalArrayType array_type,
230346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                                               int number_of_elements);
230446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool HasIndexedPropertiesInExternalArrayData();
230546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void* GetIndexedPropertiesExternalArrayData();
230646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  ExternalArrayType GetIndexedPropertiesExternalArrayDataType();
230746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int GetIndexedPropertiesExternalArrayDataLength();
23083811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
23091c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  /**
231083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org   * Checks whether a callback is set by the
231183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org   * ObjectTemplate::SetCallAsFunctionHandler method.
231283a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org   * When an Object is callable this method returns true.
231383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org   */
231446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  bool IsCallable();
231583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org
231683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  /**
23171805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org   * Call an Object as a function if a callback is set by the
23181c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org   * ObjectTemplate::SetCallAsFunctionHandler method.
23191c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org   */
232046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Value> CallAsFunction(Handle<Object> recv,
232146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                              int argc,
232246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                              Handle<Value> argv[]);
23231c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
23241c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  /**
23257304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * Call an Object as a constructor if a callback is set by the
23261c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org   * ObjectTemplate::SetCallAsFunctionHandler method.
23271c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org   * Note: This method behaves like the Function::NewInstance method.
23281c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org   */
232946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Value> CallAsConstructor(int argc, Handle<Value> argv[]);
23301c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
233146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static Local<Object> New();
233232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static Object* Cast(Value* obj));
2333e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org
233443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
233546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Object();
233646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(Value* obj);
233746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Value> SlowGetInternalField(int index);
233846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void* SlowGetAlignedPointerFromInternalField(int index);
233943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
234043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
234143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
234243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
234343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * An instance of the built-in array constructor (ECMA-262, 15.4.2).
234443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
2345594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Array : public Object {
234643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
234746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  uint32_t Length() const;
234843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23493e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org  /**
23503e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org   * Clones an element at index |index|.  Returns an empty
23513e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org   * handle if cloning fails (for any reason).
23523e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org   */
235346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Object> CloneElementAt(uint32_t index);
23543e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org
2355badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org  /**
2356badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org   * Creates a JavaScript array with the given length. If the length
2357badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org   * is negative the returned array will have length 0.
2358badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org   */
235946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static Local<Array> New(int length = 0);
2360badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org
236132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static Array* Cast(Value* obj));
236243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
236346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Array();
236446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(Value* obj);
236543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
236643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
236743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
236843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
2369727e995b7bba3c57fb1e5c156d386ca11894f781v * A JavaScript function object (ECMA-262, 15.3).
237043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
2371594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Function : public Object {
237243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
237346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Object> NewInstance() const;
237446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Object> NewInstance(int argc, Handle<Value> argv[]) const;
237546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<Value> Call(Handle<Object> recv, int argc, Handle<Value> argv[]);
237646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void SetName(Handle<String> name);
237746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Handle<Value> GetName() const;
23785c838251403b0be9a882540f1922577abba4c872ager@chromium.org
23795c838251403b0be9a882540f1922577abba4c872ager@chromium.org  /**
2380659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org   * Name inferred from variable or property assignment of this function.
2381659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org   * Used to facilitate debugging and profiling of JavaScript code written
2382659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org   * in an OO style, where many functions are anonymous but are assigned
2383659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org   * to object properties.
2384659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org   */
238546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Handle<Value> GetInferredName() const;
2386659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
2387659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  /**
23885c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * Returns zero based line number of function body and
23895c838251403b0be9a882540f1922577abba4c872ager@chromium.org   * kLineOffsetNotFound if no information available.
23905c838251403b0be9a882540f1922577abba4c872ager@chromium.org   */
239146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int GetScriptLineNumber() const;
2392c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  /**
2393c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org   * Returns zero based column number of function body and
2394c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org   * kLineOffsetNotFound if no information available.
2395c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org   */
239646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  int GetScriptColumnNumber() const;
23971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
23981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  /**
23991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * Returns scriptId object.
24001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * DEPRECATED: use ScriptId() instead.
24011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   */
240246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Handle<Value> GetScriptId() const;
24031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
24041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  /**
24051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * Returns scriptId.
24061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   */
24071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  int ScriptId() const;
24081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
240946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  ScriptOrigin GetScriptOrigin() const;
241032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static Function* Cast(Value* obj));
241146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static const int kLineOffsetNotFound;
2412c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
241343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
241446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Function();
241546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(Value* obj);
241643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
241743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2418a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org#ifndef V8_ARRAY_BUFFER_INTERNAL_FIELD_COUNT
2419e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org// The number of required internal fields can be defined by embedder.
2420a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org#define V8_ARRAY_BUFFER_INTERNAL_FIELD_COUNT 2
2421a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org#endif
242243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
242343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
2424ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org * An instance of the built-in ArrayBuffer constructor (ES6 draft 15.13.5).
2425ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org * This API is experimental and may change significantly.
2426ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org */
2427594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT ArrayBuffer : public Object {
2428ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org public:
2429ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  /**
2430837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * Allocator that V8 uses to allocate |ArrayBuffer|'s memory.
2431837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * The allocator is a global V8 setting. It should be set with
2432837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * V8::SetArrayBufferAllocator prior to creation of a first ArrayBuffer.
2433837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   *
2434837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * This API is experimental and may change significantly.
2435837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   */
2436594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  class V8_EXPORT Allocator { // NOLINT
2437837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   public:
2438837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org    virtual ~Allocator() {}
2439837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org
2440837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org    /**
2441837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org     * Allocate |length| bytes. Return NULL if allocation is not successful.
2442d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org     * Memory should be initialized to zeroes.
2443837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org     */
2444837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org    virtual void* Allocate(size_t length) = 0;
2445d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
2446d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    /**
2447d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org     * Allocate |length| bytes. Return NULL if allocation is not successful.
2448d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org     * Memory does not have to be initialized.
2449d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org     */
2450d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    virtual void* AllocateUninitialized(size_t length) {
2451d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      // Override with call to |Allocate| for compatibility
2452d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      // with legacy version.
2453d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      return Allocate(length);
2454d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    }
2455d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
2456837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org    /**
2457307dd6ea3b729c8058ada645b42a1cf083c92128danno@chromium.org     * Free the memory block of size |length|, pointed to by |data|.
2458307dd6ea3b729c8058ada645b42a1cf083c92128danno@chromium.org     * That memory is guaranteed to be previously allocated by |Allocate|.
2459837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org     */
2460307dd6ea3b729c8058ada645b42a1cf083c92128danno@chromium.org    virtual void Free(void* data, size_t length) {
2461307dd6ea3b729c8058ada645b42a1cf083c92128danno@chromium.org      // Override with call to |Free(void*)| for compatibility
2462307dd6ea3b729c8058ada645b42a1cf083c92128danno@chromium.org      // with legacy version.
2463307dd6ea3b729c8058ada645b42a1cf083c92128danno@chromium.org      Free(data);
2464307dd6ea3b729c8058ada645b42a1cf083c92128danno@chromium.org    }
2465307dd6ea3b729c8058ada645b42a1cf083c92128danno@chromium.org
2466307dd6ea3b729c8058ada645b42a1cf083c92128danno@chromium.org    /**
2467307dd6ea3b729c8058ada645b42a1cf083c92128danno@chromium.org     * Deprecated. Never called directly by V8.
2468307dd6ea3b729c8058ada645b42a1cf083c92128danno@chromium.org     * For compatibility with legacy version of this interface.
2469307dd6ea3b729c8058ada645b42a1cf083c92128danno@chromium.org     */
2470307dd6ea3b729c8058ada645b42a1cf083c92128danno@chromium.org    virtual void Free(void* data);
2471837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  };
2472837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org
2473837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  /**
2474837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * The contents of an |ArrayBuffer|. Externalization of |ArrayBuffer|
2475837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * returns an instance of this class, populated, with a pointer to data
2476837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * and byte length.
2477837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   *
2478837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * The Data pointer of ArrayBuffer::Contents is always allocated with
2479837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * Allocator::Allocate that is set with V8::SetArrayBufferAllocator.
2480837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   *
2481837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * This API is experimental and may change significantly.
2482837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   */
2483594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  class V8_EXPORT Contents { // NOLINT
2484837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   public:
2485837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org    Contents() : data_(NULL), byte_length_(0) {}
2486837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org
2487837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org    void* Data() const { return data_; }
2488837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org    size_t ByteLength() const { return byte_length_; }
2489837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org
2490837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   private:
2491837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org    void* data_;
2492837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org    size_t byte_length_;
2493837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org
2494837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org    friend class ArrayBuffer;
2495837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  };
2496837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org
2497837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org
2498837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  /**
2499ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * Data length in bytes.
2500ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   */
2501ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  size_t ByteLength() const;
2502ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
2503ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  /**
2504ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * Create a new ArrayBuffer. Allocate |byte_length| bytes.
2505ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * Allocated memory will be owned by a created ArrayBuffer and
2506a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org   * will be deallocated when it is garbage-collected,
2507a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org   * unless the object is externalized.
2508ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   */
2509ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  static Local<ArrayBuffer> New(size_t byte_length);
2510ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
2511ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  /**
2512ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * Create a new ArrayBuffer over an existing memory block.
2513a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org   * The created array buffer is immediately in externalized state.
2514ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * The memory block will not be reclaimed when a created ArrayBuffer
2515ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * is garbage-collected.
2516ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   */
2517ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  static Local<ArrayBuffer> New(void* data, size_t byte_length);
2518ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
2519a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  /**
2520a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org   * Returns true if ArrayBuffer is extrenalized, that is, does not
2521a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org   * own its memory block.
2522a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org   */
2523a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  bool IsExternal() const;
2524a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
2525a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  /**
25261fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org   * Neuters this ArrayBuffer and all its views (typed arrays).
25271fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org   * Neutering sets the byte length of the buffer and all typed arrays to zero,
25281fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org   * preventing JavaScript from ever accessing underlying backing store.
25291fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org   * ArrayBuffer should have been externalized.
25301fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org   */
25311fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  void Neuter();
25321fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
25331fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  /**
2534837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * Make this ArrayBuffer external. The pointer to underlying memory block
2535837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * and byte length are returned as |Contents| structure. After ArrayBuffer
2536837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * had been etxrenalized, it does no longer owns the memory block. The caller
2537837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * should take steps to free memory when it is no longer needed.
2538837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   *
2539837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * The memory block is guaranteed to be allocated with |Allocator::Allocate|
2540837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * that has been set with V8::SetArrayBufferAllocator.
2541a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org   */
2542837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  Contents Externalize();
2543a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
2544ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  V8_INLINE(static ArrayBuffer* Cast(Value* obj));
2545ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
2546a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  static const int kInternalFieldCount = V8_ARRAY_BUFFER_INTERNAL_FIELD_COUNT;
2547a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
2548ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org private:
2549ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  ArrayBuffer();
2550ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  static void CheckCast(Value* obj);
2551ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org};
2552ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
2553ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
2554e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org#ifndef V8_ARRAY_BUFFER_VIEW_INTERNAL_FIELD_COUNT
2555e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org// The number of required internal fields can be defined by embedder.
2556e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org#define V8_ARRAY_BUFFER_VIEW_INTERNAL_FIELD_COUNT 2
2557e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org#endif
2558e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
2559e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
2560ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org/**
25611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * A base class for an instance of one of "views" over ArrayBuffer,
25621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * including TypedArrays and DataView (ES6 draft 15.13).
25631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org *
2564f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * This API is experimental and may change significantly.
2565f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org */
2566594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT ArrayBufferView : public Object {
2567f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org public:
2568f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  /**
2569f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org   * Returns underlying ArrayBuffer.
2570f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org   */
2571f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Local<ArrayBuffer> Buffer();
2572f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  /**
25731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * Byte offset in |Buffer|.
2574f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org   */
2575f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  size_t ByteOffset();
2576f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  /**
25771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * Size of a view in bytes.
2578f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org   */
2579f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  size_t ByteLength();
2580f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  /**
25811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * Base address of a view.
2582f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org   */
2583f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  void* BaseAddress();
2584f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
25851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  V8_INLINE(static ArrayBufferView* Cast(Value* obj));
25861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
2587e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  static const int kInternalFieldCount =
2588e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org      V8_ARRAY_BUFFER_VIEW_INTERNAL_FIELD_COUNT;
2589e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
25901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private:
25911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  ArrayBufferView();
25921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  static void CheckCast(Value* obj);
25931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org};
25941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
25951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
25961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org/**
25971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * A base class for an instance of TypedArray series of constructors
25981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * (ES6 draft 15.13.6).
25991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * This API is experimental and may change significantly.
26001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org */
2601594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT TypedArray : public ArrayBufferView {
26021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public:
26031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  /**
26041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * Number of elements in this typed array
26051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * (e.g. for Int16Array, |ByteLength|/2).
26061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   */
26071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  size_t Length();
26081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
2609f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  V8_INLINE(static TypedArray* Cast(Value* obj));
2610f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2611f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org private:
2612f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  TypedArray();
2613f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static void CheckCast(Value* obj);
2614f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org};
2615f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2616f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2617f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org/**
2618f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * An instance of Uint8Array constructor (ES6 draft 15.13.6).
2619f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * This API is experimental and may change significantly.
2620f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org */
2621594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Uint8Array : public TypedArray {
2622f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org public:
2623f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Local<Uint8Array> New(Handle<ArrayBuffer> array_buffer,
2624f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org                               size_t byte_offset, size_t length);
2625f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  V8_INLINE(static Uint8Array* Cast(Value* obj));
2626f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2627f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org private:
2628f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Uint8Array();
2629f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static void CheckCast(Value* obj);
2630f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org};
2631f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2632f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2633f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org/**
263457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org * An instance of Uint8ClampedArray constructor (ES6 draft 15.13.6).
263557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org * This API is experimental and may change significantly.
263657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org */
2637594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Uint8ClampedArray : public TypedArray {
263857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org public:
263957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  static Local<Uint8ClampedArray> New(Handle<ArrayBuffer> array_buffer,
264057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org                               size_t byte_offset, size_t length);
264157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  V8_INLINE(static Uint8ClampedArray* Cast(Value* obj));
264257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
264357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org private:
264457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  Uint8ClampedArray();
264557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  static void CheckCast(Value* obj);
264657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org};
264757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
264857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org/**
2649f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * An instance of Int8Array constructor (ES6 draft 15.13.6).
2650f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * This API is experimental and may change significantly.
2651f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org */
2652594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Int8Array : public TypedArray {
2653f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org public:
2654f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Local<Int8Array> New(Handle<ArrayBuffer> array_buffer,
2655f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org                               size_t byte_offset, size_t length);
2656f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  V8_INLINE(static Int8Array* Cast(Value* obj));
2657f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2658f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org private:
2659f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Int8Array();
2660f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static void CheckCast(Value* obj);
2661f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org};
2662f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2663f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2664f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org/**
2665f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * An instance of Uint16Array constructor (ES6 draft 15.13.6).
2666f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * This API is experimental and may change significantly.
2667f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org */
2668594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Uint16Array : public TypedArray {
2669f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org public:
2670f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Local<Uint16Array> New(Handle<ArrayBuffer> array_buffer,
2671f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org                               size_t byte_offset, size_t length);
2672f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  V8_INLINE(static Uint16Array* Cast(Value* obj));
2673f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2674f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org private:
2675f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Uint16Array();
2676f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static void CheckCast(Value* obj);
2677f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org};
2678f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2679f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2680f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org/**
2681f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * An instance of Int16Array constructor (ES6 draft 15.13.6).
2682f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * This API is experimental and may change significantly.
2683f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org */
2684594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Int16Array : public TypedArray {
2685f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org public:
2686f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Local<Int16Array> New(Handle<ArrayBuffer> array_buffer,
2687f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org                               size_t byte_offset, size_t length);
2688f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  V8_INLINE(static Int16Array* Cast(Value* obj));
2689f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2690f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org private:
2691f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Int16Array();
2692f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static void CheckCast(Value* obj);
2693f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org};
2694f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2695f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2696f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org/**
2697f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * An instance of Uint32Array constructor (ES6 draft 15.13.6).
2698f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * This API is experimental and may change significantly.
2699f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org */
2700594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Uint32Array : public TypedArray {
2701f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org public:
2702f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Local<Uint32Array> New(Handle<ArrayBuffer> array_buffer,
2703f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org                               size_t byte_offset, size_t length);
2704f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  V8_INLINE(static Uint32Array* Cast(Value* obj));
2705f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2706f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org private:
2707f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Uint32Array();
2708f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static void CheckCast(Value* obj);
2709f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org};
2710f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2711f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2712f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org/**
2713f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * An instance of Int32Array constructor (ES6 draft 15.13.6).
2714f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * This API is experimental and may change significantly.
2715f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org */
2716594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Int32Array : public TypedArray {
2717f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org public:
2718f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Local<Int32Array> New(Handle<ArrayBuffer> array_buffer,
2719f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org                               size_t byte_offset, size_t length);
2720f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  V8_INLINE(static Int32Array* Cast(Value* obj));
2721f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2722f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org private:
2723f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Int32Array();
2724f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static void CheckCast(Value* obj);
2725f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org};
2726f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2727f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2728f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org/**
2729f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * An instance of Float32Array constructor (ES6 draft 15.13.6).
2730f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * This API is experimental and may change significantly.
2731f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org */
2732594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Float32Array : public TypedArray {
2733f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org public:
2734f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Local<Float32Array> New(Handle<ArrayBuffer> array_buffer,
2735f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org                               size_t byte_offset, size_t length);
2736f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  V8_INLINE(static Float32Array* Cast(Value* obj));
2737f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2738f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org private:
2739f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Float32Array();
2740f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static void CheckCast(Value* obj);
2741f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org};
2742f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2743f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2744f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org/**
2745f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * An instance of Float64Array constructor (ES6 draft 15.13.6).
2746f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org * This API is experimental and may change significantly.
2747f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org */
2748594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Float64Array : public TypedArray {
2749f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org public:
2750f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Local<Float64Array> New(Handle<ArrayBuffer> array_buffer,
2751f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org                               size_t byte_offset, size_t length);
2752f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  V8_INLINE(static Float64Array* Cast(Value* obj));
2753f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2754f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org private:
2755f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Float64Array();
2756f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static void CheckCast(Value* obj);
2757f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org};
2758f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2759f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2760f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org/**
27611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * An instance of DataView constructor (ES6 draft 15.13.7).
27621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * This API is experimental and may change significantly.
27631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org */
2764594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT DataView : public ArrayBufferView {
27651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public:
27661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  static Local<DataView> New(Handle<ArrayBuffer> array_buffer,
27671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                             size_t byte_offset, size_t length);
27681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  V8_INLINE(static DataView* Cast(Value* obj));
27691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
27701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private:
27711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  DataView();
27721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  static void CheckCast(Value* obj);
27731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org};
27741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
27751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
27761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org/**
2777fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org * An instance of the built-in Date constructor (ECMA-262, 15.9).
2778fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org */
2779594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Date : public Object {
2780fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org public:
278146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static Local<Value> New(double time);
2782fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
2783d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  // Deprecated, use Date::ValueOf() instead.
2784d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  // TODO(svenpanne) Actually deprecate when Chrome is adapted.
2785d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  double NumberValue() const { return ValueOf(); }
2786d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
2787fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  /**
2788fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * A specialization of Value::NumberValue that is more efficient
2789fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * because we know the structure of this object.
2790fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   */
2791d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  double ValueOf() const;
2792fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
279332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static Date* Cast(v8::Value* obj));
2794fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
2795fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  /**
2796fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * Notification that the embedder has changed the time zone,
2797fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * daylight savings time, or other date / time configuration
2798fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * parameters.  V8 keeps a cache of various values used for
2799fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * date / time computation.  This notification will reset
2800fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * those cached values for the current context so that date /
2801fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * time configuration changes would be reflected in the Date
2802fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * object.
2803fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   *
2804fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * This API should not be called more than needed as it will
2805fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * negatively impact the performance of date operations.
2806fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   */
280746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void DateTimeConfigurationChangeNotification();
2808fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
2809fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org private:
281046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(v8::Value* obj);
2811fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org};
2812fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
2813fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
2814fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org/**
281584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org * A Number object (ECMA-262, 4.3.21).
281684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org */
2817594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT NumberObject : public Object {
281884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org public:
281946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static Local<Value> New(double value);
282084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
2821d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  // Deprecated, use NumberObject::ValueOf() instead.
2822d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  // TODO(svenpanne) Actually deprecate when Chrome is adapted.
2823d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  double NumberValue() const { return ValueOf(); }
2824d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
282584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  /**
282684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   * Returns the Number held by the object.
282784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   */
2828d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  double ValueOf() const;
282984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
283032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static NumberObject* Cast(v8::Value* obj));
283184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
283284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org private:
283346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(v8::Value* obj);
283484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org};
283584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
283684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
283784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org/**
283884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org * A Boolean object (ECMA-262, 4.3.15).
283984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org */
2840594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT BooleanObject : public Object {
284184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org public:
284246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static Local<Value> New(bool value);
284384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
2844d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  // Deprecated, use BooleanObject::ValueOf() instead.
2845d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  // TODO(svenpanne) Actually deprecate when Chrome is adapted.
2846d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  bool BooleanValue() const { return ValueOf(); }
2847d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
284884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  /**
284984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   * Returns the Boolean held by the object.
285084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   */
2851d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  bool ValueOf() const;
285284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
285332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static BooleanObject* Cast(v8::Value* obj));
285484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
285584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org private:
285646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(v8::Value* obj);
285784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org};
285884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
285984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
286084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org/**
286184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org * A String object (ECMA-262, 4.3.18).
286284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org */
2863594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT StringObject : public Object {
286484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org public:
286546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static Local<Value> New(Handle<String> value);
286684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
2867d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  // Deprecated, use StringObject::ValueOf() instead.
2868d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  // TODO(svenpanne) Actually deprecate when Chrome is adapted.
2869d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  Local<String> StringValue() const { return ValueOf(); }
2870d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
287184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  /**
287284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   * Returns the String held by the object.
287384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   */
2874d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  Local<String> ValueOf() const;
287584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
287632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static StringObject* Cast(v8::Value* obj));
287784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
287884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org private:
287946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(v8::Value* obj);
288084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org};
288184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
288284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
288384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org/**
2884e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org * A Symbol object (ECMA-262 edition 6).
2885e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org *
2886e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org * This is an experimental feature. Use at your own risk.
2887e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org */
2888594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT SymbolObject : public Object {
2889e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org public:
2890e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  static Local<Value> New(Isolate* isolate, Handle<Symbol> value);
2891e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
2892d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  // Deprecated, use SymbolObject::ValueOf() instead.
2893d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  // TODO(svenpanne) Actually deprecate when Chrome is adapted.
2894d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  Local<Symbol> SymbolValue() const { return ValueOf(); }
2895d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
2896e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  /**
2897e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   * Returns the Symbol held by the object.
2898e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   */
2899d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  Local<Symbol> ValueOf() const;
2900e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
2901e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  V8_INLINE(static SymbolObject* Cast(v8::Value* obj));
2902e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
2903e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org private:
2904e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  static void CheckCast(v8::Value* obj);
2905e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org};
2906e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
2907e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
2908e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org/**
2909fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org * An instance of the built-in RegExp constructor (ECMA-262, 15.10).
2910fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org */
2911594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT RegExp : public Object {
2912fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org public:
2913fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  /**
2914fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * Regular expression flag bits. They can be or'ed to enable a set
2915fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * of flags.
2916fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   */
2917fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  enum Flags {
2918fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org    kNone = 0,
2919fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org    kGlobal = 1,
2920fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org    kIgnoreCase = 2,
2921fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org    kMultiline = 4
2922fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  };
2923fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
2924fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  /**
2925fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * Creates a regular expression from the given pattern string and
2926fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * the flags bit field. May throw a JavaScript exception as
2927fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * described in ECMA-262, 15.10.4.1.
2928fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   *
2929fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * For example,
2930fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   *   RegExp::New(v8::String::New("foo"),
2931fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   *               static_cast<RegExp::Flags>(kGlobal | kMultiline))
2932fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * is equivalent to evaluating "/foo/gm".
2933fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   */
293446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static Local<RegExp> New(Handle<String> pattern, Flags flags);
2935fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
2936fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  /**
2937fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * Returns the value of the source property: a string representing
2938fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * the regular expression.
2939fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   */
294046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Local<String> GetSource() const;
2941fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
2942fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  /**
2943fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * Returns the flags bit field.
2944fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   */
294546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  Flags GetFlags() const;
2946fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
294732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static RegExp* Cast(v8::Value* obj));
2948fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
2949fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org private:
295046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(v8::Value* obj);
2951fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org};
2952fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
2953fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
2954fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org/**
2955eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org * A JavaScript value that wraps a C++ void*. This type of value is mainly used
2956eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org * to associate C++ data structures with JavaScript objects.
295743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
2958594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT External : public Value {
295943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
296046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static Local<External> New(void* value);
296132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static External* Cast(Value* obj));
296246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void* Value() const;
296343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
296446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void CheckCast(v8::Value* obj);
296543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
296643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
296743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2968fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Templates ---
296943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
297043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
297143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
297243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * The superclass of object and function templates.
297343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
2974594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Template : public Data {
297543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
297643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /** Adds a property to each instance created by this template.*/
297743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void Set(Handle<String> name, Handle<Data> value,
297843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           PropertyAttribute attributes = None);
297932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(void Set(const char* name, Handle<Data> value));
298043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
298143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Template();
298243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
298343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class ObjectTemplate;
298443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class FunctionTemplate;
298543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
298643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
298743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2988bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
2989867c3b0ba722de75ec681cfe23a56f0692b49b7aulan@chromium.orgclass ReturnValue {
2990bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org public:
2991dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  template <class S> V8_INLINE(ReturnValue(const ReturnValue<S>& that))
2992dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org      : value_(that.value_) {
2993dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org    TYPE_CHECK(T, S);
2994dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  }
2995bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  // Handle setters
2996c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  template <typename S> V8_INLINE(void Set(const Persistent<S>& handle));
2997c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  template <typename S> V8_INLINE(void Set(const Handle<S> handle));
2998bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  // Fast primitive setters
299953ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  V8_INLINE(void Set(bool value));
300053ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  V8_INLINE(void Set(double i));
300153ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  V8_INLINE(void Set(int32_t i));
300253ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  V8_INLINE(void Set(uint32_t i));
3003bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  // Fast JS primitive setters
300453ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  V8_INLINE(void SetNull());
300553ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  V8_INLINE(void SetUndefined());
3006837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  V8_INLINE(void SetEmptyString());
300753ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  // Convenience getter for Isolate
300853ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  V8_INLINE(Isolate* GetIsolate());
3009dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
3010bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org private:
3011dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  template<class F> friend class ReturnValue;
3012dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  template<class F> friend class FunctionCallbackInfo;
3013dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  template<class F> friend class PropertyCallbackInfo;
30148a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org  V8_INLINE(internal::Object* GetDefaultValue());
3015dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  V8_INLINE(explicit ReturnValue(internal::Object** slot));
3016bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  internal::Object** value_;
3017bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org};
3018bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
3019bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
302043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
302143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * The argument information given to function call callbacks.  This
3022727e995b7bba3c57fb1e5c156d386ca11894f781v * class provides access to information about the context of the call,
302343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * including the receiver, the number and values of arguments, and
302443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * the holder of the function.
302543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3026bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
3027867c3b0ba722de75ec681cfe23a56f0692b49b7aulan@chromium.orgclass FunctionCallbackInfo {
302843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
302932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(int Length() const);
303032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(Local<Value> operator[](int i) const);
303132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(Local<Function> Callee() const);
303232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(Local<Object> This() const);
303332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(Local<Object> Holder() const);
303432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(bool IsConstructCall() const);
303532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(Local<Value> Data() const);
303632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(Isolate* GetIsolate() const);
3037bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  V8_INLINE(ReturnValue<T> GetReturnValue() const);
3038bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  // This shouldn't be public, but the arm compiler needs it.
30398a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org  static const int kArgsLength = 6;
30403ee08a60067751ecfad036b933a23002989d7450jkummerow@chromium.org
3041bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org protected:
3042bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  friend class internal::FunctionCallbackArguments;
3043bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  friend class internal::CustomArguments<FunctionCallbackInfo>;
3044bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  static const int kReturnValueIndex = 0;
30458a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org  static const int kReturnValueDefaultValueIndex = -1;
30468a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org  static const int kIsolateIndex = -2;
30478a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org  static const int kDataIndex = -3;
30488a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org  static const int kCalleeIndex = -4;
30498a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org  static const int kHolderIndex = -5;
3050bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
3051bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  V8_INLINE(FunctionCallbackInfo(internal::Object** implicit_args,
3052e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org                   internal::Object** values,
3053e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org                   int length,
305432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org                   bool is_construct_call));
3055e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  internal::Object** implicit_args_;
3056e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  internal::Object** values_;
305743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int length_;
3058e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  bool is_construct_call_;
305943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
306043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
306143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3062594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Arguments : public FunctionCallbackInfo<Value> {
3063bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org private:
3064bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  friend class internal::FunctionCallbackArguments;
3065bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  V8_INLINE(Arguments(internal::Object** implicit_args,
3066bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                      internal::Object** values,
3067bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                      int length,
3068bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                      bool is_construct_call));
3069bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org};
3070bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
307143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
3072bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org * The information passed to a property callback about the context
307343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * of the property access.
307443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3075bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
3076867c3b0ba722de75ec681cfe23a56f0692b49b7aulan@chromium.orgclass PropertyCallbackInfo {
307743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
307832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(Isolate* GetIsolate() const);
307932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(Local<Value> Data() const);
308032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(Local<Object> This() const);
308132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(Local<Object> Holder() const);
3082bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  V8_INLINE(ReturnValue<T> GetReturnValue() const);
3083bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  // This shouldn't be public, but the arm compiler needs it.
30848a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org  static const int kArgsLength = 6;
30853ee08a60067751ecfad036b933a23002989d7450jkummerow@chromium.org
3086bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org protected:
3087bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  friend class MacroAssembler;
3088bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  friend class internal::PropertyCallbackArguments;
3089bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  friend class internal::CustomArguments<PropertyCallbackInfo>;
3090bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  static const int kThisIndex = 0;
3091bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  static const int kHolderIndex = -1;
3092bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  static const int kDataIndex = -2;
309353ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  static const int kReturnValueIndex = -3;
30948a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org  static const int kReturnValueDefaultValueIndex = -4;
30958a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org  static const int kIsolateIndex = -5;
3096bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
3097bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  V8_INLINE(PropertyCallbackInfo(internal::Object** args))
3098bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      : args_(args) { }
3099c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  internal::Object** args_;
310043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
310143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
310243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3103594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT AccessorInfo : public PropertyCallbackInfo<Value> {
3104bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org private:
3105bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  friend class internal::PropertyCallbackArguments;
3106bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  V8_INLINE(AccessorInfo(internal::Object** args))
3107bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      : PropertyCallbackInfo<Value>(args) { }
3108bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org};
3109bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
3110bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
311143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef Handle<Value> (*InvocationCallback)(const Arguments& args);
3112bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*FunctionCallback)(const FunctionCallbackInfo<Value>& info);
311343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
311443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
311543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * NamedProperty[Getter|Setter] are used as interceptors on object.
311643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * See ObjectTemplate::SetNamedPropertyHandler.
311743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
311843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef Handle<Value> (*NamedPropertyGetter)(Local<String> property,
311943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                             const AccessorInfo& info);
3120bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*NamedPropertyGetterCallback)(
3121bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    Local<String> property,
3122bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<Value>& info);
312343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
312443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
312543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
312643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns the value if the setter intercepts the request.
312743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Otherwise, returns an empty handle.
312843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
312943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef Handle<Value> (*NamedPropertySetter)(Local<String> property,
313043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                             Local<Value> value,
313143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                             const AccessorInfo& info);
3132bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*NamedPropertySetterCallback)(
3133bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    Local<String> property,
3134bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    Local<Value> value,
3135bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<Value>& info);
3136bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
313743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
313843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
313943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns a non-empty handle if the interceptor intercepts the request.
31402c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org * The result is an integer encoding property attributes (like v8::None,
31412c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org * v8::DontEnum, etc.)
314243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
31431af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.orgtypedef Handle<Integer> (*NamedPropertyQuery)(Local<String> property,
31441af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org                                              const AccessorInfo& info);
3145bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*NamedPropertyQueryCallback)(
3146bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    Local<String> property,
3147bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<Integer>& info);
314843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
314943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
315043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
315143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns a non-empty handle if the deleter intercepts the request.
3152727e995b7bba3c57fb1e5c156d386ca11894f781v * The return value is true if the property could be deleted and false
3153727e995b7bba3c57fb1e5c156d386ca11894f781v * otherwise.
315443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
315543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef Handle<Boolean> (*NamedPropertyDeleter)(Local<String> property,
315643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                                const AccessorInfo& info);
3157bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*NamedPropertyDeleterCallback)(
3158bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    Local<String> property,
3159bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<Boolean>& info);
3160bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
316143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
316243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
3163727e995b7bba3c57fb1e5c156d386ca11894f781v * Returns an array containing the names of the properties the named
3164727e995b7bba3c57fb1e5c156d386ca11894f781v * property getter intercepts.
316543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
316643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef Handle<Array> (*NamedPropertyEnumerator)(const AccessorInfo& info);
3167bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*NamedPropertyEnumeratorCallback)(
3168bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<Array>& info);
316943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3170727e995b7bba3c57fb1e5c156d386ca11894f781v
317143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
3172727e995b7bba3c57fb1e5c156d386ca11894f781v * Returns the value of the property if the getter intercepts the
3173727e995b7bba3c57fb1e5c156d386ca11894f781v * request.  Otherwise, returns an empty handle.
317443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
317543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef Handle<Value> (*IndexedPropertyGetter)(uint32_t index,
317643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                               const AccessorInfo& info);
3177bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*IndexedPropertyGetterCallback)(
3178bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    uint32_t index,
3179bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<Value>& info);
318043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
318143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
318243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
318343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns the value if the setter intercepts the request.
318443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Otherwise, returns an empty handle.
318543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
318643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef Handle<Value> (*IndexedPropertySetter)(uint32_t index,
318743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                               Local<Value> value,
318843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                               const AccessorInfo& info);
3189bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*IndexedPropertySetterCallback)(
3190bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    uint32_t index,
3191bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    Local<Value> value,
3192bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<Value>& info);
319343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
319443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
319543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
319643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns a non-empty handle if the interceptor intercepts the request.
3197ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org * The result is an integer encoding property attributes.
319843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
319926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgtypedef Handle<Integer> (*IndexedPropertyQuery)(uint32_t index,
320026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org                                                const AccessorInfo& info);
3201bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*IndexedPropertyQueryCallback)(
3202bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    uint32_t index,
3203bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<Integer>& info);
3204bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
320543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
320643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
320743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns a non-empty handle if the deleter intercepts the request.
3208727e995b7bba3c57fb1e5c156d386ca11894f781v * The return value is true if the property could be deleted and false
3209727e995b7bba3c57fb1e5c156d386ca11894f781v * otherwise.
321043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
321143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef Handle<Boolean> (*IndexedPropertyDeleter)(uint32_t index,
321243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                                  const AccessorInfo& info);
3213bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*IndexedPropertyDeleterCallback)(
3214bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    uint32_t index,
3215bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<Boolean>& info);
3216bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
321743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3218727e995b7bba3c57fb1e5c156d386ca11894f781v/**
3219727e995b7bba3c57fb1e5c156d386ca11894f781v * Returns an array containing the indices of the properties the
3220727e995b7bba3c57fb1e5c156d386ca11894f781v * indexed property getter intercepts.
3221727e995b7bba3c57fb1e5c156d386ca11894f781v */
322243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef Handle<Array> (*IndexedPropertyEnumerator)(const AccessorInfo& info);
3223bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtypedef void (*IndexedPropertyEnumeratorCallback)(
3224bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    const PropertyCallbackInfo<Array>& info);
322543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
322643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
322743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
3228727e995b7bba3c57fb1e5c156d386ca11894f781v * Access type specification.
322943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
323043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenenum AccessType {
323143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ACCESS_GET,
323243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ACCESS_SET,
323343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ACCESS_HAS,
323443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ACCESS_DELETE,
323543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ACCESS_KEYS
323643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
323743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3238727e995b7bba3c57fb1e5c156d386ca11894f781v
3239727e995b7bba3c57fb1e5c156d386ca11894f781v/**
3240727e995b7bba3c57fb1e5c156d386ca11894f781v * Returns true if cross-context access should be allowed to the named
32412bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com * property with the given key on the host object.
3242727e995b7bba3c57fb1e5c156d386ca11894f781v */
32432bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.comtypedef bool (*NamedSecurityCallback)(Local<Object> host,
324443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                      Local<Value> key,
324543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                      AccessType type,
324643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                      Local<Value> data);
324743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3248727e995b7bba3c57fb1e5c156d386ca11894f781v
3249727e995b7bba3c57fb1e5c156d386ca11894f781v/**
3250727e995b7bba3c57fb1e5c156d386ca11894f781v * Returns true if cross-context access should be allowed to the indexed
32512bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com * property with the given index on the host object.
3252727e995b7bba3c57fb1e5c156d386ca11894f781v */
32532bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.comtypedef bool (*IndexedSecurityCallback)(Local<Object> host,
325443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                        uint32_t index,
325543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                        AccessType type,
325643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                        Local<Value> data);
325743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
325843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
325943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
3260727e995b7bba3c57fb1e5c156d386ca11894f781v * A FunctionTemplate is used to create functions at runtime. There
3261727e995b7bba3c57fb1e5c156d386ca11894f781v * can only be one function created from a FunctionTemplate in a
3262c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * context.  The lifetime of the created function is equal to the
3263c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * lifetime of the context.  So in case the embedder needs to create
3264c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * temporary functions that can be collected using Scripts is
3265c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * preferred.
326643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
326743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * A FunctionTemplate can have properties, these properties are added to the
3268727e995b7bba3c57fb1e5c156d386ca11894f781v * function object when it is created.
326943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3270727e995b7bba3c57fb1e5c156d386ca11894f781v * A FunctionTemplate has a corresponding instance template which is
3271727e995b7bba3c57fb1e5c156d386ca11894f781v * used to create object instances when the function is used as a
3272727e995b7bba3c57fb1e5c156d386ca11894f781v * constructor. Properties added to the instance template are added to
3273727e995b7bba3c57fb1e5c156d386ca11894f781v * each object instance.
327443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
327543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * A FunctionTemplate can have a prototype template. The prototype template
327643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * is used to create the prototype object of the function.
327743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3278727e995b7bba3c57fb1e5c156d386ca11894f781v * The following example shows how to use a FunctionTemplate:
327943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3280727e995b7bba3c57fb1e5c156d386ca11894f781v * \code
328143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *    v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New();
328243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *    t->Set("func_property", v8::Number::New(1));
328343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
328443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *    v8::Local<v8::Template> proto_t = t->PrototypeTemplate();
328543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *    proto_t->Set("proto_method", v8::FunctionTemplate::New(InvokeCallback));
328643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *    proto_t->Set("proto_const", v8::Number::New(2));
328743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
328843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *    v8::Local<v8::ObjectTemplate> instance_t = t->InstanceTemplate();
328943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *    instance_t->SetAccessor("instance_accessor", InstanceAccessorCallback);
329043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *    instance_t->SetNamedPropertyHandler(PropertyHandlerCallback, ...);
329143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *    instance_t->Set("instance_property", Number::New(3));
329243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
329343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *    v8::Local<v8::Function> function = t->GetFunction();
329443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *    v8::Local<v8::Object> instance = function->NewInstance();
3295727e995b7bba3c57fb1e5c156d386ca11894f781v * \endcode
329643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
329743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Let's use "function" as the JS variable name of the function object
3298727e995b7bba3c57fb1e5c156d386ca11894f781v * and "instance" for the instance object created above.  The function
3299727e995b7bba3c57fb1e5c156d386ca11894f781v * and the instance will have the following properties:
330043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3301727e995b7bba3c57fb1e5c156d386ca11894f781v * \code
3302727e995b7bba3c57fb1e5c156d386ca11894f781v *   func_property in function == true;
3303727e995b7bba3c57fb1e5c156d386ca11894f781v *   function.func_property == 1;
330443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3305727e995b7bba3c57fb1e5c156d386ca11894f781v *   function.prototype.proto_method() invokes 'InvokeCallback'
3306727e995b7bba3c57fb1e5c156d386ca11894f781v *   function.prototype.proto_const == 2;
330743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3308727e995b7bba3c57fb1e5c156d386ca11894f781v *   instance instanceof function == true;
3309727e995b7bba3c57fb1e5c156d386ca11894f781v *   instance.instance_accessor calls 'InstanceAccessorCallback'
3310727e995b7bba3c57fb1e5c156d386ca11894f781v *   instance.instance_property == 3;
3311727e995b7bba3c57fb1e5c156d386ca11894f781v * \endcode
331243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3313727e995b7bba3c57fb1e5c156d386ca11894f781v * A FunctionTemplate can inherit from another one by calling the
3314727e995b7bba3c57fb1e5c156d386ca11894f781v * FunctionTemplate::Inherit method.  The following graph illustrates
3315727e995b7bba3c57fb1e5c156d386ca11894f781v * the semantics of inheritance:
331643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3317727e995b7bba3c57fb1e5c156d386ca11894f781v * \code
3318727e995b7bba3c57fb1e5c156d386ca11894f781v *   FunctionTemplate Parent  -> Parent() . prototype -> { }
3319727e995b7bba3c57fb1e5c156d386ca11894f781v *     ^                                                  ^
3320727e995b7bba3c57fb1e5c156d386ca11894f781v *     | Inherit(Parent)                                  | .__proto__
3321727e995b7bba3c57fb1e5c156d386ca11894f781v *     |                                                  |
3322727e995b7bba3c57fb1e5c156d386ca11894f781v *   FunctionTemplate Child   -> Child()  . prototype -> { }
3323727e995b7bba3c57fb1e5c156d386ca11894f781v * \endcode
332443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3325727e995b7bba3c57fb1e5c156d386ca11894f781v * A FunctionTemplate 'Child' inherits from 'Parent', the prototype
3326727e995b7bba3c57fb1e5c156d386ca11894f781v * object of the Child() function has __proto__ pointing to the
3327727e995b7bba3c57fb1e5c156d386ca11894f781v * Parent() function's prototype object. An instance of the Child
3328727e995b7bba3c57fb1e5c156d386ca11894f781v * function has all properties on Parent's instance templates.
332943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3330727e995b7bba3c57fb1e5c156d386ca11894f781v * Let Parent be the FunctionTemplate initialized in the previous
3331727e995b7bba3c57fb1e5c156d386ca11894f781v * section and create a Child FunctionTemplate by:
333243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3333727e995b7bba3c57fb1e5c156d386ca11894f781v * \code
333443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   Local<FunctionTemplate> parent = t;
333543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   Local<FunctionTemplate> child = FunctionTemplate::New();
333643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   child->Inherit(parent);
333743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
333843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   Local<Function> child_function = child->GetFunction();
333943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   Local<Object> child_instance = child_function->NewInstance();
3340727e995b7bba3c57fb1e5c156d386ca11894f781v * \endcode
334143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3342727e995b7bba3c57fb1e5c156d386ca11894f781v * The Child function and Child instance will have the following
3343727e995b7bba3c57fb1e5c156d386ca11894f781v * properties:
3344727e995b7bba3c57fb1e5c156d386ca11894f781v *
3345727e995b7bba3c57fb1e5c156d386ca11894f781v * \code
334643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   child_func.prototype.__proto__ == function.prototype;
3347727e995b7bba3c57fb1e5c156d386ca11894f781v *   child_instance.instance_accessor calls 'InstanceAccessorCallback'
334843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   child_instance.instance_property == 3;
3349727e995b7bba3c57fb1e5c156d386ca11894f781v * \endcode
335043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3351594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT FunctionTemplate : public Template {
335243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
335343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /** Creates a function template.*/
33541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  V8_DEPRECATED(static Local<FunctionTemplate> New(
33551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      InvocationCallback callback,
3356727e995b7bba3c57fb1e5c156d386ca11894f781v      Handle<Value> data = Handle<Value>(),
3357a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org      Handle<Signature> signature = Handle<Signature>(),
33581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      int length = 0));
3359bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  static Local<FunctionTemplate> New(
33601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      FunctionCallback callback = 0,
3361bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      Handle<Value> data = Handle<Value>(),
3362bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      Handle<Signature> signature = Handle<Signature>(),
3363bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      int length = 0);
3364bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
336543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /** Returns the unique function instance in the current execution context.*/
336643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Local<Function> GetFunction();
336743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3368727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
3369727e995b7bba3c57fb1e5c156d386ca11894f781v   * Set the call-handler callback for a FunctionTemplate.  This
3370727e995b7bba3c57fb1e5c156d386ca11894f781v   * callback is called whenever the function created from this
3371727e995b7bba3c57fb1e5c156d386ca11894f781v   * FunctionTemplate is called.
3372727e995b7bba3c57fb1e5c156d386ca11894f781v   */
33731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  V8_DEPRECATED(void SetCallHandler(InvocationCallback callback,
33741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                    Handle<Value> data = Handle<Value>()));
3375bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  void SetCallHandler(FunctionCallback callback,
3376bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                      Handle<Value> data = Handle<Value>());
337743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3378a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  /** Set the predefined length property for the FunctionTemplate. */
3379a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  void SetLength(int length);
3380a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
3381727e995b7bba3c57fb1e5c156d386ca11894f781v  /** Get the InstanceTemplate. */
338243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Local<ObjectTemplate> InstanceTemplate();
338343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
338443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /** Causes the function template to inherit from a parent function template.*/
338543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void Inherit(Handle<FunctionTemplate> parent);
338643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
338743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
338843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * A PrototypeTemplate is the template used to create the prototype object
338943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * of the function created by this template.
339043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
339143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Local<ObjectTemplate> PrototypeTemplate();
339243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3393727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
3394727e995b7bba3c57fb1e5c156d386ca11894f781v   * Set the class name of the FunctionTemplate.  This is used for
3395727e995b7bba3c57fb1e5c156d386ca11894f781v   * printing objects created with the function created from the
3396727e995b7bba3c57fb1e5c156d386ca11894f781v   * FunctionTemplate as its constructor.
3397727e995b7bba3c57fb1e5c156d386ca11894f781v   */
339843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void SetClassName(Handle<String> name);
339943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
340043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
3401727e995b7bba3c57fb1e5c156d386ca11894f781v   * Determines whether the __proto__ accessor ignores instances of
3402727e995b7bba3c57fb1e5c156d386ca11894f781v   * the function template.  If instances of the function template are
3403727e995b7bba3c57fb1e5c156d386ca11894f781v   * ignored, __proto__ skips all instances and instead returns the
3404727e995b7bba3c57fb1e5c156d386ca11894f781v   * next object in the prototype chain.
3405727e995b7bba3c57fb1e5c156d386ca11894f781v   *
3406727e995b7bba3c57fb1e5c156d386ca11894f781v   * Call with a value of true to make the __proto__ accessor ignore
3407727e995b7bba3c57fb1e5c156d386ca11894f781v   * instances of the function template.  Call with a value of false
3408727e995b7bba3c57fb1e5c156d386ca11894f781v   * to make the __proto__ accessor not ignore instances of the
3409727e995b7bba3c57fb1e5c156d386ca11894f781v   * function template.  By default, instances of a function template
3410727e995b7bba3c57fb1e5c156d386ca11894f781v   * are not ignored.
341143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
341243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void SetHiddenPrototype(bool value);
341343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
341443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
34152c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org   * Sets the ReadOnly flag in the attributes of the 'prototype' property
34162c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org   * of functions created from this FunctionTemplate to true.
341704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org   */
34182c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org  void ReadOnlyPrototype();
341904921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org
342004921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  /**
3421727e995b7bba3c57fb1e5c156d386ca11894f781v   * Returns true if the given object is an instance of this function
3422727e995b7bba3c57fb1e5c156d386ca11894f781v   * template.
342343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
342443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool HasInstance(Handle<Value> object);
342543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
342643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
342743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  FunctionTemplate();
34281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  // TODO(dcarney): Remove with SetCallHandler.
34291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  friend class v8::CallHandlerHelper;
34301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  void SetCallHandlerInternal(InvocationCallback callback, Handle<Value> data);
343143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class Context;
343243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class ObjectTemplate;
343343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
343443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
343543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
343643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
3437727e995b7bba3c57fb1e5c156d386ca11894f781v * An ObjectTemplate is used to create objects at runtime.
3438727e995b7bba3c57fb1e5c156d386ca11894f781v *
3439727e995b7bba3c57fb1e5c156d386ca11894f781v * Properties added to an ObjectTemplate are added to each object
3440727e995b7bba3c57fb1e5c156d386ca11894f781v * created from the ObjectTemplate.
344143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3442594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT ObjectTemplate : public Template {
344343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
3444727e995b7bba3c57fb1e5c156d386ca11894f781v  /** Creates an ObjectTemplate. */
344543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static Local<ObjectTemplate> New();
3446727e995b7bba3c57fb1e5c156d386ca11894f781v
344743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /** Creates a new instance of this template.*/
344843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Local<Object> NewInstance();
344943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
345043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
345143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Sets an accessor on the object template.
3452727e995b7bba3c57fb1e5c156d386ca11894f781v   *
3453727e995b7bba3c57fb1e5c156d386ca11894f781v   * Whenever the property with the given name is accessed on objects
3454727e995b7bba3c57fb1e5c156d386ca11894f781v   * created from this ObjectTemplate the getter and setter callbacks
3455727e995b7bba3c57fb1e5c156d386ca11894f781v   * are called instead of getting and setting the property directly
3456727e995b7bba3c57fb1e5c156d386ca11894f781v   * on the JavaScript object.
3457727e995b7bba3c57fb1e5c156d386ca11894f781v   *
3458727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param name The name of the property for which an accessor is added.
3459727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param getter The callback to invoke when getting the property.
3460727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param setter The callback to invoke when setting the property.
3461727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param data A piece of data that will be passed to the getter and setter
3462727e995b7bba3c57fb1e5c156d386ca11894f781v   *   callbacks whenever they are invoked.
3463727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param settings Access control settings for the accessor. This is a bit
3464727e995b7bba3c57fb1e5c156d386ca11894f781v   *   field consisting of one of more of
3465727e995b7bba3c57fb1e5c156d386ca11894f781v   *   DEFAULT = 0, ALL_CAN_READ = 1, or ALL_CAN_WRITE = 2.
3466727e995b7bba3c57fb1e5c156d386ca11894f781v   *   The default is to not allow cross-context access.
3467727e995b7bba3c57fb1e5c156d386ca11894f781v   *   ALL_CAN_READ means that all cross-context reads are allowed.
3468727e995b7bba3c57fb1e5c156d386ca11894f781v   *   ALL_CAN_WRITE means that all cross-context writes are allowed.
3469727e995b7bba3c57fb1e5c156d386ca11894f781v   *   The combination ALL_CAN_READ | ALL_CAN_WRITE can be used to allow all
3470727e995b7bba3c57fb1e5c156d386ca11894f781v   *   cross-context access.
3471727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param attribute The attributes of the property for which an accessor
3472727e995b7bba3c57fb1e5c156d386ca11894f781v   *   is added.
34737028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org   * \param signature The signature describes valid receivers for the accessor
34747028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org   *   and is used to perform implicit instance checks against them. If the
34757028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org   *   receiver is incompatible (i.e. is not an instance of the constructor as
34767028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org   *   defined by FunctionTemplate::HasInstance()), an implicit TypeError is
34777028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org   *   thrown and no callback is invoked.
347843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
34791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  V8_DEPRECATED(void SetAccessor(Handle<String> name,
34801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                 AccessorGetter getter,
34811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                 AccessorSetter setter = 0,
34821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                 Handle<Value> data = Handle<Value>(),
34831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                 AccessControl settings = DEFAULT,
34841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                 PropertyAttribute attribute = None,
34851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                 Handle<AccessorSignature> signature =
34861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                     Handle<AccessorSignature>()));
3487bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  void SetAccessor(Handle<String> name,
3488bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                   AccessorGetterCallback getter,
3489bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                   AccessorSetterCallback setter = 0,
3490bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                   Handle<Value> data = Handle<Value>(),
3491bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                   AccessControl settings = DEFAULT,
3492bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                   PropertyAttribute attribute = None,
3493bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                   Handle<AccessorSignature> signature =
3494bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                       Handle<AccessorSignature>());
349543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3496750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  // This function is not yet stable and should not be used at this time.
3497750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  bool SetAccessor(Handle<String> name,
3498750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                   Handle<DeclaredAccessorDescriptor> descriptor,
3499750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                   AccessControl settings = DEFAULT,
3500750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                   PropertyAttribute attribute = None,
3501750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                   Handle<AccessorSignature> signature =
3502750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                       Handle<AccessorSignature>());
3503750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
350443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
350543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Sets a named property handler on the object template.
3506727e995b7bba3c57fb1e5c156d386ca11894f781v   *
3507727e995b7bba3c57fb1e5c156d386ca11894f781v   * Whenever a named property is accessed on objects created from
3508727e995b7bba3c57fb1e5c156d386ca11894f781v   * this object template, the provided callback is invoked instead of
3509727e995b7bba3c57fb1e5c156d386ca11894f781v   * accessing the property directly on the JavaScript object.
3510727e995b7bba3c57fb1e5c156d386ca11894f781v   *
3511727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param getter The callback to invoke when getting a property.
3512727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param setter The callback to invoke when setting a property.
35132c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org   * \param query The callback to invoke to check if a property is present,
35142c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org   *   and if present, get its attributes.
3515727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param deleter The callback to invoke when deleting a property.
3516727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param enumerator The callback to invoke to enumerate all the named
3517727e995b7bba3c57fb1e5c156d386ca11894f781v   *   properties of an object.
3518727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param data A piece of data that will be passed to the callbacks
3519727e995b7bba3c57fb1e5c156d386ca11894f781v   *   whenever they are invoked.
352043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
35211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  V8_DEPRECATED(void SetNamedPropertyHandler(
35221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      NamedPropertyGetter getter,
35231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      NamedPropertySetter setter = 0,
35241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      NamedPropertyQuery query = 0,
35251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      NamedPropertyDeleter deleter = 0,
35261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      NamedPropertyEnumerator enumerator = 0,
35271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      Handle<Value> data = Handle<Value>()));
3528bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  void SetNamedPropertyHandler(
3529bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      NamedPropertyGetterCallback getter,
3530bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      NamedPropertySetterCallback setter = 0,
3531bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      NamedPropertyQueryCallback query = 0,
3532bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      NamedPropertyDeleterCallback deleter = 0,
3533bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      NamedPropertyEnumeratorCallback enumerator = 0,
3534bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      Handle<Value> data = Handle<Value>());
353543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
353643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
353743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Sets an indexed property handler on the object template.
3538727e995b7bba3c57fb1e5c156d386ca11894f781v   *
3539727e995b7bba3c57fb1e5c156d386ca11894f781v   * Whenever an indexed property is accessed on objects created from
3540727e995b7bba3c57fb1e5c156d386ca11894f781v   * this object template, the provided callback is invoked instead of
3541727e995b7bba3c57fb1e5c156d386ca11894f781v   * accessing the property directly on the JavaScript object.
3542727e995b7bba3c57fb1e5c156d386ca11894f781v   *
3543727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param getter The callback to invoke when getting a property.
3544727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param setter The callback to invoke when setting a property.
35457304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * \param query The callback to invoke to check if an object has a property.
3546727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param deleter The callback to invoke when deleting a property.
3547727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param enumerator The callback to invoke to enumerate all the indexed
3548727e995b7bba3c57fb1e5c156d386ca11894f781v   *   properties of an object.
3549727e995b7bba3c57fb1e5c156d386ca11894f781v   * \param data A piece of data that will be passed to the callbacks
3550727e995b7bba3c57fb1e5c156d386ca11894f781v   *   whenever they are invoked.
355143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
35521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  V8_DEPRECATED(void SetIndexedPropertyHandler(
35531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      IndexedPropertyGetter getter,
35541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      IndexedPropertySetter setter = 0,
35551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      IndexedPropertyQuery query = 0,
35561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      IndexedPropertyDeleter deleter = 0,
35571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      IndexedPropertyEnumerator enumerator = 0,
35581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      Handle<Value> data = Handle<Value>()));
3559bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  void SetIndexedPropertyHandler(
3560bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      IndexedPropertyGetterCallback getter,
3561bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      IndexedPropertySetterCallback setter = 0,
3562bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      IndexedPropertyQueryCallback query = 0,
3563bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      IndexedPropertyDeleterCallback deleter = 0,
3564bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      IndexedPropertyEnumeratorCallback enumerator = 0,
3565bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      Handle<Value> data = Handle<Value>());
356626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org
356743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
356843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Sets the callback to be used when calling instances created from
356943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * this template as a function.  If no callback is set, instances
3570727e995b7bba3c57fb1e5c156d386ca11894f781v   * behave like normal JavaScript objects that cannot be called as a
357143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * function.
357243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
35731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  V8_DEPRECATED(void SetCallAsFunctionHandler(
35741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      InvocationCallback callback,
35751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      Handle<Value> data = Handle<Value>()));
3576bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  void SetCallAsFunctionHandler(FunctionCallback callback,
3577bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                                Handle<Value> data = Handle<Value>());
357843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3579727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
3580727e995b7bba3c57fb1e5c156d386ca11894f781v   * Mark object instances of the template as undetectable.
3581727e995b7bba3c57fb1e5c156d386ca11894f781v   *
3582727e995b7bba3c57fb1e5c156d386ca11894f781v   * In many ways, undetectable objects behave as though they are not
3583727e995b7bba3c57fb1e5c156d386ca11894f781v   * there.  They behave like 'undefined' in conditionals and when
3584727e995b7bba3c57fb1e5c156d386ca11894f781v   * printed.  However, properties can be accessed and called as on
3585727e995b7bba3c57fb1e5c156d386ca11894f781v   * normal objects.
3586727e995b7bba3c57fb1e5c156d386ca11894f781v   */
358743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void MarkAsUndetectable();
358843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3589727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
3590727e995b7bba3c57fb1e5c156d386ca11894f781v   * Sets access check callbacks on the object template.
3591727e995b7bba3c57fb1e5c156d386ca11894f781v   *
3592727e995b7bba3c57fb1e5c156d386ca11894f781v   * When accessing properties on instances of this object template,
3593727e995b7bba3c57fb1e5c156d386ca11894f781v   * the access check callback will be called to determine whether or
3594727e995b7bba3c57fb1e5c156d386ca11894f781v   * not to allow cross-context access to the properties.
35955a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * The last parameter specifies whether access checks are turned
35965a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * on by default on instances. If access checks are off by default,
35975a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * they can be turned on on individual instances by calling
35985a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * Object::TurnOnAccessCheck().
3599727e995b7bba3c57fb1e5c156d386ca11894f781v   */
360043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void SetAccessCheckCallbacks(NamedSecurityCallback named_handler,
360143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                               IndexedSecurityCallback indexed_handler,
36025a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org                               Handle<Value> data = Handle<Value>(),
36035a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org                               bool turned_on_by_default = true);
360443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3605212ac23f8231d169b4aa6737d762099993020826kasper.lund  /**
3606212ac23f8231d169b4aa6737d762099993020826kasper.lund   * Gets the number of internal fields for objects generated from
3607212ac23f8231d169b4aa6737d762099993020826kasper.lund   * this template.
3608212ac23f8231d169b4aa6737d762099993020826kasper.lund   */
3609212ac23f8231d169b4aa6737d762099993020826kasper.lund  int InternalFieldCount();
3610212ac23f8231d169b4aa6737d762099993020826kasper.lund
3611212ac23f8231d169b4aa6737d762099993020826kasper.lund  /**
3612212ac23f8231d169b4aa6737d762099993020826kasper.lund   * Sets the number of internal fields for objects generated from
3613212ac23f8231d169b4aa6737d762099993020826kasper.lund   * this template.
3614212ac23f8231d169b4aa6737d762099993020826kasper.lund   */
3615212ac23f8231d169b4aa6737d762099993020826kasper.lund  void SetInternalFieldCount(int value);
3616212ac23f8231d169b4aa6737d762099993020826kasper.lund
361743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
361843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ObjectTemplate();
361943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static Local<ObjectTemplate> New(Handle<FunctionTemplate> constructor);
362043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class FunctionTemplate;
362143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
362243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
362343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
362443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
36257028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org * A Signature specifies which receivers and arguments are valid
36267028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org * parameters to a function.
362743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3628594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Signature : public Data {
362943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
363043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static Local<Signature> New(Handle<FunctionTemplate> receiver =
363143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                  Handle<FunctionTemplate>(),
363243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                              int argc = 0,
363343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                              Handle<FunctionTemplate> argv[] = 0);
363443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
363543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Signature();
363643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
363743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
363843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
363943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
36407028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org * An AccessorSignature specifies which receivers are valid parameters
36417028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org * to an accessor callback.
36427028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org */
3643594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT AccessorSignature : public Data {
36447028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org public:
36457028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  static Local<AccessorSignature> New(Handle<FunctionTemplate> receiver =
36467028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org                                          Handle<FunctionTemplate>());
36477028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org private:
36487028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  AccessorSignature();
36497028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org};
36507028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
36517028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
3652594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT DeclaredAccessorDescriptor : public Data {
3653750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org private:
3654750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  DeclaredAccessorDescriptor();
3655750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org};
3656750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
3657750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
3658594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT ObjectOperationDescriptor : public Data {
3659750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org public:
3660750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  // This function is not yet stable and should not be used at this time.
3661750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  static Local<RawOperationDescriptor> NewInternalFieldDereference(
3662750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      Isolate* isolate,
3663750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      int internal_field);
3664750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org private:
3665750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ObjectOperationDescriptor();
3666750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org};
3667750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
3668750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
3669750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgenum DeclaredAccessorDescriptorDataType {
3670750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    kDescriptorBoolType,
3671750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    kDescriptorInt8Type, kDescriptorUint8Type,
3672750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    kDescriptorInt16Type, kDescriptorUint16Type,
3673750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    kDescriptorInt32Type, kDescriptorUint32Type,
3674750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    kDescriptorFloatType, kDescriptorDoubleType
3675750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org};
3676750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
3677750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
3678594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT RawOperationDescriptor : public Data {
3679750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org public:
3680750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  Local<DeclaredAccessorDescriptor> NewHandleDereference(Isolate* isolate);
3681750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  Local<RawOperationDescriptor> NewRawDereference(Isolate* isolate);
3682750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  Local<RawOperationDescriptor> NewRawShift(Isolate* isolate,
3683750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                                            int16_t byte_offset);
3684750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  Local<DeclaredAccessorDescriptor> NewPointerCompare(Isolate* isolate,
3685750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                                                      void* compare_value);
3686750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  Local<DeclaredAccessorDescriptor> NewPrimitiveValue(
3687750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      Isolate* isolate,
3688750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      DeclaredAccessorDescriptorDataType data_type,
3689750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      uint8_t bool_offset = 0);
3690750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  Local<DeclaredAccessorDescriptor> NewBitmaskCompare8(Isolate* isolate,
3691750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                                                       uint8_t bitmask,
3692750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                                                       uint8_t compare_value);
3693750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  Local<DeclaredAccessorDescriptor> NewBitmaskCompare16(
3694750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      Isolate* isolate,
3695750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      uint16_t bitmask,
3696750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      uint16_t compare_value);
3697750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  Local<DeclaredAccessorDescriptor> NewBitmaskCompare32(
3698750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      Isolate* isolate,
3699750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      uint32_t bitmask,
3700750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      uint32_t compare_value);
3701750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
3702750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org private:
3703750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  RawOperationDescriptor();
3704750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org};
3705750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
3706750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
37077028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org/**
3708727e995b7bba3c57fb1e5c156d386ca11894f781v * A utility for determining the type of objects based on the template
3709727e995b7bba3c57fb1e5c156d386ca11894f781v * they were constructed from.
371043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3711594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT TypeSwitch : public Data {
371243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
371343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static Local<TypeSwitch> New(Handle<FunctionTemplate> type);
371443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static Local<TypeSwitch> New(int argc, Handle<FunctionTemplate> types[]);
371543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int match(Handle<Value> value);
371643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
371743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  TypeSwitch();
371843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
371943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
372043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3721fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Extensions ---
372243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3723594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT ExternalAsciiStringResourceImpl
3724c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    : public String::ExternalAsciiStringResource {
3725c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com public:
3726c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  ExternalAsciiStringResourceImpl() : data_(0), length_(0) {}
3727c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  ExternalAsciiStringResourceImpl(const char* data, size_t length)
3728c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      : data_(data), length_(length) {}
3729c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  const char* data() const { return data_; }
3730c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  size_t length() const { return length_; }
3731c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
3732c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com private:
3733c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  const char* data_;
3734c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  size_t length_;
3735c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com};
373643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
373743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
373843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Ignore
373943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3740594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Extension {  // NOLINT
374143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
3742c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Note that the strings passed into this constructor must live as long
3743c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // as the Extension itself.
374443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Extension(const char* name,
3745355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org            const char* source = 0,
374643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            int dep_count = 0,
3747c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com            const char** deps = 0,
3748c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com            int source_length = -1);
374943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  virtual ~Extension() { }
375043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  virtual v8::Handle<v8::FunctionTemplate>
375143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      GetNativeFunction(v8::Handle<v8::String> name) {
375243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return v8::Handle<v8::FunctionTemplate>();
375343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
375443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3755c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  const char* name() const { return name_; }
3756c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  size_t source_length() const { return source_length_; }
3757c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  const String::ExternalAsciiStringResource* source() const {
3758c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    return &source_; }
375943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int dependency_count() { return dep_count_; }
376043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  const char** dependencies() { return deps_; }
376143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void set_auto_enable(bool value) { auto_enable_ = value; }
376243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool auto_enable() { return auto_enable_; }
376343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
376443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
376543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  const char* name_;
3766c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  size_t source_length_;  // expected to initialize before source_
3767c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  ExternalAsciiStringResourceImpl source_;
376843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int dep_count_;
376943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  const char** deps_;
377043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool auto_enable_;
377141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
377241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org  // Disallow copying and assigning.
377341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org  Extension(const Extension&);
377441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org  void operator=(const Extension&);
377543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
377643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
377743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3778594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgvoid V8_EXPORT RegisterExtension(Extension* extension);
377943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
378043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
378143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
378243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Ignore
378343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3784594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT DeclareExtension {
378543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
378632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(DeclareExtension(Extension* extension)) {
378743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    RegisterExtension(extension);
378843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
378943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
379043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
379143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3792fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Statics ---
379343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
379443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3795594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgHandle<Primitive> V8_EXPORT Undefined();
3796594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgHandle<Primitive> V8_EXPORT Null();
3797594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgHandle<Boolean> V8_EXPORT True();
3798594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgHandle<Boolean> V8_EXPORT False();
379943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
380032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orgV8_INLINE(Handle<Primitive> Undefined(Isolate* isolate));
380132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orgV8_INLINE(Handle<Primitive> Null(Isolate* isolate));
380232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orgV8_INLINE(Handle<Boolean> True(Isolate* isolate));
380332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orgV8_INLINE(Handle<Boolean> False(Isolate* isolate));
3804efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
380543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
380643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
3807c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * A set of constraints that specifies the limits of the runtime's memory use.
3808c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * You must set the heap size before initializing the VM - the size cannot be
3809c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * adjusted after the VM is initialized.
3810c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org *
3811c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * If you are using threads then you should hold the V8::Locker lock while
3812c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * setting the stack limit and you must set a non-default stack limit separately
3813c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * for each thread.
381443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3815594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT ResourceConstraints {
381643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
381743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ResourceConstraints();
38185a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  int max_young_space_size() const { return max_young_space_size_; }
381943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void set_max_young_space_size(int value) { max_young_space_size_ = value; }
38205a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  int max_old_space_size() const { return max_old_space_size_; }
382143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void set_max_old_space_size(int value) { max_old_space_size_ = value; }
382201fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org  int max_executable_size() { return max_executable_size_; }
382301fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org  void set_max_executable_size(int value) { max_executable_size_ = value; }
38245a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  uint32_t* stack_limit() const { return stack_limit_; }
3825c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  // Sets an address beyond which the VM's stack may not grow.
382643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void set_stack_limit(uint32_t* value) { stack_limit_ = value; }
382743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
382843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int max_young_space_size_;
382943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int max_old_space_size_;
383001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org  int max_executable_size_;
383143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  uint32_t* stack_limit_;
383243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
383343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
383443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3835594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgbool V8_EXPORT SetResourceConstraints(ResourceConstraints* constraints);
383643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
383743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3838fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Exceptions ---
383943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
384043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
384143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef void (*FatalErrorCallback)(const char* location, const char* message);
384243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
384343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
384489e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.orgtypedef void (*MessageCallback)(Handle<Message> message, Handle<Value> error);
384543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
384643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
384743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
3848727e995b7bba3c57fb1e5c156d386ca11894f781v * Schedules an exception to be thrown when returning to JavaScript.  When an
3849727e995b7bba3c57fb1e5c156d386ca11894f781v * exception has been scheduled it is illegal to invoke any JavaScript
385043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * operation; the caller must return immediately and only after the exception
3851727e995b7bba3c57fb1e5c156d386ca11894f781v * has been handled does it become legal to invoke JavaScript operations.
385243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3853594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgHandle<Value> V8_EXPORT ThrowException(Handle<Value> exception);
385443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
385543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
385643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Create new error objects by calling the corresponding error object
385743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * constructor with the message.
385843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
3859594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Exception {
386043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
386143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static Local<Value> RangeError(Handle<String> message);
386243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static Local<Value> ReferenceError(Handle<String> message);
386343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static Local<Value> SyntaxError(Handle<String> message);
386443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static Local<Value> TypeError(Handle<String> message);
386543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static Local<Value> Error(Handle<String> message);
386643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
386743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
386843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3869fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Counters Callbacks ---
387043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3871a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgtypedef int* (*CounterLookupCallback)(const char* name);
387243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3873bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgtypedef void* (*CreateHistogramCallback)(const char* name,
3874bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org                                         int min,
3875bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org                                         int max,
3876bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org                                         size_t buckets);
3877bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
3878bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgtypedef void (*AddHistogramSampleCallback)(void* histogram, int sample);
3879bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
3880fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Memory Allocation Callback ---
38813cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org  enum ObjectSpace {
38823cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org    kObjectSpaceNewSpace = 1 << 0,
38833cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org    kObjectSpaceOldPointerSpace = 1 << 1,
38843cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org    kObjectSpaceOldDataSpace = 1 << 2,
38853cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org    kObjectSpaceCodeSpace = 1 << 3,
38863cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org    kObjectSpaceMapSpace = 1 << 4,
38873cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org    kObjectSpaceLoSpace = 1 << 5,
38883cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org
38893cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org    kObjectSpaceAll = kObjectSpaceNewSpace | kObjectSpaceOldPointerSpace |
38903cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org      kObjectSpaceOldDataSpace | kObjectSpaceCodeSpace | kObjectSpaceMapSpace |
38913cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org      kObjectSpaceLoSpace
38923cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org  };
38933cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org
38943cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org  enum AllocationAction {
38953cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org    kAllocationActionAllocate = 1 << 0,
38963cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org    kAllocationActionFree = 1 << 1,
38973cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org    kAllocationActionAll = kAllocationActionAllocate | kAllocationActionFree
38983cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org  };
38993cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org
39003cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.orgtypedef void (*MemoryAllocationCallback)(ObjectSpace space,
39013cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org                                         AllocationAction action,
39023cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org                                         int size);
39033cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org
3904fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org// --- Leave Script Callback ---
3905fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.orgtypedef void (*CallCompletedCallback)();
3906fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org
3907fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Failed Access Check Callback ---
390843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef void (*FailedAccessCheckCallback)(Local<Object> target,
390943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                          AccessType type,
391043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                          Local<Value> data);
391143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3912fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- AllowCodeGenerationFromStrings callbacks ---
3913fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
3914fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org/**
3915fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org * Callback to check if code generation from strings is allowed. See
3916fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org * Context::AllowCodeGenerationFromStrings.
3917fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org */
3918fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.orgtypedef bool (*AllowCodeGenerationFromStringsCallback)(Local<Context> context);
3919fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
3920fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Garbage Collection Callbacks ---
392143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
392243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
39235d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org * Applications can register callback functions which will be called
39245d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org * before and after a garbage collection.  Allocations are not
39255d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org * allowed in the callback functions, you therefore cannot manipulate
3926727e995b7bba3c57fb1e5c156d386ca11894f781v * objects (set or delete properties for example) since it is possible
3927727e995b7bba3c57fb1e5c156d386ca11894f781v * such operations will result in the allocation of objects.
392843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
39295d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.orgenum GCType {
39305d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  kGCTypeScavenge = 1 << 0,
39315d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  kGCTypeMarkSweepCompact = 1 << 1,
39325d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  kGCTypeAll = kGCTypeScavenge | kGCTypeMarkSweepCompact
39335d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org};
39345d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
39355d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.orgenum GCCallbackFlags {
39365d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  kNoGCCallbackFlags = 0,
3937ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  kGCCallbackFlagCompacted = 1 << 0,
3938ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  kGCCallbackFlagConstructRetainedObjectInfos = 1 << 1
39395d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org};
39405d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
39415d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.orgtypedef void (*GCPrologueCallback)(GCType type, GCCallbackFlags flags);
39425d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.orgtypedef void (*GCEpilogueCallback)(GCType type, GCCallbackFlags flags);
39435d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
394443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef void (*GCCallback)();
394543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
394643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
394743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
39483811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org * Collection of V8 heap information.
39493811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org *
39503811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org * Instances of this class can be passed to v8::V8::HeapStatistics to
39513811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org * get heap statistics from V8.
39523811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org */
3953594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT HeapStatistics {
39543811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org public:
39553811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  HeapStatistics();
39563811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  size_t total_heap_size() { return total_heap_size_; }
395701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org  size_t total_heap_size_executable() { return total_heap_size_executable_; }
395872204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org  size_t total_physical_size() { return total_physical_size_; }
39593811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  size_t used_heap_size() { return used_heap_size_; }
3960c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  size_t heap_size_limit() { return heap_size_limit_; }
39613811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
39623811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org private:
39633811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  size_t total_heap_size_;
396401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org  size_t total_heap_size_executable_;
396572204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org  size_t total_physical_size_;
39663811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  size_t used_heap_size_;
3967c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  size_t heap_size_limit_;
39683811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
39693811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  friend class V8;
39707c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  friend class Isolate;
39713811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org};
39723811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
39733811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
3974b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.orgclass RetainedObjectInfo;
3975b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org
39763811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org/**
3977ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * Isolate represents an isolated instance of the V8 engine.  V8
3978ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * isolates have completely separate states.  Objects from one isolate
3979ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * must not be used in other isolates.  When V8 is initialized a
3980ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * default isolate is implicitly created and entered.  The embedder
3981ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * can create additional isolates and use them in parallel in multiple
3982ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * threads.  An isolate can be entered by at most one thread at any
3983659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org * given time.  The Locker/Unlocker API must be used to synchronize.
3984ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org */
3985594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Isolate {
3986ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org public:
3987ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  /**
3988ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * Stack-allocated class which sets the isolate for all operations
3989ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * executed within a local scope.
3990ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   */
3991594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  class V8_EXPORT Scope {
3992ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   public:
3993ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    explicit Scope(Isolate* isolate) : isolate_(isolate) {
3994ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      isolate->Enter();
3995ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    }
3996ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
3997ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    ~Scope() { isolate_->Exit(); }
3998ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
3999ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   private:
4000ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    Isolate* const isolate_;
4001ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4002ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    // Prevent copying of Scope objects.
4003ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    Scope(const Scope&);
4004ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    Scope& operator=(const Scope&);
4005ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  };
4006ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4007ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  /**
4008ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * Creates a new isolate.  Does not change the currently entered
4009ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * isolate.
4010ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   *
4011ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * When an isolate is no longer used its resources should be freed
4012ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * by calling Dispose().  Using the delete operator is not allowed.
4013ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   */
4014ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  static Isolate* New();
4015ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4016ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  /**
4017ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * Returns the entered isolate for the current thread or NULL in
4018ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * case there is no current isolate.
4019ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   */
4020ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  static Isolate* GetCurrent();
4021ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4022ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  /**
4023ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * Methods below this point require holding a lock (using Locker) in
4024ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * a multi-threaded environment.
4025ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   */
4026ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4027ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  /**
4028ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * Sets this isolate as the entered one for the current thread.
4029ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * Saves the previously entered one (if any), so that it can be
4030ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * restored when exiting.  Re-entering an isolate is allowed.
4031ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   */
4032ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void Enter();
4033ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4034ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  /**
4035ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * Exits this isolate by restoring the previously entered one in the
4036ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * current thread.  The isolate may still stay the same, if it was
4037ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * entered more than once.
4038ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   *
4039ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * Requires: this == Isolate::GetCurrent().
4040ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   */
4041ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void Exit();
4042ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4043ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  /**
4044ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * Disposes the isolate.  The isolate must not be entered by any
4045ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * thread to be disposable.
4046ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   */
4047ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void Dispose();
4048ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4049ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  /**
4050ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org   * Associate embedder-specific data with the isolate
4051ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org   */
405232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(void SetData(void* data));
4053ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
4054ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  /**
4055efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org   * Retrieve embedder-specific data from the isolate.
4056ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org   * Returns NULL if SetData has never been called.
4057ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org   */
405832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(void* GetData());
4059ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
40607c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  /**
40617c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org   * Get statistics about the heap memory usage.
40627c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org   */
40637c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  void GetHeapStatistics(HeapStatistics* heap_statistics);
40647c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
40652bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  /**
40662bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   * Adjusts the amount of registered external memory. Used to give V8 an
40672bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   * indication of the amount of externally allocated memory that is kept alive
40682bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   * by JavaScript objects. V8 uses this to decide when to perform global
40692bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   * garbage collections. Registering externally allocated memory will trigger
40702bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   * global garbage collections more often than it would otherwise in an attempt
40712bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   * to garbage collect the JavaScript objects that keep the externally
40722bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   * allocated memory alive.
40732bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   *
40742bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   * \param change_in_bytes the change in externally allocated memory that is
40752bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   *   kept alive by JavaScript objects.
40762bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   * \returns the adjusted value.
40772bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org   */
40782bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  intptr_t AdjustAmountOfExternalAllocatedMemory(intptr_t change_in_bytes);
40792bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org
4080f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  /**
4081f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org   * Returns heap profiler for this isolate. Will return NULL until the isolate
4082f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org   * is initialized.
4083f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org   */
4084f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  HeapProfiler* GetHeapProfiler();
4085f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
4086f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  /**
408793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org   * Returns CPU profiler for this isolate. Will return NULL unless the isolate
408893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org   * is initialized. It is the embedder's responsibility to stop all CPU
408993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org   * profiling activities if it has started any.
4090f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org   */
4091f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  CpuProfiler* GetCpuProfiler();
4092f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
409340ce96b9446ccab86d0d80ee90bb86a9cca33aa7mvstanton@chromium.org  /** Returns the context that is on the top of the stack. */
409440ce96b9446ccab86d0d80ee90bb86a9cca33aa7mvstanton@chromium.org  Local<Context> GetCurrentContext();
409540ce96b9446ccab86d0d80ee90bb86a9cca33aa7mvstanton@chromium.org
4096ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  /**
4097ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * Allows the host application to group objects together. If one
4098ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * object in the group is alive, all objects in the group are alive.
4099ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * After each garbage collection, object groups are removed. It is
4100ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * intended to be used in the before-garbage-collection callback
4101ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * function, for instance to simulate DOM tree connections among JS
4102ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * wrapper objects. Object groups for all dependent handles need to
4103ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * be provided for kGCTypeMarkSweepCompact collections, for all other
4104ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * garbage collection types it is sufficient to provide object groups
4105ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * for partially dependent handles only.
4106ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   */
4107ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  void SetObjectGroupId(const Persistent<Value>& object,
4108ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org                        UniqueId id);
4109ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
4110ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  /**
4111ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * Allows the host application to declare implicit references from an object
4112ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * group to an object. If the objects of the object group are alive, the child
4113ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * object is alive too. After each garbage collection, all implicit references
4114ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * are removed. It is intended to be used in the before-garbage-collection
4115ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * callback function.
4116ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   */
4117ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  void SetReferenceFromGroup(UniqueId id,
4118ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org                             const Persistent<Value>& child);
4119ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
4120ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  /**
4121ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * Allows the host application to declare implicit references from an object
4122ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * to another object. If the parent object is alive, the child object is alive
4123ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * too. After each garbage collection, all implicit references are removed. It
4124ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   * is intended to be used in the before-garbage-collection callback function.
4125ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   */
4126ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  void SetReference(const Persistent<Object>& parent,
4127ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org                    const Persistent<Value>& child);
4128ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
4129ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org private:
4130ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Isolate();
4131ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Isolate(const Isolate&);
4132ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ~Isolate();
4133ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Isolate& operator=(const Isolate&);
4134ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void* operator new(size_t size);
4135ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void operator delete(void*, size_t);
4136ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org};
4137ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4138ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4139594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT StartupData {
41408e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org public:
41418e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  enum CompressionAlgorithm {
41428e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    kUncompressed,
41438e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    kBZip2
41448e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  };
41458e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
41468e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  const char* data;
41478e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  int compressed_size;
41488e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  int raw_size;
41498e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org};
41508e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
4151e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org
4152e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org/**
4153e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org * A helper class for driving V8 startup data decompression.  It is based on
4154e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org * "CompressedStartupData" API functions from the V8 class.  It isn't mandatory
4155e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org * for an embedder to use this class, instead, API functions can be used
4156e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org * directly.
4157e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org *
4158e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org * For an example of the class usage, see the "shell.cc" sample application.
4159e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org */
4160594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT StartupDataDecompressor {  // NOLINT
4161e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org public:
4162e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org  StartupDataDecompressor();
4163e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org  virtual ~StartupDataDecompressor();
4164e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org  int Decompress();
4165e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org
4166e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org protected:
4167e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org  virtual int DecompressData(char* raw_data,
4168e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org                             int* raw_data_size,
4169e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org                             const char* compressed_data,
4170e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org                             int compressed_data_size) = 0;
4171e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org
4172e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org private:
4173e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org  char** raw_data;
4174e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org};
4175e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org
417684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
417784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org/**
417884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org * EntropySource is used as a callback function when v8 needs a source
417984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org * of entropy.
418084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org */
418184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgtypedef bool (*EntropySource)(unsigned char* buffer, size_t length);
418284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
4183f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
4184f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com/**
4185967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org * ReturnAddressLocationResolver is used as a callback function when v8 is
4186967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org * resolving the location of a return address on the stack. Profilers that
4187967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org * change the return address on the stack can use this to resolve the stack
4188967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org * location to whereever the profiler stashed the original return address.
4189753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org *
4190753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org * \param return_addr_location points to a location on stack where a machine
4191753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org *    return address resides.
4192753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org * \returns either return_addr_location, or else a pointer to the profiler's
4193753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org *    copy of the original return address.
4194753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org *
4195753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org * \note the resolver function must not cause garbage collection.
4196967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org */
4197967e270a034432457500dbf950d2c4951a929e52ulan@chromium.orgtypedef uintptr_t (*ReturnAddressLocationResolver)(
4198967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org    uintptr_t return_addr_location);
4199967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org
4200967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org
4201967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org/**
4202753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org * FunctionEntryHook is the type of the profile entry hook called at entry to
4203753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org * any generated function when function-level profiling is enabled.
4204753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org *
4205753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org * \param function the address of the function that's being entered.
4206753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org * \param return_addr_location points to a location on stack where the machine
4207753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org *    return address resides. This can be used to identify the caller of
4208753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org *    \p function, and/or modified to divert execution when \p function exits.
4209753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org *
4210753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org * \note the entry hook must not cause garbage collection.
4211753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org */
4212753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.orgtypedef void (*FunctionEntryHook)(uintptr_t function,
4213753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org                                  uintptr_t return_addr_location);
4214753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org
4215753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org
4216753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org/**
4217355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org * A JIT code event is issued each time code is added, moved or removed.
4218355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org *
4219355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org * \note removal events are not currently issued.
4220355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org */
4221355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.orgstruct JitCodeEvent {
4222355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  enum EventType {
4223355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    CODE_ADDED,
4224355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    CODE_MOVED,
4225c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    CODE_REMOVED,
4226c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    CODE_ADD_LINE_POS_INFO,
4227c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    CODE_START_LINE_INFO_RECORDING,
4228c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    CODE_END_LINE_INFO_RECORDING
4229c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  };
4230c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  // Definition of the code position type. The "POSITION" type means the place
4231c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  // in the source code which are of interest when making stack traces to
4232c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  // pin-point the source location of a stack frame as close as possible.
4233c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  // The "STATEMENT_POSITION" means the place at the beginning of each
4234c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  // statement, and is used to indicate possible break locations.
4235c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  enum PositionType {
4236c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    POSITION,
4237c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    STATEMENT_POSITION
4238355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  };
4239355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
4240355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  // Type of event.
4241355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  EventType type;
4242355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  // Start of the instructions.
4243355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  void* code_start;
4244355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  // Size of the instructions.
4245355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  size_t code_len;
4246c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  // Script info for CODE_ADDED event.
4247c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Handle<Script> script;
4248c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  // User-defined data for *_LINE_INFO_* event. It's used to hold the source
4249c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  // code line information which is returned from the
4250c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  // CODE_START_LINE_INFO_RECORDING event. And it's passed to subsequent
4251c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  // CODE_ADD_LINE_POS_INFO and CODE_END_LINE_INFO_RECORDING events.
4252c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  void* user_data;
4253355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
42544e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  struct name_t {
42554e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org    // Name of the object associated with the code, note that the string is not
42564e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org    // zero-terminated.
42574e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org    const char* str;
42584e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org    // Number of chars in str.
42594e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org    size_t len;
42604e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  };
42614e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org
42624e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  struct line_info_t {
42634e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org    // PC offset
42644e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org    size_t offset;
42654e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org    // Code postion
42664e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org    size_t pos;
42674e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org    // The position type.
42684e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org    PositionType position_type;
42694e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  };
42704e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org
4271355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  union {
4272355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    // Only valid for CODE_ADDED.
42734e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org    struct name_t name;
4274c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
4275c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    // Only valid for CODE_ADD_LINE_POS_INFO
42764e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org    struct line_info_t line_info;
4277c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
4278355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    // New location of instructions. Only valid for CODE_MOVED.
4279355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    void* new_code_start;
4280355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  };
4281355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org};
4282355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
4283355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org/**
4284355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org * Option flags passed to the SetJitCodeEventHandler function.
4285355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org */
4286355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.orgenum JitCodeEventOptions {
4287355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  kJitCodeEventDefault = 0,
4288355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  // Generate callbacks for already existent code.
4289355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  kJitCodeEventEnumExisting = 1
4290355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org};
4291355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
4292355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
4293355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org/**
4294355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org * Callback function passed to SetJitCodeEventHandler.
4295355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org *
4296355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org * \param event code add, move or removal event.
4297355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org */
4298355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.orgtypedef void (*JitCodeEventHandler)(const JitCodeEvent* event);
4299355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
4300355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
4301355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org/**
430289e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org * Interface for iterating through all external resources in the heap.
4303f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com */
4304594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT ExternalResourceVisitor {  // NOLINT
4305f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com public:
4306f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  virtual ~ExternalResourceVisitor() {}
4307f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  virtual void VisitExternalString(Handle<String> string) {}
4308f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com};
4309f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
4310f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
4311ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org/**
431289e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org * Interface for iterating through all the persistent handles in the heap.
431389e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org */
4314594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT PersistentHandleVisitor {  // NOLINT
431589e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org public:
431689e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  virtual ~PersistentHandleVisitor() {}
4317b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  virtual void VisitPersistentHandle(Persistent<Value>* value,
4318b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org                                     uint16_t class_id) {}
431989e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org};
432089e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
432189e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
432289e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org/**
432357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org * Asserts that no action is performed that could cause a handle's value
432457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org * to be modified. Useful when otherwise unsafe handle operations need to
432557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org * be performed.
432657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org */
4327594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT AssertNoGCScope {
432857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#ifndef DEBUG
432979e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  // TODO(yangguo): remove isolate argument.
433079e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  V8_INLINE(AssertNoGCScope(Isolate* isolate)) { }
433157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#else
433257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  AssertNoGCScope(Isolate* isolate);
433357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  ~AssertNoGCScope();
433457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org private:
433579e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  void* disallow_heap_allocation_;
433657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#endif
433757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org};
433857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
433957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
434057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org/**
434143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Container class for static utility functions.
434243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
4343594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT V8 {
434443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
4345727e995b7bba3c57fb1e5c156d386ca11894f781v  /** Set the callback to invoke in case of fatal errors. */
434643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static void SetFatalErrorHandler(FatalErrorCallback that);
434743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4348727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
4349fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * Set the callback to invoke to check if code generation from
4350fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * strings should be allowed.
4351fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   */
4352fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  static void SetAllowCodeGenerationFromStringsCallback(
4353fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org      AllowCodeGenerationFromStringsCallback that);
4354fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
4355fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  /**
4356837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * Set allocator to use for ArrayBuffer memory.
4357837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * The allocator should be set only once. The allocator should be set
4358837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * before any code tha uses ArrayBuffers is executed.
4359837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   * This allocator is used in all isolates.
4360837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org   */
4361837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  static void SetArrayBufferAllocator(ArrayBuffer::Allocator* allocator);
4362837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org
4363837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  /**
4364727e995b7bba3c57fb1e5c156d386ca11894f781v   * Ignore out-of-memory exceptions.
4365727e995b7bba3c57fb1e5c156d386ca11894f781v   *
4366727e995b7bba3c57fb1e5c156d386ca11894f781v   * V8 running out of memory is treated as a fatal error by default.
4367727e995b7bba3c57fb1e5c156d386ca11894f781v   * This means that the fatal error handler is called and that V8 is
4368727e995b7bba3c57fb1e5c156d386ca11894f781v   * terminated.
4369727e995b7bba3c57fb1e5c156d386ca11894f781v   *
43707304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * IgnoreOutOfMemoryException can be used to not treat an
4371727e995b7bba3c57fb1e5c156d386ca11894f781v   * out-of-memory situation as a fatal error.  This way, the contexts
4372727e995b7bba3c57fb1e5c156d386ca11894f781v   * that did not cause the out of memory problem might be able to
4373727e995b7bba3c57fb1e5c156d386ca11894f781v   * continue execution.
4374727e995b7bba3c57fb1e5c156d386ca11894f781v   */
437543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static void IgnoreOutOfMemoryException();
437643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4377727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
43789258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * Check if V8 is dead and therefore unusable.  This is the case after
4379727e995b7bba3c57fb1e5c156d386ca11894f781v   * fatal errors such as out-of-memory situations.
4380727e995b7bba3c57fb1e5c156d386ca11894f781v   */
438143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static bool IsDead();
438243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
438343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
43848e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   * The following 4 functions are to be used when V8 is built with
43858e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   * the 'compress_startup_data' flag enabled. In this case, the
43868e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   * embedder must decompress startup data prior to initializing V8.
43878e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   *
43888e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   * This is how interaction with V8 should look like:
43898e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   *   int compressed_data_count = v8::V8::GetCompressedStartupDataCount();
43908e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   *   v8::StartupData* compressed_data =
43918e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   *     new v8::StartupData[compressed_data_count];
43928e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   *   v8::V8::GetCompressedStartupData(compressed_data);
43938e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   *   ... decompress data (compressed_data can be updated in-place) ...
43948e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   *   v8::V8::SetDecompressedStartupData(compressed_data);
43958e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   *   ... now V8 can be initialized
43968e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   *   ... make sure the decompressed data stays valid until V8 shutdown
4397e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org   *
4398e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org   * A helper class StartupDataDecompressor is provided. It implements
4399e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org   * the protocol of the interaction described above, and can be used in
4400e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org   * most cases instead of calling these API functions directly.
44018e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   */
44028e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  static StartupData::CompressionAlgorithm GetCompressedStartupDataAlgorithm();
44038e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  static int GetCompressedStartupDataCount();
44048e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  static void GetCompressedStartupData(StartupData* compressed_data);
44058e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  static void SetDecompressedStartupData(StartupData* decompressed_data);
44068e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
44078e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  /**
4408727e995b7bba3c57fb1e5c156d386ca11894f781v   * Adds a message listener.
4409727e995b7bba3c57fb1e5c156d386ca11894f781v   *
44107304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * The same message listener can be added more than once and in that
4411727e995b7bba3c57fb1e5c156d386ca11894f781v   * case it will be called more than once for each message.
44128432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org   *
44138432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org   * If data is specified, it will be passed to the callback when it is called.
44148432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org   * Otherwise, the exception object will be passed to the callback instead.
441543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
44168432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org  static bool AddMessageListener(MessageCallback that,
44178432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org                                 Handle<Value> data = Handle<Value>());
441843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
441943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
442043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Remove all message listeners from the specified callback function.
442143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
442243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static void RemoveMessageListeners(MessageCallback that);
442343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
442443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
44256a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org   * Tells V8 to capture current stack trace when uncaught exception occurs
44266a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org   * and report it to the message listeners. The option is off by default.
44276a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org   */
44286a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org  static void SetCaptureStackTraceForUncaughtExceptions(
44296a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org      bool capture,
44306a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org      int frame_limit = 10,
44316a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org      StackTrace::StackTraceOptions options = StackTrace::kOverview);
44326a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org
44336a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org  /**
4434727e995b7bba3c57fb1e5c156d386ca11894f781v   * Sets V8 flags from a string.
443543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
443643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static void SetFlagsFromString(const char* str, int length);
443743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
44389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  /**
4439727e995b7bba3c57fb1e5c156d386ca11894f781v   * Sets V8 flags from the command line.
44409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com   */
44419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  static void SetFlagsFromCommandLine(int* argc,
44429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                                      char** argv,
44439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                                      bool remove_flags);
44449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
44457276f14ca716596e0a0d17539516370c1f453847kasper.lund  /** Get the version string. */
44467276f14ca716596e0a0d17539516370c1f453847kasper.lund  static const char* GetVersion();
444743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
444843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
444943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Enables the host application to provide a mechanism for recording
445043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * statistics counters.
445143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
445243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static void SetCounterFunction(CounterLookupCallback);
445343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
445443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
4455bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org   * Enables the host application to provide a mechanism for recording
4456bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org   * histograms. The CreateHistogram function returns a
4457bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org   * histogram which will later be passed to the AddHistogramSample
4458bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org   * function.
4459bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org   */
4460bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  static void SetCreateHistogramFunction(CreateHistogramCallback);
4461bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  static void SetAddHistogramSampleFunction(AddHistogramSampleCallback);
4462bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
446343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /** Callback function for reporting failed access checks.*/
446443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static void SetFailedAccessCheckCallbackFunction(FailedAccessCheckCallback);
446543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
446643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
4467727e995b7bba3c57fb1e5c156d386ca11894f781v   * Enables the host application to receive a notification before a
44685d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * garbage collection.  Allocations are not allowed in the
44695d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * callback function, you therefore cannot manipulate objects (set
44705d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * or delete properties for example) since it is possible such
44715d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * operations will result in the allocation of objects. It is possible
44725d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * to specify the GCType filter for your callback. But it is not possible to
44735d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * register the same callback function two times with different
44745d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * GCType filters.
44755d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   */
44765d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  static void AddGCPrologueCallback(
44775d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org      GCPrologueCallback callback, GCType gc_type_filter = kGCTypeAll);
44785d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
44795d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  /**
44805d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * This function removes callback which was installed by
44815d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * AddGCPrologueCallback function.
44825d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   */
44835d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  static void RemoveGCPrologueCallback(GCPrologueCallback callback);
44845d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
44855d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  /**
44865d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * The function is deprecated. Please use AddGCPrologueCallback instead.
44875d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * Enables the host application to receive a notification before a
44885d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * garbage collection.  Allocations are not allowed in the
4489727e995b7bba3c57fb1e5c156d386ca11894f781v   * callback function, you therefore cannot manipulate objects (set
4490727e995b7bba3c57fb1e5c156d386ca11894f781v   * or delete properties for example) since it is possible such
4491727e995b7bba3c57fb1e5c156d386ca11894f781v   * operations will result in the allocation of objects.
449243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
4493003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  V8_DEPRECATED(static void SetGlobalGCPrologueCallback(GCCallback));
449443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
449543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
4496727e995b7bba3c57fb1e5c156d386ca11894f781v   * Enables the host application to receive a notification after a
44975d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * garbage collection.  Allocations are not allowed in the
44985d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * callback function, you therefore cannot manipulate objects (set
44995d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * or delete properties for example) since it is possible such
45005d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * operations will result in the allocation of objects. It is possible
45015d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * to specify the GCType filter for your callback. But it is not possible to
45025d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * register the same callback function two times with different
45035d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * GCType filters.
45045d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   */
45055d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  static void AddGCEpilogueCallback(
45065d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org      GCEpilogueCallback callback, GCType gc_type_filter = kGCTypeAll);
45075d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
45085d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  /**
45095d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * This function removes callback which was installed by
45105d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * AddGCEpilogueCallback function.
45115d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   */
45125d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  static void RemoveGCEpilogueCallback(GCEpilogueCallback callback);
45135d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
45145d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  /**
45155d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * The function is deprecated. Please use AddGCEpilogueCallback instead.
45165d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org   * Enables the host application to receive a notification after a
4517727e995b7bba3c57fb1e5c156d386ca11894f781v   * major garbage collection.  Allocations are not allowed in the
4518727e995b7bba3c57fb1e5c156d386ca11894f781v   * callback function, you therefore cannot manipulate objects (set
4519727e995b7bba3c57fb1e5c156d386ca11894f781v   * or delete properties for example) since it is possible such
4520727e995b7bba3c57fb1e5c156d386ca11894f781v   * operations will result in the allocation of objects.
452143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
4522003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  V8_DEPRECATED(static void SetGlobalGCEpilogueCallback(GCCallback));
452343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
452443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
45253cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org   * Enables the host application to provide a mechanism to be notified
45263cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org   * and perform custom logging when V8 Allocates Executable Memory.
45273cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org   */
45283cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org  static void AddMemoryAllocationCallback(MemoryAllocationCallback callback,
45293cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org                                          ObjectSpace space,
45303cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org                                          AllocationAction action);
45313cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org
45323cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org  /**
4533fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org   * Removes callback that was installed by AddMemoryAllocationCallback.
45343cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org   */
45353cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org  static void RemoveMemoryAllocationCallback(MemoryAllocationCallback callback);
45363cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org
45373cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org  /**
4538fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org   * Adds a callback to notify the host application when a script finished
4539fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org   * running.  If a script re-enters the runtime during executing, the
4540fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org   * CallCompletedCallback is only invoked when the outer-most script
4541fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org   * execution ends.  Executing scripts inside the callback do not trigger
4542fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org   * further callbacks.
4543fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org   */
4544fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org  static void AddCallCompletedCallback(CallCompletedCallback callback);
4545fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org
4546fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org  /**
4547fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org   * Removes callback that was installed by AddCallCompletedCallback.
4548fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org   */
4549fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org  static void RemoveCallCompletedCallback(CallCompletedCallback callback);
4550fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org
4551fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org  /**
4552727e995b7bba3c57fb1e5c156d386ca11894f781v   * Initializes from snapshot if possible. Otherwise, attempts to
4553c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org   * initialize from scratch.  This function is called implicitly if
4554c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org   * you use the API without calling it first.
455543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
455643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static bool Initialize();
455743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
45587276f14ca716596e0a0d17539516370c1f453847kasper.lund  /**
455984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   * Allows the host application to provide a callback which can be used
456084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   * as a source of entropy for random number generators.
456184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org   */
456284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  static void SetEntropySource(EntropySource source);
456384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
456484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  /**
4565967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org   * Allows the host application to provide a callback that allows v8 to
4566967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org   * cooperate with a profiler that rewrites return addresses on stack.
4567967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org   */
4568967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org  static void SetReturnAddressLocationResolver(
4569967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org      ReturnAddressLocationResolver return_address_resolver);
4570967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org
4571967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org  /**
45721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * Deprecated, use the variant with the Isolate parameter below instead.
45731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   */
45741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  V8_DEPRECATED(static bool SetFunctionEntryHook(FunctionEntryHook entry_hook));
45751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
45761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  /**
4577753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org   * Allows the host application to provide the address of a function that's
4578753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org   * invoked on entry to every V8-generated function.
4579753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org   * Note that \p entry_hook is invoked at the very start of each
4580753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org   * generated function.
4581753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org   *
45821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * \param isolate the isolate to operate on.
4583753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org   * \param entry_hook a function that will be invoked on entry to every
4584753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org   *   V8-generated function.
4585753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org   * \returns true on success on supported platforms, false on failure.
45861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   * \note Setting an entry hook can only be done very early in an isolates
45871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   *   lifetime, and once set, the entry hook cannot be revoked.
4588753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org   */
45891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  static bool SetFunctionEntryHook(Isolate* isolate,
45901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                   FunctionEntryHook entry_hook);
4591753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org
4592753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org  /**
4593355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org   * Allows the host application to provide the address of a function that is
4594355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org   * notified each time code is added, moved or removed.
4595355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org   *
4596355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org   * \param options options for the JIT code event handler.
4597355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org   * \param event_handler the JIT code event handler, which will be invoked
4598355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org   *     each time code is added, moved or removed.
4599355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org   * \note \p event_handler won't get notified of existent code.
4600355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org   * \note since code removal notifications are not currently issued, the
4601355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org   *     \p event_handler may get notifications of code that overlaps earlier
4602355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org   *     code notifications. This happens when code areas are reused, and the
4603355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org   *     earlier overlapping code areas should therefore be discarded.
4604355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org   * \note the events passed to \p event_handler and the strings they point to
4605355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org   *     are not guaranteed to live past each call. The \p event_handler must
4606355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org   *     copy strings and other parameters it needs to keep around.
4607355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org   * \note the set of events declared in JitCodeEvent::EventType is expected to
4608355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org   *     grow over time, and the JitCodeEvent structure is expected to accrue
4609355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org   *     new members. The \p event_handler function must ignore event codes
4610355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org   *     it does not recognize to maintain future compatibility.
4611355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org   */
4612355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  static void SetJitCodeEventHandler(JitCodeEventOptions options,
4613355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org                                     JitCodeEventHandler event_handler);
4614355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
46152bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  // TODO(svenpanne) Really deprecate me when Chrome is fixed.
46162bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  /** Deprecated. Use Isolate::AdjustAmountOfExternalAllocatedMemory instead. */
461728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  static intptr_t AdjustAmountOfExternalAllocatedMemory(
461828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org      intptr_t change_in_bytes);
46197276f14ca716596e0a0d17539516370c1f453847kasper.lund
4620245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  /**
4621245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org   * Suspends recording of tick samples in the profiler.
4622245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org   * When the V8 profiling mode is enabled (usually via command line
4623245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org   * switches) this function suspends recording of tick samples.
4624245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org   * Profiling ticks are discarded until ResumeProfiler() is called.
4625245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org   *
4626245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org   * See also the --prof and --prof_auto command line switches to
4627245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org   * enable V8 profiling.
4628245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org   */
4629c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  V8_DEPRECATED(static void PauseProfiler());
4630245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
4631245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  /**
4632245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org   * Resumes recording of tick samples in the profiler.
4633245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org   * See also PauseProfiler().
4634245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org   */
4635c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  V8_DEPRECATED(static void ResumeProfiler());
4636245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
463741826e77311db718135ef6517b846933dfd275f3ager@chromium.org  /**
463871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org   * Return whether profiler is currently paused.
463971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org   */
4640c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  V8_DEPRECATED(static bool IsProfilerPaused());
464171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
464271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  /**
4643c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * Retrieve the V8 thread id of the calling thread.
4644c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   *
4645c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * The thread id for a thread should only be retrieved after the V8
4646c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * lock has been acquired with a Locker object with that thread.
4647c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   */
4648c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org  static int GetCurrentThreadId();
4649c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org
4650c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org  /**
4651c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * Forcefully terminate execution of a JavaScript thread.  This can
4652c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * be used to terminate long-running scripts.
4653c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   *
4654c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * TerminateExecution should only be called when then V8 lock has
4655c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * been acquired with a Locker object.  Therefore, in order to be
4656c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * able to terminate long-running threads, preemption must be
4657c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * enabled to allow the user of TerminateExecution to acquire the
4658c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * lock.
4659c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   *
4660c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * The termination is achieved by throwing an exception that is
4661c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * uncatchable by JavaScript exception handlers.  Termination
4662c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * exceptions act as if they were caught by a C++ TryCatch exception
46637304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * handler.  If forceful termination is used, any C++ TryCatch
4664c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * exception handler that catches an exception should check if that
4665c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * exception is a termination exception and immediately return if
4666c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * that is the case.  Returning immediately in that case will
4667c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * continue the propagation of the termination exception if needed.
4668c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   *
4669c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * The thread id passed to TerminateExecution must have been
4670c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * obtained by calling GetCurrentThreadId on the thread in question.
4671c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   *
4672c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * \param thread_id The thread id of the thread to terminate.
4673c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   */
4674c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org  static void TerminateExecution(int thread_id);
4675c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org
4676c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org  /**
4677ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * Forcefully terminate the current thread of JavaScript execution
4678ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * in the given isolate. If no isolate is provided, the default
4679ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * isolate is used.
4680c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   *
4681c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * This method can be used by any thread even if that thread has not
4682c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * acquired the V8 lock with a Locker object.
4683ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   *
4684ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   * \param isolate The isolate in which to terminate the current JS execution.
4685c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   */
4686ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  static void TerminateExecution(Isolate* isolate = NULL);
46879085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
46882ab99526496cda7ff426115c76a1c475a1b4f4a5sgjesse@chromium.org  /**
46892ab99526496cda7ff426115c76a1c475a1b4f4a5sgjesse@chromium.org   * Is V8 terminating JavaScript execution.
46902ab99526496cda7ff426115c76a1c475a1b4f4a5sgjesse@chromium.org   *
46912ab99526496cda7ff426115c76a1c475a1b4f4a5sgjesse@chromium.org   * Returns true if JavaScript execution is currently terminating
46922ab99526496cda7ff426115c76a1c475a1b4f4a5sgjesse@chromium.org   * because of a call to TerminateExecution.  In that case there are
46932ab99526496cda7ff426115c76a1c475a1b4f4a5sgjesse@chromium.org   * still JavaScript frames on the stack and the termination
46942ab99526496cda7ff426115c76a1c475a1b4f4a5sgjesse@chromium.org   * exception is still active.
46956d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org   *
46966d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org   * \param isolate The isolate in which to check.
46972ab99526496cda7ff426115c76a1c475a1b4f4a5sgjesse@chromium.org   */
46986d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  static bool IsExecutionTerminating(Isolate* isolate = NULL);
46992ab99526496cda7ff426115c76a1c475a1b4f4a5sgjesse@chromium.org
47009085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  /**
470132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * Resume execution capability in the given isolate, whose execution
470232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * was previously forcefully terminated using TerminateExecution().
470332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   *
470432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * When execution is forcefully terminated using TerminateExecution(),
470532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * the isolate can not resume execution until all JavaScript frames
470632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * have propagated the uncatchable exception which is generated.  This
470732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * method allows the program embedding the engine to handle the
470832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * termination event and resume execution capability, even if
470932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * JavaScript frames remain on the stack.
471032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   *
471132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * This method can be used by any thread even if that thread has not
471232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * acquired the V8 lock with a Locker object.
471332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   *
471432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * \param isolate The isolate in which to resume execution capability.
471532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   */
471632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  static void CancelTerminateExecution(Isolate* isolate);
471732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
471832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  /**
471941826e77311db718135ef6517b846933dfd275f3ager@chromium.org   * Releases any resources used by v8 and stops any utility threads
472041826e77311db718135ef6517b846933dfd275f3ager@chromium.org   * that may be running.  Note that disposing v8 is permanent, it
472141826e77311db718135ef6517b846933dfd275f3ager@chromium.org   * cannot be reinitialized.
472241826e77311db718135ef6517b846933dfd275f3ager@chromium.org   *
472341826e77311db718135ef6517b846933dfd275f3ager@chromium.org   * It should generally not be necessary to dispose v8 before exiting
472441826e77311db718135ef6517b846933dfd275f3ager@chromium.org   * a process, this should happen automatically.  It is only necessary
472541826e77311db718135ef6517b846933dfd275f3ager@chromium.org   * to use if the process needs the resources taken up by v8.
472641826e77311db718135ef6517b846933dfd275f3ager@chromium.org   */
472741826e77311db718135ef6517b846933dfd275f3ager@chromium.org  static bool Dispose();
472841826e77311db718135ef6517b846933dfd275f3ager@chromium.org
47297c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  /** Deprecated. Use Isolate::GetHeapStatistics instead. */
47307c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  V8_DEPRECATED(static void GetHeapStatistics(HeapStatistics* heap_statistics));
4731add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org
4732add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org  /**
4733f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com   * Iterates through all external resources referenced from current isolate
4734e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org   * heap.  GC is not invoked prior to iterating, therefore there is no
4735e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org   * guarantee that visited objects are still alive.
4736f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com   */
4737f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  static void VisitExternalResources(ExternalResourceVisitor* visitor);
4738f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
4739f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  /**
474089e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org   * Iterates through all the persistent handles in the current isolate's heap
474189e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org   * that have class_ids.
474289e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org   */
474389e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  static void VisitHandlesWithClassIds(PersistentHandleVisitor* visitor);
474489e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
474589e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  /**
4746003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org   * Iterates through all the persistent handles in the current isolate's heap
4747003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org   * that have class_ids and are candidates to be marked as partially dependent
4748003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org   * handles. This will visit handles to young objects created since the last
4749003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org   * garbage collection but is free to visit an arbitrary superset of these
4750003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org   * objects.
4751003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org   */
4752003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  static void VisitHandlesForPartialDependence(
4753003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org      Isolate* isolate, PersistentHandleVisitor* visitor);
4754003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
4755003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  /**
4756add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org   * Optional notification that the embedder is idle.
4757add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org   * V8 uses the notification to reduce memory footprint.
4758ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org   * This call can be used repeatedly if the embedder remains idle.
4759ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org   * Returns true if the embedder should stop calling IdleNotification
4760ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org   * until real work has been done.  This indicates that V8 has done
4761ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org   * as much cleanup as it will be able to do.
4762ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org   *
4763ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org   * The hint argument specifies the amount of work to be done in the function
4764ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org   * on scale from 1 to 1000. There is no guarantee that the actual work will
4765ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org   * match the hint.
4766add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org   */
4767ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org  static bool IdleNotification(int hint = 1000);
4768add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org
4769c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org  /**
4770c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * Optional notification that the system is running low on memory.
4771c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   * V8 uses these notifications to attempt to free memory.
4772c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   */
4773c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org  static void LowMemoryNotification();
4774c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org
47758b2bb2665b37457fd2bdccbce0356051c83a73fckasperl@chromium.org  /**
47768b2bb2665b37457fd2bdccbce0356051c83a73fckasperl@chromium.org   * Optional notification that a context has been disposed. V8 uses
4777ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org   * these notifications to guide the GC heuristic. Returns the number
4778ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org   * of context disposals - including this one - since the last time
4779ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org   * V8 had a chance to clean up.
47808b2bb2665b37457fd2bdccbce0356051c83a73fckasperl@chromium.org   */
4781ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  static int ContextDisposedNotification();
47828b2bb2665b37457fd2bdccbce0356051c83a73fckasperl@chromium.org
4783169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  /**
4784169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org   * Initialize the ICU library bundled with V8. The embedder should only
4785169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org   * invoke this method when using the bundled ICU. Returns true on success.
4786169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org   */
4787169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  static bool InitializeICU();
4788169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
478943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
479043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  V8();
479143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4792d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  static internal::Object** GlobalizeReference(internal::Isolate* isolate,
4793d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org                                               internal::Object** handle);
4794a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  static void DisposeGlobal(internal::Object** global_handle);
479557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  typedef WeakReferenceCallbacks<Value, void>::Revivable RevivableCallback;
4796b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  static void MakeWeak(internal::Object** global_handle,
479732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org                       void* data,
479879e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org                       RevivableCallback weak_reference_callback);
4799b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  static void ClearWeak(internal::Object** global_handle);
4800594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  static int Eternalize(internal::Isolate* isolate,
4801594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org                        internal::Object** handle);
4802594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  static internal::Object** GetEternal(internal::Isolate* isolate, int index);
480343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
480443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  template <class T> friend class Handle;
480543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  template <class T> friend class Local;
480643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  template <class T> friend class Persistent;
480743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class Context;
480843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
480943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
481043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
481143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
481243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * An external exception handler.
481343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
4814594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT TryCatch {
481543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
481643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
481749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org   * Creates a new try/catch block and registers it with v8.  Note that
481849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org   * all TryCatch blocks should be stack allocated because the memory
481949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org   * location itself is compared against JavaScript try/catch blocks.
482043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
482143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  TryCatch();
482243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
482343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
482443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Unregisters and deletes this try/catch block.
482543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
482643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ~TryCatch();
482743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
482843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
482943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns true if an exception has been caught by this try/catch block.
483043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
48315a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  bool HasCaught() const;
483243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
483343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
483432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * For certain types of exceptions, it makes no sense to continue execution.
4835c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   *
483632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * If CanContinue returns false, the correct action is to perform any C++
483732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * cleanup needed and then return.  If CanContinue returns false and
483832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * HasTerminated returns true, it is possible to call
483932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * CancelTerminateExecution in order to continue calling into the engine.
4840c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org   */
4841c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org  bool CanContinue() const;
4842c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org
4843c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org  /**
484432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * Returns true if an exception has been caught due to script execution
484532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * being terminated.
484632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   *
484732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * There is no JavaScript representation of an execution termination
484832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * exception.  Such exceptions are thrown when the TerminateExecution
484932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * methods are called to terminate a long-running script.
485032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   *
485132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * If such an exception has been thrown, HasTerminated will return true,
485232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * indicating that it is possible to call CancelTerminateExecution in order
485332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   * to continue calling into the engine.
485432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org   */
485532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  bool HasTerminated() const;
485632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
485732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  /**
4858b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com   * Throws the exception caught by this TryCatch in a way that avoids
4859b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com   * it being caught again by this same TryCatch.  As with ThrowException
4860b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com   * it is illegal to execute any JavaScript operations after calling
4861b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com   * ReThrow; the caller must return immediately to where the exception
4862b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com   * is caught.
4863b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com   */
4864b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com  Handle<Value> ReThrow();
4865b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com
4866b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com  /**
486743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Returns the exception caught by this try/catch block.  If no exception has
486843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * been caught an empty handle is returned.
486943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   *
487043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * The returned handle is valid until this TryCatch block has been destroyed.
487143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
48725a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  Local<Value> Exception() const;
487343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
487443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
4875911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org   * Returns the .stack property of the thrown object.  If no .stack
4876911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org   * property is present an empty handle is returned.
4877911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org   */
4878911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  Local<Value> StackTrace() const;
4879911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
4880911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  /**
48819258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * Returns the message associated with this exception.  If there is
48829258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * no message associated an empty handle is returned.
48839258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   *
48849258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * The returned handle is valid until this TryCatch block has been
48859258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * destroyed.
48869258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   */
48875a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  Local<v8::Message> Message() const;
48889258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
48899258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  /**
489043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Clears any exceptions that may have been caught by this try/catch block.
489143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * After this method has been called, HasCaught() will return false.
489243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   *
489343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * It is not necessary to clear a try/catch block before using it again; if
489443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * another exception is thrown the previously caught exception will just be
489543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * overwritten.  However, it is often a good idea since it makes it easier
489643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * to determine which operation threw a given exception.
489743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
489843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void Reset();
489943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4900727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
4901727e995b7bba3c57fb1e5c156d386ca11894f781v   * Set verbosity of the external exception handler.
4902727e995b7bba3c57fb1e5c156d386ca11894f781v   *
4903727e995b7bba3c57fb1e5c156d386ca11894f781v   * By default, exceptions that are caught by an external exception
4904727e995b7bba3c57fb1e5c156d386ca11894f781v   * handler are not reported.  Call SetVerbose with true on an
4905727e995b7bba3c57fb1e5c156d386ca11894f781v   * external exception handler to have exceptions caught by the
4906727e995b7bba3c57fb1e5c156d386ca11894f781v   * handler reported as if they were not caught.
4907727e995b7bba3c57fb1e5c156d386ca11894f781v   */
490843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void SetVerbose(bool value);
490943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
49109258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  /**
49119258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * Set whether or not this TryCatch should capture a Message object
49129258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * which holds source information about where the exception
49139258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   * occurred.  True by default.
49149258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   */
49159258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  void SetCaptureMessage(bool value);
49169258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
4917c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org private:
491849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  // Make it hard to create heap-allocated TryCatch blocks.
491949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  TryCatch(const TryCatch&);
492049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  void operator=(const TryCatch&);
492149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  void* operator new(size_t size);
492249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  void operator delete(void*, size_t);
492349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
4924e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org  v8::internal::Isolate* isolate_;
4925c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  void* next_;
492643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void* exception_;
492793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  void* message_obj_;
492893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  void* message_script_;
492993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  int message_start_pos_;
493093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  int message_end_pos_;
4931b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com  bool is_verbose_ : 1;
4932b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com  bool can_continue_ : 1;
4933b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com  bool capture_message_ : 1;
4934b9ce637a396f3cb3845105ba1f5553d25b25abefchristian.plesner.hansen@gmail.com  bool rethrow_ : 1;
493532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  bool has_terminated_ : 1;
4936c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
4937ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  friend class v8::internal::Isolate;
493843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
493943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
494043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4941fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Context ---
494243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
494343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
494443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
494543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Ignore
494643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
4947594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT ExtensionConfiguration {
494843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
494943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ExtensionConfiguration(int name_count, const char* names[])
495043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      : name_count_(name_count), names_(names) { }
495143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
495243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class ImplementationUtilities;
495343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int name_count_;
495443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  const char** names_;
495543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
495643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
495743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
495843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
495943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * A sandboxed execution context with its own set of built-in objects
496043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * and functions.
496143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
4962594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Context {
496343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
49647a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  /**
49657a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org   * Returns the global proxy object or global object itself for
49667a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org   * detached contexts.
49677a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org   *
49687a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org   * Global proxy object is a thin wrapper whose prototype points to
49697a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org   * actual context's global object with the properties like Object, etc.
49707a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org   * This is done that way for security reasons (for more details see
49717a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org   * https://wiki.mozilla.org/Gecko:SplitWindow).
49727a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org   *
49737a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org   * Please note that changes to global proxy object prototype most probably
49747a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org   * would break VM---v8 expects only global object as a prototype of
49757a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org   * global proxy object.
49767a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org   *
49777a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org   * If DetachGlobal() has been invoked, Global() would return actual global
49787a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org   * object until global is reattached with ReattachGlobal().
49797a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org   */
498043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Local<Object> Global();
498143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
49825a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  /**
49835a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * Detaches the global object from its context before
49845a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   * the global object can be reused to create a new context.
49855a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org   */
49865a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  void DetachGlobal();
49875a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
4988df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org  /**
4989df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org   * Reattaches a global object to a context.  This can be used to
4990df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org   * restore the connection between a global object and a context
4991df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org   * after DetachGlobal has been called.
4992df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org   *
4993df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org   * \param global_object The global object to reattach to the
4994df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org   *   context.  For this to work, the global object must be the global
4995df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org   *   object that was associated with this context before a call to
4996df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org   *   DetachGlobal.
4997df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org   */
4998df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org  void ReattachGlobal(Handle<Object> global_object);
4999df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org
5000e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  /**
5001e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   * Creates a new context and returns a handle to the newly allocated
5002e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   * context.
50039155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org   *
5004e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org   * \param isolate The isolate in which to create the context.
50055d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   *
50065d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   * \param extensions An optional extension configuration containing
50075d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   * the extensions to be installed in the newly created context.
50085d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   *
50095d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   * \param global_template An optional object template from which the
50105d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   * global object for the newly created context will be created.
50115d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   *
50125d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   * \param global_object An optional global object to be reused for
50135d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   * the newly created context. This global object must have been
50145d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   * created by a previous call to Context::New with the same global
50155d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   * template. The state of the global object will be completely reset
50165d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org   * and only object identify will remain.
50179155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org   */
5018e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  static Local<Context> New(
5019e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      Isolate* isolate,
5020e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      ExtensionConfiguration* extensions = NULL,
5021e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      Handle<ObjectTemplate> global_template = Handle<ObjectTemplate>(),
5022e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      Handle<Value> global_object = Handle<Value>());
5023e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
5024e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  /** Deprecated. Use Isolate version instead. */
5025906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  V8_DEPRECATED(static Persistent<Context> New(
50265d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org      ExtensionConfiguration* extensions = NULL,
5027727e995b7bba3c57fb1e5c156d386ca11894f781v      Handle<ObjectTemplate> global_template = Handle<ObjectTemplate>(),
5028906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org      Handle<Value> global_object = Handle<Value>()));
502943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
503044510671e908d0efc639513d81efcd81e7f14240kasper.lund  /** Returns the last entered context. */
503144510671e908d0efc639513d81efcd81e7f14240kasper.lund  static Local<Context> GetEntered();
503243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5033e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // TODO(svenpanne) Actually deprecate this.
5034e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  /** Deprecated. Use Isolate::GetCurrentContext instead. */
503544510671e908d0efc639513d81efcd81e7f14240kasper.lund  static Local<Context> GetCurrent();
503644510671e908d0efc639513d81efcd81e7f14240kasper.lund
503743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /**
50381bf0cd04f43405cf4353d7c5360e53149ecb9f2cager@chromium.org   * Returns the context of the calling JavaScript code.  That is the
50391bf0cd04f43405cf4353d7c5360e53149ecb9f2cager@chromium.org   * context of the top-most JavaScript frame.  If there are no
50401bf0cd04f43405cf4353d7c5360e53149ecb9f2cager@chromium.org   * JavaScript frames an empty handle is returned.
50411bf0cd04f43405cf4353d7c5360e53149ecb9f2cager@chromium.org   */
50421bf0cd04f43405cf4353d7c5360e53149ecb9f2cager@chromium.org  static Local<Context> GetCalling();
50431bf0cd04f43405cf4353d7c5360e53149ecb9f2cager@chromium.org
50441bf0cd04f43405cf4353d7c5360e53149ecb9f2cager@chromium.org  /**
504543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Sets the security token for the context.  To access an object in
504643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * another context, the security tokens must match.
504743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
504843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void SetSecurityToken(Handle<Value> token);
504943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
50505a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  /** Restores the security token to the default value. */
50515a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  void UseDefaultSecurityToken();
50525a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
505343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  /** Returns the security token of this context.*/
505443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Handle<Value> GetSecurityToken();
505543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5056727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
5057727e995b7bba3c57fb1e5c156d386ca11894f781v   * Enter this context.  After entering a context, all code compiled
5058727e995b7bba3c57fb1e5c156d386ca11894f781v   * and run is compiled and run in this context.  If another context
5059727e995b7bba3c57fb1e5c156d386ca11894f781v   * is already entered, this old context is saved so it can be
5060727e995b7bba3c57fb1e5c156d386ca11894f781v   * restored when the new context is exited.
5061727e995b7bba3c57fb1e5c156d386ca11894f781v   */
506243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void Enter();
5063727e995b7bba3c57fb1e5c156d386ca11894f781v
5064727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
5065727e995b7bba3c57fb1e5c156d386ca11894f781v   * Exit this context.  Exiting the current context restores the
5066727e995b7bba3c57fb1e5c156d386ca11894f781v   * context that was in place when entering the current context.
5067727e995b7bba3c57fb1e5c156d386ca11894f781v   */
506843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void Exit();
506943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5070727e995b7bba3c57fb1e5c156d386ca11894f781v  /** Returns true if the context has experienced an out of memory situation. */
507143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool HasOutOfMemoryException();
507243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5073727e995b7bba3c57fb1e5c156d386ca11894f781v  /** Returns true if V8 has a current context. */
507443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static bool InContext();
507543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
507646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  /** Returns an isolate associated with a current context. */
507746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  v8::Isolate* GetIsolate();
5078e19986e2807a2b21b2c4840812fed1d45b6fc227yangguo@chromium.org
5079e19986e2807a2b21b2c4840812fed1d45b6fc227yangguo@chromium.org  /**
5080eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * Gets the embedder data with the given index, which must have been set by a
5081eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * previous call to SetEmbedderData with the same index. Note that index 0
5082eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * currently has a special meaning for Chrome's debugger.
5083eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   */
508432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(Local<Value> GetEmbedderData(int index));
5085eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
5086eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  /**
5087eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * Sets the embedder data with the given index, growing the data as
5088eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * needed. Note that index 0 currently has a special meaning for Chrome's
5089eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * debugger.
5090eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   */
5091eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  void SetEmbedderData(int index, Handle<Value> value);
5092eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
5093eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  /**
5094eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * Gets a 2-byte-aligned native pointer from the embedder data with the given
5095eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * index, which must have bees set by a previous call to
5096eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * SetAlignedPointerInEmbedderData with the same index. Note that index 0
5097eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * currently has a special meaning for Chrome's debugger.
5098eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   */
509932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(void* GetAlignedPointerFromEmbedderData(int index));
5100eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
5101eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  /**
5102eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * Sets a 2-byte-aligned native pointer in the embedder data with the given
5103eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * index, growing the data as needed. Note that index 0 currently has a
5104eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   * special meaning for Chrome's debugger.
5105eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org   */
5106eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  void SetAlignedPointerInEmbedderData(int index, void* value);
51079085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
51089085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  /**
5109fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * Control whether code generation from strings is allowed. Calling
5110fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * this method with false will disable 'eval' and the 'Function'
5111fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * constructor for code running in this context. If 'eval' or the
5112fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * 'Function' constructor are used an exception will be thrown.
5113fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   *
5114fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * If code generation from strings is not allowed the
5115fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * V8::AllowCodeGenerationFromStrings callback will be invoked if
5116fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * set before blocking the call to 'eval' or the 'Function'
5117fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * constructor. If that callback returns true, the call will be
5118fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * allowed, otherwise an exception will be thrown. If no callback is
5119fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   * set an exception will be thrown.
5120fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org   */
5121fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  void AllowCodeGenerationFromStrings(bool allow);
5122fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
5123fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  /**
51241145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org   * Returns true if code generation from strings is allowed for the context.
51251145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org   * For more details see AllowCodeGenerationFromStrings(bool) documentation.
51261145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org   */
51271145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org  bool IsCodeGenerationFromStringsAllowed();
51281145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org
51291145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org  /**
513056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org   * Sets the error description for the exception that is thrown when
513156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org   * code generation from strings is not allowed and 'eval' or the 'Function'
513256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org   * constructor are called.
513356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org   */
513456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  void SetErrorMessageForCodeGenerationFromStrings(Handle<String> message);
513556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
513656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  /**
513743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * Stack-allocated class which sets the execution context for all
513843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   * operations executed within a local scope.
513943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   */
514069ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org  class Scope {
514143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   public:
514232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    explicit V8_INLINE(Scope(Handle<Context> context)) : context_(context) {
514343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      context_->Enter();
514443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
5145c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    // TODO(dcarney): deprecate
514657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    V8_INLINE(Scope(Isolate* isolate, Persistent<Context>& context)) // NOLINT
514757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#ifndef V8_USE_UNSAFE_HANDLES
514857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    : context_(Handle<Context>::New(isolate, context)) {
514957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#else
515057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    : context_(Local<Context>::New(isolate, context)) {
515157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#endif
515257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org      context_->Enter();
515357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    }
515432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    V8_INLINE(~Scope()) { context_->Exit(); }
515557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
515643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   private:
515743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Handle<Context> context_;
515843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  };
515943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
516043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
516143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class Value;
516243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class Script;
516343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class Object;
516443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class Function;
5165eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
5166eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  Local<Value> SlowGetEmbedderData(int index);
5167eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  void* SlowGetAlignedPointerFromEmbedderData(int index);
516843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
516943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
517043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
517143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
517246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * Multiple threads in V8 are allowed, but only one thread at a time is allowed
517346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * to use any given V8 isolate, see the comments in the Isolate class. The
517446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * definition of 'using a V8 isolate' includes accessing handles or holding onto
517546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * object pointers obtained from V8 handles while in the particular V8 isolate.
517646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * It is up to the user of V8 to ensure, perhaps with locking, that this
517746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * constraint is not violated. In addition to any other synchronization
517846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * mechanism that may be used, the v8::Locker and v8::Unlocker classes must be
517946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * used to signal thead switches to V8.
5180ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org *
518146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * v8::Locker is a scoped lock object. While it's active, i.e. between its
518246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * construction and destruction, the current thread is allowed to use the locked
518346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * isolate. V8 guarantees that an isolate can be locked by at most one thread at
518446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * any time. In other words, the scope of a v8::Locker is a critical section.
518543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
51861c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org * Sample usage:
51871c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org* \code
518843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * ...
518943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * {
51901c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org *   v8::Locker locker(isolate);
51911c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org *   v8::Isolate::Scope isolate_scope(isolate);
519243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   ...
51931c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org *   // Code using V8 and isolate goes here.
519443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   ...
519543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * } // Destructor called here
5196727e995b7bba3c57fb1e5c156d386ca11894f781v * \endcode
519743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
519846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * If you wish to stop using V8 in a thread A you can do this either by
519946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * destroying the v8::Locker object as above or by constructing a v8::Unlocker
520046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * object:
520143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
5202727e995b7bba3c57fb1e5c156d386ca11894f781v * \code
520343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * {
52041c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org *   isolate->Exit();
52051c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org *   v8::Unlocker unlocker(isolate);
520643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   ...
520743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   // Code not using V8 goes here while V8 can run in another thread.
520843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   ...
520943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * } // Destructor called here.
52101c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org * isolate->Enter();
5211727e995b7bba3c57fb1e5c156d386ca11894f781v * \endcode
521243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
521346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * The Unlocker object is intended for use in a long-running callback from V8,
521446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * where you want to release the V8 lock for other threads to use.
521543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
521646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * The v8::Locker is a recursive lock, i.e. you can lock more than once in a
521746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * given thread. This can be useful if you have code that can be called either
521846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * from code that holds the lock or from code that does not. The Unlocker is
521946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * not recursive so you can not have several Unlockers on the stack at once, and
522046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * you can not use an Unlocker in a thread that is not inside a Locker's scope.
522143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
522246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * An unlocker will unlock several lockers if it has to and reinstate the
522346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * correct depth of locking on its destruction, e.g.:
522443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
5225727e995b7bba3c57fb1e5c156d386ca11894f781v * \code
522643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * // V8 not locked.
522743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * {
52281c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org *   v8::Locker locker(isolate);
52291c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org *   Isolate::Scope isolate_scope(isolate);
523043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   // V8 locked.
523143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   {
52321c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org *     v8::Locker another_locker(isolate);
523343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     // V8 still locked (2 levels).
523443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     {
52351c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org *       isolate->Exit();
52361c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org *       v8::Unlocker unlocker(isolate);
523743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *       // V8 not locked.
523843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     }
52391c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org *     isolate->Enter();
524043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     // V8 locked again (2 levels).
524143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   }
524243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   // V8 still locked (1 level).
524343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * }
524443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * // V8 Now no longer locked.
5245727e995b7bba3c57fb1e5c156d386ca11894f781v * \endcode
524643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
5247594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Unlocker {
524843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
52491c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  /**
525046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org   * Initialize Unlocker for a given Isolate.
52511c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org   */
525246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  V8_INLINE(explicit Unlocker(Isolate* isolate)) { Initialize(isolate); }
525346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
5254d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  /** Deprecated. Use Isolate version instead. */
525546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  V8_DEPRECATED(Unlocker());
525646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
525743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ~Unlocker();
52581c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org private:
525946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void Initialize(Isolate* isolate);
526046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
52611c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  internal::Isolate* isolate_;
526243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
526343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
526443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5265594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT Locker {
526643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
52671c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  /**
526846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org   * Initialize Locker for a given Isolate.
52691c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org   */
527046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  V8_INLINE(explicit Locker(Isolate* isolate)) { Initialize(isolate); }
527146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
5272d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  /** Deprecated. Use Isolate version instead. */
527346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  V8_DEPRECATED(Locker());
527446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
527543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ~Locker();
5276727e995b7bba3c57fb1e5c156d386ca11894f781v
5277727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
5278727e995b7bba3c57fb1e5c156d386ca11894f781v   * Start preemption.
5279727e995b7bba3c57fb1e5c156d386ca11894f781v   *
52807304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org   * When preemption is started, a timer is fired every n milliseconds
5281727e995b7bba3c57fb1e5c156d386ca11894f781v   * that will switch between multiple threads that are in contention
5282727e995b7bba3c57fb1e5c156d386ca11894f781v   * for the V8 lock.
5283727e995b7bba3c57fb1e5c156d386ca11894f781v   */
5284727e995b7bba3c57fb1e5c156d386ca11894f781v  static void StartPreemption(int every_n_ms);
5285727e995b7bba3c57fb1e5c156d386ca11894f781v
5286727e995b7bba3c57fb1e5c156d386ca11894f781v  /**
5287727e995b7bba3c57fb1e5c156d386ca11894f781v   * Stop preemption.
5288727e995b7bba3c57fb1e5c156d386ca11894f781v   */
5289727e995b7bba3c57fb1e5c156d386ca11894f781v  static void StopPreemption();
5290727e995b7bba3c57fb1e5c156d386ca11894f781v
52919258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  /**
529246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org   * Returns whether or not the locker for a given isolate, is locked by the
529346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org   * current thread.
52949258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org   */
529546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static bool IsLocked(Isolate* isolate);
52969258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
5297ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  /**
5298ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org   * Returns whether v8::Locker is being used by this V8 instance.
5299ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org   */
53007c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  static bool IsActive();
5301ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
530243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
530346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  void Initialize(Isolate* isolate);
530446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
530543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool has_lock_;
530643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool top_level_;
53071c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  internal::Isolate* isolate_;
530841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
5309ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  static bool active_;
5310ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
531141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org  // Disallow copying and assigning.
531241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org  Locker(const Locker&);
531341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org  void operator=(const Locker&);
531443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
531543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
531643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5317d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com/**
5318fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org * A struct for exporting HeapStats data from V8, using "push" model.
5319fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org */
5320fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.orgstruct HeapStatsUpdate;
5321fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org
5322fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org
5323fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org/**
5324d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com * An interface for exporting data from V8, using "push" model.
5325d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com */
5326594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT OutputStream {  // NOLINT
5327f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org public:
5328d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com  enum OutputEncoding {
5329fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org    kAscii = 0  // 7-bit ASCII.
5330d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com  };
5331d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com  enum WriteResult {
5332d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com    kContinue = 0,
5333d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com    kAbort = 1
5334d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com  };
5335d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com  virtual ~OutputStream() {}
5336d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com  /** Notify about the end of stream. */
5337d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com  virtual void EndOfStream() = 0;
5338d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com  /** Get preferred output chunk size. Called only once. */
5339d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com  virtual int GetChunkSize() { return 1024; }
5340d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com  /** Get preferred output encoding. Called only once. */
5341d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com  virtual OutputEncoding GetOutputEncoding() { return kAscii; }
5342d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com  /**
5343d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com   * Writes the next chunk of snapshot data into the stream. Writing
5344d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com   * can be stopped by returning kAbort as function result. EndOfStream
5345d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com   * will not be called in case writing was aborted.
5346d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com   */
5347d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com  virtual WriteResult WriteAsciiChunk(char* data, int size) = 0;
534828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  /**
534928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org   * Writes the next chunk of heap stats data into the stream. Writing
535028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org   * can be stopped by returning kAbort as function result. EndOfStream
535128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org   * will not be called in case writing was aborted.
535228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org   */
5353fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  virtual WriteResult WriteHeapStatsChunk(HeapStatsUpdate* data, int count) {
53543ee08a60067751ecfad036b933a23002989d7450jkummerow@chromium.org    return kAbort;
53553ee08a60067751ecfad036b933a23002989d7450jkummerow@chromium.org  };
5356d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com};
5357d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com
5358d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com
53595f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org/**
53605f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org * An interface for reporting progress and controlling long-running
53615f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org * activities.
53625f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org */
5363594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgclass V8_EXPORT ActivityControl {  // NOLINT
53645f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org public:
53655f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  enum ControlOption {
53665f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    kContinue = 0,
53675f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    kAbort = 1
53685f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  };
53695f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  virtual ~ActivityControl() {}
53705f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  /**
53715f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org   * Notify about current progress. The activity can be stopped by
53725f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org   * returning kAbort as the callback result.
53735f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org   */
53745f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  virtual ControlOption ReportProgressValue(int done, int total) = 0;
53755f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org};
53765f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
537743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5378fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// --- Implementation ---
537943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
538018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
538118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgnamespace internal {
538218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
53831b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgconst int kApiPointerSize = sizeof(void*);  // NOLINT
53841b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgconst int kApiIntSize = sizeof(int);  // NOLINT
538518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
538618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org// Tag information for HeapObject.
538718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgconst int kHeapObjectTag = 1;
538818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgconst int kHeapObjectTagSize = 2;
538918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgconst intptr_t kHeapObjectTagMask = (1 << kHeapObjectTagSize) - 1;
539018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
539118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org// Tag information for Smi.
539218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgconst int kSmiTag = 0;
539318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgconst int kSmiTagSize = 1;
539418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgconst intptr_t kSmiTagMask = (1 << kSmiTagSize) - 1;
539518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
5396c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgtemplate <size_t ptr_size> struct SmiTagging;
53979d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
5398bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<int kSmiShiftSize>
5399bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgV8_INLINE(internal::Object* IntToSmi(int value)) {
5400bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  int smi_shift_bits = kSmiTagSize + kSmiShiftSize;
5401bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  intptr_t tagged_value =
5402bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org      (static_cast<intptr_t>(value) << smi_shift_bits) | kSmiTag;
5403bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  return reinterpret_cast<internal::Object*>(tagged_value);
5404bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
5405bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
54069d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com// Smi constants for 32-bit systems.
5407c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgtemplate <> struct SmiTagging<4> {
54089d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  static const int kSmiShiftSize = 0;
54099d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  static const int kSmiValueSize = 31;
541032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static int SmiToInt(internal::Object* value)) {
54119d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    int shift_bits = kSmiTagSize + kSmiShiftSize;
54129d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    // Throw away top 32 bits and shift down (requires >> to be sign extending).
54139d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    return static_cast<int>(reinterpret_cast<intptr_t>(value)) >> shift_bits;
54149d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  }
5415bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  V8_INLINE(static internal::Object* IntToSmi(int value)) {
5416bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    return internal::IntToSmi<kSmiShiftSize>(value);
5417bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  }
5418bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  V8_INLINE(static bool IsValidSmi(intptr_t value)) {
5419bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    // To be representable as an tagged small integer, the two
5420bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    // most-significant bits of 'value' must be either 00 or 11 due to
5421bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    // sign-extension. To check this we add 01 to the two
5422bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    // most-significant bits, and check if the most-significant bit is 0
5423bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    //
5424bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    // CAUTION: The original code below:
5425bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    // bool result = ((value + 0x40000000) & 0x80000000) == 0;
5426bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    // may lead to incorrect results according to the C language spec, and
5427bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    // in fact doesn't work correctly with gcc4.1.1 in some cases: The
5428bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    // compiler may produce undefined results in case of signed integer
5429bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    // overflow. The computation must be done w/ unsigned ints.
5430bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    return static_cast<uintptr_t>(value + 0x40000000U) < 0x80000000U;
5431bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  }
54329d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com};
54339d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
54349d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com// Smi constants for 64-bit systems.
5435c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgtemplate <> struct SmiTagging<8> {
54369d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  static const int kSmiShiftSize = 31;
54379d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  static const int kSmiValueSize = 32;
543832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static int SmiToInt(internal::Object* value)) {
54399d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    int shift_bits = kSmiTagSize + kSmiShiftSize;
54409d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    // Shift down and throw away top 32 bits.
54419d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    return static_cast<int>(reinterpret_cast<intptr_t>(value) >> shift_bits);
54429d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  }
5443bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  V8_INLINE(static internal::Object* IntToSmi(int value)) {
5444bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    return internal::IntToSmi<kSmiShiftSize>(value);
5445bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  }
5446bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  V8_INLINE(static bool IsValidSmi(intptr_t value)) {
5447bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    // To be representable as a long smi, the value must be a 32-bit integer.
5448bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    return (value == static_cast<int32_t>(value));
5449bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  }
54509d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com};
54519d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
5452c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgtypedef SmiTagging<kApiPointerSize> PlatformSmiTagging;
5453c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgconst int kSmiShiftSize = PlatformSmiTagging::kSmiShiftSize;
5454c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgconst int kSmiValueSize = PlatformSmiTagging::kSmiValueSize;
545518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
545618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org/**
545718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org * This class exports constants and functionality from within v8 that
545818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org * is necessary to implement inline functions in the v8 api.  Don't
545918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org * depend on functions and constants defined here.
546018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org */
546118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgclass Internals {
546218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org public:
546318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  // These values match non-compiler-dependent values defined within
546418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  // the implementation of v8.
546518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  static const int kHeapObjectMapOffset = 0;
5466ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  static const int kMapInstanceTypeOffset = 1 * kApiPointerSize + kApiIntSize;
5467efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  static const int kStringResourceOffset = 3 * kApiPointerSize;
5468ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org
5469fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  static const int kOddballKindOffset = 3 * kApiPointerSize;
5470ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  static const int kForeignAddressOffset = kApiPointerSize;
54714a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com  static const int kJSObjectHeaderSize = 3 * kApiPointerSize;
5472eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  static const int kFixedArrayHeaderSize = 2 * kApiPointerSize;
5473eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  static const int kContextHeaderSize = 2 * kApiPointerSize;
54741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  static const int kContextEmbedderDataIndex = 65;
547518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  static const int kFullStringRepresentationMask = 0x07;
547656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  static const int kStringEncodingMask = 0x4;
547782dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  static const int kExternalTwoByteRepresentationTag = 0x02;
547856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  static const int kExternalAsciiRepresentationTag = 0x06;
547918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
5480efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  static const int kIsolateEmbedderDataOffset = 1 * kApiPointerSize;
5481efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  static const int kIsolateRootsOffset = 3 * kApiPointerSize;
5482efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  static const int kUndefinedValueRootIndex = 5;
5483efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  static const int kNullValueRootIndex = 7;
5484efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  static const int kTrueValueRootIndex = 8;
5485efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  static const int kFalseValueRootIndex = 9;
5486594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  static const int kEmptyStringRootIndex = 133;
5487efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
5488d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  static const int kNodeClassIdOffset = 1 * kApiPointerSize;
5489d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  static const int kNodeFlagsOffset = 1 * kApiPointerSize + 3;
5490d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  static const int kNodeStateMask = 0xf;
5491d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  static const int kNodeStateIsWeakValue = 2;
5492c16e8281e6e3e3b57e157b62d5a1ca530e23e4bfdanno@chromium.org  static const int kNodeStateIsPendingValue = 3;
5493d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  static const int kNodeStateIsNearDeathValue = 4;
549446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static const int kNodeIsIndependentShift = 4;
549546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static const int kNodeIsPartiallyDependentShift = 5;
549646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
5497bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org  static const int kJSObjectType = 0xb1;
54985ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org  static const int kFirstNonstringType = 0x80;
54994a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  static const int kOddballType = 0x83;
5500c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  static const int kForeignType = 0x87;
550118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
5502fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  static const int kUndefinedOddballKind = 5;
5503fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  static const int kNullOddballKind = 3;
5504fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org
550593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  static void CheckInitializedImpl(v8::Isolate* isolate);
550693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  V8_INLINE(static void CheckInitialized(v8::Isolate* isolate)) {
55071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#ifdef V8_ENABLE_CHECKS
550893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org    CheckInitializedImpl(isolate);
55091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#endif
551093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  }
55111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
551232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static bool HasHeapObjectTag(internal::Object* value)) {
551318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    return ((reinterpret_cast<intptr_t>(value) & kHeapObjectTagMask) ==
551418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org            kHeapObjectTag);
551518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  }
5516c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
551732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static int SmiValue(internal::Object* value)) {
5518c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    return PlatformSmiTagging::SmiToInt(value);
55199d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  }
55209d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
5521bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  V8_INLINE(static internal::Object* IntToSmi(int value)) {
5522bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    return PlatformSmiTagging::IntToSmi(value);
5523bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  }
5524bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
5525bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  V8_INLINE(static bool IsValidSmi(intptr_t value)) {
5526bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    return PlatformSmiTagging::IsValidSmi(value);
5527bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  }
5528bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
552932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static int GetInstanceType(internal::Object* obj)) {
55309d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    typedef internal::Object O;
55319d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    O* map = ReadField<O*>(obj, kHeapObjectMapOffset);
55329d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    return ReadField<uint8_t>(map, kMapInstanceTypeOffset);
55339d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  }
55349d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
553532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static int GetOddballKind(internal::Object* obj)) {
5536fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org    typedef internal::Object O;
5537fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org    return SmiValue(ReadField<O*>(obj, kOddballKindOffset));
5538fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  }
5539fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org
554032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static bool IsExternalTwoByteString(int instance_type)) {
554118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    int representation = (instance_type & kFullStringRepresentationMask);
554218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    return representation == kExternalTwoByteRepresentationTag;
554318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  }
554418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
554546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  V8_INLINE(static uint8_t GetNodeFlag(internal::Object** obj, int shift)) {
554646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org      uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
5547594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org      return *addr & static_cast<uint8_t>(1U << shift);
554846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  }
554946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
555046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  V8_INLINE(static void UpdateNodeFlag(internal::Object** obj,
555146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                                       bool value, int shift)) {
555246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org      uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
5553594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org      uint8_t mask = static_cast<uint8_t>(1 << shift);
5554594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org      *addr = static_cast<uint8_t>((*addr & ~mask) | (value << shift));
555546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  }
555646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
5557d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  V8_INLINE(static uint8_t GetNodeState(internal::Object** obj)) {
5558d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org    uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
5559d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org    return *addr & kNodeStateMask;
5560d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  }
5561d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
5562d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  V8_INLINE(static void UpdateNodeState(internal::Object** obj,
5563d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org                                        uint8_t value)) {
5564d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org    uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
5565594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    *addr = static_cast<uint8_t>((*addr & ~kNodeStateMask) | value);
5566d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  }
5567d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
556832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static void SetEmbedderData(v8::Isolate* isolate, void* data)) {
5569efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org    uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) +
5570efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org        kIsolateEmbedderDataOffset;
5571efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org    *reinterpret_cast<void**>(addr) = data;
5572efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  }
5573efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
557432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static void* GetEmbedderData(v8::Isolate* isolate)) {
5575efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org    uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) +
5576efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org        kIsolateEmbedderDataOffset;
5577efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org    return *reinterpret_cast<void**>(addr);
5578efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  }
5579efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
558032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static internal::Object** GetRoot(v8::Isolate* isolate,
558132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org                                              int index)) {
5582efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org    uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + kIsolateRootsOffset;
5583efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org    return reinterpret_cast<internal::Object**>(addr + index * kApiPointerSize);
5584efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  }
5585efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
558618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  template <typename T>
558732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static T ReadField(Object* ptr, int offset)) {
558818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    uint8_t* addr = reinterpret_cast<uint8_t*>(ptr) + offset - kHeapObjectTag;
558918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    return *reinterpret_cast<T*>(addr);
559018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  }
5591ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
5592eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  template <typename T>
559332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static T ReadEmbedderData(Context* context, int index)) {
5594eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    typedef internal::Object O;
5595eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    typedef internal::Internals I;
5596eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    O* ctx = *reinterpret_cast<O**>(context);
5597eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    int embedder_data_offset = I::kContextHeaderSize +
5598eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org        (internal::kApiPointerSize * I::kContextEmbedderDataIndex);
5599eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    O* embedder_data = I::ReadField<O*>(ctx, embedder_data_offset);
5600eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    int value_offset =
5601eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org        I::kFixedArrayHeaderSize + (internal::kApiPointerSize * index);
5602eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    return I::ReadField<T>(embedder_data, value_offset);
5603eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  }
5604eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
560532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static bool CanCastToHeapObject(void* o)) { return false; }
560632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static bool CanCastToHeapObject(Context* o)) { return true; }
560732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static bool CanCastToHeapObject(String* o)) { return true; }
560832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static bool CanCastToHeapObject(Object* o)) { return true; }
560932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static bool CanCastToHeapObject(Message* o)) { return true; }
561032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static bool CanCastToHeapObject(StackTrace* o)) { return true; }
561132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  V8_INLINE(static bool CanCastToHeapObject(StackFrame* o)) { return true; }
561218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org};
561318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
5614f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org}  // namespace internal
561518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
561618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
561743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentemplate <class T>
561843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenLocal<T>::Local() : Handle<T>() { }
561943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
562043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
562143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentemplate <class T>
562243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenLocal<T> Local<T>::New(Handle<T> that) {
562343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (that.IsEmpty()) return Local<T>();
5624ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  T* that_ptr = *that;
5625ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr);
5626ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  if (internal::Internals::CanCastToHeapObject(that_ptr)) {
5627ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(
5628ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        reinterpret_cast<internal::HeapObject*>(*p))));
5629ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
563043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(*p)));
563143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
563243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
563343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
563443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentemplate <class T>
5635d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.orgLocal<T> Local<T>::New(Isolate* isolate, Handle<T> that) {
563657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  return New(isolate, that.val_);
563757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org}
563857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
563957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#ifndef V8_USE_UNSAFE_HANDLES
564057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgtemplate <class T>
564157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgLocal<T> Local<T>::New(Isolate* isolate, const Persistent<T>& that) {
564257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  return New(isolate, that.val_);
564357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org}
564457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
564557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgtemplate <class T>
564657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgHandle<T> Handle<T>::New(Isolate* isolate, T* that) {
564757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  if (that == NULL) return Handle<T>();
564857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  T* that_ptr = that;
564957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr);
565057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  return Handle<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(
565157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org      reinterpret_cast<internal::Isolate*>(isolate), *p)));
565257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org}
565357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#endif
565457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
565557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
565657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgtemplate <class T>
565757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgLocal<T> Local<T>::New(Isolate* isolate, T* that) {
565857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  if (that == NULL) return Local<T>();
565957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  T* that_ptr = that;
566032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr);
566132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(
566232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org      reinterpret_cast<internal::Isolate*>(isolate), *p)));
566332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org}
566432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
566532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
5666594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgtemplate<class T>
5667594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgint Local<T>::Eternalize(Isolate* isolate) {
5668594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  return V8::Eternalize(reinterpret_cast<internal::Isolate*>(isolate),
5669594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org                        reinterpret_cast<internal::Object**>(this->val_));
5670594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org}
5671594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
5672594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
5673594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgtemplate<class T>
5674594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgLocal<T> Local<T>::GetEternal(Isolate* isolate, int index) {
5675594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  internal::Object** handle =
5676594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org      V8::GetEternal(reinterpret_cast<internal::Isolate*>(isolate), index);
5677594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  return Local<T>(T::Cast(reinterpret_cast<Value*>(handle)));
5678594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org}
5679594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
5680594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
5681f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org#ifdef V8_USE_UNSAFE_HANDLES
568232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orgtemplate <class T>
568343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenPersistent<T> Persistent<T>::New(Handle<T> that) {
568457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  return New(Isolate::GetCurrent(), that.val_);
5685d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org}
5686d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
5687d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
5688d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.orgtemplate <class T>
5689d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.orgPersistent<T> Persistent<T>::New(Isolate* isolate, Handle<T> that) {
569057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  return New(Isolate::GetCurrent(), that.val_);
569157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org}
569257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
569357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgtemplate <class T>
569457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgPersistent<T> Persistent<T>::New(Isolate* isolate, Persistent<T> that) {
569557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  return New(Isolate::GetCurrent(), that.val_);
569657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org}
569757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#endif
569857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
5699f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org
570057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgtemplate <class T>
5701f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.orgT* Persistent<T>::New(Isolate* isolate, T* that) {
5702f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org  if (that == NULL) return NULL;
570357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  internal::Object** p = reinterpret_cast<internal::Object**>(that);
5704f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org  return reinterpret_cast<T*>(
5705d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org      V8::GlobalizeReference(reinterpret_cast<internal::Isolate*>(isolate),
5706f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org                             p));
570743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
570843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
570943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
571043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentemplate <class T>
571189e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.orgbool Persistent<T>::IsIndependent() const {
571246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  typedef internal::Internals I;
5713e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  if (this->IsEmpty()) return false;
571457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  return I::GetNodeFlag(reinterpret_cast<internal::Object**>(this->val_),
571546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                        I::kNodeIsIndependentShift);
5716e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org}
5717e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
5718e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
5719e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgtemplate <class T>
57203291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgbool Persistent<T>::IsNearDeath() const {
5721d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  typedef internal::Internals I;
572243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this->IsEmpty()) return false;
5723c16e8281e6e3e3b57e157b62d5a1ca530e23e4bfdanno@chromium.org  uint8_t node_state =
5724c16e8281e6e3e3b57e157b62d5a1ca530e23e4bfdanno@chromium.org      I::GetNodeState(reinterpret_cast<internal::Object**>(this->val_));
5725c16e8281e6e3e3b57e157b62d5a1ca530e23e4bfdanno@chromium.org  return node_state == I::kNodeStateIsNearDeathValue ||
5726c16e8281e6e3e3b57e157b62d5a1ca530e23e4bfdanno@chromium.org      node_state == I::kNodeStateIsPendingValue;
572743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
572843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
572943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
573043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentemplate <class T>
57313291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgbool Persistent<T>::IsWeak() const {
5732d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  typedef internal::Internals I;
573332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  if (this->IsEmpty()) return false;
573457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  return I::GetNodeState(reinterpret_cast<internal::Object**>(this->val_)) ==
5735d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org      I::kNodeStateIsWeakValue;
573632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org}
573732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
573832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
573932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orgtemplate <class T>
574043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Persistent<T>::Dispose() {
5741a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  if (this->IsEmpty()) return;
5742a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  V8::DisposeGlobal(reinterpret_cast<internal::Object**>(this->val_));
5743a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org#ifndef V8_USE_UNSAFE_HANDLES
5744a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  val_ = 0;
5745a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org#endif
574643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
574743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
574843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
574943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentemplate <class T>
575057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgtemplate <typename S, typename P>
575157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgvoid Persistent<T>::MakeWeak(
575257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    P* parameters,
575357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    typename WeakReferenceCallbacks<S, P>::Revivable callback) {
575457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  TYPE_CHECK(S, T);
575557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  typedef typename WeakReferenceCallbacks<Value, void>::Revivable Revivable;
5756b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  V8::MakeWeak(reinterpret_cast<internal::Object**>(this->val_),
575718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org               parameters,
575879e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org               reinterpret_cast<Revivable>(callback));
575943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
576043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
576157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
576257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgtemplate <class T>
576357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgtemplate <typename P>
576457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgvoid Persistent<T>::MakeWeak(
576557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    P* parameters,
576657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    typename WeakReferenceCallbacks<T, P>::Revivable callback) {
5767b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  MakeWeak<T, P>(parameters, callback);
576857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org}
576957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
577057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
577143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentemplate <class T>
5772f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.orgtemplate <typename S, typename P>
5773f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.orgvoid Persistent<T>::MakeWeak(
5774f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org    Isolate* isolate,
5775f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org    P* parameters,
5776f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org    typename WeakReferenceCallbacks<S, P>::Revivable callback) {
5777f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org  MakeWeak<S, P>(parameters, callback);
5778f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org}
5779f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org
5780f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org
5781f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.orgtemplate <class T>
5782f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.orgtemplate<typename P>
5783f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.orgvoid Persistent<T>::MakeWeak(
5784f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org    Isolate* isolate,
5785f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org    P* parameters,
5786f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org    typename WeakReferenceCallbacks<T, P>::Revivable callback) {
5787f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org  MakeWeak<P>(parameters, callback);
5788f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org}
5789f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org
5790f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org
5791f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.orgtemplate <class T>
579243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Persistent<T>::ClearWeak() {
5793b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  V8::ClearWeak(reinterpret_cast<internal::Object**>(this->val_));
5794d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org}
5795d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
579643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5797b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.orgtemplate <class T>
5798c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.orgvoid Persistent<T>::MarkIndependent() {
579946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  typedef internal::Internals I;
580046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  if (this->IsEmpty()) return;
580157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(this->val_),
5802d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org                    true,
5803d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org                    I::kNodeIsIndependentShift);
5804e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org}
5805e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
5806e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
5807e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgtemplate <class T>
5808b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.orgvoid Persistent<T>::MarkPartiallyDependent() {
580946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  typedef internal::Internals I;
581046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  if (this->IsEmpty()) return;
581157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(this->val_),
5812d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org                    true,
5813d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org                    I::kNodeIsPartiallyDependentShift);
5814e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org}
5815e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
5816906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org
5817d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.orgtemplate <class T>
581857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgvoid Persistent<T>::Reset(Isolate* isolate, const Handle<T>& other) {
581957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  Dispose(isolate);
582057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#ifdef V8_USE_UNSAFE_HANDLES
582157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  *this = *New(isolate, other);
582257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#else
582357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  if (other.IsEmpty()) {
582457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    this->val_ = NULL;
582557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    return;
582657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
582757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  internal::Object** p = reinterpret_cast<internal::Object**>(other.val_);
582857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  this->val_ = reinterpret_cast<T*>(
582957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org      V8::GlobalizeReference(reinterpret_cast<internal::Isolate*>(isolate), p));
583057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org#endif
583157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org}
583257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
5833906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org
5834b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org#ifndef V8_USE_UNSAFE_HANDLES
5835b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.orgtemplate <class T>
5836b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.orgvoid Persistent<T>::Reset(Isolate* isolate, const Persistent<T>& other) {
5837b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  Dispose(isolate);
5838b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  if (other.IsEmpty()) {
5839b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org    this->val_ = NULL;
5840b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org    return;
5841b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  }
5842b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  internal::Object** p = reinterpret_cast<internal::Object**>(other.val_);
5843b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  this->val_ = reinterpret_cast<T*>(
5844b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org      V8::GlobalizeReference(reinterpret_cast<internal::Isolate*>(isolate), p));
5845b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org}
5846b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org#endif
5847b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org
5848b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org
5849906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.orgtemplate <class T>
5850906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.orgT* Persistent<T>::ClearAndLeak() {
5851906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  T* old;
5852906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org#ifdef V8_USE_UNSAFE_HANDLES
5853906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  old = **this;
5854906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  *this = Persistent<T>();
5855906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org#else
5856906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  old = val_;
5857906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  val_ = NULL;
5858906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org#endif
5859906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  return old;
5860906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org}
5861906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org
5862906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org
586357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgtemplate <class T>
5864b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.orgvoid Persistent<T>::SetWrapperClassId(uint16_t class_id) {
586546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  typedef internal::Internals I;
5866d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  if (this->IsEmpty()) return;
586757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  internal::Object** obj = reinterpret_cast<internal::Object**>(this->val_);
586846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset;
586946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  *reinterpret_cast<uint16_t*>(addr) = class_id;
5870b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org}
587169ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
5872d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
5873d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.orgtemplate <class T>
5874b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.orguint16_t Persistent<T>::WrapperClassId() const {
587546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  typedef internal::Internals I;
5876d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  if (this->IsEmpty()) return 0;
587757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  internal::Object** obj = reinterpret_cast<internal::Object**>(this->val_);
587846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset;
587946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  return *reinterpret_cast<uint16_t*>(addr);
588089e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org}
588189e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
5882bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
5883bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
5884bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgReturnValue<T>::ReturnValue(internal::Object** slot) : value_(slot) {}
5885bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
5886bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
5887c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgtemplate<typename S>
5888c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid ReturnValue<T>::Set(const Persistent<S>& handle) {
5889c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  TYPE_CHECK(T, S);
5890b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  if (V8_UNLIKELY(handle.IsEmpty())) {
58918a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org    *value_ = GetDefaultValue();
5892b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  } else {
5893b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org    *value_ = *reinterpret_cast<internal::Object**>(*handle);
5894b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  }
5895bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
5896bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
5897bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
5898c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgtemplate<typename S>
5899c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid ReturnValue<T>::Set(const Handle<S> handle) {
5900c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  TYPE_CHECK(T, S);
5901b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  if (V8_UNLIKELY(handle.IsEmpty())) {
59028a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org    *value_ = GetDefaultValue();
5903b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  } else {
5904b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org    *value_ = *reinterpret_cast<internal::Object**>(*handle);
5905b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  }
5906bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
5907bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
5908bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
590953ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.orgvoid ReturnValue<T>::Set(double i) {
5910b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  TYPE_CHECK(T, Number);
591153ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  Set(Number::New(GetIsolate(), i));
5912bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
5913bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
5914bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
591553ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.orgvoid ReturnValue<T>::Set(int32_t i) {
5916b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  TYPE_CHECK(T, Integer);
5917bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  typedef internal::Internals I;
5918bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  if (V8_LIKELY(I::IsValidSmi(i))) {
5919bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    *value_ = I::IntToSmi(i);
5920bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    return;
5921bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  }
592253ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  Set(Integer::New(i, GetIsolate()));
5923bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
5924bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
5925bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
592653ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.orgvoid ReturnValue<T>::Set(uint32_t i) {
5927b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  TYPE_CHECK(T, Integer);
5928bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  typedef internal::Internals I;
59291fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  // Can't simply use INT32_MAX here for whatever reason.
5930594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  bool fits_into_int32_t = (i & (1U << 31)) == 0;
59311fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  if (V8_LIKELY(fits_into_int32_t)) {
59321fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    Set(static_cast<int32_t>(i));
5933bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    return;
5934bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  }
593553ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  Set(Integer::NewFromUnsigned(i, GetIsolate()));
5936bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
5937bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
5938bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
593953ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.orgvoid ReturnValue<T>::Set(bool value) {
5940b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  TYPE_CHECK(T, Boolean);
594153ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  typedef internal::Internals I;
594253ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  int root_index;
5943bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  if (value) {
594453ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org    root_index = I::kTrueValueRootIndex;
5945bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  } else {
594653ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org    root_index = I::kFalseValueRootIndex;
5947bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  }
594853ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  *value_ = *I::GetRoot(GetIsolate(), root_index);
5949bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
5950bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
5951bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
595253ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.orgvoid ReturnValue<T>::SetNull() {
5953b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  TYPE_CHECK(T, Primitive);
5954bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  typedef internal::Internals I;
595553ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  *value_ = *I::GetRoot(GetIsolate(), I::kNullValueRootIndex);
5956bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
5957bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
5958bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
595953ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.orgvoid ReturnValue<T>::SetUndefined() {
5960b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  TYPE_CHECK(T, Primitive);
5961bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  typedef internal::Internals I;
596253ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  *value_ = *I::GetRoot(GetIsolate(), I::kUndefinedValueRootIndex);
5963bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
5964bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
5965bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
5966837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.orgvoid ReturnValue<T>::SetEmptyString() {
5967b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  TYPE_CHECK(T, String);
5968837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  typedef internal::Internals I;
5969837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  *value_ = *I::GetRoot(GetIsolate(), I::kEmptyStringRootIndex);
5970837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org}
5971837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org
5972837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.orgtemplate<typename T>
597353ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.orgIsolate* ReturnValue<T>::GetIsolate() {
59748a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org  // Isolate is always the pointer below the default value on the stack.
59758a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org  return *reinterpret_cast<Isolate**>(&value_[-2]);
59768a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org}
59778a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org
59788a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.orgtemplate<typename T>
59798a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.orginternal::Object* ReturnValue<T>::GetDefaultValue() {
59808a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org  // Default value is always the pointer below value_ on the stack.
59818a00e82ec5c3dbedfd3dcb56996c7df2452da4a5verwaest@chromium.org  return value_[-1];
5982bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
5983bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
5984bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
5985bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
5986bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgFunctionCallbackInfo<T>::FunctionCallbackInfo(internal::Object** implicit_args,
5987bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                                              internal::Object** values,
5988bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                                              int length,
5989bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                                              bool is_construct_call)
5990e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    : implicit_args_(implicit_args),
5991e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org      values_(values),
5992e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org      length_(length),
5993e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org      is_construct_call_(is_construct_call) { }
599469ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
599569ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
5996bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgArguments::Arguments(internal::Object** args,
5997bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                     internal::Object** values,
5998bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                     int length,
5999bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                     bool is_construct_call)
6000bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org    : FunctionCallbackInfo<Value>(args, values, length, is_construct_call) { }
6001bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
6002bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
6003bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6004bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgLocal<Value> FunctionCallbackInfo<T>::operator[](int i) const {
600543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (i < 0 || length_ <= i) return Local<Value>(*Undefined());
600643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return Local<Value>(reinterpret_cast<Value*>(values_ - i));
600743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
600843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
600943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6010bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6011bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgLocal<Function> FunctionCallbackInfo<T>::Callee() const {
6012e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  return Local<Function>(reinterpret_cast<Function*>(
6013e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org      &implicit_args_[kCalleeIndex]));
601443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
601543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
601643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6017bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6018bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgLocal<Object> FunctionCallbackInfo<T>::This() const {
601943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return Local<Object>(reinterpret_cast<Object*>(values_ + 1));
602043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
602143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
602243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6023bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6024bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgLocal<Object> FunctionCallbackInfo<T>::Holder() const {
6025e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  return Local<Object>(reinterpret_cast<Object*>(
6026e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org      &implicit_args_[kHolderIndex]));
602743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
602843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
602943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6030bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6031bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgLocal<Value> FunctionCallbackInfo<T>::Data() const {
6032e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  return Local<Value>(reinterpret_cast<Value*>(&implicit_args_[kDataIndex]));
603343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
603443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
603543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6036bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6037bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgIsolate* FunctionCallbackInfo<T>::GetIsolate() const {
603828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  return *reinterpret_cast<Isolate**>(&implicit_args_[kIsolateIndex]);
603928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org}
604028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
604128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
6042bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6043bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgReturnValue<T> FunctionCallbackInfo<T>::GetReturnValue() const {
6044bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  return ReturnValue<T>(&implicit_args_[kReturnValueIndex]);
6045bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
6046bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
6047bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
6048bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6049bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgbool FunctionCallbackInfo<T>::IsConstructCall() const {
605043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return is_construct_call_;
605143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
605243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
605343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6054bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6055bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgint FunctionCallbackInfo<T>::Length() const {
605643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return length_;
605743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
605843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
605943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
606043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentemplate <class T>
606143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenLocal<T> HandleScope::Close(Handle<T> value) {
606218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  internal::Object** before = reinterpret_cast<internal::Object**>(*value);
606318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  internal::Object** after = RawClose(before);
606443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return Local<T>(reinterpret_cast<T*>(after));
606543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
606643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
60675a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgHandle<Value> ScriptOrigin::ResourceName() const {
606843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return resource_name_;
606943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
607043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
607143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
60725a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgHandle<Integer> ScriptOrigin::ResourceLineOffset() const {
607343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return resource_line_offset_;
607443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
607543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
607643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
60775a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgHandle<Integer> ScriptOrigin::ResourceColumnOffset() const {
607843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return resource_column_offset_;
607943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
608043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6081d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgHandle<Boolean> ScriptOrigin::ResourceIsSharedCrossOrigin() const {
6082d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  return resource_is_shared_cross_origin_;
6083d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org}
6084d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
608543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
608643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenHandle<Boolean> Boolean::New(bool value) {
608743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return value ? True() : False();
608843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
608943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
609043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
609143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Template::Set(const char* name, v8::Handle<Data> value) {
609243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Set(v8::String::New(name), value);
609343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
609443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
609543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
609618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgLocal<Value> Object::GetInternalField(int index) {
609718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifndef V8_ENABLE_CHECKS
609818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  typedef internal::Object O;
609918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  typedef internal::Internals I;
610018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  O* obj = *reinterpret_cast<O**>(this);
6101eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  // Fast path: If the object is a plain JSObject, which is the common case, we
6102eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  // know where to find the internal fields and can return the value directly.
61039d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  if (I::GetInstanceType(obj) == I::kJSObjectType) {
61044a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com    int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index);
610518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    O* value = I::ReadField<O*>(obj, offset);
610618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    O** result = HandleScope::CreateHandle(value);
610718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    return Local<Value>(reinterpret_cast<Value*>(result));
610818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  }
610918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
6110eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  return SlowGetInternalField(index);
611118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
611218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
611318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
6114eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgvoid* Object::GetAlignedPointerFromInternalField(int index) {
6115eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org#ifndef V8_ENABLE_CHECKS
61169d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  typedef internal::Object O;
61179d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  typedef internal::Internals I;
61189d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  O* obj = *reinterpret_cast<O**>(this);
6119eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  // Fast path: If the object is a plain JSObject, which is the common case, we
6120eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  // know where to find the internal fields and can return the value directly.
6121ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  if (V8_LIKELY(I::GetInstanceType(obj) == I::kJSObjectType)) {
61224a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com    int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index);
6123eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    return I::ReadField<void*>(obj, offset);
61249d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  }
6125eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org#endif
6126eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  return SlowGetAlignedPointerFromInternalField(index);
612718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
612818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
612918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
613018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgString* String::Cast(v8::Value* value) {
613118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
613218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  CheckCast(value);
613318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
613418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return static_cast<String*>(value);
613518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
613618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
613718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
6138efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgLocal<String> String::Empty(Isolate* isolate) {
6139efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  typedef internal::Object* S;
6140efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  typedef internal::Internals I;
61411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  I::CheckInitialized(isolate);
61424a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  S* slot = I::GetRoot(isolate, I::kEmptyStringRootIndex);
6143efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  return Local<String>(reinterpret_cast<String*>(slot));
6144efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org}
6145efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
6146efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
614732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgLocal<String> String::New(const char* data, int length) {
614832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  return NewFromUtf8(Isolate::GetCurrent(), data, kNormalString, length);
614932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org}
615032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
615132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
615232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgLocal<String> String::New(const uint16_t* data, int length) {
615332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  return NewFromTwoByte(Isolate::GetCurrent(), data, kNormalString, length);
615432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org}
615532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
615632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
615732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgLocal<String> String::NewSymbol(const char* data, int length) {
615832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  return NewFromUtf8(Isolate::GetCurrent(), data, kInternalizedString, length);
615932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org}
616032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
616132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
616232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgLocal<String> String::NewUndetectable(const char* data, int length) {
616332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  return NewFromUtf8(Isolate::GetCurrent(), data, kUndetectableString, length);
616432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org}
616532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
616632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
616732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgLocal<String> String::NewUndetectable(const uint16_t* data, int length) {
616832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  return NewFromTwoByte(
616932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org      Isolate::GetCurrent(), data, kUndetectableString, length);
617032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org}
617132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
617232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
617318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgString::ExternalStringResource* String::GetExternalStringResource() const {
617418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  typedef internal::Object O;
617518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  typedef internal::Internals I;
617618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  O* obj = *reinterpret_cast<O**>(const_cast<String*>(this));
617718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  String::ExternalStringResource* result;
61789d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  if (I::IsExternalTwoByteString(I::GetInstanceType(obj))) {
617918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    void* value = I::ReadField<void*>(obj, I::kStringResourceOffset);
618018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    result = reinterpret_cast<String::ExternalStringResource*>(value);
618118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  } else {
618218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    result = NULL;
618318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  }
618418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
618518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  VerifyExternalStringResource(result);
618618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
618718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return result;
618818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
618918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
619018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
619156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.orgString::ExternalStringResourceBase* String::GetExternalStringResourceBase(
619256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    String::Encoding* encoding_out) const {
619356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  typedef internal::Object O;
619456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  typedef internal::Internals I;
619556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  O* obj = *reinterpret_cast<O**>(const_cast<String*>(this));
619656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  int type = I::GetInstanceType(obj) & I::kFullStringRepresentationMask;
619756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  *encoding_out = static_cast<Encoding>(type & I::kStringEncodingMask);
619856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  ExternalStringResourceBase* resource = NULL;
619956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  if (type == I::kExternalAsciiRepresentationTag ||
620056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org      type == I::kExternalTwoByteRepresentationTag) {
620156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    void* value = I::ReadField<void*>(obj, I::kStringResourceOffset);
620256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    resource = static_cast<ExternalStringResourceBase*>(value);
620356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  }
620456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org#ifdef V8_ENABLE_CHECKS
620556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    VerifyExternalStringResourceBase(resource, *encoding_out);
620656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org#endif
620756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  return resource;
620856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org}
620956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
621056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
6211fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.orgbool Value::IsUndefined() const {
6212fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org#ifdef V8_ENABLE_CHECKS
6213fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  return FullIsUndefined();
6214fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org#else
6215fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  return QuickIsUndefined();
6216fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org#endif
6217fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org}
6218fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org
6219fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.orgbool Value::QuickIsUndefined() const {
6220fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  typedef internal::Object O;
6221fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  typedef internal::Internals I;
6222fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  O* obj = *reinterpret_cast<O**>(const_cast<Value*>(this));
6223fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  if (!I::HasHeapObjectTag(obj)) return false;
6224fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  if (I::GetInstanceType(obj) != I::kOddballType) return false;
6225fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  return (I::GetOddballKind(obj) == I::kUndefinedOddballKind);
6226fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org}
6227fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org
6228fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org
6229fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.orgbool Value::IsNull() const {
6230fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org#ifdef V8_ENABLE_CHECKS
6231fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  return FullIsNull();
6232fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org#else
6233fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  return QuickIsNull();
6234fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org#endif
6235fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org}
6236fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org
6237fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.orgbool Value::QuickIsNull() const {
6238fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  typedef internal::Object O;
6239fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  typedef internal::Internals I;
6240fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  O* obj = *reinterpret_cast<O**>(const_cast<Value*>(this));
6241fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  if (!I::HasHeapObjectTag(obj)) return false;
6242fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  if (I::GetInstanceType(obj) != I::kOddballType) return false;
6243fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  return (I::GetOddballKind(obj) == I::kNullOddballKind);
6244fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org}
6245fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org
6246fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org
624718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgbool Value::IsString() const {
624818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
624918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return FullIsString();
625018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#else
625118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return QuickIsString();
625218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
625318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
625418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
625518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgbool Value::QuickIsString() const {
625618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  typedef internal::Object O;
625718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  typedef internal::Internals I;
625818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  O* obj = *reinterpret_cast<O**>(const_cast<Value*>(this));
625918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  if (!I::HasHeapObjectTag(obj)) return false;
62609d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  return (I::GetInstanceType(obj) < I::kFirstNonstringType);
626118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
626218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
626318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
62641fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgtemplate <class T> Value* Value::Cast(T* value) {
62651fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  return static_cast<Value*>(value);
62661fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org}
62671fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
62681fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
6269e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgSymbol* Symbol::Cast(v8::Value* value) {
6270e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#ifdef V8_ENABLE_CHECKS
6271e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CheckCast(value);
6272e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif
6273e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return static_cast<Symbol*>(value);
6274e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
6275e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
6276e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
627718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgNumber* Number::Cast(v8::Value* value) {
627818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
627918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  CheckCast(value);
628018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
628118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return static_cast<Number*>(value);
628218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
628318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
628418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
628518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgInteger* Integer::Cast(v8::Value* value) {
628618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
628718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  CheckCast(value);
628818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
628918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return static_cast<Integer*>(value);
629018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
629118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
629218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
629318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgDate* Date::Cast(v8::Value* value) {
629418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
629518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  CheckCast(value);
629618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
629718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return static_cast<Date*>(value);
629818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
629918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
630018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
630184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgStringObject* StringObject::Cast(v8::Value* value) {
630284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org#ifdef V8_ENABLE_CHECKS
630384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  CheckCast(value);
630484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org#endif
630584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  return static_cast<StringObject*>(value);
630684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org}
630784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
630884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
6309e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgSymbolObject* SymbolObject::Cast(v8::Value* value) {
6310e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#ifdef V8_ENABLE_CHECKS
6311e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CheckCast(value);
6312e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif
6313e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return static_cast<SymbolObject*>(value);
6314e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
6315e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
6316e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
631784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgNumberObject* NumberObject::Cast(v8::Value* value) {
631884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org#ifdef V8_ENABLE_CHECKS
631984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  CheckCast(value);
632084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org#endif
632184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  return static_cast<NumberObject*>(value);
632284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org}
632384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
632484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
632584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgBooleanObject* BooleanObject::Cast(v8::Value* value) {
632684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org#ifdef V8_ENABLE_CHECKS
632784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  CheckCast(value);
632884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org#endif
632984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  return static_cast<BooleanObject*>(value);
633084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org}
633184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
633284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
6333b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.orgRegExp* RegExp::Cast(v8::Value* value) {
6334b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org#ifdef V8_ENABLE_CHECKS
6335b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  CheckCast(value);
6336b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org#endif
6337b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  return static_cast<RegExp*>(value);
6338b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org}
6339b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org
6340b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org
634118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgObject* Object::Cast(v8::Value* value) {
634218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
634318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  CheckCast(value);
634418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
634518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return static_cast<Object*>(value);
634618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
634718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
634818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
634918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgArray* Array::Cast(v8::Value* value) {
635018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
635118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  CheckCast(value);
635218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
635318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return static_cast<Array*>(value);
635418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
635518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
635618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
6357ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.orgArrayBuffer* ArrayBuffer::Cast(v8::Value* value) {
6358ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org#ifdef V8_ENABLE_CHECKS
6359ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  CheckCast(value);
6360ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org#endif
6361ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  return static_cast<ArrayBuffer*>(value);
6362ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org}
6363ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
6364ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
63651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgArrayBufferView* ArrayBufferView::Cast(v8::Value* value) {
63661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#ifdef V8_ENABLE_CHECKS
63671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CheckCast(value);
63681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#endif
63691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  return static_cast<ArrayBufferView*>(value);
63701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
63711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
63721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
6373f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgTypedArray* TypedArray::Cast(v8::Value* value) {
6374f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#ifdef V8_ENABLE_CHECKS
6375f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  CheckCast(value);
6376f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#endif
6377f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return static_cast<TypedArray*>(value);
6378f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
6379f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6380f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6381f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgUint8Array* Uint8Array::Cast(v8::Value* value) {
6382f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#ifdef V8_ENABLE_CHECKS
6383f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  CheckCast(value);
6384f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#endif
6385f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return static_cast<Uint8Array*>(value);
6386f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
6387f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6388f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6389f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgInt8Array* Int8Array::Cast(v8::Value* value) {
6390f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#ifdef V8_ENABLE_CHECKS
6391f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  CheckCast(value);
6392f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#endif
6393f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return static_cast<Int8Array*>(value);
6394f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
6395f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6396f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6397f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgUint16Array* Uint16Array::Cast(v8::Value* value) {
6398f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#ifdef V8_ENABLE_CHECKS
6399f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  CheckCast(value);
6400f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#endif
6401f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return static_cast<Uint16Array*>(value);
6402f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
6403f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6404f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6405f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgInt16Array* Int16Array::Cast(v8::Value* value) {
6406f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#ifdef V8_ENABLE_CHECKS
6407f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  CheckCast(value);
6408f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#endif
6409f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return static_cast<Int16Array*>(value);
6410f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
6411f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6412f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6413f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgUint32Array* Uint32Array::Cast(v8::Value* value) {
6414f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#ifdef V8_ENABLE_CHECKS
6415f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  CheckCast(value);
6416f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#endif
6417f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return static_cast<Uint32Array*>(value);
6418f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
6419f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6420f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6421f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgInt32Array* Int32Array::Cast(v8::Value* value) {
6422f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#ifdef V8_ENABLE_CHECKS
6423f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  CheckCast(value);
6424f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#endif
6425f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return static_cast<Int32Array*>(value);
6426f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
6427f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6428f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6429f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgFloat32Array* Float32Array::Cast(v8::Value* value) {
6430f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#ifdef V8_ENABLE_CHECKS
6431f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  CheckCast(value);
6432f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#endif
6433f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return static_cast<Float32Array*>(value);
6434f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
6435f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6436f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6437f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgFloat64Array* Float64Array::Cast(v8::Value* value) {
6438f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#ifdef V8_ENABLE_CHECKS
6439f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  CheckCast(value);
6440f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org#endif
6441f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return static_cast<Float64Array*>(value);
6442f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
6443f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
6444f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
64451fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgUint8ClampedArray* Uint8ClampedArray::Cast(v8::Value* value) {
64461fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org#ifdef V8_ENABLE_CHECKS
64471fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  CheckCast(value);
64481fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org#endif
64491fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  return static_cast<Uint8ClampedArray*>(value);
64501fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org}
64511fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
64521fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
64531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgDataView* DataView::Cast(v8::Value* value) {
64541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#ifdef V8_ENABLE_CHECKS
64551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CheckCast(value);
64561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#endif
64571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  return static_cast<DataView*>(value);
64581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
64591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
64601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
646118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgFunction* Function::Cast(v8::Value* value) {
646218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
646318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  CheckCast(value);
646418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
646518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return static_cast<Function*>(value);
646618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
646718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
646818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
646918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgExternal* External::Cast(v8::Value* value) {
647018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_ENABLE_CHECKS
647118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  CheckCast(value);
647218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
647318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return static_cast<External*>(value);
647418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
647518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
647618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
6477bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6478bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgIsolate* PropertyCallbackInfo<T>::GetIsolate() const {
6479bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  return *reinterpret_cast<Isolate**>(&args_[kIsolateIndex]);
6480bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
6481bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
6482bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
6483bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6484bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgLocal<Value> PropertyCallbackInfo<T>::Data() const {
6485bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  return Local<Value>(reinterpret_cast<Value*>(&args_[kDataIndex]));
648628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org}
648728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
648828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
6489bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6490bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgLocal<Object> PropertyCallbackInfo<T>::This() const {
6491bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  return Local<Object>(reinterpret_cast<Object*>(&args_[kThisIndex]));
6492c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org}
6493c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
6494c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
6495bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6496bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgLocal<Object> PropertyCallbackInfo<T>::Holder() const {
6497bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  return Local<Object>(reinterpret_cast<Object*>(&args_[kHolderIndex]));
6498c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org}
6499c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
6500c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
6501bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
6502bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgReturnValue<T> PropertyCallbackInfo<T>::GetReturnValue() const {
6503bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  return ReturnValue<T>(&args_[kReturnValueIndex]);
6504c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org}
6505c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
6506c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
6507efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgHandle<Primitive> Undefined(Isolate* isolate) {
6508efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  typedef internal::Object* S;
6509efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  typedef internal::Internals I;
65101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  I::CheckInitialized(isolate);
6511efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  S* slot = I::GetRoot(isolate, I::kUndefinedValueRootIndex);
6512efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  return Handle<Primitive>(reinterpret_cast<Primitive*>(slot));
6513efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org}
6514efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
6515efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
6516efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgHandle<Primitive> Null(Isolate* isolate) {
6517efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  typedef internal::Object* S;
6518efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  typedef internal::Internals I;
65191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  I::CheckInitialized(isolate);
6520efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  S* slot = I::GetRoot(isolate, I::kNullValueRootIndex);
6521efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  return Handle<Primitive>(reinterpret_cast<Primitive*>(slot));
6522efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org}
6523efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
6524efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
6525efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgHandle<Boolean> True(Isolate* isolate) {
6526efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  typedef internal::Object* S;
6527efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  typedef internal::Internals I;
65281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  I::CheckInitialized(isolate);
6529efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  S* slot = I::GetRoot(isolate, I::kTrueValueRootIndex);
6530efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  return Handle<Boolean>(reinterpret_cast<Boolean*>(slot));
6531efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org}
6532efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
6533efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
6534efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgHandle<Boolean> False(Isolate* isolate) {
6535efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  typedef internal::Object* S;
6536efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  typedef internal::Internals I;
65371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  I::CheckInitialized(isolate);
6538efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  S* slot = I::GetRoot(isolate, I::kFalseValueRootIndex);
6539efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  return Handle<Boolean>(reinterpret_cast<Boolean*>(slot));
6540efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org}
6541efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
6542efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
6543efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgvoid Isolate::SetData(void* data) {
6544efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  typedef internal::Internals I;
6545efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  I::SetEmbedderData(this, data);
6546efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org}
6547efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
6548efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
6549efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgvoid* Isolate::GetData() {
6550efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  typedef internal::Internals I;
6551efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  return I::GetEmbedderData(this);
6552efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org}
6553efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
6554efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
6555eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgLocal<Value> Context::GetEmbedderData(int index) {
6556eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org#ifndef V8_ENABLE_CHECKS
6557eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  typedef internal::Object O;
6558eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  typedef internal::Internals I;
6559eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  O** result = HandleScope::CreateHandle(I::ReadEmbedderData<O*>(this, index));
6560eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  return Local<Value>(reinterpret_cast<Value*>(result));
6561eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org#else
6562eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  return SlowGetEmbedderData(index);
6563eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org#endif
6564eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org}
6565eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
6566eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
6567eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgvoid* Context::GetAlignedPointerFromEmbedderData(int index) {
6568eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org#ifndef V8_ENABLE_CHECKS
6569eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  typedef internal::Internals I;
6570eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  return I::ReadEmbedderData<void*>(this, index);
6571eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org#else
6572eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  return SlowGetAlignedPointerFromEmbedderData(index);
6573eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org#endif
6574eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org}
6575eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
6576eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
657743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
6578727e995b7bba3c57fb1e5c156d386ca11894f781v * \example shell.cc
6579727e995b7bba3c57fb1e5c156d386ca11894f781v * A simple shell that takes a list of expressions on the
658043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * command-line and executes them.
658143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
658243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
658343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
658443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
658543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * \example process.cc
658643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
658743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
658843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
658943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}  // namespace v8
659043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
659143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
659243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef TYPE_CHECK
659343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
659443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
65959258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org#endif  // V8_H_
6596