Home | History | Annotate | Download | only in include
      1 // Copyright 2012 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 /** \mainpage V8 API Reference Guide
      6  *
      7  * V8 is Google's open source JavaScript engine.
      8  *
      9  * This set of documents provides reference material generated from the
     10  * V8 header file, include/v8.h.
     11  *
     12  * For other documentation see http://code.google.com/apis/v8/
     13  */
     14 
     15 #ifndef V8_H_
     16 #define V8_H_
     17 
     18 #include "v8stdint.h"
     19 
     20 // We reserve the V8_* prefix for macros defined in V8 public API and
     21 // assume there are no name conflicts with the embedder's code.
     22 
     23 #ifdef V8_OS_WIN
     24 
     25 // Setup for Windows DLL export/import. When building the V8 DLL the
     26 // BUILDING_V8_SHARED needs to be defined. When building a program which uses
     27 // the V8 DLL USING_V8_SHARED needs to be defined. When either building the V8
     28 // static library or building a program which uses the V8 static library neither
     29 // BUILDING_V8_SHARED nor USING_V8_SHARED should be defined.
     30 #if defined(BUILDING_V8_SHARED) && defined(USING_V8_SHARED)
     31 #error both BUILDING_V8_SHARED and USING_V8_SHARED are set - please check the\
     32   build configuration to ensure that at most one of these is set
     33 #endif
     34 
     35 #ifdef BUILDING_V8_SHARED
     36 # define V8_EXPORT __declspec(dllexport)
     37 #elif USING_V8_SHARED
     38 # define V8_EXPORT __declspec(dllimport)
     39 #else
     40 # define V8_EXPORT
     41 #endif  // BUILDING_V8_SHARED
     42 
     43 #else  // V8_OS_WIN
     44 
     45 // Setup for Linux shared library export.
     46 #if V8_HAS_ATTRIBUTE_VISIBILITY && defined(V8_SHARED)
     47 # ifdef BUILDING_V8_SHARED
     48 #  define V8_EXPORT __attribute__ ((visibility("default")))
     49 # else
     50 #  define V8_EXPORT
     51 # endif
     52 #else
     53 # define V8_EXPORT
     54 #endif
     55 
     56 #endif  // V8_OS_WIN
     57 
     58 /**
     59  * The v8 JavaScript engine.
     60  */
     61 namespace v8 {
     62 
     63 class AccessorSignature;
     64 class Array;
     65 class Boolean;
     66 class BooleanObject;
     67 class Context;
     68 class CpuProfiler;
     69 class Data;
     70 class Date;
     71 class DeclaredAccessorDescriptor;
     72 class External;
     73 class Function;
     74 class FunctionTemplate;
     75 class HeapProfiler;
     76 class ImplementationUtilities;
     77 class Int32;
     78 class Integer;
     79 class Isolate;
     80 class Name;
     81 class Number;
     82 class NumberObject;
     83 class Object;
     84 class ObjectOperationDescriptor;
     85 class ObjectTemplate;
     86 class Platform;
     87 class Primitive;
     88 class RawOperationDescriptor;
     89 class Script;
     90 class Signature;
     91 class StackFrame;
     92 class StackTrace;
     93 class String;
     94 class StringObject;
     95 class Symbol;
     96 class SymbolObject;
     97 class Private;
     98 class Uint32;
     99 class Utils;
    100 class Value;
    101 template <class T> class Handle;
    102 template <class T> class Local;
    103 template <class T> class Eternal;
    104 template<class T> class NonCopyablePersistentTraits;
    105 template<class T> class PersistentBase;
    106 template<class T,
    107          class M = NonCopyablePersistentTraits<T> > class Persistent;
    108 template<class T> class UniquePersistent;
    109 template<class K, class V, class T> class PersistentValueMap;
    110 template<class V, class T> class PersistentValueVector;
    111 template<class T, class P> class WeakCallbackObject;
    112 class FunctionTemplate;
    113 class ObjectTemplate;
    114 class Data;
    115 template<typename T> class FunctionCallbackInfo;
    116 template<typename T> class PropertyCallbackInfo;
    117 class StackTrace;
    118 class StackFrame;
    119 class Isolate;
    120 class DeclaredAccessorDescriptor;
    121 class ObjectOperationDescriptor;
    122 class RawOperationDescriptor;
    123 class CallHandlerHelper;
    124 class EscapableHandleScope;
    125 template<typename T> class ReturnValue;
    126 
    127 namespace internal {
    128 class Arguments;
    129 class Heap;
    130 class HeapObject;
    131 class Isolate;
    132 class Object;
    133 struct StreamedSource;
    134 template<typename T> class CustomArguments;
    135 class PropertyCallbackArguments;
    136 class FunctionCallbackArguments;
    137 class GlobalHandles;
    138 }
    139 
    140 
    141 /**
    142  * General purpose unique identifier.
    143  */
    144 class UniqueId {
    145  public:
    146   explicit UniqueId(intptr_t data)
    147       : data_(data) {}
    148 
    149   bool operator==(const UniqueId& other) const {
    150     return data_ == other.data_;
    151   }
    152 
    153   bool operator!=(const UniqueId& other) const {
    154     return data_ != other.data_;
    155   }
    156 
    157   bool operator<(const UniqueId& other) const {
    158     return data_ < other.data_;
    159   }
    160 
    161  private:
    162   intptr_t data_;
    163 };
    164 
    165 // --- Handles ---
    166 
    167 #define TYPE_CHECK(T, S)                                       \
    168   while (false) {                                              \
    169     *(static_cast<T* volatile*>(0)) = static_cast<S*>(0);      \
    170   }
    171 
    172 
    173 /**
    174  * An object reference managed by the v8 garbage collector.
    175  *
    176  * All objects returned from v8 have to be tracked by the garbage
    177  * collector so that it knows that the objects are still alive.  Also,
    178  * because the garbage collector may move objects, it is unsafe to
    179  * point directly to an object.  Instead, all objects are stored in
    180  * handles which are known by the garbage collector and updated
    181  * whenever an object moves.  Handles should always be passed by value
    182  * (except in cases like out-parameters) and they should never be
    183  * allocated on the heap.
    184  *
    185  * There are two types of handles: local and persistent handles.
    186  * Local handles are light-weight and transient and typically used in
    187  * local operations.  They are managed by HandleScopes.  Persistent
    188  * handles can be used when storing objects across several independent
    189  * operations and have to be explicitly deallocated when they're no
    190  * longer used.
    191  *
    192  * It is safe to extract the object stored in the handle by
    193  * dereferencing the handle (for instance, to extract the Object* from
    194  * a Handle<Object>); the value will still be governed by a handle
    195  * behind the scenes and the same rules apply to these values as to
    196  * their handles.
    197  */
    198 template <class T> class Handle {
    199  public:
    200   /**
    201    * Creates an empty handle.
    202    */
    203   V8_INLINE Handle() : val_(0) {}
    204 
    205   /**
    206    * Creates a handle for the contents of the specified handle.  This
    207    * constructor allows you to pass handles as arguments by value and
    208    * to assign between handles.  However, if you try to assign between
    209    * incompatible handles, for instance from a Handle<String> to a
    210    * Handle<Number> it will cause a compile-time error.  Assigning
    211    * between compatible handles, for instance assigning a
    212    * Handle<String> to a variable declared as Handle<Value>, is legal
    213    * because String is a subclass of Value.
    214    */
    215   template <class S> V8_INLINE Handle(Handle<S> that)
    216       : val_(reinterpret_cast<T*>(*that)) {
    217     /**
    218      * This check fails when trying to convert between incompatible
    219      * handles. For example, converting from a Handle<String> to a
    220      * Handle<Number>.
    221      */
    222     TYPE_CHECK(T, S);
    223   }
    224 
    225   /**
    226    * Returns true if the handle is empty.
    227    */
    228   V8_INLINE bool IsEmpty() const { return val_ == 0; }
    229 
    230   /**
    231    * Sets the handle to be empty. IsEmpty() will then return true.
    232    */
    233   V8_INLINE void Clear() { val_ = 0; }
    234 
    235   V8_INLINE T* operator->() const { return val_; }
    236 
    237   V8_INLINE T* operator*() const { return val_; }
    238 
    239   /**
    240    * Checks whether two handles are the same.
    241    * Returns true if both are empty, or if the objects
    242    * to which they refer are identical.
    243    * The handles' references are not checked.
    244    */
    245   template <class S> V8_INLINE bool operator==(const Handle<S>& that) const {
    246     internal::Object** a = reinterpret_cast<internal::Object**>(this->val_);
    247     internal::Object** b = reinterpret_cast<internal::Object**>(that.val_);
    248     if (a == 0) return b == 0;
    249     if (b == 0) return false;
    250     return *a == *b;
    251   }
    252 
    253   template <class S> V8_INLINE bool operator==(
    254       const PersistentBase<S>& that) const {
    255     internal::Object** a = reinterpret_cast<internal::Object**>(this->val_);
    256     internal::Object** b = reinterpret_cast<internal::Object**>(that.val_);
    257     if (a == 0) return b == 0;
    258     if (b == 0) return false;
    259     return *a == *b;
    260   }
    261 
    262   /**
    263    * Checks whether two handles are different.
    264    * Returns true if only one of the handles is empty, or if
    265    * the objects to which they refer are different.
    266    * The handles' references are not checked.
    267    */
    268   template <class S> V8_INLINE bool operator!=(const Handle<S>& that) const {
    269     return !operator==(that);
    270   }
    271 
    272   template <class S> V8_INLINE bool operator!=(
    273       const Persistent<S>& that) const {
    274     return !operator==(that);
    275   }
    276 
    277   template <class S> V8_INLINE static Handle<T> Cast(Handle<S> that) {
    278 #ifdef V8_ENABLE_CHECKS
    279     // If we're going to perform the type check then we have to check
    280     // that the handle isn't empty before doing the checked cast.
    281     if (that.IsEmpty()) return Handle<T>();
    282 #endif
    283     return Handle<T>(T::Cast(*that));
    284   }
    285 
    286   template <class S> V8_INLINE Handle<S> As() {
    287     return Handle<S>::Cast(*this);
    288   }
    289 
    290   V8_INLINE static Handle<T> New(Isolate* isolate, Handle<T> that) {
    291     return New(isolate, that.val_);
    292   }
    293   V8_INLINE static Handle<T> New(Isolate* isolate,
    294                                  const PersistentBase<T>& that) {
    295     return New(isolate, that.val_);
    296   }
    297 
    298  private:
    299   friend class Utils;
    300   template<class F, class M> friend class Persistent;
    301   template<class F> friend class PersistentBase;
    302   template<class F> friend class Handle;
    303   template<class F> friend class Local;
    304   template<class F> friend class FunctionCallbackInfo;
    305   template<class F> friend class PropertyCallbackInfo;
    306   template<class F> friend class internal::CustomArguments;
    307   friend Handle<Primitive> Undefined(Isolate* isolate);
    308   friend Handle<Primitive> Null(Isolate* isolate);
    309   friend Handle<Boolean> True(Isolate* isolate);
    310   friend Handle<Boolean> False(Isolate* isolate);
    311   friend class Context;
    312   friend class HandleScope;
    313   friend class Object;
    314   friend class Private;
    315 
    316   /**
    317    * Creates a new handle for the specified value.
    318    */
    319   V8_INLINE explicit Handle(T* val) : val_(val) {}
    320 
    321   V8_INLINE static Handle<T> New(Isolate* isolate, T* that);
    322 
    323   T* val_;
    324 };
    325 
    326 
    327 /**
    328  * A light-weight stack-allocated object handle.  All operations
    329  * that return objects from within v8 return them in local handles.  They
    330  * are created within HandleScopes, and all local handles allocated within a
    331  * handle scope are destroyed when the handle scope is destroyed.  Hence it
    332  * is not necessary to explicitly deallocate local handles.
    333  */
    334 template <class T> class Local : public Handle<T> {
    335  public:
    336   V8_INLINE Local();
    337   template <class S> V8_INLINE Local(Local<S> that)
    338       : Handle<T>(reinterpret_cast<T*>(*that)) {
    339     /**
    340      * This check fails when trying to convert between incompatible
    341      * handles. For example, converting from a Handle<String> to a
    342      * Handle<Number>.
    343      */
    344     TYPE_CHECK(T, S);
    345   }
    346 
    347 
    348   template <class S> V8_INLINE static Local<T> Cast(Local<S> that) {
    349 #ifdef V8_ENABLE_CHECKS
    350     // If we're going to perform the type check then we have to check
    351     // that the handle isn't empty before doing the checked cast.
    352     if (that.IsEmpty()) return Local<T>();
    353 #endif
    354     return Local<T>(T::Cast(*that));
    355   }
    356   template <class S> V8_INLINE Local(Handle<S> that)
    357       : Handle<T>(reinterpret_cast<T*>(*that)) {
    358     TYPE_CHECK(T, S);
    359   }
    360 
    361   template <class S> V8_INLINE Local<S> As() {
    362     return Local<S>::Cast(*this);
    363   }
    364 
    365   /**
    366    * Create a local handle for the content of another handle.
    367    * The referee is kept alive by the local handle even when
    368    * the original handle is destroyed/disposed.
    369    */
    370   V8_INLINE static Local<T> New(Isolate* isolate, Handle<T> that);
    371   V8_INLINE static Local<T> New(Isolate* isolate,
    372                                 const PersistentBase<T>& that);
    373 
    374  private:
    375   friend class Utils;
    376   template<class F> friend class Eternal;
    377   template<class F> friend class PersistentBase;
    378   template<class F, class M> friend class Persistent;
    379   template<class F> friend class Handle;
    380   template<class F> friend class Local;
    381   template<class F> friend class FunctionCallbackInfo;
    382   template<class F> friend class PropertyCallbackInfo;
    383   friend class String;
    384   friend class Object;
    385   friend class Context;
    386   template<class F> friend class internal::CustomArguments;
    387   friend class HandleScope;
    388   friend class EscapableHandleScope;
    389   template<class F1, class F2, class F3> friend class PersistentValueMap;
    390   template<class F1, class F2> friend class PersistentValueVector;
    391 
    392   template <class S> V8_INLINE Local(S* that) : Handle<T>(that) { }
    393   V8_INLINE static Local<T> New(Isolate* isolate, T* that);
    394 };
    395 
    396 
    397 // Eternal handles are set-once handles that live for the life of the isolate.
    398 template <class T> class Eternal {
    399  public:
    400   V8_INLINE Eternal() : index_(kInitialValue) { }
    401   template<class S>
    402   V8_INLINE Eternal(Isolate* isolate, Local<S> handle) : index_(kInitialValue) {
    403     Set(isolate, handle);
    404   }
    405   // Can only be safely called if already set.
    406   V8_INLINE Local<T> Get(Isolate* isolate);
    407   V8_INLINE bool IsEmpty() { return index_ == kInitialValue; }
    408   template<class S> V8_INLINE void Set(Isolate* isolate, Local<S> handle);
    409 
    410  private:
    411   static const int kInitialValue = -1;
    412   int index_;
    413 };
    414 
    415 
    416 template<class T, class P>
    417 class WeakCallbackData {
    418  public:
    419   typedef void (*Callback)(const WeakCallbackData<T, P>& data);
    420 
    421   V8_INLINE Isolate* GetIsolate() const { return isolate_; }
    422   V8_INLINE Local<T> GetValue() const { return handle_; }
    423   V8_INLINE P* GetParameter() const { return parameter_; }
    424 
    425  private:
    426   friend class internal::GlobalHandles;
    427   WeakCallbackData(Isolate* isolate, Local<T> handle, P* parameter)
    428     : isolate_(isolate), handle_(handle), parameter_(parameter) { }
    429   Isolate* isolate_;
    430   Local<T> handle_;
    431   P* parameter_;
    432 };
    433 
    434 
    435 /**
    436  * An object reference that is independent of any handle scope.  Where
    437  * a Local handle only lives as long as the HandleScope in which it was
    438  * allocated, a PersistentBase handle remains valid until it is explicitly
    439  * disposed.
    440  *
    441  * A persistent handle contains a reference to a storage cell within
    442  * the v8 engine which holds an object value and which is updated by
    443  * the garbage collector whenever the object is moved.  A new storage
    444  * cell can be created using the constructor or PersistentBase::Reset and
    445  * existing handles can be disposed using PersistentBase::Reset.
    446  *
    447  */
    448 template <class T> class PersistentBase {
    449  public:
    450   /**
    451    * If non-empty, destroy the underlying storage cell
    452    * IsEmpty() will return true after this call.
    453    */
    454   V8_INLINE void Reset();
    455   /**
    456    * If non-empty, destroy the underlying storage cell
    457    * and create a new one with the contents of other if other is non empty
    458    */
    459   template <class S>
    460   V8_INLINE void Reset(Isolate* isolate, const Handle<S>& other);
    461 
    462   /**
    463    * If non-empty, destroy the underlying storage cell
    464    * and create a new one with the contents of other if other is non empty
    465    */
    466   template <class S>
    467   V8_INLINE void Reset(Isolate* isolate, const PersistentBase<S>& other);
    468 
    469   V8_INLINE bool IsEmpty() const { return val_ == 0; }
    470 
    471   template <class S>
    472   V8_INLINE bool operator==(const PersistentBase<S>& that) const {
    473     internal::Object** a = reinterpret_cast<internal::Object**>(this->val_);
    474     internal::Object** b = reinterpret_cast<internal::Object**>(that.val_);
    475     if (a == 0) return b == 0;
    476     if (b == 0) return false;
    477     return *a == *b;
    478   }
    479 
    480   template <class S> V8_INLINE bool operator==(const Handle<S>& that) const {
    481     internal::Object** a = reinterpret_cast<internal::Object**>(this->val_);
    482     internal::Object** b = reinterpret_cast<internal::Object**>(that.val_);
    483     if (a == 0) return b == 0;
    484     if (b == 0) return false;
    485     return *a == *b;
    486   }
    487 
    488   template <class S>
    489   V8_INLINE bool operator!=(const PersistentBase<S>& that) const {
    490     return !operator==(that);
    491   }
    492 
    493   template <class S> V8_INLINE bool operator!=(const Handle<S>& that) const {
    494     return !operator==(that);
    495   }
    496 
    497   /**
    498    *  Install a finalization callback on this object.
    499    *  NOTE: There is no guarantee as to *when* or even *if* the callback is
    500    *  invoked. The invocation is performed solely on a best effort basis.
    501    *  As always, GC-based finalization should *not* be relied upon for any
    502    *  critical form of resource management!
    503    */
    504   template<typename P>
    505   V8_INLINE void SetWeak(
    506       P* parameter,
    507       typename WeakCallbackData<T, P>::Callback callback);
    508 
    509   template<typename S, typename P>
    510   V8_INLINE void SetWeak(
    511       P* parameter,
    512       typename WeakCallbackData<S, P>::Callback callback);
    513 
    514   template<typename P>
    515   V8_INLINE P* ClearWeak();
    516 
    517   // TODO(dcarney): remove this.
    518   V8_INLINE void ClearWeak() { ClearWeak<void>(); }
    519 
    520   /**
    521    * Marks the reference to this object independent. Garbage collector is free
    522    * to ignore any object groups containing this object. Weak callback for an
    523    * independent handle should not assume that it will be preceded by a global
    524    * GC prologue callback or followed by a global GC epilogue callback.
    525    */
    526   V8_INLINE void MarkIndependent();
    527 
    528   /**
    529    * Marks the reference to this object partially dependent. Partially dependent
    530    * handles only depend on other partially dependent handles and these
    531    * dependencies are provided through object groups. It provides a way to build
    532    * smaller object groups for young objects that represent only a subset of all
    533    * external dependencies. This mark is automatically cleared after each
    534    * garbage collection.
    535    */
    536   V8_INLINE void MarkPartiallyDependent();
    537 
    538   V8_INLINE bool IsIndependent() const;
    539 
    540   /** Checks if the handle holds the only reference to an object. */
    541   V8_INLINE bool IsNearDeath() const;
    542 
    543   /** Returns true if the handle's reference is weak.  */
    544   V8_INLINE bool IsWeak() const;
    545 
    546   /**
    547    * Assigns a wrapper class ID to the handle. See RetainedObjectInfo interface
    548    * description in v8-profiler.h for details.
    549    */
    550   V8_INLINE void SetWrapperClassId(uint16_t class_id);
    551 
    552   /**
    553    * Returns the class ID previously assigned to this handle or 0 if no class ID
    554    * was previously assigned.
    555    */
    556   V8_INLINE uint16_t WrapperClassId() const;
    557 
    558  private:
    559   friend class Isolate;
    560   friend class Utils;
    561   template<class F> friend class Handle;
    562   template<class F> friend class Local;
    563   template<class F1, class F2> friend class Persistent;
    564   template<class F> friend class UniquePersistent;
    565   template<class F> friend class PersistentBase;
    566   template<class F> friend class ReturnValue;
    567   template<class F1, class F2, class F3> friend class PersistentValueMap;
    568   template<class F1, class F2> friend class PersistentValueVector;
    569   friend class Object;
    570 
    571   explicit V8_INLINE PersistentBase(T* val) : val_(val) {}
    572   PersistentBase(PersistentBase& other); // NOLINT
    573   void operator=(PersistentBase&);
    574   V8_INLINE static T* New(Isolate* isolate, T* that);
    575 
    576   T* val_;
    577 };
    578 
    579 
    580 /**
    581  * Default traits for Persistent. This class does not allow
    582  * use of the copy constructor or assignment operator.
    583  * At present kResetInDestructor is not set, but that will change in a future
    584  * version.
    585  */
    586 template<class T>
    587 class NonCopyablePersistentTraits {
    588  public:
    589   typedef Persistent<T, NonCopyablePersistentTraits<T> > NonCopyablePersistent;
    590   static const bool kResetInDestructor = false;
    591   template<class S, class M>
    592   V8_INLINE static void Copy(const Persistent<S, M>& source,
    593                              NonCopyablePersistent* dest) {
    594     Uncompilable<Object>();
    595   }
    596   // TODO(dcarney): come up with a good compile error here.
    597   template<class O> V8_INLINE static void Uncompilable() {
    598     TYPE_CHECK(O, Primitive);
    599   }
    600 };
    601 
    602 
    603 /**
    604  * Helper class traits to allow copying and assignment of Persistent.
    605  * This will clone the contents of storage cell, but not any of the flags, etc.
    606  */
    607 template<class T>
    608 struct CopyablePersistentTraits {
    609   typedef Persistent<T, CopyablePersistentTraits<T> > CopyablePersistent;
    610   static const bool kResetInDestructor = true;
    611   template<class S, class M>
    612   static V8_INLINE void Copy(const Persistent<S, M>& source,
    613                              CopyablePersistent* dest) {
    614     // do nothing, just allow copy
    615   }
    616 };
    617 
    618 
    619 /**
    620  * A PersistentBase which allows copy and assignment.
    621  *
    622  * Copy, assignment and destructor bevavior is controlled by the traits
    623  * class M.
    624  *
    625  * Note: Persistent class hierarchy is subject to future changes.
    626  */
    627 template <class T, class M> class Persistent : public PersistentBase<T> {
    628  public:
    629   /**
    630    * A Persistent with no storage cell.
    631    */
    632   V8_INLINE Persistent() : PersistentBase<T>(0) { }
    633   /**
    634    * Construct a Persistent from a Handle.
    635    * When the Handle is non-empty, a new storage cell is created
    636    * pointing to the same object, and no flags are set.
    637    */
    638   template <class S> V8_INLINE Persistent(Isolate* isolate, Handle<S> that)
    639       : PersistentBase<T>(PersistentBase<T>::New(isolate, *that)) {
    640     TYPE_CHECK(T, S);
    641   }
    642   /**
    643    * Construct a Persistent from a Persistent.
    644    * When the Persistent is non-empty, a new storage cell is created
    645    * pointing to the same object, and no flags are set.
    646    */
    647   template <class S, class M2>
    648   V8_INLINE Persistent(Isolate* isolate, const Persistent<S, M2>& that)
    649     : PersistentBase<T>(PersistentBase<T>::New(isolate, *that)) {
    650     TYPE_CHECK(T, S);
    651   }
    652   /**
    653    * The copy constructors and assignment operator create a Persistent
    654    * exactly as the Persistent constructor, but the Copy function from the
    655    * traits class is called, allowing the setting of flags based on the
    656    * copied Persistent.
    657    */
    658   V8_INLINE Persistent(const Persistent& that) : PersistentBase<T>(0) {
    659     Copy(that);
    660   }
    661   template <class S, class M2>
    662   V8_INLINE Persistent(const Persistent<S, M2>& that) : PersistentBase<T>(0) {
    663     Copy(that);
    664   }
    665   V8_INLINE Persistent& operator=(const Persistent& that) { // NOLINT
    666     Copy(that);
    667     return *this;
    668   }
    669   template <class S, class M2>
    670   V8_INLINE Persistent& operator=(const Persistent<S, M2>& that) { // NOLINT
    671     Copy(that);
    672     return *this;
    673   }
    674   /**
    675    * The destructor will dispose the Persistent based on the
    676    * kResetInDestructor flags in the traits class.  Since not calling dispose
    677    * can result in a memory leak, it is recommended to always set this flag.
    678    */
    679   V8_INLINE ~Persistent() {
    680     if (M::kResetInDestructor) this->Reset();
    681   }
    682 
    683   // TODO(dcarney): this is pretty useless, fix or remove
    684   template <class S>
    685   V8_INLINE static Persistent<T>& Cast(Persistent<S>& that) { // NOLINT
    686 #ifdef V8_ENABLE_CHECKS
    687     // If we're going to perform the type check then we have to check
    688     // that the handle isn't empty before doing the checked cast.
    689     if (!that.IsEmpty()) T::Cast(*that);
    690 #endif
    691     return reinterpret_cast<Persistent<T>&>(that);
    692   }
    693 
    694   // TODO(dcarney): this is pretty useless, fix or remove
    695   template <class S> V8_INLINE Persistent<S>& As() { // NOLINT
    696     return Persistent<S>::Cast(*this);
    697   }
    698 
    699   // This will be removed.
    700   V8_INLINE T* ClearAndLeak();
    701 
    702  private:
    703   friend class Isolate;
    704   friend class Utils;
    705   template<class F> friend class Handle;
    706   template<class F> friend class Local;
    707   template<class F1, class F2> friend class Persistent;
    708   template<class F> friend class ReturnValue;
    709 
    710   template <class S> V8_INLINE Persistent(S* that) : PersistentBase<T>(that) { }
    711   V8_INLINE T* operator*() const { return this->val_; }
    712   template<class S, class M2>
    713   V8_INLINE void Copy(const Persistent<S, M2>& that);
    714 };
    715 
    716 
    717 /**
    718  * A PersistentBase which has move semantics.
    719  *
    720  * Note: Persistent class hierarchy is subject to future changes.
    721  */
    722 template<class T>
    723 class UniquePersistent : public PersistentBase<T> {
    724   struct RValue {
    725     V8_INLINE explicit RValue(UniquePersistent* obj) : object(obj) {}
    726     UniquePersistent* object;
    727   };
    728 
    729  public:
    730   /**
    731    * A UniquePersistent with no storage cell.
    732    */
    733   V8_INLINE UniquePersistent() : PersistentBase<T>(0) { }
    734   /**
    735    * Construct a UniquePersistent from a Handle.
    736    * When the Handle is non-empty, a new storage cell is created
    737    * pointing to the same object, and no flags are set.
    738    */
    739   template <class S>
    740   V8_INLINE UniquePersistent(Isolate* isolate, Handle<S> that)
    741       : PersistentBase<T>(PersistentBase<T>::New(isolate, *that)) {
    742     TYPE_CHECK(T, S);
    743   }
    744   /**
    745    * Construct a UniquePersistent from a PersistentBase.
    746    * When the Persistent is non-empty, a new storage cell is created
    747    * pointing to the same object, and no flags are set.
    748    */
    749   template <class S>
    750   V8_INLINE UniquePersistent(Isolate* isolate, const PersistentBase<S>& that)
    751     : PersistentBase<T>(PersistentBase<T>::New(isolate, that.val_)) {
    752     TYPE_CHECK(T, S);
    753   }
    754   /**
    755    * Move constructor.
    756    */
    757   V8_INLINE UniquePersistent(RValue rvalue)
    758     : PersistentBase<T>(rvalue.object->val_) {
    759     rvalue.object->val_ = 0;
    760   }
    761   V8_INLINE ~UniquePersistent() { this->Reset(); }
    762   /**
    763    * Move via assignment.
    764    */
    765   template<class S>
    766   V8_INLINE UniquePersistent& operator=(UniquePersistent<S> rhs) {
    767     TYPE_CHECK(T, S);
    768     this->Reset();
    769     this->val_ = rhs.val_;
    770     rhs.val_ = 0;
    771     return *this;
    772   }
    773   /**
    774    * Cast operator for moves.
    775    */
    776   V8_INLINE operator RValue() { return RValue(this); }
    777   /**
    778    * Pass allows returning uniques from functions, etc.
    779    */
    780   UniquePersistent Pass() { return UniquePersistent(RValue(this)); }
    781 
    782  private:
    783   UniquePersistent(UniquePersistent&);
    784   void operator=(UniquePersistent&);
    785 };
    786 
    787 
    788  /**
    789  * A stack-allocated class that governs a number of local handles.
    790  * After a handle scope has been created, all local handles will be
    791  * allocated within that handle scope until either the handle scope is
    792  * deleted or another handle scope is created.  If there is already a
    793  * handle scope and a new one is created, all allocations will take
    794  * place in the new handle scope until it is deleted.  After that,
    795  * new handles will again be allocated in the original handle scope.
    796  *
    797  * After the handle scope of a local handle has been deleted the
    798  * garbage collector will no longer track the object stored in the
    799  * handle and may deallocate it.  The behavior of accessing a handle
    800  * for which the handle scope has been deleted is undefined.
    801  */
    802 class V8_EXPORT HandleScope {
    803  public:
    804   HandleScope(Isolate* isolate);
    805 
    806   ~HandleScope();
    807 
    808   /**
    809    * Counts the number of allocated handles.
    810    */
    811   static int NumberOfHandles(Isolate* isolate);
    812 
    813   V8_INLINE Isolate* GetIsolate() const {
    814     return reinterpret_cast<Isolate*>(isolate_);
    815   }
    816 
    817  protected:
    818   V8_INLINE HandleScope() {}
    819 
    820   void Initialize(Isolate* isolate);
    821 
    822   static internal::Object** CreateHandle(internal::Isolate* isolate,
    823                                          internal::Object* value);
    824 
    825  private:
    826   // Uses heap_object to obtain the current Isolate.
    827   static internal::Object** CreateHandle(internal::HeapObject* heap_object,
    828                                          internal::Object* value);
    829 
    830   // Make it hard to create heap-allocated or illegal handle scopes by
    831   // disallowing certain operations.
    832   HandleScope(const HandleScope&);
    833   void operator=(const HandleScope&);
    834   void* operator new(size_t size);
    835   void operator delete(void*, size_t);
    836 
    837   internal::Isolate* isolate_;
    838   internal::Object** prev_next_;
    839   internal::Object** prev_limit_;
    840 
    841   // Local::New uses CreateHandle with an Isolate* parameter.
    842   template<class F> friend class Local;
    843 
    844   // Object::GetInternalField and Context::GetEmbedderData use CreateHandle with
    845   // a HeapObject* in their shortcuts.
    846   friend class Object;
    847   friend class Context;
    848 };
    849 
    850 
    851 /**
    852  * A HandleScope which first allocates a handle in the current scope
    853  * which will be later filled with the escape value.
    854  */
    855 class V8_EXPORT EscapableHandleScope : public HandleScope {
    856  public:
    857   EscapableHandleScope(Isolate* isolate);
    858   V8_INLINE ~EscapableHandleScope() {}
    859 
    860   /**
    861    * Pushes the value into the previous scope and returns a handle to it.
    862    * Cannot be called twice.
    863    */
    864   template <class T>
    865   V8_INLINE Local<T> Escape(Local<T> value) {
    866     internal::Object** slot =
    867         Escape(reinterpret_cast<internal::Object**>(*value));
    868     return Local<T>(reinterpret_cast<T*>(slot));
    869   }
    870 
    871  private:
    872   internal::Object** Escape(internal::Object** escape_value);
    873 
    874   // Make it hard to create heap-allocated or illegal handle scopes by
    875   // disallowing certain operations.
    876   EscapableHandleScope(const EscapableHandleScope&);
    877   void operator=(const EscapableHandleScope&);
    878   void* operator new(size_t size);
    879   void operator delete(void*, size_t);
    880 
    881   internal::Object** escape_slot_;
    882 };
    883 
    884 
    885 /**
    886  * A simple Maybe type, representing an object which may or may not have a
    887  * value.
    888  */
    889 template<class T>
    890 struct Maybe {
    891   Maybe() : has_value(false) {}
    892   explicit Maybe(T t) : has_value(true), value(t) {}
    893   Maybe(bool has, T t) : has_value(has), value(t) {}
    894 
    895   bool has_value;
    896   T value;
    897 };
    898 
    899 
    900 // Convenience wrapper.
    901 template <class T>
    902 inline Maybe<T> maybe(T t) {
    903   return Maybe<T>(t);
    904 }
    905 
    906 
    907 // --- Special objects ---
    908 
    909 
    910 /**
    911  * The superclass of values and API object templates.
    912  */
    913 class V8_EXPORT Data {
    914  private:
    915   Data();
    916 };
    917 
    918 
    919 /**
    920  * The origin, within a file, of a script.
    921  */
    922 class ScriptOrigin {
    923  public:
    924   V8_INLINE ScriptOrigin(
    925       Handle<Value> resource_name,
    926       Handle<Integer> resource_line_offset = Handle<Integer>(),
    927       Handle<Integer> resource_column_offset = Handle<Integer>(),
    928       Handle<Boolean> resource_is_shared_cross_origin = Handle<Boolean>(),
    929       Handle<Integer> script_id = Handle<Integer>())
    930       : resource_name_(resource_name),
    931         resource_line_offset_(resource_line_offset),
    932         resource_column_offset_(resource_column_offset),
    933         resource_is_shared_cross_origin_(resource_is_shared_cross_origin),
    934         script_id_(script_id) { }
    935   V8_INLINE Handle<Value> ResourceName() const;
    936   V8_INLINE Handle<Integer> ResourceLineOffset() const;
    937   V8_INLINE Handle<Integer> ResourceColumnOffset() const;
    938   V8_INLINE Handle<Boolean> ResourceIsSharedCrossOrigin() const;
    939   V8_INLINE Handle<Integer> ScriptID() const;
    940  private:
    941   Handle<Value> resource_name_;
    942   Handle<Integer> resource_line_offset_;
    943   Handle<Integer> resource_column_offset_;
    944   Handle<Boolean> resource_is_shared_cross_origin_;
    945   Handle<Integer> script_id_;
    946 };
    947 
    948 
    949 /**
    950  * A compiled JavaScript script, not yet tied to a Context.
    951  */
    952 class V8_EXPORT UnboundScript {
    953  public:
    954   /**
    955    * Binds the script to the currently entered context.
    956    */
    957   Local<Script> BindToCurrentContext();
    958 
    959   int GetId();
    960   Handle<Value> GetScriptName();
    961 
    962   /**
    963    * Data read from magic sourceURL comments.
    964    */
    965   Handle<Value> GetSourceURL();
    966   /**
    967    * Data read from magic sourceMappingURL comments.
    968    */
    969   Handle<Value> GetSourceMappingURL();
    970 
    971   /**
    972    * Returns zero based line number of the code_pos location in the script.
    973    * -1 will be returned if no information available.
    974    */
    975   int GetLineNumber(int code_pos);
    976 
    977   static const int kNoScriptId = 0;
    978 };
    979 
    980 
    981 /**
    982  * A compiled JavaScript script, tied to a Context which was active when the
    983  * script was compiled.
    984  */
    985 class V8_EXPORT Script {
    986  public:
    987   /**
    988    * A shorthand for ScriptCompiler::Compile().
    989    */
    990   static Local<Script> Compile(Handle<String> source,
    991                                ScriptOrigin* origin = NULL);
    992 
    993   // To be decprecated, use the Compile above.
    994   static Local<Script> Compile(Handle<String> source,
    995                                Handle<String> file_name);
    996 
    997   /**
    998    * Runs the script returning the resulting value. It will be run in the
    999    * context in which it was created (ScriptCompiler::CompileBound or
   1000    * UnboundScript::BindToGlobalContext()).
   1001    */
   1002   Local<Value> Run();
   1003 
   1004   /**
   1005    * Returns the corresponding context-unbound script.
   1006    */
   1007   Local<UnboundScript> GetUnboundScript();
   1008 
   1009   V8_DEPRECATED("Use GetUnboundScript()->GetId()",
   1010                 int GetId()) {
   1011     return GetUnboundScript()->GetId();
   1012   }
   1013 };
   1014 
   1015 
   1016 /**
   1017  * For compiling scripts.
   1018  */
   1019 class V8_EXPORT ScriptCompiler {
   1020  public:
   1021   /**
   1022    * Compilation data that the embedder can cache and pass back to speed up
   1023    * future compilations. The data is produced if the CompilerOptions passed to
   1024    * the compilation functions in ScriptCompiler contains produce_data_to_cache
   1025    * = true. The data to cache can then can be retrieved from
   1026    * UnboundScript.
   1027    */
   1028   struct V8_EXPORT CachedData {
   1029     enum BufferPolicy {
   1030       BufferNotOwned,
   1031       BufferOwned
   1032     };
   1033 
   1034     CachedData() : data(NULL), length(0), buffer_policy(BufferNotOwned) {}
   1035 
   1036     // If buffer_policy is BufferNotOwned, the caller keeps the ownership of
   1037     // data and guarantees that it stays alive until the CachedData object is
   1038     // destroyed. If the policy is BufferOwned, the given data will be deleted
   1039     // (with delete[]) when the CachedData object is destroyed.
   1040     CachedData(const uint8_t* data, int length,
   1041                BufferPolicy buffer_policy = BufferNotOwned);
   1042     ~CachedData();
   1043     // TODO(marja): Async compilation; add constructors which take a callback
   1044     // which will be called when V8 no longer needs the data.
   1045     const uint8_t* data;
   1046     int length;
   1047     BufferPolicy buffer_policy;
   1048 
   1049    private:
   1050     // Prevent copying. Not implemented.
   1051     CachedData(const CachedData&);
   1052     CachedData& operator=(const CachedData&);
   1053   };
   1054 
   1055   /**
   1056    * Source code which can be then compiled to a UnboundScript or Script.
   1057    */
   1058   class Source {
   1059    public:
   1060     // Source takes ownership of CachedData.
   1061     V8_INLINE Source(Local<String> source_string, const ScriptOrigin& origin,
   1062            CachedData* cached_data = NULL);
   1063     V8_INLINE Source(Local<String> source_string,
   1064                      CachedData* cached_data = NULL);
   1065     V8_INLINE ~Source();
   1066 
   1067     // Ownership of the CachedData or its buffers is *not* transferred to the
   1068     // caller. The CachedData object is alive as long as the Source object is
   1069     // alive.
   1070     V8_INLINE const CachedData* GetCachedData() const;
   1071 
   1072    private:
   1073     friend class ScriptCompiler;
   1074     // Prevent copying. Not implemented.
   1075     Source(const Source&);
   1076     Source& operator=(const Source&);
   1077 
   1078     Local<String> source_string;
   1079 
   1080     // Origin information
   1081     Handle<Value> resource_name;
   1082     Handle<Integer> resource_line_offset;
   1083     Handle<Integer> resource_column_offset;
   1084     Handle<Boolean> resource_is_shared_cross_origin;
   1085 
   1086     // Cached data from previous compilation (if a kConsume*Cache flag is
   1087     // set), or hold newly generated cache data (kProduce*Cache flags) are
   1088     // set when calling a compile method.
   1089     CachedData* cached_data;
   1090   };
   1091 
   1092   /**
   1093    * For streaming incomplete script data to V8. The embedder should implement a
   1094    * subclass of this class.
   1095    */
   1096   class ExternalSourceStream {
   1097    public:
   1098     virtual ~ExternalSourceStream() {}
   1099 
   1100     /**
   1101      * V8 calls this to request the next chunk of data from the embedder. This
   1102      * function will be called on a background thread, so it's OK to block and
   1103      * wait for the data, if the embedder doesn't have data yet. Returns the
   1104      * length of the data returned. When the data ends, GetMoreData should
   1105      * return 0. Caller takes ownership of the data.
   1106      *
   1107      * When streaming UTF-8 data, V8 handles multi-byte characters split between
   1108      * two data chunks, but doesn't handle multi-byte characters split between
   1109      * more than two data chunks. The embedder can avoid this problem by always
   1110      * returning at least 2 bytes of data.
   1111      *
   1112      * If the embedder wants to cancel the streaming, they should make the next
   1113      * GetMoreData call return 0. V8 will interpret it as end of data (and most
   1114      * probably, parsing will fail). The streaming task will return as soon as
   1115      * V8 has parsed the data it received so far.
   1116      */
   1117     virtual size_t GetMoreData(const uint8_t** src) = 0;
   1118   };
   1119 
   1120 
   1121   /**
   1122    * Source code which can be streamed into V8 in pieces. It will be parsed
   1123    * while streaming. It can be compiled after the streaming is complete.
   1124    * StreamedSource must be kept alive while the streaming task is ran (see
   1125    * ScriptStreamingTask below).
   1126    */
   1127   class V8_EXPORT StreamedSource {
   1128    public:
   1129     enum Encoding { ONE_BYTE, TWO_BYTE, UTF8 };
   1130 
   1131     StreamedSource(ExternalSourceStream* source_stream, Encoding encoding);
   1132     ~StreamedSource();
   1133 
   1134     // Ownership of the CachedData or its buffers is *not* transferred to the
   1135     // caller. The CachedData object is alive as long as the StreamedSource
   1136     // object is alive.
   1137     const CachedData* GetCachedData() const;
   1138 
   1139     internal::StreamedSource* impl() const { return impl_; }
   1140 
   1141    private:
   1142     // Prevent copying. Not implemented.
   1143     StreamedSource(const StreamedSource&);
   1144     StreamedSource& operator=(const StreamedSource&);
   1145 
   1146     internal::StreamedSource* impl_;
   1147   };
   1148 
   1149   /**
   1150    * A streaming task which the embedder must run on a background thread to
   1151    * stream scripts into V8. Returned by ScriptCompiler::StartStreamingScript.
   1152    */
   1153   class ScriptStreamingTask {
   1154    public:
   1155     virtual ~ScriptStreamingTask() {}
   1156     virtual void Run() = 0;
   1157   };
   1158 
   1159   enum CompileOptions {
   1160     kNoCompileOptions = 0,
   1161     kProduceParserCache,
   1162     kConsumeParserCache,
   1163     kProduceCodeCache,
   1164     kConsumeCodeCache,
   1165 
   1166     // Support the previous API for a transition period.
   1167     kProduceDataToCache
   1168   };
   1169 
   1170   /**
   1171    * Compiles the specified script (context-independent).
   1172    * Cached data as part of the source object can be optionally produced to be
   1173    * consumed later to speed up compilation of identical source scripts.
   1174    *
   1175    * Note that when producing cached data, the source must point to NULL for
   1176    * cached data. When consuming cached data, the cached data must have been
   1177    * produced by the same version of V8.
   1178    *
   1179    * \param source Script source code.
   1180    * \return Compiled script object (context independent; for running it must be
   1181    *   bound to a context).
   1182    */
   1183   static Local<UnboundScript> CompileUnbound(
   1184       Isolate* isolate, Source* source,
   1185       CompileOptions options = kNoCompileOptions);
   1186 
   1187   /**
   1188    * Compiles the specified script (bound to current context).
   1189    *
   1190    * \param source Script source code.
   1191    * \param pre_data Pre-parsing data, as obtained by ScriptData::PreCompile()
   1192    *   using pre_data speeds compilation if it's done multiple times.
   1193    *   Owned by caller, no references are kept when this function returns.
   1194    * \return Compiled script object, bound to the context that was active
   1195    *   when this function was called. When run it will always use this
   1196    *   context.
   1197    */
   1198   static Local<Script> Compile(
   1199       Isolate* isolate, Source* source,
   1200       CompileOptions options = kNoCompileOptions);
   1201 
   1202   /**
   1203    * Returns a task which streams script data into V8, or NULL if the script
   1204    * cannot be streamed. The user is responsible for running the task on a
   1205    * background thread and deleting it. When ran, the task starts parsing the
   1206    * script, and it will request data from the StreamedSource as needed. When
   1207    * ScriptStreamingTask::Run exits, all data has been streamed and the script
   1208    * can be compiled (see Compile below).
   1209    *
   1210    * This API allows to start the streaming with as little data as possible, and
   1211    * the remaining data (for example, the ScriptOrigin) is passed to Compile.
   1212    */
   1213   static ScriptStreamingTask* StartStreamingScript(
   1214       Isolate* isolate, StreamedSource* source,
   1215       CompileOptions options = kNoCompileOptions);
   1216 
   1217   /**
   1218    * Compiles a streamed script (bound to current context).
   1219    *
   1220    * This can only be called after the streaming has finished
   1221    * (ScriptStreamingTask has been run). V8 doesn't construct the source string
   1222    * during streaming, so the embedder needs to pass the full source here.
   1223    */
   1224   static Local<Script> Compile(Isolate* isolate, StreamedSource* source,
   1225                                Handle<String> full_source_string,
   1226                                const ScriptOrigin& origin);
   1227 };
   1228 
   1229 
   1230 /**
   1231  * An error message.
   1232  */
   1233 class V8_EXPORT Message {
   1234  public:
   1235   Local<String> Get() const;
   1236   Local<String> GetSourceLine() const;
   1237 
   1238   /**
   1239    * Returns the origin for the script from where the function causing the
   1240    * error originates.
   1241    */
   1242   ScriptOrigin GetScriptOrigin() const;
   1243 
   1244   /**
   1245    * Returns the resource name for the script from where the function causing
   1246    * the error originates.
   1247    */
   1248   Handle<Value> GetScriptResourceName() const;
   1249 
   1250   /**
   1251    * Exception stack trace. By default stack traces are not captured for
   1252    * uncaught exceptions. SetCaptureStackTraceForUncaughtExceptions allows
   1253    * to change this option.
   1254    */
   1255   Handle<StackTrace> GetStackTrace() const;
   1256 
   1257   /**
   1258    * Returns the number, 1-based, of the line where the error occurred.
   1259    */
   1260   int GetLineNumber() const;
   1261 
   1262   /**
   1263    * Returns the index within the script of the first character where
   1264    * the error occurred.
   1265    */
   1266   int GetStartPosition() const;
   1267 
   1268   /**
   1269    * Returns the index within the script of the last character where
   1270    * the error occurred.
   1271    */
   1272   int GetEndPosition() const;
   1273 
   1274   /**
   1275    * Returns the index within the line of the first character where
   1276    * the error occurred.
   1277    */
   1278   int GetStartColumn() const;
   1279 
   1280   /**
   1281    * Returns the index within the line of the last character where
   1282    * the error occurred.
   1283    */
   1284   int GetEndColumn() const;
   1285 
   1286   /**
   1287    * Passes on the value set by the embedder when it fed the script from which
   1288    * this Message was generated to V8.
   1289    */
   1290   bool IsSharedCrossOrigin() const;
   1291 
   1292   // TODO(1245381): Print to a string instead of on a FILE.
   1293   static void PrintCurrentStackTrace(Isolate* isolate, FILE* out);
   1294 
   1295   static const int kNoLineNumberInfo = 0;
   1296   static const int kNoColumnInfo = 0;
   1297   static const int kNoScriptIdInfo = 0;
   1298 };
   1299 
   1300 
   1301 /**
   1302  * Representation of a JavaScript stack trace. The information collected is a
   1303  * snapshot of the execution stack and the information remains valid after
   1304  * execution continues.
   1305  */
   1306 class V8_EXPORT StackTrace {
   1307  public:
   1308   /**
   1309    * Flags that determine what information is placed captured for each
   1310    * StackFrame when grabbing the current stack trace.
   1311    */
   1312   enum StackTraceOptions {
   1313     kLineNumber = 1,
   1314     kColumnOffset = 1 << 1 | kLineNumber,
   1315     kScriptName = 1 << 2,
   1316     kFunctionName = 1 << 3,
   1317     kIsEval = 1 << 4,
   1318     kIsConstructor = 1 << 5,
   1319     kScriptNameOrSourceURL = 1 << 6,
   1320     kScriptId = 1 << 7,
   1321     kExposeFramesAcrossSecurityOrigins = 1 << 8,
   1322     kOverview = kLineNumber | kColumnOffset | kScriptName | kFunctionName,
   1323     kDetailed = kOverview | kIsEval | kIsConstructor | kScriptNameOrSourceURL
   1324   };
   1325 
   1326   /**
   1327    * Returns a StackFrame at a particular index.
   1328    */
   1329   Local<StackFrame> GetFrame(uint32_t index) const;
   1330 
   1331   /**
   1332    * Returns the number of StackFrames.
   1333    */
   1334   int GetFrameCount() const;
   1335 
   1336   /**
   1337    * Returns StackTrace as a v8::Array that contains StackFrame objects.
   1338    */
   1339   Local<Array> AsArray();
   1340 
   1341   /**
   1342    * Grab a snapshot of the current JavaScript execution stack.
   1343    *
   1344    * \param frame_limit The maximum number of stack frames we want to capture.
   1345    * \param options Enumerates the set of things we will capture for each
   1346    *   StackFrame.
   1347    */
   1348   static Local<StackTrace> CurrentStackTrace(
   1349       Isolate* isolate,
   1350       int frame_limit,
   1351       StackTraceOptions options = kOverview);
   1352 };
   1353 
   1354 
   1355 /**
   1356  * A single JavaScript stack frame.
   1357  */
   1358 class V8_EXPORT StackFrame {
   1359  public:
   1360   /**
   1361    * Returns the number, 1-based, of the line for the associate function call.
   1362    * This method will return Message::kNoLineNumberInfo if it is unable to
   1363    * retrieve the line number, or if kLineNumber was not passed as an option
   1364    * when capturing the StackTrace.
   1365    */
   1366   int GetLineNumber() const;
   1367 
   1368   /**
   1369    * Returns the 1-based column offset on the line for the associated function
   1370    * call.
   1371    * This method will return Message::kNoColumnInfo if it is unable to retrieve
   1372    * the column number, or if kColumnOffset was not passed as an option when
   1373    * capturing the StackTrace.
   1374    */
   1375   int GetColumn() const;
   1376 
   1377   /**
   1378    * Returns the id of the script for the function for this StackFrame.
   1379    * This method will return Message::kNoScriptIdInfo if it is unable to
   1380    * retrieve the script id, or if kScriptId was not passed as an option when
   1381    * capturing the StackTrace.
   1382    */
   1383   int GetScriptId() const;
   1384 
   1385   /**
   1386    * Returns the name of the resource that contains the script for the
   1387    * function for this StackFrame.
   1388    */
   1389   Local<String> GetScriptName() const;
   1390 
   1391   /**
   1392    * Returns the name of the resource that contains the script for the
   1393    * function for this StackFrame or sourceURL value if the script name
   1394    * is undefined and its source ends with //# sourceURL=... string or
   1395    * deprecated //@ sourceURL=... string.
   1396    */
   1397   Local<String> GetScriptNameOrSourceURL() const;
   1398 
   1399   /**
   1400    * Returns the name of the function associated with this stack frame.
   1401    */
   1402   Local<String> GetFunctionName() const;
   1403 
   1404   /**
   1405    * Returns whether or not the associated function is compiled via a call to
   1406    * eval().
   1407    */
   1408   bool IsEval() const;
   1409 
   1410   /**
   1411    * Returns whether or not the associated function is called as a
   1412    * constructor via "new".
   1413    */
   1414   bool IsConstructor() const;
   1415 };
   1416 
   1417 
   1418 /**
   1419  * A JSON Parser.
   1420  */
   1421 class V8_EXPORT JSON {
   1422  public:
   1423   /**
   1424    * Tries to parse the string |json_string| and returns it as value if
   1425    * successful.
   1426    *
   1427    * \param json_string The string to parse.
   1428    * \return The corresponding value if successfully parsed.
   1429    */
   1430   static Local<Value> Parse(Local<String> json_string);
   1431 };
   1432 
   1433 
   1434 // --- Value ---
   1435 
   1436 
   1437 /**
   1438  * The superclass of all JavaScript values and objects.
   1439  */
   1440 class V8_EXPORT Value : public Data {
   1441  public:
   1442   /**
   1443    * Returns true if this value is the undefined value.  See ECMA-262
   1444    * 4.3.10.
   1445    */
   1446   V8_INLINE bool IsUndefined() const;
   1447 
   1448   /**
   1449    * Returns true if this value is the null value.  See ECMA-262
   1450    * 4.3.11.
   1451    */
   1452   V8_INLINE bool IsNull() const;
   1453 
   1454    /**
   1455    * Returns true if this value is true.
   1456    */
   1457   bool IsTrue() const;
   1458 
   1459   /**
   1460    * Returns true if this value is false.
   1461    */
   1462   bool IsFalse() const;
   1463 
   1464   /**
   1465    * Returns true if this value is a symbol or a string.
   1466    * This is an experimental feature.
   1467    */
   1468   bool IsName() const;
   1469 
   1470   /**
   1471    * Returns true if this value is an instance of the String type.
   1472    * See ECMA-262 8.4.
   1473    */
   1474   V8_INLINE bool IsString() const;
   1475 
   1476   /**
   1477    * Returns true if this value is a symbol.
   1478    * This is an experimental feature.
   1479    */
   1480   bool IsSymbol() const;
   1481 
   1482   /**
   1483    * Returns true if this value is a function.
   1484    */
   1485   bool IsFunction() const;
   1486 
   1487   /**
   1488    * Returns true if this value is an array.
   1489    */
   1490   bool IsArray() const;
   1491 
   1492   /**
   1493    * Returns true if this value is an object.
   1494    */
   1495   bool IsObject() const;
   1496 
   1497   /**
   1498    * Returns true if this value is boolean.
   1499    */
   1500   bool IsBoolean() const;
   1501 
   1502   /**
   1503    * Returns true if this value is a number.
   1504    */
   1505   bool IsNumber() const;
   1506 
   1507   /**
   1508    * Returns true if this value is external.
   1509    */
   1510   bool IsExternal() const;
   1511 
   1512   /**
   1513    * Returns true if this value is a 32-bit signed integer.
   1514    */
   1515   bool IsInt32() const;
   1516 
   1517   /**
   1518    * Returns true if this value is a 32-bit unsigned integer.
   1519    */
   1520   bool IsUint32() const;
   1521 
   1522   /**
   1523    * Returns true if this value is a Date.
   1524    */
   1525   bool IsDate() const;
   1526 
   1527   /**
   1528    * Returns true if this value is an Arguments object.
   1529    */
   1530   bool IsArgumentsObject() const;
   1531 
   1532   /**
   1533    * Returns true if this value is a Boolean object.
   1534    */
   1535   bool IsBooleanObject() const;
   1536 
   1537   /**
   1538    * Returns true if this value is a Number object.
   1539    */
   1540   bool IsNumberObject() const;
   1541 
   1542   /**
   1543    * Returns true if this value is a String object.
   1544    */
   1545   bool IsStringObject() const;
   1546 
   1547   /**
   1548    * Returns true if this value is a Symbol object.
   1549    * This is an experimental feature.
   1550    */
   1551   bool IsSymbolObject() const;
   1552 
   1553   /**
   1554    * Returns true if this value is a NativeError.
   1555    */
   1556   bool IsNativeError() const;
   1557 
   1558   /**
   1559    * Returns true if this value is a RegExp.
   1560    */
   1561   bool IsRegExp() const;
   1562 
   1563   /**
   1564    * Returns true if this value is a Promise.
   1565    * This is an experimental feature.
   1566    */
   1567   bool IsPromise() const;
   1568 
   1569   /**
   1570    * Returns true if this value is a Map.
   1571    * This is an experimental feature.
   1572    */
   1573   bool IsMap() const;
   1574 
   1575   /**
   1576    * Returns true if this value is a Set.
   1577    * This is an experimental feature.
   1578    */
   1579   bool IsSet() const;
   1580 
   1581   /**
   1582    * Returns true if this value is a WeakMap.
   1583    * This is an experimental feature.
   1584    */
   1585   bool IsWeakMap() const;
   1586 
   1587   /**
   1588    * Returns true if this value is a WeakSet.
   1589    * This is an experimental feature.
   1590    */
   1591   bool IsWeakSet() const;
   1592 
   1593   /**
   1594    * Returns true if this value is an ArrayBuffer.
   1595    * This is an experimental feature.
   1596    */
   1597   bool IsArrayBuffer() const;
   1598 
   1599   /**
   1600    * Returns true if this value is an ArrayBufferView.
   1601    * This is an experimental feature.
   1602    */
   1603   bool IsArrayBufferView() const;
   1604 
   1605   /**
   1606    * Returns true if this value is one of TypedArrays.
   1607    * This is an experimental feature.
   1608    */
   1609   bool IsTypedArray() const;
   1610 
   1611   /**
   1612    * Returns true if this value is an Uint8Array.
   1613    * This is an experimental feature.
   1614    */
   1615   bool IsUint8Array() const;
   1616 
   1617   /**
   1618    * Returns true if this value is an Uint8ClampedArray.
   1619    * This is an experimental feature.
   1620    */
   1621   bool IsUint8ClampedArray() const;
   1622 
   1623   /**
   1624    * Returns true if this value is an Int8Array.
   1625    * This is an experimental feature.
   1626    */
   1627   bool IsInt8Array() const;
   1628 
   1629   /**
   1630    * Returns true if this value is an Uint16Array.
   1631    * This is an experimental feature.
   1632    */
   1633   bool IsUint16Array() const;
   1634 
   1635   /**
   1636    * Returns true if this value is an Int16Array.
   1637    * This is an experimental feature.
   1638    */
   1639   bool IsInt16Array() const;
   1640 
   1641   /**
   1642    * Returns true if this value is an Uint32Array.
   1643    * This is an experimental feature.
   1644    */
   1645   bool IsUint32Array() const;
   1646 
   1647   /**
   1648    * Returns true if this value is an Int32Array.
   1649    * This is an experimental feature.
   1650    */
   1651   bool IsInt32Array() const;
   1652 
   1653   /**
   1654    * Returns true if this value is a Float32Array.
   1655    * This is an experimental feature.
   1656    */
   1657   bool IsFloat32Array() const;
   1658 
   1659   /**
   1660    * Returns true if this value is a Float64Array.
   1661    * This is an experimental feature.
   1662    */
   1663   bool IsFloat64Array() const;
   1664 
   1665   /**
   1666    * Returns true if this value is a DataView.
   1667    * This is an experimental feature.
   1668    */
   1669   bool IsDataView() const;
   1670 
   1671   Local<Boolean> ToBoolean() const;
   1672   Local<Number> ToNumber() const;
   1673   Local<String> ToString() const;
   1674   Local<String> ToDetailString() const;
   1675   Local<Object> ToObject() const;
   1676   Local<Integer> ToInteger() const;
   1677   Local<Uint32> ToUint32() const;
   1678   Local<Int32> ToInt32() const;
   1679 
   1680   /**
   1681    * Attempts to convert a string to an array index.
   1682    * Returns an empty handle if the conversion fails.
   1683    */
   1684   Local<Uint32> ToArrayIndex() const;
   1685 
   1686   bool BooleanValue() const;
   1687   double NumberValue() const;
   1688   int64_t IntegerValue() const;
   1689   uint32_t Uint32Value() const;
   1690   int32_t Int32Value() const;
   1691 
   1692   /** JS == */
   1693   bool Equals(Handle<Value> that) const;
   1694   bool StrictEquals(Handle<Value> that) const;
   1695   bool SameValue(Handle<Value> that) const;
   1696 
   1697   template <class T> V8_INLINE static Value* Cast(T* value);
   1698 
   1699  private:
   1700   V8_INLINE bool QuickIsUndefined() const;
   1701   V8_INLINE bool QuickIsNull() const;
   1702   V8_INLINE bool QuickIsString() const;
   1703   bool FullIsUndefined() const;
   1704   bool FullIsNull() const;
   1705   bool FullIsString() const;
   1706 };
   1707 
   1708 
   1709 /**
   1710  * The superclass of primitive values.  See ECMA-262 4.3.2.
   1711  */
   1712 class V8_EXPORT Primitive : public Value { };
   1713 
   1714 
   1715 /**
   1716  * A primitive boolean value (ECMA-262, 4.3.14).  Either the true
   1717  * or false value.
   1718  */
   1719 class V8_EXPORT Boolean : public Primitive {
   1720  public:
   1721   bool Value() const;
   1722   V8_INLINE static Handle<Boolean> New(Isolate* isolate, bool value);
   1723 };
   1724 
   1725 
   1726 /**
   1727  * A superclass for symbols and strings.
   1728  */
   1729 class V8_EXPORT Name : public Primitive {
   1730  public:
   1731   V8_INLINE static Name* Cast(v8::Value* obj);
   1732  private:
   1733   static void CheckCast(v8::Value* obj);
   1734 };
   1735 
   1736 
   1737 /**
   1738  * A JavaScript string value (ECMA-262, 4.3.17).
   1739  */
   1740 class V8_EXPORT String : public Name {
   1741  public:
   1742   enum Encoding {
   1743     UNKNOWN_ENCODING = 0x1,
   1744     TWO_BYTE_ENCODING = 0x0,
   1745     ASCII_ENCODING = 0x4,  // TODO(yangguo): deprecate this.
   1746     ONE_BYTE_ENCODING = 0x4
   1747   };
   1748   /**
   1749    * Returns the number of characters in this string.
   1750    */
   1751   int Length() const;
   1752 
   1753   /**
   1754    * Returns the number of bytes in the UTF-8 encoded
   1755    * representation of this string.
   1756    */
   1757   int Utf8Length() const;
   1758 
   1759   /**
   1760    * Returns whether this string is known to contain only one byte data.
   1761    * Does not read the string.
   1762    * False negatives are possible.
   1763    */
   1764   bool IsOneByte() const;
   1765 
   1766   /**
   1767    * Returns whether this string contain only one byte data.
   1768    * Will read the entire string in some cases.
   1769    */
   1770   bool ContainsOnlyOneByte() const;
   1771 
   1772   /**
   1773    * Write the contents of the string to an external buffer.
   1774    * If no arguments are given, expects the buffer to be large
   1775    * enough to hold the entire string and NULL terminator. Copies
   1776    * the contents of the string and the NULL terminator into the
   1777    * buffer.
   1778    *
   1779    * WriteUtf8 will not write partial UTF-8 sequences, preferring to stop
   1780    * before the end of the buffer.
   1781    *
   1782    * Copies up to length characters into the output buffer.
   1783    * Only null-terminates if there is enough space in the buffer.
   1784    *
   1785    * \param buffer The buffer into which the string will be copied.
   1786    * \param start The starting position within the string at which
   1787    * copying begins.
   1788    * \param length The number of characters to copy from the string.  For
   1789    *    WriteUtf8 the number of bytes in the buffer.
   1790    * \param nchars_ref The number of characters written, can be NULL.
   1791    * \param options Various options that might affect performance of this or
   1792    *    subsequent operations.
   1793    * \return The number of characters copied to the buffer excluding the null
   1794    *    terminator.  For WriteUtf8: The number of bytes copied to the buffer
   1795    *    including the null terminator (if written).
   1796    */
   1797   enum WriteOptions {
   1798     NO_OPTIONS = 0,
   1799     HINT_MANY_WRITES_EXPECTED = 1,
   1800     NO_NULL_TERMINATION = 2,
   1801     PRESERVE_ASCII_NULL = 4,  // TODO(yangguo): deprecate this.
   1802     PRESERVE_ONE_BYTE_NULL = 4,
   1803     // Used by WriteUtf8 to replace orphan surrogate code units with the
   1804     // unicode replacement character. Needs to be set to guarantee valid UTF-8
   1805     // output.
   1806     REPLACE_INVALID_UTF8 = 8
   1807   };
   1808 
   1809   // 16-bit character codes.
   1810   int Write(uint16_t* buffer,
   1811             int start = 0,
   1812             int length = -1,
   1813             int options = NO_OPTIONS) const;
   1814   // One byte characters.
   1815   int WriteOneByte(uint8_t* buffer,
   1816                    int start = 0,
   1817                    int length = -1,
   1818                    int options = NO_OPTIONS) const;
   1819   // UTF-8 encoded characters.
   1820   int WriteUtf8(char* buffer,
   1821                 int length = -1,
   1822                 int* nchars_ref = NULL,
   1823                 int options = NO_OPTIONS) const;
   1824 
   1825   /**
   1826    * A zero length string.
   1827    */
   1828   V8_INLINE static v8::Local<v8::String> Empty(Isolate* isolate);
   1829 
   1830   /**
   1831    * Returns true if the string is external
   1832    */
   1833   bool IsExternal() const;
   1834 
   1835   /**
   1836    * Returns true if the string is both external and one-byte.
   1837    */
   1838   bool IsExternalOneByte() const;
   1839 
   1840   // TODO(yangguo): deprecate this.
   1841   bool IsExternalAscii() const { return IsExternalOneByte(); }
   1842 
   1843   class V8_EXPORT ExternalStringResourceBase {  // NOLINT
   1844    public:
   1845     virtual ~ExternalStringResourceBase() {}
   1846 
   1847    protected:
   1848     ExternalStringResourceBase() {}
   1849 
   1850     /**
   1851      * Internally V8 will call this Dispose method when the external string
   1852      * resource is no longer needed. The default implementation will use the
   1853      * delete operator. This method can be overridden in subclasses to
   1854      * control how allocated external string resources are disposed.
   1855      */
   1856     virtual void Dispose() { delete this; }
   1857 
   1858    private:
   1859     // Disallow copying and assigning.
   1860     ExternalStringResourceBase(const ExternalStringResourceBase&);
   1861     void operator=(const ExternalStringResourceBase&);
   1862 
   1863     friend class v8::internal::Heap;
   1864   };
   1865 
   1866   /**
   1867    * An ExternalStringResource is a wrapper around a two-byte string
   1868    * buffer that resides outside V8's heap. Implement an
   1869    * ExternalStringResource to manage the life cycle of the underlying
   1870    * buffer.  Note that the string data must be immutable.
   1871    */
   1872   class V8_EXPORT ExternalStringResource
   1873       : public ExternalStringResourceBase {
   1874    public:
   1875     /**
   1876      * Override the destructor to manage the life cycle of the underlying
   1877      * buffer.
   1878      */
   1879     virtual ~ExternalStringResource() {}
   1880 
   1881     /**
   1882      * The string data from the underlying buffer.
   1883      */
   1884     virtual const uint16_t* data() const = 0;
   1885 
   1886     /**
   1887      * The length of the string. That is, the number of two-byte characters.
   1888      */
   1889     virtual size_t length() const = 0;
   1890 
   1891    protected:
   1892     ExternalStringResource() {}
   1893   };
   1894 
   1895   /**
   1896    * An ExternalOneByteStringResource is a wrapper around an one-byte
   1897    * string buffer that resides outside V8's heap. Implement an
   1898    * ExternalOneByteStringResource to manage the life cycle of the
   1899    * underlying buffer.  Note that the string data must be immutable
   1900    * and that the data must be Latin-1 and not UTF-8, which would require
   1901    * special treatment internally in the engine and do not allow efficient
   1902    * indexing.  Use String::New or convert to 16 bit data for non-Latin1.
   1903    */
   1904 
   1905   class V8_EXPORT ExternalOneByteStringResource
   1906       : public ExternalStringResourceBase {
   1907    public:
   1908     /**
   1909      * Override the destructor to manage the life cycle of the underlying
   1910      * buffer.
   1911      */
   1912     virtual ~ExternalOneByteStringResource() {}
   1913     /** The string data from the underlying buffer.*/
   1914     virtual const char* data() const = 0;
   1915     /** The number of Latin-1 characters in the string.*/
   1916     virtual size_t length() const = 0;
   1917    protected:
   1918     ExternalOneByteStringResource() {}
   1919   };
   1920 
   1921   typedef ExternalOneByteStringResource ExternalAsciiStringResource;
   1922 
   1923   /**
   1924    * If the string is an external string, return the ExternalStringResourceBase
   1925    * regardless of the encoding, otherwise return NULL.  The encoding of the
   1926    * string is returned in encoding_out.
   1927    */
   1928   V8_INLINE ExternalStringResourceBase* GetExternalStringResourceBase(
   1929       Encoding* encoding_out) const;
   1930 
   1931   /**
   1932    * Get the ExternalStringResource for an external string.  Returns
   1933    * NULL if IsExternal() doesn't return true.
   1934    */
   1935   V8_INLINE ExternalStringResource* GetExternalStringResource() const;
   1936 
   1937   /**
   1938    * Get the ExternalOneByteStringResource for an external one-byte string.
   1939    * Returns NULL if IsExternalOneByte() doesn't return true.
   1940    */
   1941   const ExternalOneByteStringResource* GetExternalOneByteStringResource() const;
   1942 
   1943   // TODO(yangguo): deprecate this.
   1944   const ExternalAsciiStringResource* GetExternalAsciiStringResource() const {
   1945     return GetExternalOneByteStringResource();
   1946   }
   1947 
   1948   V8_INLINE static String* Cast(v8::Value* obj);
   1949 
   1950   enum NewStringType {
   1951     kNormalString, kInternalizedString, kUndetectableString
   1952   };
   1953 
   1954   /** Allocates a new string from UTF-8 data.*/
   1955   static Local<String> NewFromUtf8(Isolate* isolate,
   1956                                   const char* data,
   1957                                   NewStringType type = kNormalString,
   1958                                   int length = -1);
   1959 
   1960   /** Allocates a new string from Latin-1 data.*/
   1961   static Local<String> NewFromOneByte(
   1962       Isolate* isolate,
   1963       const uint8_t* data,
   1964       NewStringType type = kNormalString,
   1965       int length = -1);
   1966 
   1967   /** Allocates a new string from UTF-16 data.*/
   1968   static Local<String> NewFromTwoByte(
   1969       Isolate* isolate,
   1970       const uint16_t* data,
   1971       NewStringType type = kNormalString,
   1972       int length = -1);
   1973 
   1974   /**
   1975    * Creates a new string by concatenating the left and the right strings
   1976    * passed in as parameters.
   1977    */
   1978   static Local<String> Concat(Handle<String> left, Handle<String> right);
   1979 
   1980   /**
   1981    * Creates a new external string using the data defined in the given
   1982    * resource. When the external string is no longer live on V8's heap the
   1983    * resource will be disposed by calling its Dispose method. The caller of
   1984    * this function should not otherwise delete or modify the resource. Neither
   1985    * should the underlying buffer be deallocated or modified except through the
   1986    * destructor of the external string resource.
   1987    */
   1988   static Local<String> NewExternal(Isolate* isolate,
   1989                                    ExternalStringResource* resource);
   1990 
   1991   /**
   1992    * Associate an external string resource with this string by transforming it
   1993    * in place so that existing references to this string in the JavaScript heap
   1994    * will use the external string resource. The external string resource's
   1995    * character contents need to be equivalent to this string.
   1996    * Returns true if the string has been changed to be an external string.
   1997    * The string is not modified if the operation fails. See NewExternal for
   1998    * information on the lifetime of the resource.
   1999    */
   2000   bool MakeExternal(ExternalStringResource* resource);
   2001 
   2002   /**
   2003    * Creates a new external string using the one-byte data defined in the given
   2004    * resource. When the external string is no longer live on V8's heap the
   2005    * resource will be disposed by calling its Dispose method. The caller of
   2006    * this function should not otherwise delete or modify the resource. Neither
   2007    * should the underlying buffer be deallocated or modified except through the
   2008    * destructor of the external string resource.
   2009    */
   2010   static Local<String> NewExternal(Isolate* isolate,
   2011                                    ExternalOneByteStringResource* resource);
   2012 
   2013   /**
   2014    * Associate an external string resource with this string by transforming it
   2015    * in place so that existing references to this string in the JavaScript heap
   2016    * will use the external string resource. The external string resource's
   2017    * character contents need to be equivalent to this string.
   2018    * Returns true if the string has been changed to be an external string.
   2019    * The string is not modified if the operation fails. See NewExternal for
   2020    * information on the lifetime of the resource.
   2021    */
   2022   bool MakeExternal(ExternalOneByteStringResource* resource);
   2023 
   2024   /**
   2025    * Returns true if this string can be made external.
   2026    */
   2027   bool CanMakeExternal();
   2028 
   2029   /**
   2030    * Converts an object to a UTF-8-encoded character array.  Useful if
   2031    * you want to print the object.  If conversion to a string fails
   2032    * (e.g. due to an exception in the toString() method of the object)
   2033    * then the length() method returns 0 and the * operator returns
   2034    * NULL.
   2035    */
   2036   class V8_EXPORT Utf8Value {
   2037    public:
   2038     explicit Utf8Value(Handle<v8::Value> obj);
   2039     ~Utf8Value();
   2040     char* operator*() { return str_; }
   2041     const char* operator*() const { return str_; }
   2042     int length() const { return length_; }
   2043    private:
   2044     char* str_;
   2045     int length_;
   2046 
   2047     // Disallow copying and assigning.
   2048     Utf8Value(const Utf8Value&);
   2049     void operator=(const Utf8Value&);
   2050   };
   2051 
   2052   /**
   2053    * Converts an object to a two-byte string.
   2054    * If conversion to a string fails (eg. due to an exception in the toString()
   2055    * method of the object) then the length() method returns 0 and the * operator
   2056    * returns NULL.
   2057    */
   2058   class V8_EXPORT Value {
   2059    public:
   2060     explicit Value(Handle<v8::Value> obj);
   2061     ~Value();
   2062     uint16_t* operator*() { return str_; }
   2063     const uint16_t* operator*() const { return str_; }
   2064     int length() const { return length_; }
   2065    private:
   2066     uint16_t* str_;
   2067     int length_;
   2068 
   2069     // Disallow copying and assigning.
   2070     Value(const Value&);
   2071     void operator=(const Value&);
   2072   };
   2073 
   2074  private:
   2075   void VerifyExternalStringResourceBase(ExternalStringResourceBase* v,
   2076                                         Encoding encoding) const;
   2077   void VerifyExternalStringResource(ExternalStringResource* val) const;
   2078   static void CheckCast(v8::Value* obj);
   2079 };
   2080 
   2081 
   2082 /**
   2083  * A JavaScript symbol (ECMA-262 edition 6)
   2084  *
   2085  * This is an experimental feature. Use at your own risk.
   2086  */
   2087 class V8_EXPORT Symbol : public Name {
   2088  public:
   2089   // Returns the print name string of the symbol, or undefined if none.
   2090   Local<Value> Name() const;
   2091 
   2092   // Create a symbol. If name is not empty, it will be used as the description.
   2093   static Local<Symbol> New(
   2094       Isolate *isolate, Local<String> name = Local<String>());
   2095 
   2096   // Access global symbol registry.
   2097   // Note that symbols created this way are never collected, so
   2098   // they should only be used for statically fixed properties.
   2099   // Also, there is only one global name space for the names used as keys.
   2100   // To minimize the potential for clashes, use qualified names as keys.
   2101   static Local<Symbol> For(Isolate *isolate, Local<String> name);
   2102 
   2103   // Retrieve a global symbol. Similar to |For|, but using a separate
   2104   // registry that is not accessible by (and cannot clash with) JavaScript code.
   2105   static Local<Symbol> ForApi(Isolate *isolate, Local<String> name);
   2106 
   2107   // Well-known symbols
   2108   static Local<Symbol> GetIterator(Isolate* isolate);
   2109   static Local<Symbol> GetUnscopables(Isolate* isolate);
   2110 
   2111   V8_INLINE static Symbol* Cast(v8::Value* obj);
   2112 
   2113  private:
   2114   Symbol();
   2115   static void CheckCast(v8::Value* obj);
   2116 };
   2117 
   2118 
   2119 /**
   2120  * A private symbol
   2121  *
   2122  * This is an experimental feature. Use at your own risk.
   2123  */
   2124 class V8_EXPORT Private : public Data {
   2125  public:
   2126   // Returns the print name string of the private symbol, or undefined if none.
   2127   Local<Value> Name() const;
   2128 
   2129   // Create a private symbol. If name is not empty, it will be the description.
   2130   static Local<Private> New(
   2131       Isolate *isolate, Local<String> name = Local<String>());
   2132 
   2133   // Retrieve a global private symbol. If a symbol with this name has not
   2134   // been retrieved in the same isolate before, it is created.
   2135   // Note that private symbols created this way are never collected, so
   2136   // they should only be used for statically fixed properties.
   2137   // Also, there is only one global name space for the names used as keys.
   2138   // To minimize the potential for clashes, use qualified names as keys,
   2139   // e.g., "Class#property".
   2140   static Local<Private> ForApi(Isolate *isolate, Local<String> name);
   2141 
   2142  private:
   2143   Private();
   2144 };
   2145 
   2146 
   2147 /**
   2148  * A JavaScript number value (ECMA-262, 4.3.20)
   2149  */
   2150 class V8_EXPORT Number : public Primitive {
   2151  public:
   2152   double Value() const;
   2153   static Local<Number> New(Isolate* isolate, double value);
   2154   V8_INLINE static Number* Cast(v8::Value* obj);
   2155  private:
   2156   Number();
   2157   static void CheckCast(v8::Value* obj);
   2158 };
   2159 
   2160 
   2161 /**
   2162  * A JavaScript value representing a signed integer.
   2163  */
   2164 class V8_EXPORT Integer : public Number {
   2165  public:
   2166   static Local<Integer> New(Isolate* isolate, int32_t value);
   2167   static Local<Integer> NewFromUnsigned(Isolate* isolate, uint32_t value);
   2168   int64_t Value() const;
   2169   V8_INLINE static Integer* Cast(v8::Value* obj);
   2170  private:
   2171   Integer();
   2172   static void CheckCast(v8::Value* obj);
   2173 };
   2174 
   2175 
   2176 /**
   2177  * A JavaScript value representing a 32-bit signed integer.
   2178  */
   2179 class V8_EXPORT Int32 : public Integer {
   2180  public:
   2181   int32_t Value() const;
   2182  private:
   2183   Int32();
   2184 };
   2185 
   2186 
   2187 /**
   2188  * A JavaScript value representing a 32-bit unsigned integer.
   2189  */
   2190 class V8_EXPORT Uint32 : public Integer {
   2191  public:
   2192   uint32_t Value() const;
   2193  private:
   2194   Uint32();
   2195 };
   2196 
   2197 
   2198 enum PropertyAttribute {
   2199   None       = 0,
   2200   ReadOnly   = 1 << 0,
   2201   DontEnum   = 1 << 1,
   2202   DontDelete = 1 << 2
   2203 };
   2204 
   2205 enum ExternalArrayType {
   2206   kExternalInt8Array = 1,
   2207   kExternalUint8Array,
   2208   kExternalInt16Array,
   2209   kExternalUint16Array,
   2210   kExternalInt32Array,
   2211   kExternalUint32Array,
   2212   kExternalFloat32Array,
   2213   kExternalFloat64Array,
   2214   kExternalUint8ClampedArray,
   2215 
   2216   // Legacy constant names
   2217   kExternalByteArray = kExternalInt8Array,
   2218   kExternalUnsignedByteArray = kExternalUint8Array,
   2219   kExternalShortArray = kExternalInt16Array,
   2220   kExternalUnsignedShortArray = kExternalUint16Array,
   2221   kExternalIntArray = kExternalInt32Array,
   2222   kExternalUnsignedIntArray = kExternalUint32Array,
   2223   kExternalFloatArray = kExternalFloat32Array,
   2224   kExternalDoubleArray = kExternalFloat64Array,
   2225   kExternalPixelArray = kExternalUint8ClampedArray
   2226 };
   2227 
   2228 /**
   2229  * Accessor[Getter|Setter] are used as callback functions when
   2230  * setting|getting a particular property. See Object and ObjectTemplate's
   2231  * method SetAccessor.
   2232  */
   2233 typedef void (*AccessorGetterCallback)(
   2234     Local<String> property,
   2235     const PropertyCallbackInfo<Value>& info);
   2236 typedef void (*AccessorNameGetterCallback)(
   2237     Local<Name> property,
   2238     const PropertyCallbackInfo<Value>& info);
   2239 
   2240 
   2241 typedef void (*AccessorSetterCallback)(
   2242     Local<String> property,
   2243     Local<Value> value,
   2244     const PropertyCallbackInfo<void>& info);
   2245 typedef void (*AccessorNameSetterCallback)(
   2246     Local<Name> property,
   2247     Local<Value> value,
   2248     const PropertyCallbackInfo<void>& info);
   2249 
   2250 
   2251 /**
   2252  * Access control specifications.
   2253  *
   2254  * Some accessors should be accessible across contexts.  These
   2255  * accessors have an explicit access control parameter which specifies
   2256  * the kind of cross-context access that should be allowed.
   2257  *
   2258  * TODO(dcarney): Remove PROHIBITS_OVERWRITING as it is now unused.
   2259  */
   2260 enum AccessControl {
   2261   DEFAULT               = 0,
   2262   ALL_CAN_READ          = 1,
   2263   ALL_CAN_WRITE         = 1 << 1,
   2264   PROHIBITS_OVERWRITING = 1 << 2
   2265 };
   2266 
   2267 
   2268 /**
   2269  * A JavaScript object (ECMA-262, 4.3.3)
   2270  */
   2271 class V8_EXPORT Object : public Value {
   2272  public:
   2273   bool Set(Handle<Value> key, Handle<Value> value);
   2274 
   2275   bool Set(uint32_t index, Handle<Value> value);
   2276 
   2277   // Sets an own property on this object bypassing interceptors and
   2278   // overriding accessors or read-only properties.
   2279   //
   2280   // Note that if the object has an interceptor the property will be set
   2281   // locally, but since the interceptor takes precedence the local property
   2282   // will only be returned if the interceptor doesn't return a value.
   2283   //
   2284   // Note also that this only works for named properties.
   2285   bool ForceSet(Handle<Value> key,
   2286                 Handle<Value> value,
   2287                 PropertyAttribute attribs = None);
   2288 
   2289   Local<Value> Get(Handle<Value> key);
   2290 
   2291   Local<Value> Get(uint32_t index);
   2292 
   2293   /**
   2294    * Gets the property attributes of a property which can be None or
   2295    * any combination of ReadOnly, DontEnum and DontDelete. Returns
   2296    * None when the property doesn't exist.
   2297    */
   2298   PropertyAttribute GetPropertyAttributes(Handle<Value> key);
   2299 
   2300   /**
   2301    * Returns Object.getOwnPropertyDescriptor as per ES5 section 15.2.3.3.
   2302    */
   2303   Local<Value> GetOwnPropertyDescriptor(Local<String> key);
   2304 
   2305   bool Has(Handle<Value> key);
   2306 
   2307   bool Delete(Handle<Value> key);
   2308 
   2309   // Delete a property on this object bypassing interceptors and
   2310   // ignoring dont-delete attributes.
   2311   bool ForceDelete(Handle<Value> key);
   2312 
   2313   bool Has(uint32_t index);
   2314 
   2315   bool Delete(uint32_t index);
   2316 
   2317   bool SetAccessor(Handle<String> name,
   2318                    AccessorGetterCallback getter,
   2319                    AccessorSetterCallback setter = 0,
   2320                    Handle<Value> data = Handle<Value>(),
   2321                    AccessControl settings = DEFAULT,
   2322                    PropertyAttribute attribute = None);
   2323   bool SetAccessor(Handle<Name> name,
   2324                    AccessorNameGetterCallback getter,
   2325                    AccessorNameSetterCallback setter = 0,
   2326                    Handle<Value> data = Handle<Value>(),
   2327                    AccessControl settings = DEFAULT,
   2328                    PropertyAttribute attribute = None);
   2329 
   2330   // This function is not yet stable and should not be used at this time.
   2331   bool SetDeclaredAccessor(Local<Name> name,
   2332                            Local<DeclaredAccessorDescriptor> descriptor,
   2333                            PropertyAttribute attribute = None,
   2334                            AccessControl settings = DEFAULT);
   2335 
   2336   void SetAccessorProperty(Local<Name> name,
   2337                            Local<Function> getter,
   2338                            Handle<Function> setter = Handle<Function>(),
   2339                            PropertyAttribute attribute = None,
   2340                            AccessControl settings = DEFAULT);
   2341 
   2342   /**
   2343    * Functionality for private properties.
   2344    * This is an experimental feature, use at your own risk.
   2345    * Note: Private properties are inherited. Do not rely on this, since it may
   2346    * change.
   2347    */
   2348   bool HasPrivate(Handle<Private> key);
   2349   bool SetPrivate(Handle<Private> key, Handle<Value> value);
   2350   bool DeletePrivate(Handle<Private> key);
   2351   Local<Value> GetPrivate(Handle<Private> key);
   2352 
   2353   /**
   2354    * Returns an array containing the names of the enumerable properties
   2355    * of this object, including properties from prototype objects.  The
   2356    * array returned by this method contains the same values as would
   2357    * be enumerated by a for-in statement over this object.
   2358    */
   2359   Local<Array> GetPropertyNames();
   2360 
   2361   /**
   2362    * This function has the same functionality as GetPropertyNames but
   2363    * the returned array doesn't contain the names of properties from
   2364    * prototype objects.
   2365    */
   2366   Local<Array> GetOwnPropertyNames();
   2367 
   2368   /**
   2369    * Get the prototype object.  This does not skip objects marked to
   2370    * be skipped by __proto__ and it does not consult the security
   2371    * handler.
   2372    */
   2373   Local<Value> GetPrototype();
   2374 
   2375   /**
   2376    * Set the prototype object.  This does not skip objects marked to
   2377    * be skipped by __proto__ and it does not consult the security
   2378    * handler.
   2379    */
   2380   bool SetPrototype(Handle<Value> prototype);
   2381 
   2382   /**
   2383    * Finds an instance of the given function template in the prototype
   2384    * chain.
   2385    */
   2386   Local<Object> FindInstanceInPrototypeChain(Handle<FunctionTemplate> tmpl);
   2387 
   2388   /**
   2389    * Call builtin Object.prototype.toString on this object.
   2390    * This is different from Value::ToString() that may call
   2391    * user-defined toString function. This one does not.
   2392    */
   2393   Local<String> ObjectProtoToString();
   2394 
   2395   /**
   2396    * Returns the name of the function invoked as a constructor for this object.
   2397    */
   2398   Local<String> GetConstructorName();
   2399 
   2400   /** Gets the number of internal fields for this Object. */
   2401   int InternalFieldCount();
   2402 
   2403   /** Same as above, but works for Persistents */
   2404   V8_INLINE static int InternalFieldCount(
   2405       const PersistentBase<Object>& object) {
   2406     return object.val_->InternalFieldCount();
   2407   }
   2408 
   2409   /** Gets the value from an internal field. */
   2410   V8_INLINE Local<Value> GetInternalField(int index);
   2411 
   2412   /** Sets the value in an internal field. */
   2413   void SetInternalField(int index, Handle<Value> value);
   2414 
   2415   /**
   2416    * Gets a 2-byte-aligned native pointer from an internal field. This field
   2417    * must have been set by SetAlignedPointerInInternalField, everything else
   2418    * leads to undefined behavior.
   2419    */
   2420   V8_INLINE void* GetAlignedPointerFromInternalField(int index);
   2421 
   2422   /** Same as above, but works for Persistents */
   2423   V8_INLINE static void* GetAlignedPointerFromInternalField(
   2424       const PersistentBase<Object>& object, int index) {
   2425     return object.val_->GetAlignedPointerFromInternalField(index);
   2426   }
   2427 
   2428   /**
   2429    * Sets a 2-byte-aligned native pointer in an internal field. To retrieve such
   2430    * a field, GetAlignedPointerFromInternalField must be used, everything else
   2431    * leads to undefined behavior.
   2432    */
   2433   void SetAlignedPointerInInternalField(int index, void* value);
   2434 
   2435   // Testers for local properties.
   2436   bool HasOwnProperty(Handle<String> key);
   2437   bool HasRealNamedProperty(Handle<String> key);
   2438   bool HasRealIndexedProperty(uint32_t index);
   2439   bool HasRealNamedCallbackProperty(Handle<String> key);
   2440 
   2441   /**
   2442    * If result.IsEmpty() no real property was located in the prototype chain.
   2443    * This means interceptors in the prototype chain are not called.
   2444    */
   2445   Local<Value> GetRealNamedPropertyInPrototypeChain(Handle<String> key);
   2446 
   2447   /**
   2448    * If result.IsEmpty() no real property was located on the object or
   2449    * in the prototype chain.
   2450    * This means interceptors in the prototype chain are not called.
   2451    */
   2452   Local<Value> GetRealNamedProperty(Handle<String> key);
   2453 
   2454   /** Tests for a named lookup interceptor.*/
   2455   bool HasNamedLookupInterceptor();
   2456 
   2457   /** Tests for an index lookup interceptor.*/
   2458   bool HasIndexedLookupInterceptor();
   2459 
   2460   /**
   2461    * Turns on access check on the object if the object is an instance of
   2462    * a template that has access check callbacks. If an object has no
   2463    * access check info, the object cannot be accessed by anyone.
   2464    */
   2465   void TurnOnAccessCheck();
   2466 
   2467   /**
   2468    * Returns the identity hash for this object. The current implementation
   2469    * uses a hidden property on the object to store the identity hash.
   2470    *
   2471    * The return value will never be 0. Also, it is not guaranteed to be
   2472    * unique.
   2473    */
   2474   int GetIdentityHash();
   2475 
   2476   /**
   2477    * Access hidden properties on JavaScript objects. These properties are
   2478    * hidden from the executing JavaScript and only accessible through the V8
   2479    * C++ API. Hidden properties introduced by V8 internally (for example the
   2480    * identity hash) are prefixed with "v8::".
   2481    */
   2482   bool SetHiddenValue(Handle<String> key, Handle<Value> value);
   2483   Local<Value> GetHiddenValue(Handle<String> key);
   2484   bool DeleteHiddenValue(Handle<String> key);
   2485 
   2486   /**
   2487    * Returns true if this is an instance of an api function (one
   2488    * created from a function created from a function template) and has
   2489    * been modified since it was created.  Note that this method is
   2490    * conservative and may return true for objects that haven't actually
   2491    * been modified.
   2492    */
   2493   bool IsDirty();
   2494 
   2495   /**
   2496    * Clone this object with a fast but shallow copy.  Values will point
   2497    * to the same values as the original object.
   2498    */
   2499   Local<Object> Clone();
   2500 
   2501   /**
   2502    * Returns the context in which the object was created.
   2503    */
   2504   Local<Context> CreationContext();
   2505 
   2506   /**
   2507    * Set the backing store of the indexed properties to be managed by the
   2508    * embedding layer. Access to the indexed properties will follow the rules
   2509    * spelled out in CanvasPixelArray.
   2510    * Note: The embedding program still owns the data and needs to ensure that
   2511    *       the backing store is preserved while V8 has a reference.
   2512    */
   2513   void SetIndexedPropertiesToPixelData(uint8_t* data, int length);
   2514   bool HasIndexedPropertiesInPixelData();
   2515   uint8_t* GetIndexedPropertiesPixelData();
   2516   int GetIndexedPropertiesPixelDataLength();
   2517 
   2518   /**
   2519    * Set the backing store of the indexed properties to be managed by the
   2520    * embedding layer. Access to the indexed properties will follow the rules
   2521    * spelled out for the CanvasArray subtypes in the WebGL specification.
   2522    * Note: The embedding program still owns the data and needs to ensure that
   2523    *       the backing store is preserved while V8 has a reference.
   2524    */
   2525   void SetIndexedPropertiesToExternalArrayData(void* data,
   2526                                                ExternalArrayType array_type,
   2527                                                int number_of_elements);
   2528   bool HasIndexedPropertiesInExternalArrayData();
   2529   void* GetIndexedPropertiesExternalArrayData();
   2530   ExternalArrayType GetIndexedPropertiesExternalArrayDataType();
   2531   int GetIndexedPropertiesExternalArrayDataLength();
   2532 
   2533   /**
   2534    * Checks whether a callback is set by the
   2535    * ObjectTemplate::SetCallAsFunctionHandler method.
   2536    * When an Object is callable this method returns true.
   2537    */
   2538   bool IsCallable();
   2539 
   2540   /**
   2541    * Call an Object as a function if a callback is set by the
   2542    * ObjectTemplate::SetCallAsFunctionHandler method.
   2543    */
   2544   Local<Value> CallAsFunction(Handle<Value> recv,
   2545                               int argc,
   2546                               Handle<Value> argv[]);
   2547 
   2548   /**
   2549    * Call an Object as a constructor if a callback is set by the
   2550    * ObjectTemplate::SetCallAsFunctionHandler method.
   2551    * Note: This method behaves like the Function::NewInstance method.
   2552    */
   2553   Local<Value> CallAsConstructor(int argc, Handle<Value> argv[]);
   2554 
   2555   static Local<Object> New(Isolate* isolate);
   2556 
   2557   V8_INLINE static Object* Cast(Value* obj);
   2558 
   2559  private:
   2560   Object();
   2561   static void CheckCast(Value* obj);
   2562   Local<Value> SlowGetInternalField(int index);
   2563   void* SlowGetAlignedPointerFromInternalField(int index);
   2564 };
   2565 
   2566 
   2567 /**
   2568  * An instance of the built-in array constructor (ECMA-262, 15.4.2).
   2569  */
   2570 class V8_EXPORT Array : public Object {
   2571  public:
   2572   uint32_t Length() const;
   2573 
   2574   /**
   2575    * Clones an element at index |index|.  Returns an empty
   2576    * handle if cloning fails (for any reason).
   2577    */
   2578   Local<Object> CloneElementAt(uint32_t index);
   2579 
   2580   /**
   2581    * Creates a JavaScript array with the given length. If the length
   2582    * is negative the returned array will have length 0.
   2583    */
   2584   static Local<Array> New(Isolate* isolate, int length = 0);
   2585 
   2586   V8_INLINE static Array* Cast(Value* obj);
   2587  private:
   2588   Array();
   2589   static void CheckCast(Value* obj);
   2590 };
   2591 
   2592 
   2593 template<typename T>
   2594 class ReturnValue {
   2595  public:
   2596   template <class S> V8_INLINE ReturnValue(const ReturnValue<S>& that)
   2597       : value_(that.value_) {
   2598     TYPE_CHECK(T, S);
   2599   }
   2600   // Handle setters
   2601   template <typename S> V8_INLINE void Set(const Persistent<S>& handle);
   2602   template <typename S> V8_INLINE void Set(const Handle<S> handle);
   2603   // Fast primitive setters
   2604   V8_INLINE void Set(bool value);
   2605   V8_INLINE void Set(double i);
   2606   V8_INLINE void Set(int32_t i);
   2607   V8_INLINE void Set(uint32_t i);
   2608   // Fast JS primitive setters
   2609   V8_INLINE void SetNull();
   2610   V8_INLINE void SetUndefined();
   2611   V8_INLINE void SetEmptyString();
   2612   // Convenience getter for Isolate
   2613   V8_INLINE Isolate* GetIsolate();
   2614 
   2615   // Pointer setter: Uncompilable to prevent inadvertent misuse.
   2616   template <typename S>
   2617   V8_INLINE void Set(S* whatever);
   2618 
   2619  private:
   2620   template<class F> friend class ReturnValue;
   2621   template<class F> friend class FunctionCallbackInfo;
   2622   template<class F> friend class PropertyCallbackInfo;
   2623   template<class F, class G, class H> friend class PersistentValueMap;
   2624   V8_INLINE void SetInternal(internal::Object* value) { *value_ = value; }
   2625   V8_INLINE internal::Object* GetDefaultValue();
   2626   V8_INLINE explicit ReturnValue(internal::Object** slot);
   2627   internal::Object** value_;
   2628 };
   2629 
   2630 
   2631 /**
   2632  * The argument information given to function call callbacks.  This
   2633  * class provides access to information about the context of the call,
   2634  * including the receiver, the number and values of arguments, and
   2635  * the holder of the function.
   2636  */
   2637 template<typename T>
   2638 class FunctionCallbackInfo {
   2639  public:
   2640   V8_INLINE int Length() const;
   2641   V8_INLINE Local<Value> operator[](int i) const;
   2642   V8_INLINE Local<Function> Callee() const;
   2643   V8_INLINE Local<Object> This() const;
   2644   V8_INLINE Local<Object> Holder() const;
   2645   V8_INLINE bool IsConstructCall() const;
   2646   V8_INLINE Local<Value> Data() const;
   2647   V8_INLINE Isolate* GetIsolate() const;
   2648   V8_INLINE ReturnValue<T> GetReturnValue() const;
   2649   // This shouldn't be public, but the arm compiler needs it.
   2650   static const int kArgsLength = 7;
   2651 
   2652  protected:
   2653   friend class internal::FunctionCallbackArguments;
   2654   friend class internal::CustomArguments<FunctionCallbackInfo>;
   2655   static const int kHolderIndex = 0;
   2656   static const int kIsolateIndex = 1;
   2657   static const int kReturnValueDefaultValueIndex = 2;
   2658   static const int kReturnValueIndex = 3;
   2659   static const int kDataIndex = 4;
   2660   static const int kCalleeIndex = 5;
   2661   static const int kContextSaveIndex = 6;
   2662 
   2663   V8_INLINE FunctionCallbackInfo(internal::Object** implicit_args,
   2664                    internal::Object** values,
   2665                    int length,
   2666                    bool is_construct_call);
   2667   internal::Object** implicit_args_;
   2668   internal::Object** values_;
   2669   int length_;
   2670   bool is_construct_call_;
   2671 };
   2672 
   2673 
   2674 /**
   2675  * The information passed to a property callback about the context
   2676  * of the property access.
   2677  */
   2678 template<typename T>
   2679 class PropertyCallbackInfo {
   2680  public:
   2681   V8_INLINE Isolate* GetIsolate() const;
   2682   V8_INLINE Local<Value> Data() const;
   2683   V8_INLINE Local<Object> This() const;
   2684   V8_INLINE Local<Object> Holder() const;
   2685   V8_INLINE ReturnValue<T> GetReturnValue() const;
   2686   // This shouldn't be public, but the arm compiler needs it.
   2687   static const int kArgsLength = 6;
   2688 
   2689  protected:
   2690   friend class MacroAssembler;
   2691   friend class internal::PropertyCallbackArguments;
   2692   friend class internal::CustomArguments<PropertyCallbackInfo>;
   2693   static const int kHolderIndex = 0;
   2694   static const int kIsolateIndex = 1;
   2695   static const int kReturnValueDefaultValueIndex = 2;
   2696   static const int kReturnValueIndex = 3;
   2697   static const int kDataIndex = 4;
   2698   static const int kThisIndex = 5;
   2699 
   2700   V8_INLINE PropertyCallbackInfo(internal::Object** args) : args_(args) {}
   2701   internal::Object** args_;
   2702 };
   2703 
   2704 
   2705 typedef void (*FunctionCallback)(const FunctionCallbackInfo<Value>& info);
   2706 
   2707 
   2708 /**
   2709  * A JavaScript function object (ECMA-262, 15.3).
   2710  */
   2711 class V8_EXPORT Function : public Object {
   2712  public:
   2713   /**
   2714    * Create a function in the current execution context
   2715    * for a given FunctionCallback.
   2716    */
   2717   static Local<Function> New(Isolate* isolate,
   2718                              FunctionCallback callback,
   2719                              Local<Value> data = Local<Value>(),
   2720                              int length = 0);
   2721 
   2722   Local<Object> NewInstance() const;
   2723   Local<Object> NewInstance(int argc, Handle<Value> argv[]) const;
   2724   Local<Value> Call(Handle<Value> recv, int argc, Handle<Value> argv[]);
   2725   void SetName(Handle<String> name);
   2726   Handle<Value> GetName() const;
   2727 
   2728   /**
   2729    * Name inferred from variable or property assignment of this function.
   2730    * Used to facilitate debugging and profiling of JavaScript code written
   2731    * in an OO style, where many functions are anonymous but are assigned
   2732    * to object properties.
   2733    */
   2734   Handle<Value> GetInferredName() const;
   2735 
   2736   /**
   2737    * User-defined name assigned to the "displayName" property of this function.
   2738    * Used to facilitate debugging and profiling of JavaScript code.
   2739    */
   2740   Handle<Value> GetDisplayName() const;
   2741 
   2742   /**
   2743    * Returns zero based line number of function body and
   2744    * kLineOffsetNotFound if no information available.
   2745    */
   2746   int GetScriptLineNumber() const;
   2747   /**
   2748    * Returns zero based column number of function body and
   2749    * kLineOffsetNotFound if no information available.
   2750    */
   2751   int GetScriptColumnNumber() const;
   2752 
   2753   /**
   2754    * Tells whether this function is builtin.
   2755    */
   2756   bool IsBuiltin() const;
   2757 
   2758   /**
   2759    * Returns scriptId.
   2760    */
   2761   int ScriptId() const;
   2762 
   2763   /**
   2764    * Returns the original function if this function is bound, else returns
   2765    * v8::Undefined.
   2766    */
   2767   Local<Value> GetBoundFunction() const;
   2768 
   2769   ScriptOrigin GetScriptOrigin() const;
   2770   V8_INLINE static Function* Cast(Value* obj);
   2771   static const int kLineOffsetNotFound;
   2772 
   2773  private:
   2774   Function();
   2775   static void CheckCast(Value* obj);
   2776 };
   2777 
   2778 
   2779 /**
   2780  * An instance of the built-in Promise constructor (ES6 draft).
   2781  * This API is experimental. Only works with --harmony flag.
   2782  */
   2783 class V8_EXPORT Promise : public Object {
   2784  public:
   2785   class V8_EXPORT Resolver : public Object {
   2786    public:
   2787     /**
   2788      * Create a new resolver, along with an associated promise in pending state.
   2789      */
   2790     static Local<Resolver> New(Isolate* isolate);
   2791 
   2792     /**
   2793      * Extract the associated promise.
   2794      */
   2795     Local<Promise> GetPromise();
   2796 
   2797     /**
   2798      * Resolve/reject the associated promise with a given value.
   2799      * Ignored if the promise is no longer pending.
   2800      */
   2801     void Resolve(Handle<Value> value);
   2802     void Reject(Handle<Value> value);
   2803 
   2804     V8_INLINE static Resolver* Cast(Value* obj);
   2805 
   2806    private:
   2807     Resolver();
   2808     static void CheckCast(Value* obj);
   2809   };
   2810 
   2811   /**
   2812    * Register a resolution/rejection handler with a promise.
   2813    * The handler is given the respective resolution/rejection value as
   2814    * an argument. If the promise is already resolved/rejected, the handler is
   2815    * invoked at the end of turn.
   2816    */
   2817   Local<Promise> Chain(Handle<Function> handler);
   2818   Local<Promise> Catch(Handle<Function> handler);
   2819   Local<Promise> Then(Handle<Function> handler);
   2820 
   2821   V8_INLINE static Promise* Cast(Value* obj);
   2822 
   2823  private:
   2824   Promise();
   2825   static void CheckCast(Value* obj);
   2826 };
   2827 
   2828 
   2829 #ifndef V8_ARRAY_BUFFER_INTERNAL_FIELD_COUNT
   2830 // The number of required internal fields can be defined by embedder.
   2831 #define V8_ARRAY_BUFFER_INTERNAL_FIELD_COUNT 2
   2832 #endif
   2833 
   2834 /**
   2835  * An instance of the built-in ArrayBuffer constructor (ES6 draft 15.13.5).
   2836  * This API is experimental and may change significantly.
   2837  */
   2838 class V8_EXPORT ArrayBuffer : public Object {
   2839  public:
   2840   /**
   2841    * Allocator that V8 uses to allocate |ArrayBuffer|'s memory.
   2842    * The allocator is a global V8 setting. It should be set with
   2843    * V8::SetArrayBufferAllocator prior to creation of a first ArrayBuffer.
   2844    *
   2845    * This API is experimental and may change significantly.
   2846    */
   2847   class V8_EXPORT Allocator { // NOLINT
   2848    public:
   2849     virtual ~Allocator() {}
   2850 
   2851     /**
   2852      * Allocate |length| bytes. Return NULL if allocation is not successful.
   2853      * Memory should be initialized to zeroes.
   2854      */
   2855     virtual void* Allocate(size_t length) = 0;
   2856 
   2857     /**
   2858      * Allocate |length| bytes. Return NULL if allocation is not successful.
   2859      * Memory does not have to be initialized.
   2860      */
   2861     virtual void* AllocateUninitialized(size_t length) = 0;
   2862     /**
   2863      * Free the memory block of size |length|, pointed to by |data|.
   2864      * That memory is guaranteed to be previously allocated by |Allocate|.
   2865      */
   2866     virtual void Free(void* data, size_t length) = 0;
   2867   };
   2868 
   2869   /**
   2870    * The contents of an |ArrayBuffer|. Externalization of |ArrayBuffer|
   2871    * returns an instance of this class, populated, with a pointer to data
   2872    * and byte length.
   2873    *
   2874    * The Data pointer of ArrayBuffer::Contents is always allocated with
   2875    * Allocator::Allocate that is set with V8::SetArrayBufferAllocator.
   2876    *
   2877    * This API is experimental and may change significantly.
   2878    */
   2879   class V8_EXPORT Contents { // NOLINT
   2880    public:
   2881     Contents() : data_(NULL), byte_length_(0) {}
   2882 
   2883     void* Data() const { return data_; }
   2884     size_t ByteLength() const { return byte_length_; }
   2885 
   2886    private:
   2887     void* data_;
   2888     size_t byte_length_;
   2889 
   2890     friend class ArrayBuffer;
   2891   };
   2892 
   2893 
   2894   /**
   2895    * Data length in bytes.
   2896    */
   2897   size_t ByteLength() const;
   2898 
   2899   /**
   2900    * Create a new ArrayBuffer. Allocate |byte_length| bytes.
   2901    * Allocated memory will be owned by a created ArrayBuffer and
   2902    * will be deallocated when it is garbage-collected,
   2903    * unless the object is externalized.
   2904    */
   2905   static Local<ArrayBuffer> New(Isolate* isolate, size_t byte_length);
   2906 
   2907   /**
   2908    * Create a new ArrayBuffer over an existing memory block.
   2909    * The created array buffer is immediately in externalized state.
   2910    * The memory block will not be reclaimed when a created ArrayBuffer
   2911    * is garbage-collected.
   2912    */
   2913   static Local<ArrayBuffer> New(Isolate* isolate, void* data,
   2914                                 size_t byte_length);
   2915 
   2916   /**
   2917    * Returns true if ArrayBuffer is extrenalized, that is, does not
   2918    * own its memory block.
   2919    */
   2920   bool IsExternal() const;
   2921 
   2922   /**
   2923    * Neuters this ArrayBuffer and all its views (typed arrays).
   2924    * Neutering sets the byte length of the buffer and all typed arrays to zero,
   2925    * preventing JavaScript from ever accessing underlying backing store.
   2926    * ArrayBuffer should have been externalized.
   2927    */
   2928   void Neuter();
   2929 
   2930   /**
   2931    * Make this ArrayBuffer external. The pointer to underlying memory block
   2932    * and byte length are returned as |Contents| structure. After ArrayBuffer
   2933    * had been etxrenalized, it does no longer owns the memory block. The caller
   2934    * should take steps to free memory when it is no longer needed.
   2935    *
   2936    * The memory block is guaranteed to be allocated with |Allocator::Allocate|
   2937    * that has been set with V8::SetArrayBufferAllocator.
   2938    */
   2939   Contents Externalize();
   2940 
   2941   V8_INLINE static ArrayBuffer* Cast(Value* obj);
   2942 
   2943   static const int kInternalFieldCount = V8_ARRAY_BUFFER_INTERNAL_FIELD_COUNT;
   2944 
   2945  private:
   2946   ArrayBuffer();
   2947   static void CheckCast(Value* obj);
   2948 };
   2949 
   2950 
   2951 #ifndef V8_ARRAY_BUFFER_VIEW_INTERNAL_FIELD_COUNT
   2952 // The number of required internal fields can be defined by embedder.
   2953 #define V8_ARRAY_BUFFER_VIEW_INTERNAL_FIELD_COUNT 2
   2954 #endif
   2955 
   2956 
   2957 /**
   2958  * A base class for an instance of one of "views" over ArrayBuffer,
   2959  * including TypedArrays and DataView (ES6 draft 15.13).
   2960  *
   2961  * This API is experimental and may change significantly.
   2962  */
   2963 class V8_EXPORT ArrayBufferView : public Object {
   2964  public:
   2965   /**
   2966    * Returns underlying ArrayBuffer.
   2967    */
   2968   Local<ArrayBuffer> Buffer();
   2969   /**
   2970    * Byte offset in |Buffer|.
   2971    */
   2972   size_t ByteOffset();
   2973   /**
   2974    * Size of a view in bytes.
   2975    */
   2976   size_t ByteLength();
   2977 
   2978   V8_INLINE static ArrayBufferView* Cast(Value* obj);
   2979 
   2980   static const int kInternalFieldCount =
   2981       V8_ARRAY_BUFFER_VIEW_INTERNAL_FIELD_COUNT;
   2982 
   2983  private:
   2984   ArrayBufferView();
   2985   static void CheckCast(Value* obj);
   2986 };
   2987 
   2988 
   2989 /**
   2990  * A base class for an instance of TypedArray series of constructors
   2991  * (ES6 draft 15.13.6).
   2992  * This API is experimental and may change significantly.
   2993  */
   2994 class V8_EXPORT TypedArray : public ArrayBufferView {
   2995  public:
   2996   /**
   2997    * Number of elements in this typed array
   2998    * (e.g. for Int16Array, |ByteLength|/2).
   2999    */
   3000   size_t Length();
   3001 
   3002   V8_INLINE static TypedArray* Cast(Value* obj);
   3003 
   3004  private:
   3005   TypedArray();
   3006   static void CheckCast(Value* obj);
   3007 };
   3008 
   3009 
   3010 /**
   3011  * An instance of Uint8Array constructor (ES6 draft 15.13.6).
   3012  * This API is experimental and may change significantly.
   3013  */
   3014 class V8_EXPORT Uint8Array : public TypedArray {
   3015  public:
   3016   static Local<Uint8Array> New(Handle<ArrayBuffer> array_buffer,
   3017                                size_t byte_offset, size_t length);
   3018   V8_INLINE static Uint8Array* Cast(Value* obj);
   3019 
   3020  private:
   3021   Uint8Array();
   3022   static void CheckCast(Value* obj);
   3023 };
   3024 
   3025 
   3026 /**
   3027  * An instance of Uint8ClampedArray constructor (ES6 draft 15.13.6).
   3028  * This API is experimental and may change significantly.
   3029  */
   3030 class V8_EXPORT Uint8ClampedArray : public TypedArray {
   3031  public:
   3032   static Local<Uint8ClampedArray> New(Handle<ArrayBuffer> array_buffer,
   3033                                size_t byte_offset, size_t length);
   3034   V8_INLINE static Uint8ClampedArray* Cast(Value* obj);
   3035 
   3036  private:
   3037   Uint8ClampedArray();
   3038   static void CheckCast(Value* obj);
   3039 };
   3040 
   3041 /**
   3042  * An instance of Int8Array constructor (ES6 draft 15.13.6).
   3043  * This API is experimental and may change significantly.
   3044  */
   3045 class V8_EXPORT Int8Array : public TypedArray {
   3046  public:
   3047   static Local<Int8Array> New(Handle<ArrayBuffer> array_buffer,
   3048                                size_t byte_offset, size_t length);
   3049   V8_INLINE static Int8Array* Cast(Value* obj);
   3050 
   3051  private:
   3052   Int8Array();
   3053   static void CheckCast(Value* obj);
   3054 };
   3055 
   3056 
   3057 /**
   3058  * An instance of Uint16Array constructor (ES6 draft 15.13.6).
   3059  * This API is experimental and may change significantly.
   3060  */
   3061 class V8_EXPORT Uint16Array : public TypedArray {
   3062  public:
   3063   static Local<Uint16Array> New(Handle<ArrayBuffer> array_buffer,
   3064                                size_t byte_offset, size_t length);
   3065   V8_INLINE static Uint16Array* Cast(Value* obj);
   3066 
   3067  private:
   3068   Uint16Array();
   3069   static void CheckCast(Value* obj);
   3070 };
   3071 
   3072 
   3073 /**
   3074  * An instance of Int16Array constructor (ES6 draft 15.13.6).
   3075  * This API is experimental and may change significantly.
   3076  */
   3077 class V8_EXPORT Int16Array : public TypedArray {
   3078  public:
   3079   static Local<Int16Array> New(Handle<ArrayBuffer> array_buffer,
   3080                                size_t byte_offset, size_t length);
   3081   V8_INLINE static Int16Array* Cast(Value* obj);
   3082 
   3083  private:
   3084   Int16Array();
   3085   static void CheckCast(Value* obj);
   3086 };
   3087 
   3088 
   3089 /**
   3090  * An instance of Uint32Array constructor (ES6 draft 15.13.6).
   3091  * This API is experimental and may change significantly.
   3092  */
   3093 class V8_EXPORT Uint32Array : public TypedArray {
   3094  public:
   3095   static Local<Uint32Array> New(Handle<ArrayBuffer> array_buffer,
   3096                                size_t byte_offset, size_t length);
   3097   V8_INLINE static Uint32Array* Cast(Value* obj);
   3098 
   3099  private:
   3100   Uint32Array();
   3101   static void CheckCast(Value* obj);
   3102 };
   3103 
   3104 
   3105 /**
   3106  * An instance of Int32Array constructor (ES6 draft 15.13.6).
   3107  * This API is experimental and may change significantly.
   3108  */
   3109 class V8_EXPORT Int32Array : public TypedArray {
   3110  public:
   3111   static Local<Int32Array> New(Handle<ArrayBuffer> array_buffer,
   3112                                size_t byte_offset, size_t length);
   3113   V8_INLINE static Int32Array* Cast(Value* obj);
   3114 
   3115  private:
   3116   Int32Array();
   3117   static void CheckCast(Value* obj);
   3118 };
   3119 
   3120 
   3121 /**
   3122  * An instance of Float32Array constructor (ES6 draft 15.13.6).
   3123  * This API is experimental and may change significantly.
   3124  */
   3125 class V8_EXPORT Float32Array : public TypedArray {
   3126  public:
   3127   static Local<Float32Array> New(Handle<ArrayBuffer> array_buffer,
   3128                                size_t byte_offset, size_t length);
   3129   V8_INLINE static Float32Array* Cast(Value* obj);
   3130 
   3131  private:
   3132   Float32Array();
   3133   static void CheckCast(Value* obj);
   3134 };
   3135 
   3136 
   3137 /**
   3138  * An instance of Float64Array constructor (ES6 draft 15.13.6).
   3139  * This API is experimental and may change significantly.
   3140  */
   3141 class V8_EXPORT Float64Array : public TypedArray {
   3142  public:
   3143   static Local<Float64Array> New(Handle<ArrayBuffer> array_buffer,
   3144                                size_t byte_offset, size_t length);
   3145   V8_INLINE static Float64Array* Cast(Value* obj);
   3146 
   3147  private:
   3148   Float64Array();
   3149   static void CheckCast(Value* obj);
   3150 };
   3151 
   3152 
   3153 /**
   3154  * An instance of DataView constructor (ES6 draft 15.13.7).
   3155  * This API is experimental and may change significantly.
   3156  */
   3157 class V8_EXPORT DataView : public ArrayBufferView {
   3158  public:
   3159   static Local<DataView> New(Handle<ArrayBuffer> array_buffer,
   3160                              size_t byte_offset, size_t length);
   3161   V8_INLINE static DataView* Cast(Value* obj);
   3162 
   3163  private:
   3164   DataView();
   3165   static void CheckCast(Value* obj);
   3166 };
   3167 
   3168 
   3169 /**
   3170  * An instance of the built-in Date constructor (ECMA-262, 15.9).
   3171  */
   3172 class V8_EXPORT Date : public Object {
   3173  public:
   3174   static Local<Value> New(Isolate* isolate, double time);
   3175 
   3176   /**
   3177    * A specialization of Value::NumberValue that is more efficient
   3178    * because we know the structure of this object.
   3179    */
   3180   double ValueOf() const;
   3181 
   3182   V8_INLINE static Date* Cast(v8::Value* obj);
   3183 
   3184   /**
   3185    * Notification that the embedder has changed the time zone,
   3186    * daylight savings time, or other date / time configuration
   3187    * parameters.  V8 keeps a cache of various values used for
   3188    * date / time computation.  This notification will reset
   3189    * those cached values for the current context so that date /
   3190    * time configuration changes would be reflected in the Date
   3191    * object.
   3192    *
   3193    * This API should not be called more than needed as it will
   3194    * negatively impact the performance of date operations.
   3195    */
   3196   static void DateTimeConfigurationChangeNotification(Isolate* isolate);
   3197 
   3198  private:
   3199   static void CheckCast(v8::Value* obj);
   3200 };
   3201 
   3202 
   3203 /**
   3204  * A Number object (ECMA-262, 4.3.21).
   3205  */
   3206 class V8_EXPORT NumberObject : public Object {
   3207  public:
   3208   static Local<Value> New(Isolate* isolate, double value);
   3209 
   3210   double ValueOf() const;
   3211 
   3212   V8_INLINE static NumberObject* Cast(v8::Value* obj);
   3213 
   3214  private:
   3215   static void CheckCast(v8::Value* obj);
   3216 };
   3217 
   3218 
   3219 /**
   3220  * A Boolean object (ECMA-262, 4.3.15).
   3221  */
   3222 class V8_EXPORT BooleanObject : public Object {
   3223  public:
   3224   static Local<Value> New(bool value);
   3225 
   3226   bool ValueOf() const;
   3227 
   3228   V8_INLINE static BooleanObject* Cast(v8::Value* obj);
   3229 
   3230  private:
   3231   static void CheckCast(v8::Value* obj);
   3232 };
   3233 
   3234 
   3235 /**
   3236  * A String object (ECMA-262, 4.3.18).
   3237  */
   3238 class V8_EXPORT StringObject : public Object {
   3239  public:
   3240   static Local<Value> New(Handle<String> value);
   3241 
   3242   Local<String> ValueOf() const;
   3243 
   3244   V8_INLINE static StringObject* Cast(v8::Value* obj);
   3245 
   3246  private:
   3247   static void CheckCast(v8::Value* obj);
   3248 };
   3249 
   3250 
   3251 /**
   3252  * A Symbol object (ECMA-262 edition 6).
   3253  *
   3254  * This is an experimental feature. Use at your own risk.
   3255  */
   3256 class V8_EXPORT SymbolObject : public Object {
   3257  public:
   3258   static Local<Value> New(Isolate* isolate, Handle<Symbol> value);
   3259 
   3260   Local<Symbol> ValueOf() const;
   3261 
   3262   V8_INLINE static SymbolObject* Cast(v8::Value* obj);
   3263 
   3264  private:
   3265   static void CheckCast(v8::Value* obj);
   3266 };
   3267 
   3268 
   3269 /**
   3270  * An instance of the built-in RegExp constructor (ECMA-262, 15.10).
   3271  */
   3272 class V8_EXPORT RegExp : public Object {
   3273  public:
   3274   /**
   3275    * Regular expression flag bits. They can be or'ed to enable a set
   3276    * of flags.
   3277    */
   3278   enum Flags {
   3279     kNone = 0,
   3280     kGlobal = 1,
   3281     kIgnoreCase = 2,
   3282     kMultiline = 4
   3283   };
   3284 
   3285   /**
   3286    * Creates a regular expression from the given pattern string and
   3287    * the flags bit field. May throw a JavaScript exception as
   3288    * described in ECMA-262, 15.10.4.1.
   3289    *
   3290    * For example,
   3291    *   RegExp::New(v8::String::New("foo"),
   3292    *               static_cast<RegExp::Flags>(kGlobal | kMultiline))
   3293    * is equivalent to evaluating "/foo/gm".
   3294    */
   3295   static Local<RegExp> New(Handle<String> pattern, Flags flags);
   3296 
   3297   /**
   3298    * Returns the value of the source property: a string representing
   3299    * the regular expression.
   3300    */
   3301   Local<String> GetSource() const;
   3302 
   3303   /**
   3304    * Returns the flags bit field.
   3305    */
   3306   Flags GetFlags() const;
   3307 
   3308   V8_INLINE static RegExp* Cast(v8::Value* obj);
   3309 
   3310  private:
   3311   static void CheckCast(v8::Value* obj);
   3312 };
   3313 
   3314 
   3315 /**
   3316  * A JavaScript value that wraps a C++ void*. This type of value is mainly used
   3317  * to associate C++ data structures with JavaScript objects.
   3318  */
   3319 class V8_EXPORT External : public Value {
   3320  public:
   3321   static Local<External> New(Isolate* isolate, void* value);
   3322   V8_INLINE static External* Cast(Value* obj);
   3323   void* Value() const;
   3324  private:
   3325   static void CheckCast(v8::Value* obj);
   3326 };
   3327 
   3328 
   3329 // --- Templates ---
   3330 
   3331 
   3332 /**
   3333  * The superclass of object and function templates.
   3334  */
   3335 class V8_EXPORT Template : public Data {
   3336  public:
   3337   /** Adds a property to each instance created by this template.*/
   3338   void Set(Handle<Name> name, Handle<Data> value,
   3339            PropertyAttribute attributes = None);
   3340   V8_INLINE void Set(Isolate* isolate, const char* name, Handle<Data> value);
   3341 
   3342   void SetAccessorProperty(
   3343      Local<Name> name,
   3344      Local<FunctionTemplate> getter = Local<FunctionTemplate>(),
   3345      Local<FunctionTemplate> setter = Local<FunctionTemplate>(),
   3346      PropertyAttribute attribute = None,
   3347      AccessControl settings = DEFAULT);
   3348 
   3349   /**
   3350    * Whenever the property with the given name is accessed on objects
   3351    * created from this Template the getter and setter callbacks
   3352    * are called instead of getting and setting the property directly
   3353    * on the JavaScript object.
   3354    *
   3355    * \param name The name of the property for which an accessor is added.
   3356    * \param getter The callback to invoke when getting the property.
   3357    * \param setter The callback to invoke when setting the property.
   3358    * \param data A piece of data that will be passed to the getter and setter
   3359    *   callbacks whenever they are invoked.
   3360    * \param settings Access control settings for the accessor. This is a bit
   3361    *   field consisting of one of more of
   3362    *   DEFAULT = 0, ALL_CAN_READ = 1, or ALL_CAN_WRITE = 2.
   3363    *   The default is to not allow cross-context access.
   3364    *   ALL_CAN_READ means that all cross-context reads are allowed.
   3365    *   ALL_CAN_WRITE means that all cross-context writes are allowed.
   3366    *   The combination ALL_CAN_READ | ALL_CAN_WRITE can be used to allow all
   3367    *   cross-context access.
   3368    * \param attribute The attributes of the property for which an accessor
   3369    *   is added.
   3370    * \param signature The signature describes valid receivers for the accessor
   3371    *   and is used to perform implicit instance checks against them. If the
   3372    *   receiver is incompatible (i.e. is not an instance of the constructor as
   3373    *   defined by FunctionTemplate::HasInstance()), an implicit TypeError is
   3374    *   thrown and no callback is invoked.
   3375    */
   3376   void SetNativeDataProperty(Local<String> name,
   3377                              AccessorGetterCallback getter,
   3378                              AccessorSetterCallback setter = 0,
   3379                              // TODO(dcarney): gcc can't handle Local below
   3380                              Handle<Value> data = Handle<Value>(),
   3381                              PropertyAttribute attribute = None,
   3382                              Local<AccessorSignature> signature =
   3383                                  Local<AccessorSignature>(),
   3384                              AccessControl settings = DEFAULT);
   3385   void SetNativeDataProperty(Local<Name> name,
   3386                              AccessorNameGetterCallback getter,
   3387                              AccessorNameSetterCallback setter = 0,
   3388                              // TODO(dcarney): gcc can't handle Local below
   3389                              Handle<Value> data = Handle<Value>(),
   3390                              PropertyAttribute attribute = None,
   3391                              Local<AccessorSignature> signature =
   3392                                  Local<AccessorSignature>(),
   3393                              AccessControl settings = DEFAULT);
   3394 
   3395   // This function is not yet stable and should not be used at this time.
   3396   bool SetDeclaredAccessor(Local<Name> name,
   3397                            Local<DeclaredAccessorDescriptor> descriptor,
   3398                            PropertyAttribute attribute = None,
   3399                            Local<AccessorSignature> signature =
   3400                                Local<AccessorSignature>(),
   3401                            AccessControl settings = DEFAULT);
   3402 
   3403  private:
   3404   Template();
   3405 
   3406   friend class ObjectTemplate;
   3407   friend class FunctionTemplate;
   3408 };
   3409 
   3410 
   3411 /**
   3412  * NamedProperty[Getter|Setter] are used as interceptors on object.
   3413  * See ObjectTemplate::SetNamedPropertyHandler.
   3414  */
   3415 typedef void (*NamedPropertyGetterCallback)(
   3416     Local<String> property,
   3417     const PropertyCallbackInfo<Value>& info);
   3418 
   3419 
   3420 /**
   3421  * Returns the value if the setter intercepts the request.
   3422  * Otherwise, returns an empty handle.
   3423  */
   3424 typedef void (*NamedPropertySetterCallback)(
   3425     Local<String> property,
   3426     Local<Value> value,
   3427     const PropertyCallbackInfo<Value>& info);
   3428 
   3429 
   3430 /**
   3431  * Returns a non-empty handle if the interceptor intercepts the request.
   3432  * The result is an integer encoding property attributes (like v8::None,
   3433  * v8::DontEnum, etc.)
   3434  */
   3435 typedef void (*NamedPropertyQueryCallback)(
   3436     Local<String> property,
   3437     const PropertyCallbackInfo<Integer>& info);
   3438 
   3439 
   3440 /**
   3441  * Returns a non-empty handle if the deleter intercepts the request.
   3442  * The return value is true if the property could be deleted and false
   3443  * otherwise.
   3444  */
   3445 typedef void (*NamedPropertyDeleterCallback)(
   3446     Local<String> property,
   3447     const PropertyCallbackInfo<Boolean>& info);
   3448 
   3449 
   3450 /**
   3451  * Returns an array containing the names of the properties the named
   3452  * property getter intercepts.
   3453  */
   3454 typedef void (*NamedPropertyEnumeratorCallback)(
   3455     const PropertyCallbackInfo<Array>& info);
   3456 
   3457 
   3458 /**
   3459  * Returns the value of the property if the getter intercepts the
   3460  * request.  Otherwise, returns an empty handle.
   3461  */
   3462 typedef void (*IndexedPropertyGetterCallback)(
   3463     uint32_t index,
   3464     const PropertyCallbackInfo<Value>& info);
   3465 
   3466 
   3467 /**
   3468  * Returns the value if the setter intercepts the request.
   3469  * Otherwise, returns an empty handle.
   3470  */
   3471 typedef void (*IndexedPropertySetterCallback)(
   3472     uint32_t index,
   3473     Local<Value> value,
   3474     const PropertyCallbackInfo<Value>& info);
   3475 
   3476 
   3477 /**
   3478  * Returns a non-empty handle if the interceptor intercepts the request.
   3479  * The result is an integer encoding property attributes.
   3480  */
   3481 typedef void (*IndexedPropertyQueryCallback)(
   3482     uint32_t index,
   3483     const PropertyCallbackInfo<Integer>& info);
   3484 
   3485 
   3486 /**
   3487  * Returns a non-empty handle if the deleter intercepts the request.
   3488  * The return value is true if the property could be deleted and false
   3489  * otherwise.
   3490  */
   3491 typedef void (*IndexedPropertyDeleterCallback)(
   3492     uint32_t index,
   3493     const PropertyCallbackInfo<Boolean>& info);
   3494 
   3495 
   3496 /**
   3497  * Returns an array containing the indices of the properties the
   3498  * indexed property getter intercepts.
   3499  */
   3500 typedef void (*IndexedPropertyEnumeratorCallback)(
   3501     const PropertyCallbackInfo<Array>& info);
   3502 
   3503 
   3504 /**
   3505  * Access type specification.
   3506  */
   3507 enum AccessType {
   3508   ACCESS_GET,
   3509   ACCESS_SET,
   3510   ACCESS_HAS,
   3511   ACCESS_DELETE,
   3512   ACCESS_KEYS
   3513 };
   3514 
   3515 
   3516 /**
   3517  * Returns true if cross-context access should be allowed to the named
   3518  * property with the given key on the host object.
   3519  */
   3520 typedef bool (*NamedSecurityCallback)(Local<Object> host,
   3521                                       Local<Value> key,
   3522                                       AccessType type,
   3523                                       Local<Value> data);
   3524 
   3525 
   3526 /**
   3527  * Returns true if cross-context access should be allowed to the indexed
   3528  * property with the given index on the host object.
   3529  */
   3530 typedef bool (*IndexedSecurityCallback)(Local<Object> host,
   3531                                         uint32_t index,
   3532                                         AccessType type,
   3533                                         Local<Value> data);
   3534 
   3535 
   3536 /**
   3537  * A FunctionTemplate is used to create functions at runtime. There
   3538  * can only be one function created from a FunctionTemplate in a
   3539  * context.  The lifetime of the created function is equal to the
   3540  * lifetime of the context.  So in case the embedder needs to create
   3541  * temporary functions that can be collected using Scripts is
   3542  * preferred.
   3543  *
   3544  * A FunctionTemplate can have properties, these properties are added to the
   3545  * function object when it is created.
   3546  *
   3547  * A FunctionTemplate has a corresponding instance template which is
   3548  * used to create object instances when the function is used as a
   3549  * constructor. Properties added to the instance template are added to
   3550  * each object instance.
   3551  *
   3552  * A FunctionTemplate can have a prototype template. The prototype template
   3553  * is used to create the prototype object of the function.
   3554  *
   3555  * The following example shows how to use a FunctionTemplate:
   3556  *
   3557  * \code
   3558  *    v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New();
   3559  *    t->Set("func_property", v8::Number::New(1));
   3560  *
   3561  *    v8::Local<v8::Template> proto_t = t->PrototypeTemplate();
   3562  *    proto_t->Set("proto_method", v8::FunctionTemplate::New(InvokeCallback));
   3563  *    proto_t->Set("proto_const", v8::Number::New(2));
   3564  *
   3565  *    v8::Local<v8::ObjectTemplate> instance_t = t->InstanceTemplate();
   3566  *    instance_t->SetAccessor("instance_accessor", InstanceAccessorCallback);
   3567  *    instance_t->SetNamedPropertyHandler(PropertyHandlerCallback, ...);
   3568  *    instance_t->Set("instance_property", Number::New(3));
   3569  *
   3570  *    v8::Local<v8::Function> function = t->GetFunction();
   3571  *    v8::Local<v8::Object> instance = function->NewInstance();
   3572  * \endcode
   3573  *
   3574  * Let's use "function" as the JS variable name of the function object
   3575  * and "instance" for the instance object created above.  The function
   3576  * and the instance will have the following properties:
   3577  *
   3578  * \code
   3579  *   func_property in function == true;
   3580  *   function.func_property == 1;
   3581  *
   3582  *   function.prototype.proto_method() invokes 'InvokeCallback'
   3583  *   function.prototype.proto_const == 2;
   3584  *
   3585  *   instance instanceof function == true;
   3586  *   instance.instance_accessor calls 'InstanceAccessorCallback'
   3587  *   instance.instance_property == 3;
   3588  * \endcode
   3589  *
   3590  * A FunctionTemplate can inherit from another one by calling the
   3591  * FunctionTemplate::Inherit method.  The following graph illustrates
   3592  * the semantics of inheritance:
   3593  *
   3594  * \code
   3595  *   FunctionTemplate Parent  -> Parent() . prototype -> { }
   3596  *     ^                                                  ^
   3597  *     | Inherit(Parent)                                  | .__proto__
   3598  *     |                                                  |
   3599  *   FunctionTemplate Child   -> Child()  . prototype -> { }
   3600  * \endcode
   3601  *
   3602  * A FunctionTemplate 'Child' inherits from 'Parent', the prototype
   3603  * object of the Child() function has __proto__ pointing to the
   3604  * Parent() function's prototype object. An instance of the Child
   3605  * function has all properties on Parent's instance templates.
   3606  *
   3607  * Let Parent be the FunctionTemplate initialized in the previous
   3608  * section and create a Child FunctionTemplate by:
   3609  *
   3610  * \code
   3611  *   Local<FunctionTemplate> parent = t;
   3612  *   Local<FunctionTemplate> child = FunctionTemplate::New();
   3613  *   child->Inherit(parent);
   3614  *
   3615  *   Local<Function> child_function = child->GetFunction();
   3616  *   Local<Object> child_instance = child_function->NewInstance();
   3617  * \endcode
   3618  *
   3619  * The Child function and Child instance will have the following
   3620  * properties:
   3621  *
   3622  * \code
   3623  *   child_func.prototype.__proto__ == function.prototype;
   3624  *   child_instance.instance_accessor calls 'InstanceAccessorCallback'
   3625  *   child_instance.instance_property == 3;
   3626  * \endcode
   3627  */
   3628 class V8_EXPORT FunctionTemplate : public Template {
   3629  public:
   3630   /** Creates a function template.*/
   3631   static Local<FunctionTemplate> New(
   3632       Isolate* isolate,
   3633       FunctionCallback callback = 0,
   3634       Handle<Value> data = Handle<Value>(),
   3635       Handle<Signature> signature = Handle<Signature>(),
   3636       int length = 0);
   3637 
   3638   /** Returns the unique function instance in the current execution context.*/
   3639   Local<Function> GetFunction();
   3640 
   3641   /**
   3642    * Set the call-handler callback for a FunctionTemplate.  This
   3643    * callback is called whenever the function created from this
   3644    * FunctionTemplate is called.
   3645    */
   3646   void SetCallHandler(FunctionCallback callback,
   3647                       Handle<Value> data = Handle<Value>());
   3648 
   3649   /** Set the predefined length property for the FunctionTemplate. */
   3650   void SetLength(int length);
   3651 
   3652   /** Get the InstanceTemplate. */
   3653   Local<ObjectTemplate> InstanceTemplate();
   3654 
   3655   /** Causes the function template to inherit from a parent function template.*/
   3656   void Inherit(Handle<FunctionTemplate> parent);
   3657 
   3658   /**
   3659    * A PrototypeTemplate is the template used to create the prototype object
   3660    * of the function created by this template.
   3661    */
   3662   Local<ObjectTemplate> PrototypeTemplate();
   3663 
   3664   /**
   3665    * Set the class name of the FunctionTemplate.  This is used for
   3666    * printing objects created with the function created from the
   3667    * FunctionTemplate as its constructor.
   3668    */
   3669   void SetClassName(Handle<String> name);
   3670 
   3671   /**
   3672    * Determines whether the __proto__ accessor ignores instances of
   3673    * the function template.  If instances of the function template are
   3674    * ignored, __proto__ skips all instances and instead returns the
   3675    * next object in the prototype chain.
   3676    *
   3677    * Call with a value of true to make the __proto__ accessor ignore
   3678    * instances of the function template.  Call with a value of false
   3679    * to make the __proto__ accessor not ignore instances of the
   3680    * function template.  By default, instances of a function template
   3681    * are not ignored.
   3682    */
   3683   void SetHiddenPrototype(bool value);
   3684 
   3685   /**
   3686    * Sets the ReadOnly flag in the attributes of the 'prototype' property
   3687    * of functions created from this FunctionTemplate to true.
   3688    */
   3689   void ReadOnlyPrototype();
   3690 
   3691   /**
   3692    * Removes the prototype property from functions created from this
   3693    * FunctionTemplate.
   3694    */
   3695   void RemovePrototype();
   3696 
   3697   /**
   3698    * Returns true if the given object is an instance of this function
   3699    * template.
   3700    */
   3701   bool HasInstance(Handle<Value> object);
   3702 
   3703  private:
   3704   FunctionTemplate();
   3705   friend class Context;
   3706   friend class ObjectTemplate;
   3707 };
   3708 
   3709 
   3710 /**
   3711  * An ObjectTemplate is used to create objects at runtime.
   3712  *
   3713  * Properties added to an ObjectTemplate are added to each object
   3714  * created from the ObjectTemplate.
   3715  */
   3716 class V8_EXPORT ObjectTemplate : public Template {
   3717  public:
   3718   /** Creates an ObjectTemplate. */
   3719   static Local<ObjectTemplate> New(Isolate* isolate);
   3720   // Will be deprecated soon.
   3721   static Local<ObjectTemplate> New();
   3722 
   3723   /** Creates a new instance of this template.*/
   3724   Local<Object> NewInstance();
   3725 
   3726   /**
   3727    * Sets an accessor on the object template.
   3728    *
   3729    * Whenever the property with the given name is accessed on objects
   3730    * created from this ObjectTemplate the getter and setter callbacks
   3731    * are called instead of getting and setting the property directly
   3732    * on the JavaScript object.
   3733    *
   3734    * \param name The name of the property for which an accessor is added.
   3735    * \param getter The callback to invoke when getting the property.
   3736    * \param setter The callback to invoke when setting the property.
   3737    * \param data A piece of data that will be passed to the getter and setter
   3738    *   callbacks whenever they are invoked.
   3739    * \param settings Access control settings for the accessor. This is a bit
   3740    *   field consisting of one of more of
   3741    *   DEFAULT = 0, ALL_CAN_READ = 1, or ALL_CAN_WRITE = 2.
   3742    *   The default is to not allow cross-context access.
   3743    *   ALL_CAN_READ means that all cross-context reads are allowed.
   3744    *   ALL_CAN_WRITE means that all cross-context writes are allowed.
   3745    *   The combination ALL_CAN_READ | ALL_CAN_WRITE can be used to allow all
   3746    *   cross-context access.
   3747    * \param attribute The attributes of the property for which an accessor
   3748    *   is added.
   3749    * \param signature The signature describes valid receivers for the accessor
   3750    *   and is used to perform implicit instance checks against them. If the
   3751    *   receiver is incompatible (i.e. is not an instance of the constructor as
   3752    *   defined by FunctionTemplate::HasInstance()), an implicit TypeError is
   3753    *   thrown and no callback is invoked.
   3754    */
   3755   void SetAccessor(Handle<String> name,
   3756                    AccessorGetterCallback getter,
   3757                    AccessorSetterCallback setter = 0,
   3758                    Handle<Value> data = Handle<Value>(),
   3759                    AccessControl settings = DEFAULT,
   3760                    PropertyAttribute attribute = None,
   3761                    Handle<AccessorSignature> signature =
   3762                        Handle<AccessorSignature>());
   3763   void SetAccessor(Handle<Name> name,
   3764                    AccessorNameGetterCallback getter,
   3765                    AccessorNameSetterCallback setter = 0,
   3766                    Handle<Value> data = Handle<Value>(),
   3767                    AccessControl settings = DEFAULT,
   3768                    PropertyAttribute attribute = None,
   3769                    Handle<AccessorSignature> signature =
   3770                        Handle<AccessorSignature>());
   3771 
   3772   /**
   3773    * Sets a named property handler on the object template.
   3774    *
   3775    * Whenever a property whose name is a string is accessed on objects created
   3776    * from this object template, the provided callback is invoked instead of
   3777    * accessing the property directly on the JavaScript object.
   3778    *
   3779    * \param getter The callback to invoke when getting a property.
   3780    * \param setter The callback to invoke when setting a property.
   3781    * \param query The callback to invoke to check if a property is present,
   3782    *   and if present, get its attributes.
   3783    * \param deleter The callback to invoke when deleting a property.
   3784    * \param enumerator The callback to invoke to enumerate all the named
   3785    *   properties of an object.
   3786    * \param data A piece of data that will be passed to the callbacks
   3787    *   whenever they are invoked.
   3788    */
   3789   void SetNamedPropertyHandler(
   3790       NamedPropertyGetterCallback getter,
   3791       NamedPropertySetterCallback setter = 0,
   3792       NamedPropertyQueryCallback query = 0,
   3793       NamedPropertyDeleterCallback deleter = 0,
   3794       NamedPropertyEnumeratorCallback enumerator = 0,
   3795       Handle<Value> data = Handle<Value>());
   3796 
   3797   /**
   3798    * Sets an indexed property handler on the object template.
   3799    *
   3800    * Whenever an indexed property is accessed on objects created from
   3801    * this object template, the provided callback is invoked instead of
   3802    * accessing the property directly on the JavaScript object.
   3803    *
   3804    * \param getter The callback to invoke when getting a property.
   3805    * \param setter The callback to invoke when setting a property.
   3806    * \param query The callback to invoke to check if an object has a property.
   3807    * \param deleter The callback to invoke when deleting a property.
   3808    * \param enumerator The callback to invoke to enumerate all the indexed
   3809    *   properties of an object.
   3810    * \param data A piece of data that will be passed to the callbacks
   3811    *   whenever they are invoked.
   3812    */
   3813   void SetIndexedPropertyHandler(
   3814       IndexedPropertyGetterCallback getter,
   3815       IndexedPropertySetterCallback setter = 0,
   3816       IndexedPropertyQueryCallback query = 0,
   3817       IndexedPropertyDeleterCallback deleter = 0,
   3818       IndexedPropertyEnumeratorCallback enumerator = 0,
   3819       Handle<Value> data = Handle<Value>());
   3820 
   3821   /**
   3822    * Sets the callback to be used when calling instances created from
   3823    * this template as a function.  If no callback is set, instances
   3824    * behave like normal JavaScript objects that cannot be called as a
   3825    * function.
   3826    */
   3827   void SetCallAsFunctionHandler(FunctionCallback callback,
   3828                                 Handle<Value> data = Handle<Value>());
   3829 
   3830   /**
   3831    * Mark object instances of the template as undetectable.
   3832    *
   3833    * In many ways, undetectable objects behave as though they are not
   3834    * there.  They behave like 'undefined' in conditionals and when
   3835    * printed.  However, properties can be accessed and called as on
   3836    * normal objects.
   3837    */
   3838   void MarkAsUndetectable();
   3839 
   3840   /**
   3841    * Sets access check callbacks on the object template.
   3842    *
   3843    * When accessing properties on instances of this object template,
   3844    * the access check callback will be called to determine whether or
   3845    * not to allow cross-context access to the properties.
   3846    * The last parameter specifies whether access checks are turned
   3847    * on by default on instances. If access checks are off by default,
   3848    * they can be turned on on individual instances by calling
   3849    * Object::TurnOnAccessCheck().
   3850    */
   3851   void SetAccessCheckCallbacks(NamedSecurityCallback named_handler,
   3852                                IndexedSecurityCallback indexed_handler,
   3853                                Handle<Value> data = Handle<Value>(),
   3854                                bool turned_on_by_default = true);
   3855 
   3856   /**
   3857    * Gets the number of internal fields for objects generated from
   3858    * this template.
   3859    */
   3860   int InternalFieldCount();
   3861 
   3862   /**
   3863    * Sets the number of internal fields for objects generated from
   3864    * this template.
   3865    */
   3866   void SetInternalFieldCount(int value);
   3867 
   3868  private:
   3869   ObjectTemplate();
   3870   static Local<ObjectTemplate> New(internal::Isolate* isolate,
   3871                                    Handle<FunctionTemplate> constructor);
   3872   friend class FunctionTemplate;
   3873 };
   3874 
   3875 
   3876 /**
   3877  * A Signature specifies which receivers and arguments are valid
   3878  * parameters to a function.
   3879  */
   3880 class V8_EXPORT Signature : public Data {
   3881  public:
   3882   static Local<Signature> New(Isolate* isolate,
   3883                               Handle<FunctionTemplate> receiver =
   3884                                   Handle<FunctionTemplate>(),
   3885                               int argc = 0,
   3886                               Handle<FunctionTemplate> argv[] = 0);
   3887 
   3888  private:
   3889   Signature();
   3890 };
   3891 
   3892 
   3893 /**
   3894  * An AccessorSignature specifies which receivers are valid parameters
   3895  * to an accessor callback.
   3896  */
   3897 class V8_EXPORT AccessorSignature : public Data {
   3898  public:
   3899   static Local<AccessorSignature> New(Isolate* isolate,
   3900                                       Handle<FunctionTemplate> receiver =
   3901                                           Handle<FunctionTemplate>());
   3902 
   3903  private:
   3904   AccessorSignature();
   3905 };
   3906 
   3907 
   3908 class V8_EXPORT DeclaredAccessorDescriptor : public Data {
   3909  private:
   3910   DeclaredAccessorDescriptor();
   3911 };
   3912 
   3913 
   3914 class V8_EXPORT ObjectOperationDescriptor : public Data {
   3915  public:
   3916   // This function is not yet stable and should not be used at this time.
   3917   static Local<RawOperationDescriptor> NewInternalFieldDereference(
   3918       Isolate* isolate,
   3919       int internal_field);
   3920  private:
   3921   ObjectOperationDescriptor();
   3922 };
   3923 
   3924 
   3925 enum DeclaredAccessorDescriptorDataType {
   3926     kDescriptorBoolType,
   3927     kDescriptorInt8Type, kDescriptorUint8Type,
   3928     kDescriptorInt16Type, kDescriptorUint16Type,
   3929     kDescriptorInt32Type, kDescriptorUint32Type,
   3930     kDescriptorFloatType, kDescriptorDoubleType
   3931 };
   3932 
   3933 
   3934 class V8_EXPORT RawOperationDescriptor : public Data {
   3935  public:
   3936   Local<DeclaredAccessorDescriptor> NewHandleDereference(Isolate* isolate);
   3937   Local<RawOperationDescriptor> NewRawDereference(Isolate* isolate);
   3938   Local<RawOperationDescriptor> NewRawShift(Isolate* isolate,
   3939                                             int16_t byte_offset);
   3940   Local<DeclaredAccessorDescriptor> NewPointerCompare(Isolate* isolate,
   3941                                                       void* compare_value);
   3942   Local<DeclaredAccessorDescriptor> NewPrimitiveValue(
   3943       Isolate* isolate,
   3944       DeclaredAccessorDescriptorDataType data_type,
   3945       uint8_t bool_offset = 0);
   3946   Local<DeclaredAccessorDescriptor> NewBitmaskCompare8(Isolate* isolate,
   3947                                                        uint8_t bitmask,
   3948                                                        uint8_t compare_value);
   3949   Local<DeclaredAccessorDescriptor> NewBitmaskCompare16(
   3950       Isolate* isolate,
   3951       uint16_t bitmask,
   3952       uint16_t compare_value);
   3953   Local<DeclaredAccessorDescriptor> NewBitmaskCompare32(
   3954       Isolate* isolate,
   3955       uint32_t bitmask,
   3956       uint32_t compare_value);
   3957 
   3958  private:
   3959   RawOperationDescriptor();
   3960 };
   3961 
   3962 
   3963 /**
   3964  * A utility for determining the type of objects based on the template
   3965  * they were constructed from.
   3966  */
   3967 class V8_EXPORT TypeSwitch : public Data {
   3968  public:
   3969   static Local<TypeSwitch> New(Handle<FunctionTemplate> type);
   3970   static Local<TypeSwitch> New(int argc, Handle<FunctionTemplate> types[]);
   3971   int match(Handle<Value> value);
   3972  private:
   3973   TypeSwitch();
   3974 };
   3975 
   3976 
   3977 // --- Extensions ---
   3978 
   3979 class V8_EXPORT ExternalOneByteStringResourceImpl
   3980     : public String::ExternalOneByteStringResource {
   3981  public:
   3982   ExternalOneByteStringResourceImpl() : data_(0), length_(0) {}
   3983   ExternalOneByteStringResourceImpl(const char* data, size_t length)
   3984       : data_(data), length_(length) {}
   3985   const char* data() const { return data_; }
   3986   size_t length() const { return length_; }
   3987 
   3988  private:
   3989   const char* data_;
   3990   size_t length_;
   3991 };
   3992 
   3993 /**
   3994  * Ignore
   3995  */
   3996 class V8_EXPORT Extension {  // NOLINT
   3997  public:
   3998   // Note that the strings passed into this constructor must live as long
   3999   // as the Extension itself.
   4000   Extension(const char* name,
   4001             const char* source = 0,
   4002             int dep_count = 0,
   4003             const char** deps = 0,
   4004             int source_length = -1);
   4005   virtual ~Extension() { }
   4006   virtual v8::Handle<v8::FunctionTemplate> GetNativeFunctionTemplate(
   4007       v8::Isolate* isolate, v8::Handle<v8::String> name) {
   4008     return v8::Handle<v8::FunctionTemplate>();
   4009   }
   4010 
   4011   const char* name() const { return name_; }
   4012   size_t source_length() const { return source_length_; }
   4013   const String::ExternalOneByteStringResource* source() const {
   4014     return &source_; }
   4015   int dependency_count() { return dep_count_; }
   4016   const char** dependencies() { return deps_; }
   4017   void set_auto_enable(bool value) { auto_enable_ = value; }
   4018   bool auto_enable() { return auto_enable_; }
   4019 
   4020  private:
   4021   const char* name_;
   4022   size_t source_length_;  // expected to initialize before source_
   4023   ExternalOneByteStringResourceImpl source_;
   4024   int dep_count_;
   4025   const char** deps_;
   4026   bool auto_enable_;
   4027 
   4028   // Disallow copying and assigning.
   4029   Extension(const Extension&);
   4030   void operator=(const Extension&);
   4031 };
   4032 
   4033 
   4034 void V8_EXPORT RegisterExtension(Extension* extension);
   4035 
   4036 
   4037 // --- Statics ---
   4038 
   4039 V8_INLINE Handle<Primitive> Undefined(Isolate* isolate);
   4040 V8_INLINE Handle<Primitive> Null(Isolate* isolate);
   4041 V8_INLINE Handle<Boolean> True(Isolate* isolate);
   4042 V8_INLINE Handle<Boolean> False(Isolate* isolate);
   4043 
   4044 
   4045 /**
   4046  * A set of constraints that specifies the limits of the runtime's memory use.
   4047  * You must set the heap size before initializing the VM - the size cannot be
   4048  * adjusted after the VM is initialized.
   4049  *
   4050  * If you are using threads then you should hold the V8::Locker lock while
   4051  * setting the stack limit and you must set a non-default stack limit separately
   4052  * for each thread.
   4053  */
   4054 class V8_EXPORT ResourceConstraints {
   4055  public:
   4056   ResourceConstraints();
   4057 
   4058   /**
   4059    * Configures the constraints with reasonable default values based on the
   4060    * capabilities of the current device the VM is running on.
   4061    *
   4062    * \param physical_memory The total amount of physical memory on the current
   4063    *   device, in bytes.
   4064    * \param virtual_memory_limit The amount of virtual memory on the current
   4065    *   device, in bytes, or zero, if there is no limit.
   4066    * \param number_of_processors The number of CPUs available on the current
   4067    *   device.
   4068    */
   4069   void ConfigureDefaults(uint64_t physical_memory,
   4070                          uint64_t virtual_memory_limit,
   4071                          uint32_t number_of_processors);
   4072 
   4073   int max_semi_space_size() const { return max_semi_space_size_; }
   4074   void set_max_semi_space_size(int value) { max_semi_space_size_ = value; }
   4075   int max_old_space_size() const { return max_old_space_size_; }
   4076   void set_max_old_space_size(int value) { max_old_space_size_ = value; }
   4077   int max_executable_size() const { return max_executable_size_; }
   4078   void set_max_executable_size(int value) { max_executable_size_ = value; }
   4079   uint32_t* stack_limit() const { return stack_limit_; }
   4080   // Sets an address beyond which the VM's stack may not grow.
   4081   void set_stack_limit(uint32_t* value) { stack_limit_ = value; }
   4082   int max_available_threads() const { return max_available_threads_; }
   4083   // Set the number of threads available to V8, assuming at least 1.
   4084   void set_max_available_threads(int value) {
   4085     max_available_threads_ = value;
   4086   }
   4087   size_t code_range_size() const { return code_range_size_; }
   4088   void set_code_range_size(size_t value) {
   4089     code_range_size_ = value;
   4090   }
   4091 
   4092  private:
   4093   int max_semi_space_size_;
   4094   int max_old_space_size_;
   4095   int max_executable_size_;
   4096   uint32_t* stack_limit_;
   4097   int max_available_threads_;
   4098   size_t code_range_size_;
   4099 };
   4100 
   4101 
   4102 // --- Exceptions ---
   4103 
   4104 
   4105 typedef void (*FatalErrorCallback)(const char* location, const char* message);
   4106 
   4107 
   4108 typedef void (*MessageCallback)(Handle<Message> message, Handle<Value> error);
   4109 
   4110 // --- Tracing ---
   4111 
   4112 typedef void (*LogEventCallback)(const char* name, int event);
   4113 
   4114 /**
   4115  * Create new error objects by calling the corresponding error object
   4116  * constructor with the message.
   4117  */
   4118 class V8_EXPORT Exception {
   4119  public:
   4120   static Local<Value> RangeError(Handle<String> message);
   4121   static Local<Value> ReferenceError(Handle<String> message);
   4122   static Local<Value> SyntaxError(Handle<String> message);
   4123   static Local<Value> TypeError(Handle<String> message);
   4124   static Local<Value> Error(Handle<String> message);
   4125 };
   4126 
   4127 
   4128 // --- Counters Callbacks ---
   4129 
   4130 typedef int* (*CounterLookupCallback)(const char* name);
   4131 
   4132 typedef void* (*CreateHistogramCallback)(const char* name,
   4133                                          int min,
   4134                                          int max,
   4135                                          size_t buckets);
   4136 
   4137 typedef void (*AddHistogramSampleCallback)(void* histogram, int sample);
   4138 
   4139 // --- Memory Allocation Callback ---
   4140   enum ObjectSpace {
   4141     kObjectSpaceNewSpace = 1 << 0,
   4142     kObjectSpaceOldPointerSpace = 1 << 1,
   4143     kObjectSpaceOldDataSpace = 1 << 2,
   4144     kObjectSpaceCodeSpace = 1 << 3,
   4145     kObjectSpaceMapSpace = 1 << 4,
   4146     kObjectSpaceLoSpace = 1 << 5,
   4147 
   4148     kObjectSpaceAll = kObjectSpaceNewSpace | kObjectSpaceOldPointerSpace |
   4149       kObjectSpaceOldDataSpace | kObjectSpaceCodeSpace | kObjectSpaceMapSpace |
   4150       kObjectSpaceLoSpace
   4151   };
   4152 
   4153   enum AllocationAction {
   4154     kAllocationActionAllocate = 1 << 0,
   4155     kAllocationActionFree = 1 << 1,
   4156     kAllocationActionAll = kAllocationActionAllocate | kAllocationActionFree
   4157   };
   4158 
   4159 typedef void (*MemoryAllocationCallback)(ObjectSpace space,
   4160                                          AllocationAction action,
   4161                                          int size);
   4162 
   4163 // --- Leave Script Callback ---
   4164 typedef void (*CallCompletedCallback)();
   4165 
   4166 // --- Microtask Callback ---
   4167 typedef void (*MicrotaskCallback)(void* data);
   4168 
   4169 // --- Failed Access Check Callback ---
   4170 typedef void (*FailedAccessCheckCallback)(Local<Object> target,
   4171                                           AccessType type,
   4172                                           Local<Value> data);
   4173 
   4174 // --- AllowCodeGenerationFromStrings callbacks ---
   4175 
   4176 /**
   4177  * Callback to check if code generation from strings is allowed. See
   4178  * Context::AllowCodeGenerationFromStrings.
   4179  */
   4180 typedef bool (*AllowCodeGenerationFromStringsCallback)(Local<Context> context);
   4181 
   4182 // --- Garbage Collection Callbacks ---
   4183 
   4184 /**
   4185  * Applications can register callback functions which will be called
   4186  * before and after a garbage collection.  Allocations are not
   4187  * allowed in the callback functions, you therefore cannot manipulate
   4188  * objects (set or delete properties for example) since it is possible
   4189  * such operations will result in the allocation of objects.
   4190  */
   4191 enum GCType {
   4192   kGCTypeScavenge = 1 << 0,
   4193   kGCTypeMarkSweepCompact = 1 << 1,
   4194   kGCTypeAll = kGCTypeScavenge | kGCTypeMarkSweepCompact
   4195 };
   4196 
   4197 enum GCCallbackFlags {
   4198   kNoGCCallbackFlags = 0,
   4199   kGCCallbackFlagCompacted = 1 << 0,
   4200   kGCCallbackFlagConstructRetainedObjectInfos = 1 << 1,
   4201   kGCCallbackFlagForced = 1 << 2
   4202 };
   4203 
   4204 typedef void (*GCPrologueCallback)(GCType type, GCCallbackFlags flags);
   4205 typedef void (*GCEpilogueCallback)(GCType type, GCCallbackFlags flags);
   4206 
   4207 typedef void (*InterruptCallback)(Isolate* isolate, void* data);
   4208 
   4209 
   4210 /**
   4211  * Collection of V8 heap information.
   4212  *
   4213  * Instances of this class can be passed to v8::V8::HeapStatistics to
   4214  * get heap statistics from V8.
   4215  */
   4216 class V8_EXPORT HeapStatistics {
   4217  public:
   4218   HeapStatistics();
   4219   size_t total_heap_size() { return total_heap_size_; }
   4220   size_t total_heap_size_executable() { return total_heap_size_executable_; }
   4221   size_t total_physical_size() { return total_physical_size_; }
   4222   size_t used_heap_size() { return used_heap_size_; }
   4223   size_t heap_size_limit() { return heap_size_limit_; }
   4224 
   4225  private:
   4226   size_t total_heap_size_;
   4227   size_t total_heap_size_executable_;
   4228   size_t total_physical_size_;
   4229   size_t used_heap_size_;
   4230   size_t heap_size_limit_;
   4231 
   4232   friend class V8;
   4233   friend class Isolate;
   4234 };
   4235 
   4236 
   4237 class RetainedObjectInfo;
   4238 
   4239 
   4240 /**
   4241  * FunctionEntryHook is the type of the profile entry hook called at entry to
   4242  * any generated function when function-level profiling is enabled.
   4243  *
   4244  * \param function the address of the function that's being entered.
   4245  * \param return_addr_location points to a location on stack where the machine
   4246  *    return address resides. This can be used to identify the caller of
   4247  *    \p function, and/or modified to divert execution when \p function exits.
   4248  *
   4249  * \note the entry hook must not cause garbage collection.
   4250  */
   4251 typedef void (*FunctionEntryHook)(uintptr_t function,
   4252                                   uintptr_t return_addr_location);
   4253 
   4254 /**
   4255  * A JIT code event is issued each time code is added, moved or removed.
   4256  *
   4257  * \note removal events are not currently issued.
   4258  */
   4259 struct JitCodeEvent {
   4260   enum EventType {
   4261     CODE_ADDED,
   4262     CODE_MOVED,
   4263     CODE_REMOVED,
   4264     CODE_ADD_LINE_POS_INFO,
   4265     CODE_START_LINE_INFO_RECORDING,
   4266     CODE_END_LINE_INFO_RECORDING
   4267   };
   4268   // Definition of the code position type. The "POSITION" type means the place
   4269   // in the source code which are of interest when making stack traces to
   4270   // pin-point the source location of a stack frame as close as possible.
   4271   // The "STATEMENT_POSITION" means the place at the beginning of each
   4272   // statement, and is used to indicate possible break locations.
   4273   enum PositionType { POSITION, STATEMENT_POSITION };
   4274 
   4275   // Type of event.
   4276   EventType type;
   4277   // Start of the instructions.
   4278   void* code_start;
   4279   // Size of the instructions.
   4280   size_t code_len;
   4281   // Script info for CODE_ADDED event.
   4282   Handle<UnboundScript> script;
   4283   // User-defined data for *_LINE_INFO_* event. It's used to hold the source
   4284   // code line information which is returned from the
   4285   // CODE_START_LINE_INFO_RECORDING event. And it's passed to subsequent
   4286   // CODE_ADD_LINE_POS_INFO and CODE_END_LINE_INFO_RECORDING events.
   4287   void* user_data;
   4288 
   4289   struct name_t {
   4290     // Name of the object associated with the code, note that the string is not
   4291     // zero-terminated.
   4292     const char* str;
   4293     // Number of chars in str.
   4294     size_t len;
   4295   };
   4296 
   4297   struct line_info_t {
   4298     // PC offset
   4299     size_t offset;
   4300     // Code postion
   4301     size_t pos;
   4302     // The position type.
   4303     PositionType position_type;
   4304   };
   4305 
   4306   union {
   4307     // Only valid for CODE_ADDED.
   4308     struct name_t name;
   4309 
   4310     // Only valid for CODE_ADD_LINE_POS_INFO
   4311     struct line_info_t line_info;
   4312 
   4313     // New location of instructions. Only valid for CODE_MOVED.
   4314     void* new_code_start;
   4315   };
   4316 };
   4317 
   4318 /**
   4319  * Option flags passed to the SetJitCodeEventHandler function.
   4320  */
   4321 enum JitCodeEventOptions {
   4322   kJitCodeEventDefault = 0,
   4323   // Generate callbacks for already existent code.
   4324   kJitCodeEventEnumExisting = 1
   4325 };
   4326 
   4327 
   4328 /**
   4329  * Callback function passed to SetJitCodeEventHandler.
   4330  *
   4331  * \param event code add, move or removal event.
   4332  */
   4333 typedef void (*JitCodeEventHandler)(const JitCodeEvent* event);
   4334 
   4335 
   4336 /**
   4337  * Isolate represents an isolated instance of the V8 engine.  V8 isolates have
   4338  * completely separate states.  Objects from one isolate must not be used in
   4339  * other isolates.  The embedder can create multiple isolates and use them in
   4340  * parallel in multiple threads.  An isolate can be entered by at most one
   4341  * thread at any given time.  The Locker/Unlocker API must be used to
   4342  * synchronize.
   4343  */
   4344 class V8_EXPORT Isolate {
   4345  public:
   4346   /**
   4347    * Initial configuration parameters for a new Isolate.
   4348    */
   4349   struct CreateParams {
   4350     CreateParams()
   4351         : entry_hook(NULL),
   4352           code_event_handler(NULL),
   4353           enable_serializer(false) {}
   4354 
   4355     /**
   4356      * The optional entry_hook allows the host application to provide the
   4357      * address of a function that's invoked on entry to every V8-generated
   4358      * function.  Note that entry_hook is invoked at the very start of each
   4359      * generated function. Furthermore, if an  entry_hook is given, V8 will
   4360      * always run without a context snapshot.
   4361      */
   4362     FunctionEntryHook entry_hook;
   4363 
   4364     /**
   4365      * Allows the host application to provide the address of a function that is
   4366      * notified each time code is added, moved or removed.
   4367      */
   4368     JitCodeEventHandler code_event_handler;
   4369 
   4370     /**
   4371      * ResourceConstraints to use for the new Isolate.
   4372      */
   4373     ResourceConstraints constraints;
   4374 
   4375     /**
   4376      * This flag currently renders the Isolate unusable.
   4377      */
   4378     bool enable_serializer;
   4379   };
   4380 
   4381 
   4382   /**
   4383    * Stack-allocated class which sets the isolate for all operations
   4384    * executed within a local scope.
   4385    */
   4386   class V8_EXPORT Scope {
   4387    public:
   4388     explicit Scope(Isolate* isolate) : isolate_(isolate) {
   4389       isolate->Enter();
   4390     }
   4391 
   4392     ~Scope() { isolate_->Exit(); }
   4393 
   4394    private:
   4395     Isolate* const isolate_;
   4396 
   4397     // Prevent copying of Scope objects.
   4398     Scope(const Scope&);
   4399     Scope& operator=(const Scope&);
   4400   };
   4401 
   4402 
   4403   /**
   4404    * Assert that no Javascript code is invoked.
   4405    */
   4406   class V8_EXPORT DisallowJavascriptExecutionScope {
   4407    public:
   4408     enum OnFailure { CRASH_ON_FAILURE, THROW_ON_FAILURE };
   4409 
   4410     DisallowJavascriptExecutionScope(Isolate* isolate, OnFailure on_failure);
   4411     ~DisallowJavascriptExecutionScope();
   4412 
   4413    private:
   4414     bool on_failure_;
   4415     void* internal_;
   4416 
   4417     // Prevent copying of Scope objects.
   4418     DisallowJavascriptExecutionScope(const DisallowJavascriptExecutionScope&);
   4419     DisallowJavascriptExecutionScope& operator=(
   4420         const DisallowJavascriptExecutionScope&);
   4421   };
   4422 
   4423 
   4424   /**
   4425    * Introduce exception to DisallowJavascriptExecutionScope.
   4426    */
   4427   class V8_EXPORT AllowJavascriptExecutionScope {
   4428    public:
   4429     explicit AllowJavascriptExecutionScope(Isolate* isolate);
   4430     ~AllowJavascriptExecutionScope();
   4431 
   4432    private:
   4433     void* internal_throws_;
   4434     void* internal_assert_;
   4435 
   4436     // Prevent copying of Scope objects.
   4437     AllowJavascriptExecutionScope(const AllowJavascriptExecutionScope&);
   4438     AllowJavascriptExecutionScope& operator=(
   4439         const AllowJavascriptExecutionScope&);
   4440   };
   4441 
   4442   /**
   4443    * Do not run microtasks while this scope is active, even if microtasks are
   4444    * automatically executed otherwise.
   4445    */
   4446   class V8_EXPORT SuppressMicrotaskExecutionScope {
   4447    public:
   4448     explicit SuppressMicrotaskExecutionScope(Isolate* isolate);
   4449     ~SuppressMicrotaskExecutionScope();
   4450 
   4451    private:
   4452     internal::Isolate* isolate_;
   4453 
   4454     // Prevent copying of Scope objects.
   4455     SuppressMicrotaskExecutionScope(const SuppressMicrotaskExecutionScope&);
   4456     SuppressMicrotaskExecutionScope& operator=(
   4457         const SuppressMicrotaskExecutionScope&);
   4458   };
   4459 
   4460   /**
   4461    * Types of garbage collections that can be requested via
   4462    * RequestGarbageCollectionForTesting.
   4463    */
   4464   enum GarbageCollectionType {
   4465     kFullGarbageCollection,
   4466     kMinorGarbageCollection
   4467   };
   4468 
   4469   /**
   4470    * Features reported via the SetUseCounterCallback callback. Do not chang
   4471    * assigned numbers of existing items; add new features to the end of this
   4472    * list.
   4473    */
   4474   enum UseCounterFeature {
   4475     kUseAsm = 0,
   4476     kUseCounterFeatureCount  // This enum value must be last.
   4477   };
   4478 
   4479   typedef void (*UseCounterCallback)(Isolate* isolate,
   4480                                      UseCounterFeature feature);
   4481 
   4482 
   4483   /**
   4484    * Creates a new isolate.  Does not change the currently entered
   4485    * isolate.
   4486    *
   4487    * When an isolate is no longer used its resources should be freed
   4488    * by calling Dispose().  Using the delete operator is not allowed.
   4489    *
   4490    * V8::Initialize() must have run prior to this.
   4491    */
   4492   static Isolate* New(const CreateParams& params = CreateParams());
   4493 
   4494   /**
   4495    * Returns the entered isolate for the current thread or NULL in
   4496    * case there is no current isolate.
   4497    */
   4498   static Isolate* GetCurrent();
   4499 
   4500   /**
   4501    * Methods below this point require holding a lock (using Locker) in
   4502    * a multi-threaded environment.
   4503    */
   4504 
   4505   /**
   4506    * Sets this isolate as the entered one for the current thread.
   4507    * Saves the previously entered one (if any), so that it can be
   4508    * restored when exiting.  Re-entering an isolate is allowed.
   4509    */
   4510   void Enter();
   4511 
   4512   /**
   4513    * Exits this isolate by restoring the previously entered one in the
   4514    * current thread.  The isolate may still stay the same, if it was
   4515    * entered more than once.
   4516    *
   4517    * Requires: this == Isolate::GetCurrent().
   4518    */
   4519   void Exit();
   4520 
   4521   /**
   4522    * Disposes the isolate.  The isolate must not be entered by any
   4523    * thread to be disposable.
   4524    */
   4525   void Dispose();
   4526 
   4527   /**
   4528    * Associate embedder-specific data with the isolate. |slot| has to be
   4529    * between 0 and GetNumberOfDataSlots() - 1.
   4530    */
   4531   V8_INLINE void SetData(uint32_t slot, void* data);
   4532 
   4533   /**
   4534    * Retrieve embedder-specific data from the isolate.
   4535    * Returns NULL if SetData has never been called for the given |slot|.
   4536    */
   4537   V8_INLINE void* GetData(uint32_t slot);
   4538 
   4539   /**
   4540    * Returns the maximum number of available embedder data slots. Valid slots
   4541    * are in the range of 0 - GetNumberOfDataSlots() - 1.
   4542    */
   4543   V8_INLINE static uint32_t GetNumberOfDataSlots();
   4544 
   4545   /**
   4546    * Get statistics about the heap memory usage.
   4547    */
   4548   void GetHeapStatistics(HeapStatistics* heap_statistics);
   4549 
   4550   /**
   4551    * Adjusts the amount of registered external memory. Used to give V8 an
   4552    * indication of the amount of externally allocated memory that is kept alive
   4553    * by JavaScript objects. V8 uses this to decide when to perform global
   4554    * garbage collections. Registering externally allocated memory will trigger
   4555    * global garbage collections more often than it would otherwise in an attempt
   4556    * to garbage collect the JavaScript objects that keep the externally
   4557    * allocated memory alive.
   4558    *
   4559    * \param change_in_bytes the change in externally allocated memory that is
   4560    *   kept alive by JavaScript objects.
   4561    * \returns the adjusted value.
   4562    */
   4563   V8_INLINE int64_t
   4564       AdjustAmountOfExternalAllocatedMemory(int64_t change_in_bytes);
   4565 
   4566   /**
   4567    * Returns heap profiler for this isolate. Will return NULL until the isolate
   4568    * is initialized.
   4569    */
   4570   HeapProfiler* GetHeapProfiler();
   4571 
   4572   /**
   4573    * Returns CPU profiler for this isolate. Will return NULL unless the isolate
   4574    * is initialized. It is the embedder's responsibility to stop all CPU
   4575    * profiling activities if it has started any.
   4576    */
   4577   CpuProfiler* GetCpuProfiler();
   4578 
   4579   /** Returns true if this isolate has a current context. */
   4580   bool InContext();
   4581 
   4582   /** Returns the context that is on the top of the stack. */
   4583   Local<Context> GetCurrentContext();
   4584 
   4585   /**
   4586    * Returns the context of the calling JavaScript code.  That is the
   4587    * context of the top-most JavaScript frame.  If there are no
   4588    * JavaScript frames an empty handle is returned.
   4589    */
   4590   Local<Context> GetCallingContext();
   4591 
   4592   /** Returns the last entered context. */
   4593   Local<Context> GetEnteredContext();
   4594 
   4595   /**
   4596    * Schedules an exception to be thrown when returning to JavaScript.  When an
   4597    * exception has been scheduled it is illegal to invoke any JavaScript
   4598    * operation; the caller must return immediately and only after the exception
   4599    * has been handled does it become legal to invoke JavaScript operations.
   4600    */
   4601   Local<Value> ThrowException(Local<Value> exception);
   4602 
   4603   /**
   4604    * Allows the host application to group objects together. If one
   4605    * object in the group is alive, all objects in the group are alive.
   4606    * After each garbage collection, object groups are removed. It is
   4607    * intended to be used in the before-garbage-collection callback
   4608    * function, for instance to simulate DOM tree connections among JS
   4609    * wrapper objects. Object groups for all dependent handles need to
   4610    * be provided for kGCTypeMarkSweepCompact collections, for all other
   4611    * garbage collection types it is sufficient to provide object groups
   4612    * for partially dependent handles only.
   4613    */
   4614   template<typename T> void SetObjectGroupId(const Persistent<T>& object,
   4615                                              UniqueId id);
   4616 
   4617   /**
   4618    * Allows the host application to declare implicit references from an object
   4619    * group to an object. If the objects of the object group are alive, the child
   4620    * object is alive too. After each garbage collection, all implicit references
   4621    * are removed. It is intended to be used in the before-garbage-collection
   4622    * callback function.
   4623    */
   4624   template<typename T> void SetReferenceFromGroup(UniqueId id,
   4625                                                   const Persistent<T>& child);
   4626 
   4627   /**
   4628    * Allows the host application to declare implicit references from an object
   4629    * to another object. If the parent object is alive, the child object is alive
   4630    * too. After each garbage collection, all implicit references are removed. It
   4631    * is intended to be used in the before-garbage-collection callback function.
   4632    */
   4633   template<typename T, typename S>
   4634   void SetReference(const Persistent<T>& parent, const Persistent<S>& child);
   4635 
   4636   typedef void (*GCPrologueCallback)(Isolate* isolate,
   4637                                      GCType type,
   4638                                      GCCallbackFlags flags);
   4639   typedef void (*GCEpilogueCallback)(Isolate* isolate,
   4640                                      GCType type,
   4641                                      GCCallbackFlags flags);
   4642 
   4643   /**
   4644    * Enables the host application to receive a notification before a
   4645    * garbage collection. Allocations are allowed in the callback function,
   4646    * but the callback is not re-entrant: if the allocation inside it will
   4647    * trigger the garbage collection, the callback won't be called again.
   4648    * It is possible to specify the GCType filter for your callback. But it is
   4649    * not possible to register the same callback function two times with
   4650    * different GCType filters.
   4651    */
   4652   void AddGCPrologueCallback(
   4653       GCPrologueCallback callback, GCType gc_type_filter = kGCTypeAll);
   4654 
   4655   /**
   4656    * This function removes callback which was installed by
   4657    * AddGCPrologueCallback function.
   4658    */
   4659   void RemoveGCPrologueCallback(GCPrologueCallback callback);
   4660 
   4661   /**
   4662    * Enables the host application to receive a notification after a
   4663    * garbage collection. Allocations are allowed in the callback function,
   4664    * but the callback is not re-entrant: if the allocation inside it will
   4665    * trigger the garbage collection, the callback won't be called again.
   4666    * It is possible to specify the GCType filter for your callback. But it is
   4667    * not possible to register the same callback function two times with
   4668    * different GCType filters.
   4669    */
   4670   void AddGCEpilogueCallback(
   4671       GCEpilogueCallback callback, GCType gc_type_filter = kGCTypeAll);
   4672 
   4673   /**
   4674    * This function removes callback which was installed by
   4675    * AddGCEpilogueCallback function.
   4676    */
   4677   void RemoveGCEpilogueCallback(GCEpilogueCallback callback);
   4678 
   4679   /**
   4680    * Request V8 to interrupt long running JavaScript code and invoke
   4681    * the given |callback| passing the given |data| to it. After |callback|
   4682    * returns control will be returned to the JavaScript code.
   4683    * At any given moment V8 can remember only a single callback for the very
   4684    * last interrupt request.
   4685    * Can be called from another thread without acquiring a |Locker|.
   4686    * Registered |callback| must not reenter interrupted Isolate.
   4687    */
   4688   void RequestInterrupt(InterruptCallback callback, void* data);
   4689 
   4690   /**
   4691    * Clear interrupt request created by |RequestInterrupt|.
   4692    * Can be called from another thread without acquiring a |Locker|.
   4693    */
   4694   void ClearInterrupt();
   4695 
   4696   /**
   4697    * Request garbage collection in this Isolate. It is only valid to call this
   4698    * function if --expose_gc was specified.
   4699    *
   4700    * This should only be used for testing purposes and not to enforce a garbage
   4701    * collection schedule. It has strong negative impact on the garbage
   4702    * collection performance. Use IdleNotification() or LowMemoryNotification()
   4703    * instead to influence the garbage collection schedule.
   4704    */
   4705   void RequestGarbageCollectionForTesting(GarbageCollectionType type);
   4706 
   4707   /**
   4708    * Set the callback to invoke for logging event.
   4709    */
   4710   void SetEventLogger(LogEventCallback that);
   4711 
   4712   /**
   4713    * Adds a callback to notify the host application when a script finished
   4714    * running.  If a script re-enters the runtime during executing, the
   4715    * CallCompletedCallback is only invoked when the outer-most script
   4716    * execution ends.  Executing scripts inside the callback do not trigger
   4717    * further callbacks.
   4718    */
   4719   void AddCallCompletedCallback(CallCompletedCallback callback);
   4720 
   4721   /**
   4722    * Removes callback that was installed by AddCallCompletedCallback.
   4723    */
   4724   void RemoveCallCompletedCallback(CallCompletedCallback callback);
   4725 
   4726   /**
   4727    * Experimental: Runs the Microtask Work Queue until empty
   4728    * Any exceptions thrown by microtask callbacks are swallowed.
   4729    */
   4730   void RunMicrotasks();
   4731 
   4732   /**
   4733    * Experimental: Enqueues the callback to the Microtask Work Queue
   4734    */
   4735   void EnqueueMicrotask(Handle<Function> microtask);
   4736 
   4737   /**
   4738    * Experimental: Enqueues the callback to the Microtask Work Queue
   4739    */
   4740   void EnqueueMicrotask(MicrotaskCallback microtask, void* data = NULL);
   4741 
   4742    /**
   4743    * Experimental: Controls whether the Microtask Work Queue is automatically
   4744    * run when the script call depth decrements to zero.
   4745    */
   4746   void SetAutorunMicrotasks(bool autorun);
   4747 
   4748   /**
   4749    * Experimental: Returns whether the Microtask Work Queue is automatically
   4750    * run when the script call depth decrements to zero.
   4751    */
   4752   bool WillAutorunMicrotasks() const;
   4753 
   4754   /**
   4755    * Sets a callback for counting the number of times a feature of V8 is used.
   4756    */
   4757   void SetUseCounterCallback(UseCounterCallback callback);
   4758 
   4759   /**
   4760    * Enables the host application to provide a mechanism for recording
   4761    * statistics counters.
   4762    */
   4763   void SetCounterFunction(CounterLookupCallback);
   4764 
   4765   /**
   4766    * Enables the host application to provide a mechanism for recording
   4767    * histograms. The CreateHistogram function returns a
   4768    * histogram which will later be passed to the AddHistogramSample
   4769    * function.
   4770    */
   4771   void SetCreateHistogramFunction(CreateHistogramCallback);
   4772   void SetAddHistogramSampleFunction(AddHistogramSampleCallback);
   4773 
   4774   /**
   4775    * Optional notification that the embedder is idle.
   4776    * V8 uses the notification to reduce memory footprint.
   4777    * This call can be used repeatedly if the embedder remains idle.
   4778    * Returns true if the embedder should stop calling IdleNotification
   4779    * until real work has been done.  This indicates that V8 has done
   4780    * as much cleanup as it will be able to do.
   4781    *
   4782    * The idle_time_in_ms argument specifies the time V8 has to do reduce
   4783    * the memory footprint. There is no guarantee that the actual work will be
   4784    * done within the time limit.
   4785    */
   4786   bool IdleNotification(int idle_time_in_ms);
   4787 
   4788   /**
   4789    * Optional notification that the system is running low on memory.
   4790    * V8 uses these notifications to attempt to free memory.
   4791    */
   4792   void LowMemoryNotification();
   4793 
   4794   /**
   4795    * Optional notification that a context has been disposed. V8 uses
   4796    * these notifications to guide the GC heuristic. Returns the number
   4797    * of context disposals - including this one - since the last time
   4798    * V8 had a chance to clean up.
   4799    */
   4800   int ContextDisposedNotification();
   4801 
   4802   /**
   4803    * Allows the host application to provide the address of a function that is
   4804    * notified each time code is added, moved or removed.
   4805    *
   4806    * \param options options for the JIT code event handler.
   4807    * \param event_handler the JIT code event handler, which will be invoked
   4808    *     each time code is added, moved or removed.
   4809    * \note \p event_handler won't get notified of existent code.
   4810    * \note since code removal notifications are not currently issued, the
   4811    *     \p event_handler may get notifications of code that overlaps earlier
   4812    *     code notifications. This happens when code areas are reused, and the
   4813    *     earlier overlapping code areas should therefore be discarded.
   4814    * \note the events passed to \p event_handler and the strings they point to
   4815    *     are not guaranteed to live past each call. The \p event_handler must
   4816    *     copy strings and other parameters it needs to keep around.
   4817    * \note the set of events declared in JitCodeEvent::EventType is expected to
   4818    *     grow over time, and the JitCodeEvent structure is expected to accrue
   4819    *     new members. The \p event_handler function must ignore event codes
   4820    *     it does not recognize to maintain future compatibility.
   4821    * \note Use Isolate::CreateParams to get events for code executed during
   4822    *     Isolate setup.
   4823    */
   4824   void SetJitCodeEventHandler(JitCodeEventOptions options,
   4825                               JitCodeEventHandler event_handler);
   4826 
   4827   /**
   4828    * Modifies the stack limit for this Isolate.
   4829    *
   4830    * \param stack_limit An address beyond which the Vm's stack may not grow.
   4831    *
   4832    * \note  If you are using threads then you should hold the V8::Locker lock
   4833    *     while setting the stack limit and you must set a non-default stack
   4834    *     limit separately for each thread.
   4835    */
   4836   void SetStackLimit(uintptr_t stack_limit);
   4837 
   4838  private:
   4839   template<class K, class V, class Traits> friend class PersistentValueMap;
   4840 
   4841   Isolate();
   4842   Isolate(const Isolate&);
   4843   ~Isolate();
   4844   Isolate& operator=(const Isolate&);
   4845   void* operator new(size_t size);
   4846   void operator delete(void*, size_t);
   4847 
   4848   void SetObjectGroupId(internal::Object** object, UniqueId id);
   4849   void SetReferenceFromGroup(UniqueId id, internal::Object** object);
   4850   void SetReference(internal::Object** parent, internal::Object** child);
   4851   void CollectAllGarbage(const char* gc_reason);
   4852 };
   4853 
   4854 class V8_EXPORT StartupData {
   4855  public:
   4856   enum CompressionAlgorithm {
   4857     kUncompressed,
   4858     kBZip2
   4859   };
   4860 
   4861   const char* data;
   4862   int compressed_size;
   4863   int raw_size;
   4864 };
   4865 
   4866 
   4867 /**
   4868  * A helper class for driving V8 startup data decompression.  It is based on
   4869  * "CompressedStartupData" API functions from the V8 class.  It isn't mandatory
   4870  * for an embedder to use this class, instead, API functions can be used
   4871  * directly.
   4872  *
   4873  * For an example of the class usage, see the "shell.cc" sample application.
   4874  */
   4875 class V8_EXPORT StartupDataDecompressor {  // NOLINT
   4876  public:
   4877   StartupDataDecompressor();
   4878   virtual ~StartupDataDecompressor();
   4879   int Decompress();
   4880 
   4881  protected:
   4882   virtual int DecompressData(char* raw_data,
   4883                              int* raw_data_size,
   4884                              const char* compressed_data,
   4885                              int compressed_data_size) = 0;
   4886 
   4887  private:
   4888   char** raw_data;
   4889 };
   4890 
   4891 
   4892 /**
   4893  * EntropySource is used as a callback function when v8 needs a source
   4894  * of entropy.
   4895  */
   4896 typedef bool (*EntropySource)(unsigned char* buffer, size_t length);
   4897 
   4898 
   4899 /**
   4900  * ReturnAddressLocationResolver is used as a callback function when v8 is
   4901  * resolving the location of a return address on the stack. Profilers that
   4902  * change the return address on the stack can use this to resolve the stack
   4903  * location to whereever the profiler stashed the original return address.
   4904  *
   4905  * \param return_addr_location points to a location on stack where a machine
   4906  *    return address resides.
   4907  * \returns either return_addr_location, or else a pointer to the profiler's
   4908  *    copy of the original return address.
   4909  *
   4910  * \note the resolver function must not cause garbage collection.
   4911  */
   4912 typedef uintptr_t (*ReturnAddressLocationResolver)(
   4913     uintptr_t return_addr_location);
   4914 
   4915 
   4916 /**
   4917  * Interface for iterating through all external resources in the heap.
   4918  */
   4919 class V8_EXPORT ExternalResourceVisitor {  // NOLINT
   4920  public:
   4921   virtual ~ExternalResourceVisitor() {}
   4922   virtual void VisitExternalString(Handle<String> string) {}
   4923 };
   4924 
   4925 
   4926 /**
   4927  * Interface for iterating through all the persistent handles in the heap.
   4928  */
   4929 class V8_EXPORT PersistentHandleVisitor {  // NOLINT
   4930  public:
   4931   virtual ~PersistentHandleVisitor() {}
   4932   virtual void VisitPersistentHandle(Persistent<Value>* value,
   4933                                      uint16_t class_id) {}
   4934 };
   4935 
   4936 
   4937 /**
   4938  * Container class for static utility functions.
   4939  */
   4940 class V8_EXPORT V8 {
   4941  public:
   4942   /** Set the callback to invoke in case of fatal errors. */
   4943   static void SetFatalErrorHandler(FatalErrorCallback that);
   4944 
   4945   /**
   4946    * Set the callback to invoke to check if code generation from
   4947    * strings should be allowed.
   4948    */
   4949   static void SetAllowCodeGenerationFromStringsCallback(
   4950       AllowCodeGenerationFromStringsCallback that);
   4951 
   4952   /**
   4953    * Set allocator to use for ArrayBuffer memory.
   4954    * The allocator should be set only once. The allocator should be set
   4955    * before any code tha uses ArrayBuffers is executed.
   4956    * This allocator is used in all isolates.
   4957    */
   4958   static void SetArrayBufferAllocator(ArrayBuffer::Allocator* allocator);
   4959 
   4960   /**
   4961    * Check if V8 is dead and therefore unusable.  This is the case after
   4962    * fatal errors such as out-of-memory situations.
   4963    */
   4964   static bool IsDead();
   4965 
   4966   /**
   4967    * The following 4 functions are to be used when V8 is built with
   4968    * the 'compress_startup_data' flag enabled. In this case, the
   4969    * embedder must decompress startup data prior to initializing V8.
   4970    *
   4971    * This is how interaction with V8 should look like:
   4972    *   int compressed_data_count = v8::V8::GetCompressedStartupDataCount();
   4973    *   v8::StartupData* compressed_data =
   4974    *     new v8::StartupData[compressed_data_count];
   4975    *   v8::V8::GetCompressedStartupData(compressed_data);
   4976    *   ... decompress data (compressed_data can be updated in-place) ...
   4977    *   v8::V8::SetDecompressedStartupData(compressed_data);
   4978    *   ... now V8 can be initialized
   4979    *   ... make sure the decompressed data stays valid until V8 shutdown
   4980    *
   4981    * A helper class StartupDataDecompressor is provided. It implements
   4982    * the protocol of the interaction described above, and can be used in
   4983    * most cases instead of calling these API functions directly.
   4984    */
   4985   static StartupData::CompressionAlgorithm GetCompressedStartupDataAlgorithm();
   4986   static int GetCompressedStartupDataCount();
   4987   static void GetCompressedStartupData(StartupData* compressed_data);
   4988   static void SetDecompressedStartupData(StartupData* decompressed_data);
   4989 
   4990   /**
   4991    * Hand startup data to V8, in case the embedder has chosen to build
   4992    * V8 with external startup data.
   4993    *
   4994    * Note:
   4995    * - By default the startup data is linked into the V8 library, in which
   4996    *   case this function is not meaningful.
   4997    * - If this needs to be called, it needs to be called before V8
   4998    *   tries to make use of its built-ins.
   4999    * - To avoid unnecessary copies of data, V8 will point directly into the
   5000    *   given data blob, so pretty please keep it around until V8 exit.
   5001    * - Compression of the startup blob might be useful, but needs to
   5002    *   handled entirely on the embedders' side.
   5003    * - The call will abort if the data is invalid.
   5004    */
   5005   static void SetNativesDataBlob(StartupData* startup_blob);
   5006   static void SetSnapshotDataBlob(StartupData* startup_blob);
   5007 
   5008   /**
   5009    * Adds a message listener.
   5010    *
   5011    * The same message listener can be added more than once and in that
   5012    * case it will be called more than once for each message.
   5013    *
   5014    * If data is specified, it will be passed to the callback when it is called.
   5015    * Otherwise, the exception object will be passed to the callback instead.
   5016    */
   5017   static bool AddMessageListener(MessageCallback that,
   5018                                  Handle<Value> data = Handle<Value>());
   5019 
   5020   /**
   5021    * Remove all message listeners from the specified callback function.
   5022    */
   5023   static void RemoveMessageListeners(MessageCallback that);
   5024 
   5025   /**
   5026    * Tells V8 to capture current stack trace when uncaught exception occurs
   5027    * and report it to the message listeners. The option is off by default.
   5028    */
   5029   static void SetCaptureStackTraceForUncaughtExceptions(
   5030       bool capture,
   5031       int frame_limit = 10,
   5032       StackTrace::StackTraceOptions options = StackTrace::kOverview);
   5033 
   5034   /**
   5035    * Sets V8 flags from a string.
   5036    */
   5037   static void SetFlagsFromString(const char* str, int length);
   5038 
   5039   /**
   5040    * Sets V8 flags from the command line.
   5041    */
   5042   static void SetFlagsFromCommandLine(int* argc,
   5043                                       char** argv,
   5044                                       bool remove_flags);
   5045 
   5046   /** Get the version string. */
   5047   static const char* GetVersion();
   5048 
   5049   /** Callback function for reporting failed access checks.*/
   5050   static void SetFailedAccessCheckCallbackFunction(FailedAccessCheckCallback);
   5051 
   5052   /**
   5053    * Enables the host application to receive a notification before a
   5054    * garbage collection.  Allocations are not allowed in the
   5055    * callback function, you therefore cannot manipulate objects (set
   5056    * or delete properties for example) since it is possible such
   5057    * operations will result in the allocation of objects. It is possible
   5058    * to specify the GCType filter for your callback. But it is not possible to
   5059    * register the same callback function two times with different
   5060    * GCType filters.
   5061    */
   5062   static void AddGCPrologueCallback(
   5063       GCPrologueCallback callback, GCType gc_type_filter = kGCTypeAll);
   5064 
   5065   /**
   5066    * This function removes callback which was installed by
   5067    * AddGCPrologueCallback function.
   5068    */
   5069   static void RemoveGCPrologueCallback(GCPrologueCallback callback);
   5070 
   5071   /**
   5072    * Enables the host application to receive a notification after a
   5073    * garbage collection.  Allocations are not allowed in the
   5074    * callback function, you therefore cannot manipulate objects (set
   5075    * or delete properties for example) since it is possible such
   5076    * operations will result in the allocation of objects. It is possible
   5077    * to specify the GCType filter for your callback. But it is not possible to
   5078    * register the same callback function two times with different
   5079    * GCType filters.
   5080    */
   5081   static void AddGCEpilogueCallback(
   5082       GCEpilogueCallback callback, GCType gc_type_filter = kGCTypeAll);
   5083 
   5084   /**
   5085    * This function removes callback which was installed by
   5086    * AddGCEpilogueCallback function.
   5087    */
   5088   static void RemoveGCEpilogueCallback(GCEpilogueCallback callback);
   5089 
   5090   /**
   5091    * Enables the host application to provide a mechanism to be notified
   5092    * and perform custom logging when V8 Allocates Executable Memory.
   5093    */
   5094   static void AddMemoryAllocationCallback(MemoryAllocationCallback callback,
   5095                                           ObjectSpace space,
   5096                                           AllocationAction action);
   5097 
   5098   /**
   5099    * Removes callback that was installed by AddMemoryAllocationCallback.
   5100    */
   5101   static void RemoveMemoryAllocationCallback(MemoryAllocationCallback callback);
   5102 
   5103   /**
   5104    * Initializes V8. This function needs to be called before the first Isolate
   5105    * is created. It always returns true.
   5106    */
   5107   static bool Initialize();
   5108 
   5109   /**
   5110    * Allows the host application to provide a callback which can be used
   5111    * as a source of entropy for random number generators.
   5112    */
   5113   static void SetEntropySource(EntropySource source);
   5114 
   5115   /**
   5116    * Allows the host application to provide a callback that allows v8 to
   5117    * cooperate with a profiler that rewrites return addresses on stack.
   5118    */
   5119   static void SetReturnAddressLocationResolver(
   5120       ReturnAddressLocationResolver return_address_resolver);
   5121 
   5122   /**
   5123    * Forcefully terminate the current thread of JavaScript execution
   5124    * in the given isolate.
   5125    *
   5126    * This method can be used by any thread even if that thread has not
   5127    * acquired the V8 lock with a Locker object.
   5128    *
   5129    * \param isolate The isolate in which to terminate the current JS execution.
   5130    */
   5131   static void TerminateExecution(Isolate* isolate);
   5132 
   5133   /**
   5134    * Is V8 terminating JavaScript execution.
   5135    *
   5136    * Returns true if JavaScript execution is currently terminating
   5137    * because of a call to TerminateExecution.  In that case there are
   5138    * still JavaScript frames on the stack and the termination
   5139    * exception is still active.
   5140    *
   5141    * \param isolate The isolate in which to check.
   5142    */
   5143   static bool IsExecutionTerminating(Isolate* isolate = NULL);
   5144 
   5145   /**
   5146    * Resume execution capability in the given isolate, whose execution
   5147    * was previously forcefully terminated using TerminateExecution().
   5148    *
   5149    * When execution is forcefully terminated using TerminateExecution(),
   5150    * the isolate can not resume execution until all JavaScript frames
   5151    * have propagated the uncatchable exception which is generated.  This
   5152    * method allows the program embedding the engine to handle the
   5153    * termination event and resume execution capability, even if
   5154    * JavaScript frames remain on the stack.
   5155    *
   5156    * This method can be used by any thread even if that thread has not
   5157    * acquired the V8 lock with a Locker object.
   5158    *
   5159    * \param isolate The isolate in which to resume execution capability.
   5160    */
   5161   static void CancelTerminateExecution(Isolate* isolate);
   5162 
   5163   /**
   5164    * Releases any resources used by v8 and stops any utility threads
   5165    * that may be running.  Note that disposing v8 is permanent, it
   5166    * cannot be reinitialized.
   5167    *
   5168    * It should generally not be necessary to dispose v8 before exiting
   5169    * a process, this should happen automatically.  It is only necessary
   5170    * to use if the process needs the resources taken up by v8.
   5171    */
   5172   static bool Dispose();
   5173 
   5174   /**
   5175    * Iterates through all external resources referenced from current isolate
   5176    * heap.  GC is not invoked prior to iterating, therefore there is no
   5177    * guarantee that visited objects are still alive.
   5178    */
   5179   static void VisitExternalResources(ExternalResourceVisitor* visitor);
   5180 
   5181   /**
   5182    * Iterates through all the persistent handles in the current isolate's heap
   5183    * that have class_ids.
   5184    */
   5185   static void VisitHandlesWithClassIds(PersistentHandleVisitor* visitor);
   5186 
   5187   /**
   5188    * Iterates through all the persistent handles in the current isolate's heap
   5189    * that have class_ids and are candidates to be marked as partially dependent
   5190    * handles. This will visit handles to young objects created since the last
   5191    * garbage collection but is free to visit an arbitrary superset of these
   5192    * objects.
   5193    */
   5194   static void VisitHandlesForPartialDependence(
   5195       Isolate* isolate, PersistentHandleVisitor* visitor);
   5196 
   5197   /**
   5198    * Initialize the ICU library bundled with V8. The embedder should only
   5199    * invoke this method when using the bundled ICU. Returns true on success.
   5200    *
   5201    * If V8 was compiled with the ICU data in an external file, the location
   5202    * of the data file has to be provided.
   5203    */
   5204   static bool InitializeICU(const char* icu_data_file = NULL);
   5205 
   5206   /**
   5207    * Sets the v8::Platform to use. This should be invoked before V8 is
   5208    * initialized.
   5209    */
   5210   static void InitializePlatform(Platform* platform);
   5211 
   5212   /**
   5213    * Clears all references to the v8::Platform. This should be invoked after
   5214    * V8 was disposed.
   5215    */
   5216   static void ShutdownPlatform();
   5217 
   5218  private:
   5219   V8();
   5220 
   5221   static internal::Object** GlobalizeReference(internal::Isolate* isolate,
   5222                                                internal::Object** handle);
   5223   static internal::Object** CopyPersistent(internal::Object** handle);
   5224   static void DisposeGlobal(internal::Object** global_handle);
   5225   typedef WeakCallbackData<Value, void>::Callback WeakCallback;
   5226   static void MakeWeak(internal::Object** global_handle,
   5227                        void* data,
   5228                        WeakCallback weak_callback);
   5229   static void* ClearWeak(internal::Object** global_handle);
   5230   static void Eternalize(Isolate* isolate,
   5231                          Value* handle,
   5232                          int* index);
   5233   static Local<Value> GetEternal(Isolate* isolate, int index);
   5234 
   5235   template <class T> friend class Handle;
   5236   template <class T> friend class Local;
   5237   template <class T> friend class Eternal;
   5238   template <class T> friend class PersistentBase;
   5239   template <class T, class M> friend class Persistent;
   5240   friend class Context;
   5241 };
   5242 
   5243 
   5244 /**
   5245  * An external exception handler.
   5246  */
   5247 class V8_EXPORT TryCatch {
   5248  public:
   5249   /**
   5250    * Creates a new try/catch block and registers it with v8.  Note that
   5251    * all TryCatch blocks should be stack allocated because the memory
   5252    * location itself is compared against JavaScript try/catch blocks.
   5253    */
   5254   TryCatch();
   5255 
   5256   /**
   5257    * Unregisters and deletes this try/catch block.
   5258    */
   5259   ~TryCatch();
   5260 
   5261   /**
   5262    * Returns true if an exception has been caught by this try/catch block.
   5263    */
   5264   bool HasCaught() const;
   5265 
   5266   /**
   5267    * For certain types of exceptions, it makes no sense to continue execution.
   5268    *
   5269    * If CanContinue returns false, the correct action is to perform any C++
   5270    * cleanup needed and then return.  If CanContinue returns false and
   5271    * HasTerminated returns true, it is possible to call
   5272    * CancelTerminateExecution in order to continue calling into the engine.
   5273    */
   5274   bool CanContinue() const;
   5275 
   5276   /**
   5277    * Returns true if an exception has been caught due to script execution
   5278    * being terminated.
   5279    *
   5280    * There is no JavaScript representation of an execution termination
   5281    * exception.  Such exceptions are thrown when the TerminateExecution
   5282    * methods are called to terminate a long-running script.
   5283    *
   5284    * If such an exception has been thrown, HasTerminated will return true,
   5285    * indicating that it is possible to call CancelTerminateExecution in order
   5286    * to continue calling into the engine.
   5287    */
   5288   bool HasTerminated() const;
   5289 
   5290   /**
   5291    * Throws the exception caught by this TryCatch in a way that avoids
   5292    * it being caught again by this same TryCatch.  As with ThrowException
   5293    * it is illegal to execute any JavaScript operations after calling
   5294    * ReThrow; the caller must return immediately to where the exception
   5295    * is caught.
   5296    */
   5297   Handle<Value> ReThrow();
   5298 
   5299   /**
   5300    * Returns the exception caught by this try/catch block.  If no exception has
   5301    * been caught an empty handle is returned.
   5302    *
   5303    * The returned handle is valid until this TryCatch block has been destroyed.
   5304    */
   5305   Local<Value> Exception() const;
   5306 
   5307   /**
   5308    * Returns the .stack property of the thrown object.  If no .stack
   5309    * property is present an empty handle is returned.
   5310    */
   5311   Local<Value> StackTrace() const;
   5312 
   5313   /**
   5314    * Returns the message associated with this exception.  If there is
   5315    * no message associated an empty handle is returned.
   5316    *
   5317    * The returned handle is valid until this TryCatch block has been
   5318    * destroyed.
   5319    */
   5320   Local<v8::Message> Message() const;
   5321 
   5322   /**
   5323    * Clears any exceptions that may have been caught by this try/catch block.
   5324    * After this method has been called, HasCaught() will return false. Cancels
   5325    * the scheduled exception if it is caught and ReThrow() is not called before.
   5326    *
   5327    * It is not necessary to clear a try/catch block before using it again; if
   5328    * another exception is thrown the previously caught exception will just be
   5329    * overwritten.  However, it is often a good idea since it makes it easier
   5330    * to determine which operation threw a given exception.
   5331    */
   5332   void Reset();
   5333 
   5334   /**
   5335    * Set verbosity of the external exception handler.
   5336    *
   5337    * By default, exceptions that are caught by an external exception
   5338    * handler are not reported.  Call SetVerbose with true on an
   5339    * external exception handler to have exceptions caught by the
   5340    * handler reported as if they were not caught.
   5341    */
   5342   void SetVerbose(bool value);
   5343 
   5344   /**
   5345    * Set whether or not this TryCatch should capture a Message object
   5346    * which holds source information about where the exception
   5347    * occurred.  True by default.
   5348    */
   5349   void SetCaptureMessage(bool value);
   5350 
   5351   /**
   5352    * There are cases when the raw address of C++ TryCatch object cannot be
   5353    * used for comparisons with addresses into the JS stack. The cases are:
   5354    * 1) ARM, ARM64 and MIPS simulators which have separate JS stack.
   5355    * 2) Address sanitizer allocates local C++ object in the heap when
   5356    *    UseAfterReturn mode is enabled.
   5357    * This method returns address that can be used for comparisons with
   5358    * addresses into the JS stack. When neither simulator nor ASAN's
   5359    * UseAfterReturn is enabled, then the address returned will be the address
   5360    * of the C++ try catch handler itself.
   5361    */
   5362   static void* JSStackComparableAddress(v8::TryCatch* handler) {
   5363     if (handler == NULL) return NULL;
   5364     return handler->js_stack_comparable_address_;
   5365   }
   5366 
   5367  private:
   5368   void ResetInternal();
   5369 
   5370   // Make it hard to create heap-allocated TryCatch blocks.
   5371   TryCatch(const TryCatch&);
   5372   void operator=(const TryCatch&);
   5373   void* operator new(size_t size);
   5374   void operator delete(void*, size_t);
   5375 
   5376   v8::internal::Isolate* isolate_;
   5377   v8::TryCatch* next_;
   5378   void* exception_;
   5379   void* message_obj_;
   5380   void* message_script_;
   5381   void* js_stack_comparable_address_;
   5382   int message_start_pos_;
   5383   int message_end_pos_;
   5384   bool is_verbose_ : 1;
   5385   bool can_continue_ : 1;
   5386   bool capture_message_ : 1;
   5387   bool rethrow_ : 1;
   5388   bool has_terminated_ : 1;
   5389 
   5390   friend class v8::internal::Isolate;
   5391 };
   5392 
   5393 
   5394 // --- Context ---
   5395 
   5396 
   5397 /**
   5398  * A container for extension names.
   5399  */
   5400 class V8_EXPORT ExtensionConfiguration {
   5401  public:
   5402   ExtensionConfiguration() : name_count_(0), names_(NULL) { }
   5403   ExtensionConfiguration(int name_count, const char* names[])
   5404       : name_count_(name_count), names_(names) { }
   5405 
   5406   const char** begin() const { return &names_[0]; }
   5407   const char** end()  const { return &names_[name_count_]; }
   5408 
   5409  private:
   5410   const int name_count_;
   5411   const char** names_;
   5412 };
   5413 
   5414 
   5415 /**
   5416  * A sandboxed execution context with its own set of built-in objects
   5417  * and functions.
   5418  */
   5419 class V8_EXPORT Context {
   5420  public:
   5421   /**
   5422    * Returns the global proxy object.
   5423    *
   5424    * Global proxy object is a thin wrapper whose prototype points to actual
   5425    * context's global object with the properties like Object, etc. This is done
   5426    * that way for security reasons (for more details see
   5427    * https://wiki.mozilla.org/Gecko:SplitWindow).
   5428    *
   5429    * Please note that changes to global proxy object prototype most probably
   5430    * would break VM---v8 expects only global object as a prototype of global
   5431    * proxy object.
   5432    */
   5433   Local<Object> Global();
   5434 
   5435   /**
   5436    * Detaches the global object from its context before
   5437    * the global object can be reused to create a new context.
   5438    */
   5439   void DetachGlobal();
   5440 
   5441   /**
   5442    * Creates a new context and returns a handle to the newly allocated
   5443    * context.
   5444    *
   5445    * \param isolate The isolate in which to create the context.
   5446    *
   5447    * \param extensions An optional extension configuration containing
   5448    * the extensions to be installed in the newly created context.
   5449    *
   5450    * \param global_template An optional object template from which the
   5451    * global object for the newly created context will be created.
   5452    *
   5453    * \param global_object An optional global object to be reused for
   5454    * the newly created context. This global object must have been
   5455    * created by a previous call to Context::New with the same global
   5456    * template. The state of the global object will be completely reset
   5457    * and only object identify will remain.
   5458    */
   5459   static Local<Context> New(
   5460       Isolate* isolate,
   5461       ExtensionConfiguration* extensions = NULL,
   5462       Handle<ObjectTemplate> global_template = Handle<ObjectTemplate>(),
   5463       Handle<Value> global_object = Handle<Value>());
   5464 
   5465   /**
   5466    * Sets the security token for the context.  To access an object in
   5467    * another context, the security tokens must match.
   5468    */
   5469   void SetSecurityToken(Handle<Value> token);
   5470 
   5471   /** Restores the security token to the default value. */
   5472   void UseDefaultSecurityToken();
   5473 
   5474   /** Returns the security token of this context.*/
   5475   Handle<Value> GetSecurityToken();
   5476 
   5477   /**
   5478    * Enter this context.  After entering a context, all code compiled
   5479    * and run is compiled and run in this context.  If another context
   5480    * is already entered, this old context is saved so it can be
   5481    * restored when the new context is exited.
   5482    */
   5483   void Enter();
   5484 
   5485   /**
   5486    * Exit this context.  Exiting the current context restores the
   5487    * context that was in place when entering the current context.
   5488    */
   5489   void Exit();
   5490 
   5491   /** Returns an isolate associated with a current context. */
   5492   v8::Isolate* GetIsolate();
   5493 
   5494   /**
   5495    * Gets the embedder data with the given index, which must have been set by a
   5496    * previous call to SetEmbedderData with the same index. Note that index 0
   5497    * currently has a special meaning for Chrome's debugger.
   5498    */
   5499   V8_INLINE Local<Value> GetEmbedderData(int index);
   5500 
   5501   /**
   5502    * Sets the embedder data with the given index, growing the data as
   5503    * needed. Note that index 0 currently has a special meaning for Chrome's
   5504    * debugger.
   5505    */
   5506   void SetEmbedderData(int index, Handle<Value> value);
   5507 
   5508   /**
   5509    * Gets a 2-byte-aligned native pointer from the embedder data with the given
   5510    * index, which must have bees set by a previous call to
   5511    * SetAlignedPointerInEmbedderData with the same index. Note that index 0
   5512    * currently has a special meaning for Chrome's debugger.
   5513    */
   5514   V8_INLINE void* GetAlignedPointerFromEmbedderData(int index);
   5515 
   5516   /**
   5517    * Sets a 2-byte-aligned native pointer in the embedder data with the given
   5518    * index, growing the data as needed. Note that index 0 currently has a
   5519    * special meaning for Chrome's debugger.
   5520    */
   5521   void SetAlignedPointerInEmbedderData(int index, void* value);
   5522 
   5523   /**
   5524    * Control whether code generation from strings is allowed. Calling
   5525    * this method with false will disable 'eval' and the 'Function'
   5526    * constructor for code running in this context. If 'eval' or the
   5527    * 'Function' constructor are used an exception will be thrown.
   5528    *
   5529    * If code generation from strings is not allowed the
   5530    * V8::AllowCodeGenerationFromStrings callback will be invoked if
   5531    * set before blocking the call to 'eval' or the 'Function'
   5532    * constructor. If that callback returns true, the call will be
   5533    * allowed, otherwise an exception will be thrown. If no callback is
   5534    * set an exception will be thrown.
   5535    */
   5536   void AllowCodeGenerationFromStrings(bool allow);
   5537 
   5538   /**
   5539    * Returns true if code generation from strings is allowed for the context.
   5540    * For more details see AllowCodeGenerationFromStrings(bool) documentation.
   5541    */
   5542   bool IsCodeGenerationFromStringsAllowed();
   5543 
   5544   /**
   5545    * Sets the error description for the exception that is thrown when
   5546    * code generation from strings is not allowed and 'eval' or the 'Function'
   5547    * constructor are called.
   5548    */
   5549   void SetErrorMessageForCodeGenerationFromStrings(Handle<String> message);
   5550 
   5551   /**
   5552    * Stack-allocated class which sets the execution context for all
   5553    * operations executed within a local scope.
   5554    */
   5555   class Scope {
   5556    public:
   5557     explicit V8_INLINE Scope(Handle<Context> context) : context_(context) {
   5558       context_->Enter();
   5559     }
   5560     V8_INLINE ~Scope() { context_->Exit(); }
   5561 
   5562    private:
   5563     Handle<Context> context_;
   5564   };
   5565 
   5566  private:
   5567   friend class Value;
   5568   friend class Script;
   5569   friend class Object;
   5570   friend class Function;
   5571 
   5572   Local<Value> SlowGetEmbedderData(int index);
   5573   void* SlowGetAlignedPointerFromEmbedderData(int index);
   5574 };
   5575 
   5576 
   5577 /**
   5578  * Multiple threads in V8 are allowed, but only one thread at a time is allowed
   5579  * to use any given V8 isolate, see the comments in the Isolate class. The
   5580  * definition of 'using a V8 isolate' includes accessing handles or holding onto
   5581  * object pointers obtained from V8 handles while in the particular V8 isolate.
   5582  * It is up to the user of V8 to ensure, perhaps with locking, that this
   5583  * constraint is not violated. In addition to any other synchronization
   5584  * mechanism that may be used, the v8::Locker and v8::Unlocker classes must be
   5585  * used to signal thead switches to V8.
   5586  *
   5587  * v8::Locker is a scoped lock object. While it's active, i.e. between its
   5588  * construction and destruction, the current thread is allowed to use the locked
   5589  * isolate. V8 guarantees that an isolate can be locked by at most one thread at
   5590  * any time. In other words, the scope of a v8::Locker is a critical section.
   5591  *
   5592  * Sample usage:
   5593 * \code
   5594  * ...
   5595  * {
   5596  *   v8::Locker locker(isolate);
   5597  *   v8::Isolate::Scope isolate_scope(isolate);
   5598  *   ...
   5599  *   // Code using V8 and isolate goes here.
   5600  *   ...
   5601  * } // Destructor called here
   5602  * \endcode
   5603  *
   5604  * If you wish to stop using V8 in a thread A you can do this either by
   5605  * destroying the v8::Locker object as above or by constructing a v8::Unlocker
   5606  * object:
   5607  *
   5608  * \code
   5609  * {
   5610  *   isolate->Exit();
   5611  *   v8::Unlocker unlocker(isolate);
   5612  *   ...
   5613  *   // Code not using V8 goes here while V8 can run in another thread.
   5614  *   ...
   5615  * } // Destructor called here.
   5616  * isolate->Enter();
   5617  * \endcode
   5618  *
   5619  * The Unlocker object is intended for use in a long-running callback from V8,
   5620  * where you want to release the V8 lock for other threads to use.
   5621  *
   5622  * The v8::Locker is a recursive lock, i.e. you can lock more than once in a
   5623  * given thread. This can be useful if you have code that can be called either
   5624  * from code that holds the lock or from code that does not. The Unlocker is
   5625  * not recursive so you can not have several Unlockers on the stack at once, and
   5626  * you can not use an Unlocker in a thread that is not inside a Locker's scope.
   5627  *
   5628  * An unlocker will unlock several lockers if it has to and reinstate the
   5629  * correct depth of locking on its destruction, e.g.:
   5630  *
   5631  * \code
   5632  * // V8 not locked.
   5633  * {
   5634  *   v8::Locker locker(isolate);
   5635  *   Isolate::Scope isolate_scope(isolate);
   5636  *   // V8 locked.
   5637  *   {
   5638  *     v8::Locker another_locker(isolate);
   5639  *     // V8 still locked (2 levels).
   5640  *     {
   5641  *       isolate->Exit();
   5642  *       v8::Unlocker unlocker(isolate);
   5643  *       // V8 not locked.
   5644  *     }
   5645  *     isolate->Enter();
   5646  *     // V8 locked again (2 levels).
   5647  *   }
   5648  *   // V8 still locked (1 level).
   5649  * }
   5650  * // V8 Now no longer locked.
   5651  * \endcode
   5652  */
   5653 class V8_EXPORT Unlocker {
   5654  public:
   5655   /**
   5656    * Initialize Unlocker for a given Isolate.
   5657    */
   5658   V8_INLINE explicit Unlocker(Isolate* isolate) { Initialize(isolate); }
   5659 
   5660   ~Unlocker();
   5661  private:
   5662   void Initialize(Isolate* isolate);
   5663 
   5664   internal::Isolate* isolate_;
   5665 };
   5666 
   5667 
   5668 class V8_EXPORT Locker {
   5669  public:
   5670   /**
   5671    * Initialize Locker for a given Isolate.
   5672    */
   5673   V8_INLINE explicit Locker(Isolate* isolate) { Initialize(isolate); }
   5674 
   5675   ~Locker();
   5676 
   5677   /**
   5678    * Returns whether or not the locker for a given isolate, is locked by the
   5679    * current thread.
   5680    */
   5681   static bool IsLocked(Isolate* isolate);
   5682 
   5683   /**
   5684    * Returns whether v8::Locker is being used by this V8 instance.
   5685    */
   5686   static bool IsActive();
   5687 
   5688  private:
   5689   void Initialize(Isolate* isolate);
   5690 
   5691   bool has_lock_;
   5692   bool top_level_;
   5693   internal::Isolate* isolate_;
   5694 
   5695   static bool active_;
   5696 
   5697   // Disallow copying and assigning.
   5698   Locker(const Locker&);
   5699   void operator=(const Locker&);
   5700 };
   5701 
   5702 
   5703 // --- Implementation ---
   5704 
   5705 
   5706 namespace internal {
   5707 
   5708 const int kApiPointerSize = sizeof(void*);  // NOLINT
   5709 const int kApiIntSize = sizeof(int);  // NOLINT
   5710 const int kApiInt64Size = sizeof(int64_t);  // NOLINT
   5711 
   5712 // Tag information for HeapObject.
   5713 const int kHeapObjectTag = 1;
   5714 const int kHeapObjectTagSize = 2;
   5715 const intptr_t kHeapObjectTagMask = (1 << kHeapObjectTagSize) - 1;
   5716 
   5717 // Tag information for Smi.
   5718 const int kSmiTag = 0;
   5719 const int kSmiTagSize = 1;
   5720 const intptr_t kSmiTagMask = (1 << kSmiTagSize) - 1;
   5721 
   5722 template <size_t ptr_size> struct SmiTagging;
   5723 
   5724 template<int kSmiShiftSize>
   5725 V8_INLINE internal::Object* IntToSmi(int value) {
   5726   int smi_shift_bits = kSmiTagSize + kSmiShiftSize;
   5727   uintptr_t tagged_value =
   5728       (static_cast<uintptr_t>(value) << smi_shift_bits) | kSmiTag;
   5729   return reinterpret_cast<internal::Object*>(tagged_value);
   5730 }
   5731 
   5732 // Smi constants for 32-bit systems.
   5733 template <> struct SmiTagging<4> {
   5734   enum { kSmiShiftSize = 0, kSmiValueSize = 31 };
   5735   static int SmiShiftSize() { return kSmiShiftSize; }
   5736   static int SmiValueSize() { return kSmiValueSize; }
   5737   V8_INLINE static int SmiToInt(const internal::Object* value) {
   5738     int shift_bits = kSmiTagSize + kSmiShiftSize;
   5739     // Throw away top 32 bits and shift down (requires >> to be sign extending).
   5740     return static_cast<int>(reinterpret_cast<intptr_t>(value)) >> shift_bits;
   5741   }
   5742   V8_INLINE static internal::Object* IntToSmi(int value) {
   5743     return internal::IntToSmi<kSmiShiftSize>(value);
   5744   }
   5745   V8_INLINE static bool IsValidSmi(intptr_t value) {
   5746     // To be representable as an tagged small integer, the two
   5747     // most-significant bits of 'value' must be either 00 or 11 due to
   5748     // sign-extension. To check this we add 01 to the two
   5749     // most-significant bits, and check if the most-significant bit is 0
   5750     //
   5751     // CAUTION: The original code below:
   5752     // bool result = ((value + 0x40000000) & 0x80000000) == 0;
   5753     // may lead to incorrect results according to the C language spec, and
   5754     // in fact doesn't work correctly with gcc4.1.1 in some cases: The
   5755     // compiler may produce undefined results in case of signed integer
   5756     // overflow. The computation must be done w/ unsigned ints.
   5757     return static_cast<uintptr_t>(value + 0x40000000U) < 0x80000000U;
   5758   }
   5759 };
   5760 
   5761 // Smi constants for 64-bit systems.
   5762 template <> struct SmiTagging<8> {
   5763   enum { kSmiShiftSize = 31, kSmiValueSize = 32 };
   5764   static int SmiShiftSize() { return kSmiShiftSize; }
   5765   static int SmiValueSize() { return kSmiValueSize; }
   5766   V8_INLINE static int SmiToInt(const internal::Object* value) {
   5767     int shift_bits = kSmiTagSize + kSmiShiftSize;
   5768     // Shift down and throw away top 32 bits.
   5769     return static_cast<int>(reinterpret_cast<intptr_t>(value) >> shift_bits);
   5770   }
   5771   V8_INLINE static internal::Object* IntToSmi(int value) {
   5772     return internal::IntToSmi<kSmiShiftSize>(value);
   5773   }
   5774   V8_INLINE static bool IsValidSmi(intptr_t value) {
   5775     // To be representable as a long smi, the value must be a 32-bit integer.
   5776     return (value == static_cast<int32_t>(value));
   5777   }
   5778 };
   5779 
   5780 typedef SmiTagging<kApiPointerSize> PlatformSmiTagging;
   5781 const int kSmiShiftSize = PlatformSmiTagging::kSmiShiftSize;
   5782 const int kSmiValueSize = PlatformSmiTagging::kSmiValueSize;
   5783 V8_INLINE static bool SmiValuesAre31Bits() { return kSmiValueSize == 31; }
   5784 V8_INLINE static bool SmiValuesAre32Bits() { return kSmiValueSize == 32; }
   5785 
   5786 /**
   5787  * This class exports constants and functionality from within v8 that
   5788  * is necessary to implement inline functions in the v8 api.  Don't
   5789  * depend on functions and constants defined here.
   5790  */
   5791 class Internals {
   5792  public:
   5793   // These values match non-compiler-dependent values defined within
   5794   // the implementation of v8.
   5795   static const int kHeapObjectMapOffset = 0;
   5796   static const int kMapInstanceTypeAndBitFieldOffset =
   5797       1 * kApiPointerSize + kApiIntSize;
   5798   static const int kStringResourceOffset = 3 * kApiPointerSize;
   5799 
   5800   static const int kOddballKindOffset = 3 * kApiPointerSize;
   5801   static const int kForeignAddressOffset = kApiPointerSize;
   5802   static const int kJSObjectHeaderSize = 3 * kApiPointerSize;
   5803   static const int kFixedArrayHeaderSize = 2 * kApiPointerSize;
   5804   static const int kContextHeaderSize = 2 * kApiPointerSize;
   5805   static const int kContextEmbedderDataIndex = 95;
   5806   static const int kFullStringRepresentationMask = 0x07;
   5807   static const int kStringEncodingMask = 0x4;
   5808   static const int kExternalTwoByteRepresentationTag = 0x02;
   5809   static const int kExternalOneByteRepresentationTag = 0x06;
   5810 
   5811   static const int kIsolateEmbedderDataOffset = 0 * kApiPointerSize;
   5812   static const int kAmountOfExternalAllocatedMemoryOffset =
   5813       4 * kApiPointerSize;
   5814   static const int kAmountOfExternalAllocatedMemoryAtLastGlobalGCOffset =
   5815       kAmountOfExternalAllocatedMemoryOffset + kApiInt64Size;
   5816   static const int kIsolateRootsOffset =
   5817       kAmountOfExternalAllocatedMemoryAtLastGlobalGCOffset + kApiInt64Size +
   5818       kApiPointerSize;
   5819   static const int kUndefinedValueRootIndex = 5;
   5820   static const int kNullValueRootIndex = 7;
   5821   static const int kTrueValueRootIndex = 8;
   5822   static const int kFalseValueRootIndex = 9;
   5823   static const int kEmptyStringRootIndex = 164;
   5824 
   5825   // The external allocation limit should be below 256 MB on all architectures
   5826   // to avoid that resource-constrained embedders run low on memory.
   5827   static const int kExternalAllocationLimit = 192 * 1024 * 1024;
   5828 
   5829   static const int kNodeClassIdOffset = 1 * kApiPointerSize;
   5830   static const int kNodeFlagsOffset = 1 * kApiPointerSize + 3;
   5831   static const int kNodeStateMask = 0xf;
   5832   static const int kNodeStateIsWeakValue = 2;
   5833   static const int kNodeStateIsPendingValue = 3;
   5834   static const int kNodeStateIsNearDeathValue = 4;
   5835   static const int kNodeIsIndependentShift = 4;
   5836   static const int kNodeIsPartiallyDependentShift = 5;
   5837 
   5838   static const int kJSObjectType = 0xbc;
   5839   static const int kFirstNonstringType = 0x80;
   5840   static const int kOddballType = 0x83;
   5841   static const int kForeignType = 0x88;
   5842 
   5843   static const int kUndefinedOddballKind = 5;
   5844   static const int kNullOddballKind = 3;
   5845 
   5846   static const uint32_t kNumIsolateDataSlots = 4;
   5847 
   5848   V8_EXPORT static void CheckInitializedImpl(v8::Isolate* isolate);
   5849   V8_INLINE static void CheckInitialized(v8::Isolate* isolate) {
   5850 #ifdef V8_ENABLE_CHECKS
   5851     CheckInitializedImpl(isolate);
   5852 #endif
   5853   }
   5854 
   5855   V8_INLINE static bool HasHeapObjectTag(const internal::Object* value) {
   5856     return ((reinterpret_cast<intptr_t>(value) & kHeapObjectTagMask) ==
   5857             kHeapObjectTag);
   5858   }
   5859 
   5860   V8_INLINE static int SmiValue(const internal::Object* value) {
   5861     return PlatformSmiTagging::SmiToInt(value);
   5862   }
   5863 
   5864   V8_INLINE static internal::Object* IntToSmi(int value) {
   5865     return PlatformSmiTagging::IntToSmi(value);
   5866   }
   5867 
   5868   V8_INLINE static bool IsValidSmi(intptr_t value) {
   5869     return PlatformSmiTagging::IsValidSmi(value);
   5870   }
   5871 
   5872   V8_INLINE static int GetInstanceType(const internal::Object* obj) {
   5873     typedef internal::Object O;
   5874     O* map = ReadField<O*>(obj, kHeapObjectMapOffset);
   5875     // Map::InstanceType is defined so that it will always be loaded into
   5876     // the LS 8 bits of one 16-bit word, regardless of endianess.
   5877     return ReadField<uint16_t>(map, kMapInstanceTypeAndBitFieldOffset) & 0xff;
   5878   }
   5879 
   5880   V8_INLINE static int GetOddballKind(const internal::Object* obj) {
   5881     typedef internal::Object O;
   5882     return SmiValue(ReadField<O*>(obj, kOddballKindOffset));
   5883   }
   5884 
   5885   V8_INLINE static bool IsExternalTwoByteString(int instance_type) {
   5886     int representation = (instance_type & kFullStringRepresentationMask);
   5887     return representation == kExternalTwoByteRepresentationTag;
   5888   }
   5889 
   5890   V8_INLINE static uint8_t GetNodeFlag(internal::Object** obj, int shift) {
   5891       uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
   5892       return *addr & static_cast<uint8_t>(1U << shift);
   5893   }
   5894 
   5895   V8_INLINE static void UpdateNodeFlag(internal::Object** obj,
   5896                                        bool value, int shift) {
   5897       uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
   5898       uint8_t mask = static_cast<uint8_t>(1U << shift);
   5899       *addr = static_cast<uint8_t>((*addr & ~mask) | (value << shift));
   5900   }
   5901 
   5902   V8_INLINE static uint8_t GetNodeState(internal::Object** obj) {
   5903     uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
   5904     return *addr & kNodeStateMask;
   5905   }
   5906 
   5907   V8_INLINE static void UpdateNodeState(internal::Object** obj,
   5908                                         uint8_t value) {
   5909     uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
   5910     *addr = static_cast<uint8_t>((*addr & ~kNodeStateMask) | value);
   5911   }
   5912 
   5913   V8_INLINE static void SetEmbedderData(v8::Isolate* isolate,
   5914                                         uint32_t slot,
   5915                                         void* data) {
   5916     uint8_t *addr = reinterpret_cast<uint8_t *>(isolate) +
   5917                     kIsolateEmbedderDataOffset + slot * kApiPointerSize;
   5918     *reinterpret_cast<void**>(addr) = data;
   5919   }
   5920 
   5921   V8_INLINE static void* GetEmbedderData(const v8::Isolate* isolate,
   5922                                          uint32_t slot) {
   5923     const uint8_t* addr = reinterpret_cast<const uint8_t*>(isolate) +
   5924         kIsolateEmbedderDataOffset + slot * kApiPointerSize;
   5925     return *reinterpret_cast<void* const*>(addr);
   5926   }
   5927 
   5928   V8_INLINE static internal::Object** GetRoot(v8::Isolate* isolate,
   5929                                               int index) {
   5930     uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + kIsolateRootsOffset;
   5931     return reinterpret_cast<internal::Object**>(addr + index * kApiPointerSize);
   5932   }
   5933 
   5934   template <typename T>
   5935   V8_INLINE static T ReadField(const internal::Object* ptr, int offset) {
   5936     const uint8_t* addr =
   5937         reinterpret_cast<const uint8_t*>(ptr) + offset - kHeapObjectTag;
   5938     return *reinterpret_cast<const T*>(addr);
   5939   }
   5940 
   5941   template <typename T>
   5942   V8_INLINE static T ReadEmbedderData(const v8::Context* context, int index) {
   5943     typedef internal::Object O;
   5944     typedef internal::Internals I;
   5945     O* ctx = *reinterpret_cast<O* const*>(context);
   5946     int embedder_data_offset = I::kContextHeaderSize +
   5947         (internal::kApiPointerSize * I::kContextEmbedderDataIndex);
   5948     O* embedder_data = I::ReadField<O*>(ctx, embedder_data_offset);
   5949     int value_offset =
   5950         I::kFixedArrayHeaderSize + (internal::kApiPointerSize * index);
   5951     return I::ReadField<T>(embedder_data, value_offset);
   5952   }
   5953 };
   5954 
   5955 }  // namespace internal
   5956 
   5957 
   5958 template <class T>
   5959 Local<T>::Local() : Handle<T>() { }
   5960 
   5961 
   5962 template <class T>
   5963 Local<T> Local<T>::New(Isolate* isolate, Handle<T> that) {
   5964   return New(isolate, that.val_);
   5965 }
   5966 
   5967 template <class T>
   5968 Local<T> Local<T>::New(Isolate* isolate, const PersistentBase<T>& that) {
   5969   return New(isolate, that.val_);
   5970 }
   5971 
   5972 template <class T>
   5973 Handle<T> Handle<T>::New(Isolate* isolate, T* that) {
   5974   if (that == NULL) return Handle<T>();
   5975   T* that_ptr = that;
   5976   internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr);
   5977   return Handle<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(
   5978       reinterpret_cast<internal::Isolate*>(isolate), *p)));
   5979 }
   5980 
   5981 
   5982 template <class T>
   5983 Local<T> Local<T>::New(Isolate* isolate, T* that) {
   5984   if (that == NULL) return Local<T>();
   5985   T* that_ptr = that;
   5986   internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr);
   5987   return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(
   5988       reinterpret_cast<internal::Isolate*>(isolate), *p)));
   5989 }
   5990 
   5991 
   5992 template<class T>
   5993 template<class S>
   5994 void Eternal<T>::Set(Isolate* isolate, Local<S> handle) {
   5995   TYPE_CHECK(T, S);
   5996   V8::Eternalize(isolate, reinterpret_cast<Value*>(*handle), &this->index_);
   5997 }
   5998 
   5999 
   6000 template<class T>
   6001 Local<T> Eternal<T>::Get(Isolate* isolate) {
   6002   return Local<T>(reinterpret_cast<T*>(*V8::GetEternal(isolate, index_)));
   6003 }
   6004 
   6005 
   6006 template <class T>
   6007 T* PersistentBase<T>::New(Isolate* isolate, T* that) {
   6008   if (that == NULL) return NULL;
   6009   internal::Object** p = reinterpret_cast<internal::Object**>(that);
   6010   return reinterpret_cast<T*>(
   6011       V8::GlobalizeReference(reinterpret_cast<internal::Isolate*>(isolate),
   6012                              p));
   6013 }
   6014 
   6015 
   6016 template <class T, class M>
   6017 template <class S, class M2>
   6018 void Persistent<T, M>::Copy(const Persistent<S, M2>& that) {
   6019   TYPE_CHECK(T, S);
   6020   this->Reset();
   6021   if (that.IsEmpty()) return;
   6022   internal::Object** p = reinterpret_cast<internal::Object**>(that.val_);
   6023   this->val_ = reinterpret_cast<T*>(V8::CopyPersistent(p));
   6024   M::Copy(that, this);
   6025 }
   6026 
   6027 
   6028 template <class T>
   6029 bool PersistentBase<T>::IsIndependent() const {
   6030   typedef internal::Internals I;
   6031   if (this->IsEmpty()) return false;
   6032   return I::GetNodeFlag(reinterpret_cast<internal::Object**>(this->val_),
   6033                         I::kNodeIsIndependentShift);
   6034 }
   6035 
   6036 
   6037 template <class T>
   6038 bool PersistentBase<T>::IsNearDeath() const {
   6039   typedef internal::Internals I;
   6040   if (this->IsEmpty()) return false;
   6041   uint8_t node_state =
   6042       I::GetNodeState(reinterpret_cast<internal::Object**>(this->val_));
   6043   return node_state == I::kNodeStateIsNearDeathValue ||
   6044       node_state == I::kNodeStateIsPendingValue;
   6045 }
   6046 
   6047 
   6048 template <class T>
   6049 bool PersistentBase<T>::IsWeak() const {
   6050   typedef internal::Internals I;
   6051   if (this->IsEmpty()) return false;
   6052   return I::GetNodeState(reinterpret_cast<internal::Object**>(this->val_)) ==
   6053       I::kNodeStateIsWeakValue;
   6054 }
   6055 
   6056 
   6057 template <class T>
   6058 void PersistentBase<T>::Reset() {
   6059   if (this->IsEmpty()) return;
   6060   V8::DisposeGlobal(reinterpret_cast<internal::Object**>(this->val_));
   6061   val_ = 0;
   6062 }
   6063 
   6064 
   6065 template <class T>
   6066 template <class S>
   6067 void PersistentBase<T>::Reset(Isolate* isolate, const Handle<S>& other) {
   6068   TYPE_CHECK(T, S);
   6069   Reset();
   6070   if (other.IsEmpty()) return;
   6071   this->val_ = New(isolate, other.val_);
   6072 }
   6073 
   6074 
   6075 template <class T>
   6076 template <class S>
   6077 void PersistentBase<T>::Reset(Isolate* isolate,
   6078                               const PersistentBase<S>& other) {
   6079   TYPE_CHECK(T, S);
   6080   Reset();
   6081   if (other.IsEmpty()) return;
   6082   this->val_ = New(isolate, other.val_);
   6083 }
   6084 
   6085 
   6086 template <class T>
   6087 template <typename S, typename P>
   6088 void PersistentBase<T>::SetWeak(
   6089     P* parameter,
   6090     typename WeakCallbackData<S, P>::Callback callback) {
   6091   TYPE_CHECK(S, T);
   6092   typedef typename WeakCallbackData<Value, void>::Callback Callback;
   6093   V8::MakeWeak(reinterpret_cast<internal::Object**>(this->val_),
   6094                parameter,
   6095                reinterpret_cast<Callback>(callback));
   6096 }
   6097 
   6098 
   6099 template <class T>
   6100 template <typename P>
   6101 void PersistentBase<T>::SetWeak(
   6102     P* parameter,
   6103     typename WeakCallbackData<T, P>::Callback callback) {
   6104   SetWeak<T, P>(parameter, callback);
   6105 }
   6106 
   6107 
   6108 template <class T>
   6109 template<typename P>
   6110 P* PersistentBase<T>::ClearWeak() {
   6111   return reinterpret_cast<P*>(
   6112     V8::ClearWeak(reinterpret_cast<internal::Object**>(this->val_)));
   6113 }
   6114 
   6115 
   6116 template <class T>
   6117 void PersistentBase<T>::MarkIndependent() {
   6118   typedef internal::Internals I;
   6119   if (this->IsEmpty()) return;
   6120   I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(this->val_),
   6121                     true,
   6122                     I::kNodeIsIndependentShift);
   6123 }
   6124 
   6125 
   6126 template <class T>
   6127 void PersistentBase<T>::MarkPartiallyDependent() {
   6128   typedef internal::Internals I;
   6129   if (this->IsEmpty()) return;
   6130   I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(this->val_),
   6131                     true,
   6132                     I::kNodeIsPartiallyDependentShift);
   6133 }
   6134 
   6135 
   6136 template <class T, class M>
   6137 T* Persistent<T, M>::ClearAndLeak() {
   6138   T* old;
   6139   old = this->val_;
   6140   this->val_ = NULL;
   6141   return old;
   6142 }
   6143 
   6144 
   6145 template <class T>
   6146 void PersistentBase<T>::SetWrapperClassId(uint16_t class_id) {
   6147   typedef internal::Internals I;
   6148   if (this->IsEmpty()) return;
   6149   internal::Object** obj = reinterpret_cast<internal::Object**>(this->val_);
   6150   uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset;
   6151   *reinterpret_cast<uint16_t*>(addr) = class_id;
   6152 }
   6153 
   6154 
   6155 template <class T>
   6156 uint16_t PersistentBase<T>::WrapperClassId() const {
   6157   typedef internal::Internals I;
   6158   if (this->IsEmpty()) return 0;
   6159   internal::Object** obj = reinterpret_cast<internal::Object**>(this->val_);
   6160   uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset;
   6161   return *reinterpret_cast<uint16_t*>(addr);
   6162 }
   6163 
   6164 
   6165 template<typename T>
   6166 ReturnValue<T>::ReturnValue(internal::Object** slot) : value_(slot) {}
   6167 
   6168 template<typename T>
   6169 template<typename S>
   6170 void ReturnValue<T>::Set(const Persistent<S>& handle) {
   6171   TYPE_CHECK(T, S);
   6172   if (V8_UNLIKELY(handle.IsEmpty())) {
   6173     *value_ = GetDefaultValue();
   6174   } else {
   6175     *value_ = *reinterpret_cast<internal::Object**>(*handle);
   6176   }
   6177 }
   6178 
   6179 template<typename T>
   6180 template<typename S>
   6181 void ReturnValue<T>::Set(const Handle<S> handle) {
   6182   TYPE_CHECK(T, S);
   6183   if (V8_UNLIKELY(handle.IsEmpty())) {
   6184     *value_ = GetDefaultValue();
   6185   } else {
   6186     *value_ = *reinterpret_cast<internal::Object**>(*handle);
   6187   }
   6188 }
   6189 
   6190 template<typename T>
   6191 void ReturnValue<T>::Set(double i) {
   6192   TYPE_CHECK(T, Number);
   6193   Set(Number::New(GetIsolate(), i));
   6194 }
   6195 
   6196 template<typename T>
   6197 void ReturnValue<T>::Set(int32_t i) {
   6198   TYPE_CHECK(T, Integer);
   6199   typedef internal::Internals I;
   6200   if (V8_LIKELY(I::IsValidSmi(i))) {
   6201     *value_ = I::IntToSmi(i);
   6202     return;
   6203   }
   6204   Set(Integer::New(GetIsolate(), i));
   6205 }
   6206 
   6207 template<typename T>
   6208 void ReturnValue<T>::Set(uint32_t i) {
   6209   TYPE_CHECK(T, Integer);
   6210   // Can't simply use INT32_MAX here for whatever reason.
   6211   bool fits_into_int32_t = (i & (1U << 31)) == 0;
   6212   if (V8_LIKELY(fits_into_int32_t)) {
   6213     Set(static_cast<int32_t>(i));
   6214     return;
   6215   }
   6216   Set(Integer::NewFromUnsigned(GetIsolate(), i));
   6217 }
   6218 
   6219 template<typename T>
   6220 void ReturnValue<T>::Set(bool value) {
   6221   TYPE_CHECK(T, Boolean);
   6222   typedef internal::Internals I;
   6223   int root_index;
   6224   if (value) {
   6225     root_index = I::kTrueValueRootIndex;
   6226   } else {
   6227     root_index = I::kFalseValueRootIndex;
   6228   }
   6229   *value_ = *I::GetRoot(GetIsolate(), root_index);
   6230 }
   6231 
   6232 template<typename T>
   6233 void ReturnValue<T>::SetNull() {
   6234   TYPE_CHECK(T, Primitive);
   6235   typedef internal::Internals I;
   6236   *value_ = *I::GetRoot(GetIsolate(), I::kNullValueRootIndex);
   6237 }
   6238 
   6239 template<typename T>
   6240 void ReturnValue<T>::SetUndefined() {
   6241   TYPE_CHECK(T, Primitive);
   6242   typedef internal::Internals I;
   6243   *value_ = *I::GetRoot(GetIsolate(), I::kUndefinedValueRootIndex);
   6244 }
   6245 
   6246 template<typename T>
   6247 void ReturnValue<T>::SetEmptyString() {
   6248   TYPE_CHECK(T, String);
   6249   typedef internal::Internals I;
   6250   *value_ = *I::GetRoot(GetIsolate(), I::kEmptyStringRootIndex);
   6251 }
   6252 
   6253 template<typename T>
   6254 Isolate* ReturnValue<T>::GetIsolate() {
   6255   // Isolate is always the pointer below the default value on the stack.
   6256   return *reinterpret_cast<Isolate**>(&value_[-2]);
   6257 }
   6258 
   6259 template<typename T>
   6260 template<typename S>
   6261 void ReturnValue<T>::Set(S* whatever) {
   6262   // Uncompilable to prevent inadvertent misuse.
   6263   TYPE_CHECK(S*, Primitive);
   6264 }
   6265 
   6266 template<typename T>
   6267 internal::Object* ReturnValue<T>::GetDefaultValue() {
   6268   // Default value is always the pointer below value_ on the stack.
   6269   return value_[-1];
   6270 }
   6271 
   6272 
   6273 template<typename T>
   6274 FunctionCallbackInfo<T>::FunctionCallbackInfo(internal::Object** implicit_args,
   6275                                               internal::Object** values,
   6276                                               int length,
   6277                                               bool is_construct_call)
   6278     : implicit_args_(implicit_args),
   6279       values_(values),
   6280       length_(length),
   6281       is_construct_call_(is_construct_call) { }
   6282 
   6283 
   6284 template<typename T>
   6285 Local<Value> FunctionCallbackInfo<T>::operator[](int i) const {
   6286   if (i < 0 || length_ <= i) return Local<Value>(*Undefined(GetIsolate()));
   6287   return Local<Value>(reinterpret_cast<Value*>(values_ - i));
   6288 }
   6289 
   6290 
   6291 template<typename T>
   6292 Local<Function> FunctionCallbackInfo<T>::Callee() const {
   6293   return Local<Function>(reinterpret_cast<Function*>(
   6294       &implicit_args_[kCalleeIndex]));
   6295 }
   6296 
   6297 
   6298 template<typename T>
   6299 Local<Object> FunctionCallbackInfo<T>::This() const {
   6300   return Local<Object>(reinterpret_cast<Object*>(values_ + 1));
   6301 }
   6302 
   6303 
   6304 template<typename T>
   6305 Local<Object> FunctionCallbackInfo<T>::Holder() const {
   6306   return Local<Object>(reinterpret_cast<Object*>(
   6307       &implicit_args_[kHolderIndex]));
   6308 }
   6309 
   6310 
   6311 template<typename T>
   6312 Local<Value> FunctionCallbackInfo<T>::Data() const {
   6313   return Local<Value>(reinterpret_cast<Value*>(&implicit_args_[kDataIndex]));
   6314 }
   6315 
   6316 
   6317 template<typename T>
   6318 Isolate* FunctionCallbackInfo<T>::GetIsolate() const {
   6319   return *reinterpret_cast<Isolate**>(&implicit_args_[kIsolateIndex]);
   6320 }
   6321 
   6322 
   6323 template<typename T>
   6324 ReturnValue<T> FunctionCallbackInfo<T>::GetReturnValue() const {
   6325   return ReturnValue<T>(&implicit_args_[kReturnValueIndex]);
   6326 }
   6327 
   6328 
   6329 template<typename T>
   6330 bool FunctionCallbackInfo<T>::IsConstructCall() const {
   6331   return is_construct_call_;
   6332 }
   6333 
   6334 
   6335 template<typename T>
   6336 int FunctionCallbackInfo<T>::Length() const {
   6337   return length_;
   6338 }
   6339 
   6340 
   6341 Handle<Value> ScriptOrigin::ResourceName() const {
   6342   return resource_name_;
   6343 }
   6344 
   6345 
   6346 Handle<Integer> ScriptOrigin::ResourceLineOffset() const {
   6347   return resource_line_offset_;
   6348 }
   6349 
   6350 
   6351 Handle<Integer> ScriptOrigin::ResourceColumnOffset() const {
   6352   return resource_column_offset_;
   6353 }
   6354 
   6355 
   6356 Handle<Boolean> ScriptOrigin::ResourceIsSharedCrossOrigin() const {
   6357   return resource_is_shared_cross_origin_;
   6358 }
   6359 
   6360 
   6361 Handle<Integer> ScriptOrigin::ScriptID() const {
   6362   return script_id_;
   6363 }
   6364 
   6365 
   6366 ScriptCompiler::Source::Source(Local<String> string, const ScriptOrigin& origin,
   6367                                CachedData* data)
   6368     : source_string(string),
   6369       resource_name(origin.ResourceName()),
   6370       resource_line_offset(origin.ResourceLineOffset()),
   6371       resource_column_offset(origin.ResourceColumnOffset()),
   6372       resource_is_shared_cross_origin(origin.ResourceIsSharedCrossOrigin()),
   6373       cached_data(data) {}
   6374 
   6375 
   6376 ScriptCompiler::Source::Source(Local<String> string,
   6377                                CachedData* data)
   6378     : source_string(string), cached_data(data) {}
   6379 
   6380 
   6381 ScriptCompiler::Source::~Source() {
   6382   delete cached_data;
   6383 }
   6384 
   6385 
   6386 const ScriptCompiler::CachedData* ScriptCompiler::Source::GetCachedData()
   6387     const {
   6388   return cached_data;
   6389 }
   6390 
   6391 
   6392 Handle<Boolean> Boolean::New(Isolate* isolate, bool value) {
   6393   return value ? True(isolate) : False(isolate);
   6394 }
   6395 
   6396 
   6397 void Template::Set(Isolate* isolate, const char* name, v8::Handle<Data> value) {
   6398   Set(v8::String::NewFromUtf8(isolate, name), value);
   6399 }
   6400 
   6401 
   6402 Local<Value> Object::GetInternalField(int index) {
   6403 #ifndef V8_ENABLE_CHECKS
   6404   typedef internal::Object O;
   6405   typedef internal::HeapObject HO;
   6406   typedef internal::Internals I;
   6407   O* obj = *reinterpret_cast<O**>(this);
   6408   // Fast path: If the object is a plain JSObject, which is the common case, we
   6409   // know where to find the internal fields and can return the value directly.
   6410   if (I::GetInstanceType(obj) == I::kJSObjectType) {
   6411     int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index);
   6412     O* value = I::ReadField<O*>(obj, offset);
   6413     O** result = HandleScope::CreateHandle(reinterpret_cast<HO*>(obj), value);
   6414     return Local<Value>(reinterpret_cast<Value*>(result));
   6415   }
   6416 #endif
   6417   return SlowGetInternalField(index);
   6418 }
   6419 
   6420 
   6421 void* Object::GetAlignedPointerFromInternalField(int index) {
   6422 #ifndef V8_ENABLE_CHECKS
   6423   typedef internal::Object O;
   6424   typedef internal::Internals I;
   6425   O* obj = *reinterpret_cast<O**>(this);
   6426   // Fast path: If the object is a plain JSObject, which is the common case, we
   6427   // know where to find the internal fields and can return the value directly.
   6428   if (V8_LIKELY(I::GetInstanceType(obj) == I::kJSObjectType)) {
   6429     int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index);
   6430     return I::ReadField<void*>(obj, offset);
   6431   }
   6432 #endif
   6433   return SlowGetAlignedPointerFromInternalField(index);
   6434 }
   6435 
   6436 
   6437 String* String::Cast(v8::Value* value) {
   6438 #ifdef V8_ENABLE_CHECKS
   6439   CheckCast(value);
   6440 #endif
   6441   return static_cast<String*>(value);
   6442 }
   6443 
   6444 
   6445 Local<String> String::Empty(Isolate* isolate) {
   6446   typedef internal::Object* S;
   6447   typedef internal::Internals I;
   6448   I::CheckInitialized(isolate);
   6449   S* slot = I::GetRoot(isolate, I::kEmptyStringRootIndex);
   6450   return Local<String>(reinterpret_cast<String*>(slot));
   6451 }
   6452 
   6453 
   6454 String::ExternalStringResource* String::GetExternalStringResource() const {
   6455   typedef internal::Object O;
   6456   typedef internal::Internals I;
   6457   O* obj = *reinterpret_cast<O* const*>(this);
   6458   String::ExternalStringResource* result;
   6459   if (I::IsExternalTwoByteString(I::GetInstanceType(obj))) {
   6460     void* value = I::ReadField<void*>(obj, I::kStringResourceOffset);
   6461     result = reinterpret_cast<String::ExternalStringResource*>(value);
   6462   } else {
   6463     result = NULL;
   6464   }
   6465 #ifdef V8_ENABLE_CHECKS
   6466   VerifyExternalStringResource(result);
   6467 #endif
   6468   return result;
   6469 }
   6470 
   6471 
   6472 String::ExternalStringResourceBase* String::GetExternalStringResourceBase(
   6473     String::Encoding* encoding_out) const {
   6474   typedef internal::Object O;
   6475   typedef internal::Internals I;
   6476   O* obj = *reinterpret_cast<O* const*>(this);
   6477   int type = I::GetInstanceType(obj) & I::kFullStringRepresentationMask;
   6478   *encoding_out = static_cast<Encoding>(type & I::kStringEncodingMask);
   6479   ExternalStringResourceBase* resource = NULL;
   6480   if (type == I::kExternalOneByteRepresentationTag ||
   6481       type == I::kExternalTwoByteRepresentationTag) {
   6482     void* value = I::ReadField<void*>(obj, I::kStringResourceOffset);
   6483     resource = static_cast<ExternalStringResourceBase*>(value);
   6484   }
   6485 #ifdef V8_ENABLE_CHECKS
   6486     VerifyExternalStringResourceBase(resource, *encoding_out);
   6487 #endif
   6488   return resource;
   6489 }
   6490 
   6491 
   6492 bool Value::IsUndefined() const {
   6493 #ifdef V8_ENABLE_CHECKS
   6494   return FullIsUndefined();
   6495 #else
   6496   return QuickIsUndefined();
   6497 #endif
   6498 }
   6499 
   6500 bool Value::QuickIsUndefined() const {
   6501   typedef internal::Object O;
   6502   typedef internal::Internals I;
   6503   O* obj = *reinterpret_cast<O* const*>(this);
   6504   if (!I::HasHeapObjectTag(obj)) return false;
   6505   if (I::GetInstanceType(obj) != I::kOddballType) return false;
   6506   return (I::GetOddballKind(obj) == I::kUndefinedOddballKind);
   6507 }
   6508 
   6509 
   6510 bool Value::IsNull() const {
   6511 #ifdef V8_ENABLE_CHECKS
   6512   return FullIsNull();
   6513 #else
   6514   return QuickIsNull();
   6515 #endif
   6516 }
   6517 
   6518 bool Value::QuickIsNull() const {
   6519   typedef internal::Object O;
   6520   typedef internal::Internals I;
   6521   O* obj = *reinterpret_cast<O* const*>(this);
   6522   if (!I::HasHeapObjectTag(obj)) return false;
   6523   if (I::GetInstanceType(obj) != I::kOddballType) return false;
   6524   return (I::GetOddballKind(obj) == I::kNullOddballKind);
   6525 }
   6526 
   6527 
   6528 bool Value::IsString() const {
   6529 #ifdef V8_ENABLE_CHECKS
   6530   return FullIsString();
   6531 #else
   6532   return QuickIsString();
   6533 #endif
   6534 }
   6535 
   6536 bool Value::QuickIsString() const {
   6537   typedef internal::Object O;
   6538   typedef internal::Internals I;
   6539   O* obj = *reinterpret_cast<O* const*>(this);
   6540   if (!I::HasHeapObjectTag(obj)) return false;
   6541   return (I::GetInstanceType(obj) < I::kFirstNonstringType);
   6542 }
   6543 
   6544 
   6545 template <class T> Value* Value::Cast(T* value) {
   6546   return static_cast<Value*>(value);
   6547 }
   6548 
   6549 
   6550 Name* Name::Cast(v8::Value* value) {
   6551 #ifdef V8_ENABLE_CHECKS
   6552   CheckCast(value);
   6553 #endif
   6554   return static_cast<Name*>(value);
   6555 }
   6556 
   6557 
   6558 Symbol* Symbol::Cast(v8::Value* value) {
   6559 #ifdef V8_ENABLE_CHECKS
   6560   CheckCast(value);
   6561 #endif
   6562   return static_cast<Symbol*>(value);
   6563 }
   6564 
   6565 
   6566 Number* Number::Cast(v8::Value* value) {
   6567 #ifdef V8_ENABLE_CHECKS
   6568   CheckCast(value);
   6569 #endif
   6570   return static_cast<Number*>(value);
   6571 }
   6572 
   6573 
   6574 Integer* Integer::Cast(v8::Value* value) {
   6575 #ifdef V8_ENABLE_CHECKS
   6576   CheckCast(value);
   6577 #endif
   6578   return static_cast<Integer*>(value);
   6579 }
   6580 
   6581 
   6582 Date* Date::Cast(v8::Value* value) {
   6583 #ifdef V8_ENABLE_CHECKS
   6584   CheckCast(value);
   6585 #endif
   6586   return static_cast<Date*>(value);
   6587 }
   6588 
   6589 
   6590 StringObject* StringObject::Cast(v8::Value* value) {
   6591 #ifdef V8_ENABLE_CHECKS
   6592   CheckCast(value);
   6593 #endif
   6594   return static_cast<StringObject*>(value);
   6595 }
   6596 
   6597 
   6598 SymbolObject* SymbolObject::Cast(v8::Value* value) {
   6599 #ifdef V8_ENABLE_CHECKS
   6600   CheckCast(value);
   6601 #endif
   6602   return static_cast<SymbolObject*>(value);
   6603 }
   6604 
   6605 
   6606 NumberObject* NumberObject::Cast(v8::Value* value) {
   6607 #ifdef V8_ENABLE_CHECKS
   6608   CheckCast(value);
   6609 #endif
   6610   return static_cast<NumberObject*>(value);
   6611 }
   6612 
   6613 
   6614 BooleanObject* BooleanObject::Cast(v8::Value* value) {
   6615 #ifdef V8_ENABLE_CHECKS
   6616   CheckCast(value);
   6617 #endif
   6618   return static_cast<BooleanObject*>(value);
   6619 }
   6620 
   6621 
   6622 RegExp* RegExp::Cast(v8::Value* value) {
   6623 #ifdef V8_ENABLE_CHECKS
   6624   CheckCast(value);
   6625 #endif
   6626   return static_cast<RegExp*>(value);
   6627 }
   6628 
   6629 
   6630 Object* Object::Cast(v8::Value* value) {
   6631 #ifdef V8_ENABLE_CHECKS
   6632   CheckCast(value);
   6633 #endif
   6634   return static_cast<Object*>(value);
   6635 }
   6636 
   6637 
   6638 Array* Array::Cast(v8::Value* value) {
   6639 #ifdef V8_ENABLE_CHECKS
   6640   CheckCast(value);
   6641 #endif
   6642   return static_cast<Array*>(value);
   6643 }
   6644 
   6645 
   6646 Promise* Promise::Cast(v8::Value* value) {
   6647 #ifdef V8_ENABLE_CHECKS
   6648   CheckCast(value);
   6649 #endif
   6650   return static_cast<Promise*>(value);
   6651 }
   6652 
   6653 
   6654 Promise::Resolver* Promise::Resolver::Cast(v8::Value* value) {
   6655 #ifdef V8_ENABLE_CHECKS
   6656   CheckCast(value);
   6657 #endif
   6658   return static_cast<Promise::Resolver*>(value);
   6659 }
   6660 
   6661 
   6662 ArrayBuffer* ArrayBuffer::Cast(v8::Value* value) {
   6663 #ifdef V8_ENABLE_CHECKS
   6664   CheckCast(value);
   6665 #endif
   6666   return static_cast<ArrayBuffer*>(value);
   6667 }
   6668 
   6669 
   6670 ArrayBufferView* ArrayBufferView::Cast(v8::Value* value) {
   6671 #ifdef V8_ENABLE_CHECKS
   6672   CheckCast(value);
   6673 #endif
   6674   return static_cast<ArrayBufferView*>(value);
   6675 }
   6676 
   6677 
   6678 TypedArray* TypedArray::Cast(v8::Value* value) {
   6679 #ifdef V8_ENABLE_CHECKS
   6680   CheckCast(value);
   6681 #endif
   6682   return static_cast<TypedArray*>(value);
   6683 }
   6684 
   6685 
   6686 Uint8Array* Uint8Array::Cast(v8::Value* value) {
   6687 #ifdef V8_ENABLE_CHECKS
   6688   CheckCast(value);
   6689 #endif
   6690   return static_cast<Uint8Array*>(value);
   6691 }
   6692 
   6693 
   6694 Int8Array* Int8Array::Cast(v8::Value* value) {
   6695 #ifdef V8_ENABLE_CHECKS
   6696   CheckCast(value);
   6697 #endif
   6698   return static_cast<Int8Array*>(value);
   6699 }
   6700 
   6701 
   6702 Uint16Array* Uint16Array::Cast(v8::Value* value) {
   6703 #ifdef V8_ENABLE_CHECKS
   6704   CheckCast(value);
   6705 #endif
   6706   return static_cast<Uint16Array*>(value);
   6707 }
   6708 
   6709 
   6710 Int16Array* Int16Array::Cast(v8::Value* value) {
   6711 #ifdef V8_ENABLE_CHECKS
   6712   CheckCast(value);
   6713 #endif
   6714   return static_cast<Int16Array*>(value);
   6715 }
   6716 
   6717 
   6718 Uint32Array* Uint32Array::Cast(v8::Value* value) {
   6719 #ifdef V8_ENABLE_CHECKS
   6720   CheckCast(value);
   6721 #endif
   6722   return static_cast<Uint32Array*>(value);
   6723 }
   6724 
   6725 
   6726 Int32Array* Int32Array::Cast(v8::Value* value) {
   6727 #ifdef V8_ENABLE_CHECKS
   6728   CheckCast(value);
   6729 #endif
   6730   return static_cast<Int32Array*>(value);
   6731 }
   6732 
   6733 
   6734 Float32Array* Float32Array::Cast(v8::Value* value) {
   6735 #ifdef V8_ENABLE_CHECKS
   6736   CheckCast(value);
   6737 #endif
   6738   return static_cast<Float32Array*>(value);
   6739 }
   6740 
   6741 
   6742 Float64Array* Float64Array::Cast(v8::Value* value) {
   6743 #ifdef V8_ENABLE_CHECKS
   6744   CheckCast(value);
   6745 #endif
   6746   return static_cast<Float64Array*>(value);
   6747 }
   6748 
   6749 
   6750 Uint8ClampedArray* Uint8ClampedArray::Cast(v8::Value* value) {
   6751 #ifdef V8_ENABLE_CHECKS
   6752   CheckCast(value);
   6753 #endif
   6754   return static_cast<Uint8ClampedArray*>(value);
   6755 }
   6756 
   6757 
   6758 DataView* DataView::Cast(v8::Value* value) {
   6759 #ifdef V8_ENABLE_CHECKS
   6760   CheckCast(value);
   6761 #endif
   6762   return static_cast<DataView*>(value);
   6763 }
   6764 
   6765 
   6766 Function* Function::Cast(v8::Value* value) {
   6767 #ifdef V8_ENABLE_CHECKS
   6768   CheckCast(value);
   6769 #endif
   6770   return static_cast<Function*>(value);
   6771 }
   6772 
   6773 
   6774 External* External::Cast(v8::Value* value) {
   6775 #ifdef V8_ENABLE_CHECKS
   6776   CheckCast(value);
   6777 #endif
   6778   return static_cast<External*>(value);
   6779 }
   6780 
   6781 
   6782 template<typename T>
   6783 Isolate* PropertyCallbackInfo<T>::GetIsolate() const {
   6784   return *reinterpret_cast<Isolate**>(&args_[kIsolateIndex]);
   6785 }
   6786 
   6787 
   6788 template<typename T>
   6789 Local<Value> PropertyCallbackInfo<T>::Data() const {
   6790   return Local<Value>(reinterpret_cast<Value*>(&args_[kDataIndex]));
   6791 }
   6792 
   6793 
   6794 template<typename T>
   6795 Local<Object> PropertyCallbackInfo<T>::This() const {
   6796   return Local<Object>(reinterpret_cast<Object*>(&args_[kThisIndex]));
   6797 }
   6798 
   6799 
   6800 template<typename T>
   6801 Local<Object> PropertyCallbackInfo<T>::Holder() const {
   6802   return Local<Object>(reinterpret_cast<Object*>(&args_[kHolderIndex]));
   6803 }
   6804 
   6805 
   6806 template<typename T>
   6807 ReturnValue<T> PropertyCallbackInfo<T>::GetReturnValue() const {
   6808   return ReturnValue<T>(&args_[kReturnValueIndex]);
   6809 }
   6810 
   6811 
   6812 Handle<Primitive> Undefined(Isolate* isolate) {
   6813   typedef internal::Object* S;
   6814   typedef internal::Internals I;
   6815   I::CheckInitialized(isolate);
   6816   S* slot = I::GetRoot(isolate, I::kUndefinedValueRootIndex);
   6817   return Handle<Primitive>(reinterpret_cast<Primitive*>(slot));
   6818 }
   6819 
   6820 
   6821 Handle<Primitive> Null(Isolate* isolate) {
   6822   typedef internal::Object* S;
   6823   typedef internal::Internals I;
   6824   I::CheckInitialized(isolate);
   6825   S* slot = I::GetRoot(isolate, I::kNullValueRootIndex);
   6826   return Handle<Primitive>(reinterpret_cast<Primitive*>(slot));
   6827 }
   6828 
   6829 
   6830 Handle<Boolean> True(Isolate* isolate) {
   6831   typedef internal::Object* S;
   6832   typedef internal::Internals I;
   6833   I::CheckInitialized(isolate);
   6834   S* slot = I::GetRoot(isolate, I::kTrueValueRootIndex);
   6835   return Handle<Boolean>(reinterpret_cast<Boolean*>(slot));
   6836 }
   6837 
   6838 
   6839 Handle<Boolean> False(Isolate* isolate) {
   6840   typedef internal::Object* S;
   6841   typedef internal::Internals I;
   6842   I::CheckInitialized(isolate);
   6843   S* slot = I::GetRoot(isolate, I::kFalseValueRootIndex);
   6844   return Handle<Boolean>(reinterpret_cast<Boolean*>(slot));
   6845 }
   6846 
   6847 
   6848 void Isolate::SetData(uint32_t slot, void* data) {
   6849   typedef internal::Internals I;
   6850   I::SetEmbedderData(this, slot, data);
   6851 }
   6852 
   6853 
   6854 void* Isolate::GetData(uint32_t slot) {
   6855   typedef internal::Internals I;
   6856   return I::GetEmbedderData(this, slot);
   6857 }
   6858 
   6859 
   6860 uint32_t Isolate::GetNumberOfDataSlots() {
   6861   typedef internal::Internals I;
   6862   return I::kNumIsolateDataSlots;
   6863 }
   6864 
   6865 
   6866 int64_t Isolate::AdjustAmountOfExternalAllocatedMemory(
   6867     int64_t change_in_bytes) {
   6868   typedef internal::Internals I;
   6869   int64_t* amount_of_external_allocated_memory =
   6870       reinterpret_cast<int64_t*>(reinterpret_cast<uint8_t*>(this) +
   6871                                  I::kAmountOfExternalAllocatedMemoryOffset);
   6872   int64_t* amount_of_external_allocated_memory_at_last_global_gc =
   6873       reinterpret_cast<int64_t*>(
   6874           reinterpret_cast<uint8_t*>(this) +
   6875           I::kAmountOfExternalAllocatedMemoryAtLastGlobalGCOffset);
   6876   int64_t amount = *amount_of_external_allocated_memory + change_in_bytes;
   6877   if (change_in_bytes > 0 &&
   6878       amount - *amount_of_external_allocated_memory_at_last_global_gc >
   6879           I::kExternalAllocationLimit) {
   6880     CollectAllGarbage("external memory allocation limit reached.");
   6881   } else {
   6882     *amount_of_external_allocated_memory = amount;
   6883   }
   6884   return *amount_of_external_allocated_memory;
   6885 }
   6886 
   6887 
   6888 template<typename T>
   6889 void Isolate::SetObjectGroupId(const Persistent<T>& object,
   6890                                UniqueId id) {
   6891   TYPE_CHECK(Value, T);
   6892   SetObjectGroupId(reinterpret_cast<v8::internal::Object**>(object.val_), id);
   6893 }
   6894 
   6895 
   6896 template<typename T>
   6897 void Isolate::SetReferenceFromGroup(UniqueId id,
   6898                                     const Persistent<T>& object) {
   6899   TYPE_CHECK(Value, T);
   6900   SetReferenceFromGroup(id,
   6901                         reinterpret_cast<v8::internal::Object**>(object.val_));
   6902 }
   6903 
   6904 
   6905 template<typename T, typename S>
   6906 void Isolate::SetReference(const Persistent<T>& parent,
   6907                            const Persistent<S>& child) {
   6908   TYPE_CHECK(Object, T);
   6909   TYPE_CHECK(Value, S);
   6910   SetReference(reinterpret_cast<v8::internal::Object**>(parent.val_),
   6911                reinterpret_cast<v8::internal::Object**>(child.val_));
   6912 }
   6913 
   6914 
   6915 Local<Value> Context::GetEmbedderData(int index) {
   6916 #ifndef V8_ENABLE_CHECKS
   6917   typedef internal::Object O;
   6918   typedef internal::HeapObject HO;
   6919   typedef internal::Internals I;
   6920   HO* context = *reinterpret_cast<HO**>(this);
   6921   O** result =
   6922       HandleScope::CreateHandle(context, I::ReadEmbedderData<O*>(this, index));
   6923   return Local<Value>(reinterpret_cast<Value*>(result));
   6924 #else
   6925   return SlowGetEmbedderData(index);
   6926 #endif
   6927 }
   6928 
   6929 
   6930 void* Context::GetAlignedPointerFromEmbedderData(int index) {
   6931 #ifndef V8_ENABLE_CHECKS
   6932   typedef internal::Internals I;
   6933   return I::ReadEmbedderData<void*>(this, index);
   6934 #else
   6935   return SlowGetAlignedPointerFromEmbedderData(index);
   6936 #endif
   6937 }
   6938 
   6939 
   6940 /**
   6941  * \example shell.cc
   6942  * A simple shell that takes a list of expressions on the
   6943  * command-line and executes them.
   6944  */
   6945 
   6946 
   6947 /**
   6948  * \example process.cc
   6949  */
   6950 
   6951 
   6952 }  // namespace v8
   6953 
   6954 
   6955 #undef TYPE_CHECK
   6956 
   6957 
   6958 #endif  // V8_H_
   6959