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