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