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