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