1 // Copyright 2011 the V8 project authors. All rights reserved. 2 // Redistribution and use in source and binary forms, with or without 3 // modification, are permitted provided that the following conditions are 4 // met: 5 // 6 // * Redistributions of source code must retain the above copyright 7 // notice, this list of conditions and the following disclaimer. 8 // * Redistributions in binary form must reproduce the above 9 // copyright notice, this list of conditions and the following 10 // disclaimer in the documentation and/or other materials provided 11 // with the distribution. 12 // * Neither the name of Google Inc. nor the names of its 13 // contributors may be used to endorse or promote products derived 14 // from this software without specific prior written permission. 15 // 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28 /** \mainpage V8 API Reference Guide 29 * 30 * V8 is Google's open source JavaScript engine. 31 * 32 * This set of documents provides reference material generated from the 33 * V8 header file, include/v8.h. 34 * 35 * For other documentation see http://code.google.com/apis/v8/ 36 */ 37 38 #ifndef V8_H_ 39 #define V8_H_ 40 41 #include "v8stdint.h" 42 43 #ifdef _WIN32 44 45 // Setup for Windows DLL export/import. When building the V8 DLL the 46 // BUILDING_V8_SHARED needs to be defined. When building a program which uses 47 // the V8 DLL USING_V8_SHARED needs to be defined. When either building the V8 48 // static library or building a program which uses the V8 static library neither 49 // BUILDING_V8_SHARED nor USING_V8_SHARED should be defined. 50 #if defined(BUILDING_V8_SHARED) && defined(USING_V8_SHARED) 51 #error both BUILDING_V8_SHARED and USING_V8_SHARED are set - please check the\ 52 build configuration to ensure that at most one of these is set 53 #endif 54 55 #ifdef BUILDING_V8_SHARED 56 #define V8EXPORT __declspec(dllexport) 57 #elif USING_V8_SHARED 58 #define V8EXPORT __declspec(dllimport) 59 #else 60 #define V8EXPORT 61 #endif // BUILDING_V8_SHARED 62 63 #else // _WIN32 64 65 // Setup for Linux shared library export. There is no need to distinguish 66 // between building or using the V8 shared library, but we should not 67 // export symbols when we are building a static library. 68 #if defined(__GNUC__) && (__GNUC__ >= 4) && defined(V8_SHARED) 69 #define V8EXPORT __attribute__ ((visibility("default"))) 70 #else // defined(__GNUC__) && (__GNUC__ >= 4) 71 #define V8EXPORT 72 #endif // defined(__GNUC__) && (__GNUC__ >= 4) 73 74 #endif // _WIN32 75 76 /** 77 * The v8 JavaScript engine. 78 */ 79 namespace v8 { 80 81 class Context; 82 class String; 83 class StringObject; 84 class Value; 85 class Utils; 86 class Number; 87 class NumberObject; 88 class Object; 89 class Array; 90 class Int32; 91 class Uint32; 92 class External; 93 class Primitive; 94 class Boolean; 95 class BooleanObject; 96 class Integer; 97 class Function; 98 class Date; 99 class ImplementationUtilities; 100 class Signature; 101 template <class T> class Handle; 102 template <class T> class Local; 103 template <class T> class Persistent; 104 class FunctionTemplate; 105 class ObjectTemplate; 106 class Data; 107 class AccessorInfo; 108 class StackTrace; 109 class StackFrame; 110 111 namespace internal { 112 113 class Arguments; 114 class Object; 115 class Heap; 116 class HeapObject; 117 class Isolate; 118 } 119 120 121 // --- Weak Handles --- 122 123 124 /** 125 * A weak reference callback function. 126 * 127 * This callback should either explicitly invoke Dispose on |object| if 128 * V8 wrapper is not needed anymore, or 'revive' it by invocation of MakeWeak. 129 * 130 * \param object the weak global object to be reclaimed by the garbage collector 131 * \param parameter the value passed in when making the weak global object 132 */ 133 typedef void (*WeakReferenceCallback)(Persistent<Value> object, 134 void* parameter); 135 136 137 // --- Handles --- 138 139 #define TYPE_CHECK(T, S) \ 140 while (false) { \ 141 *(static_cast<T* volatile*>(0)) = static_cast<S*>(0); \ 142 } 143 144 /** 145 * An object reference managed by the v8 garbage collector. 146 * 147 * All objects returned from v8 have to be tracked by the garbage 148 * collector so that it knows that the objects are still alive. Also, 149 * because the garbage collector may move objects, it is unsafe to 150 * point directly to an object. Instead, all objects are stored in 151 * handles which are known by the garbage collector and updated 152 * whenever an object moves. Handles should always be passed by value 153 * (except in cases like out-parameters) and they should never be 154 * allocated on the heap. 155 * 156 * There are two types of handles: local and persistent handles. 157 * Local handles are light-weight and transient and typically used in 158 * local operations. They are managed by HandleScopes. Persistent 159 * handles can be used when storing objects across several independent 160 * operations and have to be explicitly deallocated when they're no 161 * longer used. 162 * 163 * It is safe to extract the object stored in the handle by 164 * dereferencing the handle (for instance, to extract the Object* from 165 * a Handle<Object>); the value will still be governed by a handle 166 * behind the scenes and the same rules apply to these values as to 167 * their handles. 168 */ 169 template <class T> class Handle { 170 public: 171 /** 172 * Creates an empty handle. 173 */ Handle()174 inline Handle() : val_(0) {} 175 176 /** 177 * Creates a new handle for the specified value. 178 */ Handle(T * val)179 inline explicit Handle(T* val) : val_(val) {} 180 181 /** 182 * Creates a handle for the contents of the specified handle. This 183 * constructor allows you to pass handles as arguments by value and 184 * to assign between handles. However, if you try to assign between 185 * incompatible handles, for instance from a Handle<String> to a 186 * Handle<Number> it will cause a compile-time error. Assigning 187 * between compatible handles, for instance assigning a 188 * Handle<String> to a variable declared as Handle<Value>, is legal 189 * because String is a subclass of Value. 190 */ Handle(Handle<S> that)191 template <class S> inline Handle(Handle<S> that) 192 : val_(reinterpret_cast<T*>(*that)) { 193 /** 194 * This check fails when trying to convert between incompatible 195 * handles. For example, converting from a Handle<String> to a 196 * Handle<Number>. 197 */ 198 TYPE_CHECK(T, S); 199 } 200 201 /** 202 * Returns true if the handle is empty. 203 */ IsEmpty()204 inline bool IsEmpty() const { return val_ == 0; } 205 206 /** 207 * Sets the handle to be empty. IsEmpty() will then return true. 208 */ Clear()209 inline void Clear() { val_ = 0; } 210 211 inline T* operator->() const { return val_; } 212 213 inline T* operator*() const { return val_; } 214 215 /** 216 * Checks whether two handles are the same. 217 * Returns true if both are empty, or if the objects 218 * to which they refer are identical. 219 * The handles' references are not checked. 220 */ 221 template <class S> inline bool operator==(Handle<S> that) const { 222 internal::Object** a = reinterpret_cast<internal::Object**>(**this); 223 internal::Object** b = reinterpret_cast<internal::Object**>(*that); 224 if (a == 0) return b == 0; 225 if (b == 0) return false; 226 return *a == *b; 227 } 228 229 /** 230 * Checks whether two handles are different. 231 * Returns true if only one of the handles is empty, or if 232 * the objects to which they refer are different. 233 * The handles' references are not checked. 234 */ 235 template <class S> inline bool operator!=(Handle<S> that) const { 236 return !operator==(that); 237 } 238 Cast(Handle<S> that)239 template <class S> static inline Handle<T> Cast(Handle<S> that) { 240 #ifdef V8_ENABLE_CHECKS 241 // If we're going to perform the type check then we have to check 242 // that the handle isn't empty before doing the checked cast. 243 if (that.IsEmpty()) return Handle<T>(); 244 #endif 245 return Handle<T>(T::Cast(*that)); 246 } 247 As()248 template <class S> inline Handle<S> As() { 249 return Handle<S>::Cast(*this); 250 } 251 252 private: 253 T* val_; 254 }; 255 256 257 /** 258 * A light-weight stack-allocated object handle. All operations 259 * that return objects from within v8 return them in local handles. They 260 * are created within HandleScopes, and all local handles allocated within a 261 * handle scope are destroyed when the handle scope is destroyed. Hence it 262 * is not necessary to explicitly deallocate local handles. 263 */ 264 template <class T> class Local : public Handle<T> { 265 public: 266 inline Local(); Local(Local<S> that)267 template <class S> inline Local(Local<S> that) 268 : Handle<T>(reinterpret_cast<T*>(*that)) { 269 /** 270 * This check fails when trying to convert between incompatible 271 * handles. For example, converting from a Handle<String> to a 272 * Handle<Number>. 273 */ 274 TYPE_CHECK(T, S); 275 } Local(S * that)276 template <class S> inline Local(S* that) : Handle<T>(that) { } Cast(Local<S> that)277 template <class S> static inline Local<T> Cast(Local<S> that) { 278 #ifdef V8_ENABLE_CHECKS 279 // If we're going to perform the type check then we have to check 280 // that the handle isn't empty before doing the checked cast. 281 if (that.IsEmpty()) return Local<T>(); 282 #endif 283 return Local<T>(T::Cast(*that)); 284 } 285 As()286 template <class S> inline Local<S> As() { 287 return Local<S>::Cast(*this); 288 } 289 290 /** Create a local handle for the content of another handle. 291 * The referee is kept alive by the local handle even when 292 * the original handle is destroyed/disposed. 293 */ 294 inline static Local<T> New(Handle<T> that); 295 }; 296 297 298 /** 299 * An object reference that is independent of any handle scope. Where 300 * a Local handle only lives as long as the HandleScope in which it was 301 * allocated, a Persistent handle remains valid until it is explicitly 302 * disposed. 303 * 304 * A persistent handle contains a reference to a storage cell within 305 * the v8 engine which holds an object value and which is updated by 306 * the garbage collector whenever the object is moved. A new storage 307 * cell can be created using Persistent::New and existing handles can 308 * be disposed using Persistent::Dispose. Since persistent handles 309 * are passed by value you may have many persistent handle objects 310 * that point to the same storage cell. For instance, if you pass a 311 * persistent handle as an argument to a function you will not get two 312 * different storage cells but rather two references to the same 313 * storage cell. 314 */ 315 template <class T> class Persistent : public Handle<T> { 316 public: 317 /** 318 * Creates an empty persistent handle that doesn't point to any 319 * storage cell. 320 */ 321 inline Persistent(); 322 323 /** 324 * Creates a persistent handle for the same storage cell as the 325 * specified handle. This constructor allows you to pass persistent 326 * handles as arguments by value and to assign between persistent 327 * handles. However, attempting to assign between incompatible 328 * persistent handles, for instance from a Persistent<String> to a 329 * Persistent<Number> will cause a compile-time error. Assigning 330 * between compatible persistent handles, for instance assigning a 331 * Persistent<String> to a variable declared as Persistent<Value>, 332 * is allowed as String is a subclass of Value. 333 */ Persistent(Persistent<S> that)334 template <class S> inline Persistent(Persistent<S> that) 335 : Handle<T>(reinterpret_cast<T*>(*that)) { 336 /** 337 * This check fails when trying to convert between incompatible 338 * handles. For example, converting from a Handle<String> to a 339 * Handle<Number>. 340 */ 341 TYPE_CHECK(T, S); 342 } 343 Persistent(S * that)344 template <class S> inline Persistent(S* that) : Handle<T>(that) { } 345 346 /** 347 * "Casts" a plain handle which is known to be a persistent handle 348 * to a persistent handle. 349 */ Persistent(Handle<S> that)350 template <class S> explicit inline Persistent(Handle<S> that) 351 : Handle<T>(*that) { } 352 Cast(Persistent<S> that)353 template <class S> static inline Persistent<T> Cast(Persistent<S> that) { 354 #ifdef V8_ENABLE_CHECKS 355 // If we're going to perform the type check then we have to check 356 // that the handle isn't empty before doing the checked cast. 357 if (that.IsEmpty()) return Persistent<T>(); 358 #endif 359 return Persistent<T>(T::Cast(*that)); 360 } 361 As()362 template <class S> inline Persistent<S> As() { 363 return Persistent<S>::Cast(*this); 364 } 365 366 /** 367 * Creates a new persistent handle for an existing local or 368 * persistent handle. 369 */ 370 inline static Persistent<T> New(Handle<T> that); 371 372 /** 373 * Releases the storage cell referenced by this persistent handle. 374 * Does not remove the reference to the cell from any handles. 375 * This handle's reference, and any other references to the storage 376 * cell remain and IsEmpty will still return false. 377 */ 378 inline void Dispose(); 379 380 /** 381 * Make the reference to this object weak. When only weak handles 382 * refer to the object, the garbage collector will perform a 383 * callback to the given V8::WeakReferenceCallback function, passing 384 * it the object reference and the given parameters. 385 */ 386 inline void MakeWeak(void* parameters, WeakReferenceCallback callback); 387 388 /** Clears the weak reference to this object.*/ 389 inline void ClearWeak(); 390 391 /** 392 * Marks the reference to this object independent. Garbage collector 393 * is free to ignore any object groups containing this object. 394 * Weak callback for an independent handle should not 395 * assume that it will be preceded by a global GC prologue callback 396 * or followed by a global GC epilogue callback. 397 */ 398 inline void MarkIndependent(); 399 400 /** 401 *Checks if the handle holds the only reference to an object. 402 */ 403 inline bool IsNearDeath() const; 404 405 /** 406 * Returns true if the handle's reference is weak. 407 */ 408 inline bool IsWeak() const; 409 410 /** 411 * Assigns a wrapper class ID to the handle. See RetainedObjectInfo 412 * interface description in v8-profiler.h for details. 413 */ 414 inline void SetWrapperClassId(uint16_t class_id); 415 416 private: 417 friend class ImplementationUtilities; 418 friend class ObjectTemplate; 419 }; 420 421 422 /** 423 * A stack-allocated class that governs a number of local handles. 424 * After a handle scope has been created, all local handles will be 425 * allocated within that handle scope until either the handle scope is 426 * deleted or another handle scope is created. If there is already a 427 * handle scope and a new one is created, all allocations will take 428 * place in the new handle scope until it is deleted. After that, 429 * new handles will again be allocated in the original handle scope. 430 * 431 * After the handle scope of a local handle has been deleted the 432 * garbage collector will no longer track the object stored in the 433 * handle and may deallocate it. The behavior of accessing a handle 434 * for which the handle scope has been deleted is undefined. 435 */ 436 class V8EXPORT HandleScope { 437 public: 438 HandleScope(); 439 440 ~HandleScope(); 441 442 /** 443 * Closes the handle scope and returns the value as a handle in the 444 * previous scope, which is the new current scope after the call. 445 */ 446 template <class T> Local<T> Close(Handle<T> value); 447 448 /** 449 * Counts the number of allocated handles. 450 */ 451 static int NumberOfHandles(); 452 453 /** 454 * Creates a new handle with the given value. 455 */ 456 static internal::Object** CreateHandle(internal::Object* value); 457 // Faster version, uses HeapObject to obtain the current Isolate. 458 static internal::Object** CreateHandle(internal::HeapObject* value); 459 460 private: 461 // Make it impossible to create heap-allocated or illegal handle 462 // scopes by disallowing certain operations. 463 HandleScope(const HandleScope&); 464 void operator=(const HandleScope&); 465 void* operator new(size_t size); 466 void operator delete(void*, size_t); 467 468 // This Data class is accessible internally as HandleScopeData through a 469 // typedef in the ImplementationUtilities class. 470 class V8EXPORT Data { 471 public: 472 internal::Object** next; 473 internal::Object** limit; 474 int level; Initialize()475 inline void Initialize() { 476 next = limit = NULL; 477 level = 0; 478 } 479 }; 480 481 void Leave(); 482 483 internal::Isolate* isolate_; 484 internal::Object** prev_next_; 485 internal::Object** prev_limit_; 486 487 // Allow for the active closing of HandleScopes which allows to pass a handle 488 // from the HandleScope being closed to the next top most HandleScope. 489 bool is_closed_; 490 internal::Object** RawClose(internal::Object** value); 491 492 friend class ImplementationUtilities; 493 }; 494 495 496 // --- Special objects --- 497 498 499 /** 500 * The superclass of values and API object templates. 501 */ 502 class V8EXPORT Data { 503 private: 504 Data(); 505 }; 506 507 508 /** 509 * Pre-compilation data that can be associated with a script. This 510 * data can be calculated for a script in advance of actually 511 * compiling it, and can be stored between compilations. When script 512 * data is given to the compile method compilation will be faster. 513 */ 514 class V8EXPORT ScriptData { // NOLINT 515 public: ~ScriptData()516 virtual ~ScriptData() { } 517 518 /** 519 * Pre-compiles the specified script (context-independent). 520 * 521 * \param input Pointer to UTF-8 script source code. 522 * \param length Length of UTF-8 script source code. 523 */ 524 static ScriptData* PreCompile(const char* input, int length); 525 526 /** 527 * Pre-compiles the specified script (context-independent). 528 * 529 * NOTE: Pre-compilation using this method cannot happen on another thread 530 * without using Lockers. 531 * 532 * \param source Script source code. 533 */ 534 static ScriptData* PreCompile(Handle<String> source); 535 536 /** 537 * Load previous pre-compilation data. 538 * 539 * \param data Pointer to data returned by a call to Data() of a previous 540 * ScriptData. Ownership is not transferred. 541 * \param length Length of data. 542 */ 543 static ScriptData* New(const char* data, int length); 544 545 /** 546 * Returns the length of Data(). 547 */ 548 virtual int Length() = 0; 549 550 /** 551 * Returns a serialized representation of this ScriptData that can later be 552 * passed to New(). NOTE: Serialized data is platform-dependent. 553 */ 554 virtual const char* Data() = 0; 555 556 /** 557 * Returns true if the source code could not be parsed. 558 */ 559 virtual bool HasError() = 0; 560 }; 561 562 563 /** 564 * The origin, within a file, of a script. 565 */ 566 class ScriptOrigin { 567 public: 568 inline ScriptOrigin( 569 Handle<Value> resource_name, 570 Handle<Integer> resource_line_offset = Handle<Integer>(), 571 Handle<Integer> resource_column_offset = Handle<Integer>()) resource_name_(resource_name)572 : resource_name_(resource_name), 573 resource_line_offset_(resource_line_offset), 574 resource_column_offset_(resource_column_offset) { } 575 inline Handle<Value> ResourceName() const; 576 inline Handle<Integer> ResourceLineOffset() const; 577 inline Handle<Integer> ResourceColumnOffset() const; 578 private: 579 Handle<Value> resource_name_; 580 Handle<Integer> resource_line_offset_; 581 Handle<Integer> resource_column_offset_; 582 }; 583 584 585 /** 586 * A compiled JavaScript script. 587 */ 588 class V8EXPORT Script { 589 public: 590 /** 591 * Compiles the specified script (context-independent). 592 * 593 * \param source Script source code. 594 * \param origin Script origin, owned by caller, no references are kept 595 * when New() returns 596 * \param pre_data Pre-parsing data, as obtained by ScriptData::PreCompile() 597 * using pre_data speeds compilation if it's done multiple times. 598 * Owned by caller, no references are kept when New() returns. 599 * \param script_data Arbitrary data associated with script. Using 600 * this has same effect as calling SetData(), but allows data to be 601 * available to compile event handlers. 602 * \return Compiled script object (context independent; when run it 603 * will use the currently entered context). 604 */ 605 static Local<Script> New(Handle<String> source, 606 ScriptOrigin* origin = NULL, 607 ScriptData* pre_data = NULL, 608 Handle<String> script_data = Handle<String>()); 609 610 /** 611 * Compiles the specified script using the specified file name 612 * object (typically a string) as the script's origin. 613 * 614 * \param source Script source code. 615 * \param file_name file name object (typically a string) to be used 616 * as the script's origin. 617 * \return Compiled script object (context independent; when run it 618 * will use the currently entered context). 619 */ 620 static Local<Script> New(Handle<String> source, 621 Handle<Value> file_name); 622 623 /** 624 * Compiles the specified script (bound to current context). 625 * 626 * \param source Script source code. 627 * \param origin Script origin, owned by caller, no references are kept 628 * when Compile() returns 629 * \param pre_data Pre-parsing data, as obtained by ScriptData::PreCompile() 630 * using pre_data speeds compilation if it's done multiple times. 631 * Owned by caller, no references are kept when Compile() returns. 632 * \param script_data Arbitrary data associated with script. Using 633 * this has same effect as calling SetData(), but makes data available 634 * earlier (i.e. to compile event handlers). 635 * \return Compiled script object, bound to the context that was active 636 * when this function was called. When run it will always use this 637 * context. 638 */ 639 static Local<Script> Compile(Handle<String> source, 640 ScriptOrigin* origin = NULL, 641 ScriptData* pre_data = NULL, 642 Handle<String> script_data = Handle<String>()); 643 644 /** 645 * Compiles the specified script using the specified file name 646 * object (typically a string) as the script's origin. 647 * 648 * \param source Script source code. 649 * \param file_name File name to use as script's origin 650 * \param script_data Arbitrary data associated with script. Using 651 * this has same effect as calling SetData(), but makes data available 652 * earlier (i.e. to compile event handlers). 653 * \return Compiled script object, bound to the context that was active 654 * when this function was called. When run it will always use this 655 * context. 656 */ 657 static Local<Script> Compile(Handle<String> source, 658 Handle<Value> file_name, 659 Handle<String> script_data = Handle<String>()); 660 661 /** 662 * Runs the script returning the resulting value. If the script is 663 * context independent (created using ::New) it will be run in the 664 * currently entered context. If it is context specific (created 665 * using ::Compile) it will be run in the context in which it was 666 * compiled. 667 */ 668 Local<Value> Run(); 669 670 /** 671 * Returns the script id value. 672 */ 673 Local<Value> Id(); 674 675 /** 676 * Associate an additional data object with the script. This is mainly used 677 * with the debugger as this data object is only available through the 678 * debugger API. 679 */ 680 void SetData(Handle<String> data); 681 }; 682 683 684 /** 685 * An error message. 686 */ 687 class V8EXPORT Message { 688 public: 689 Local<String> Get() const; 690 Local<String> GetSourceLine() const; 691 692 /** 693 * Returns the resource name for the script from where the function causing 694 * the error originates. 695 */ 696 Handle<Value> GetScriptResourceName() const; 697 698 /** 699 * Returns the resource data for the script from where the function causing 700 * the error originates. 701 */ 702 Handle<Value> GetScriptData() const; 703 704 /** 705 * Exception stack trace. By default stack traces are not captured for 706 * uncaught exceptions. SetCaptureStackTraceForUncaughtExceptions allows 707 * to change this option. 708 */ 709 Handle<StackTrace> GetStackTrace() const; 710 711 /** 712 * Returns the number, 1-based, of the line where the error occurred. 713 */ 714 int GetLineNumber() const; 715 716 /** 717 * Returns the index within the script of the first character where 718 * the error occurred. 719 */ 720 int GetStartPosition() const; 721 722 /** 723 * Returns the index within the script of the last character where 724 * the error occurred. 725 */ 726 int GetEndPosition() const; 727 728 /** 729 * Returns the index within the line of the first character where 730 * the error occurred. 731 */ 732 int GetStartColumn() const; 733 734 /** 735 * Returns the index within the line of the last character where 736 * the error occurred. 737 */ 738 int GetEndColumn() const; 739 740 // TODO(1245381): Print to a string instead of on a FILE. 741 static void PrintCurrentStackTrace(FILE* out); 742 743 static const int kNoLineNumberInfo = 0; 744 static const int kNoColumnInfo = 0; 745 }; 746 747 748 /** 749 * Representation of a JavaScript stack trace. The information collected is a 750 * snapshot of the execution stack and the information remains valid after 751 * execution continues. 752 */ 753 class V8EXPORT StackTrace { 754 public: 755 /** 756 * Flags that determine what information is placed captured for each 757 * StackFrame when grabbing the current stack trace. 758 */ 759 enum StackTraceOptions { 760 kLineNumber = 1, 761 kColumnOffset = 1 << 1 | kLineNumber, 762 kScriptName = 1 << 2, 763 kFunctionName = 1 << 3, 764 kIsEval = 1 << 4, 765 kIsConstructor = 1 << 5, 766 kScriptNameOrSourceURL = 1 << 6, 767 kOverview = kLineNumber | kColumnOffset | kScriptName | kFunctionName, 768 kDetailed = kOverview | kIsEval | kIsConstructor | kScriptNameOrSourceURL 769 }; 770 771 /** 772 * Returns a StackFrame at a particular index. 773 */ 774 Local<StackFrame> GetFrame(uint32_t index) const; 775 776 /** 777 * Returns the number of StackFrames. 778 */ 779 int GetFrameCount() const; 780 781 /** 782 * Returns StackTrace as a v8::Array that contains StackFrame objects. 783 */ 784 Local<Array> AsArray(); 785 786 /** 787 * Grab a snapshot of the current JavaScript execution stack. 788 * 789 * \param frame_limit The maximum number of stack frames we want to capture. 790 * \param options Enumerates the set of things we will capture for each 791 * StackFrame. 792 */ 793 static Local<StackTrace> CurrentStackTrace( 794 int frame_limit, 795 StackTraceOptions options = kOverview); 796 }; 797 798 799 /** 800 * A single JavaScript stack frame. 801 */ 802 class V8EXPORT StackFrame { 803 public: 804 /** 805 * Returns the number, 1-based, of the line for the associate function call. 806 * This method will return Message::kNoLineNumberInfo if it is unable to 807 * retrieve the line number, or if kLineNumber was not passed as an option 808 * when capturing the StackTrace. 809 */ 810 int GetLineNumber() const; 811 812 /** 813 * Returns the 1-based column offset on the line for the associated function 814 * call. 815 * This method will return Message::kNoColumnInfo if it is unable to retrieve 816 * the column number, or if kColumnOffset was not passed as an option when 817 * capturing the StackTrace. 818 */ 819 int GetColumn() const; 820 821 /** 822 * Returns the name of the resource that contains the script for the 823 * function for this StackFrame. 824 */ 825 Local<String> GetScriptName() const; 826 827 /** 828 * Returns the name of the resource that contains the script for the 829 * function for this StackFrame or sourceURL value if the script name 830 * is undefined and its source ends with //@ sourceURL=... string. 831 */ 832 Local<String> GetScriptNameOrSourceURL() const; 833 834 /** 835 * Returns the name of the function associated with this stack frame. 836 */ 837 Local<String> GetFunctionName() const; 838 839 /** 840 * Returns whether or not the associated function is compiled via a call to 841 * eval(). 842 */ 843 bool IsEval() const; 844 845 /** 846 * Returns whether or not the associated function is called as a 847 * constructor via "new". 848 */ 849 bool IsConstructor() const; 850 }; 851 852 853 // --- Value --- 854 855 856 /** 857 * The superclass of all JavaScript values and objects. 858 */ 859 class Value : public Data { 860 public: 861 /** 862 * Returns true if this value is the undefined value. See ECMA-262 863 * 4.3.10. 864 */ 865 V8EXPORT bool IsUndefined() const; 866 867 /** 868 * Returns true if this value is the null value. See ECMA-262 869 * 4.3.11. 870 */ 871 V8EXPORT bool IsNull() const; 872 873 /** 874 * Returns true if this value is true. 875 */ 876 V8EXPORT bool IsTrue() const; 877 878 /** 879 * Returns true if this value is false. 880 */ 881 V8EXPORT bool IsFalse() const; 882 883 /** 884 * Returns true if this value is an instance of the String type. 885 * See ECMA-262 8.4. 886 */ 887 inline bool IsString() const; 888 889 /** 890 * Returns true if this value is a function. 891 */ 892 V8EXPORT bool IsFunction() const; 893 894 /** 895 * Returns true if this value is an array. 896 */ 897 V8EXPORT bool IsArray() const; 898 899 /** 900 * Returns true if this value is an object. 901 */ 902 V8EXPORT bool IsObject() const; 903 904 /** 905 * Returns true if this value is boolean. 906 */ 907 V8EXPORT bool IsBoolean() const; 908 909 /** 910 * Returns true if this value is a number. 911 */ 912 V8EXPORT bool IsNumber() const; 913 914 /** 915 * Returns true if this value is external. 916 */ 917 V8EXPORT bool IsExternal() const; 918 919 /** 920 * Returns true if this value is a 32-bit signed integer. 921 */ 922 V8EXPORT bool IsInt32() const; 923 924 /** 925 * Returns true if this value is a 32-bit unsigned integer. 926 */ 927 V8EXPORT bool IsUint32() const; 928 929 /** 930 * Returns true if this value is a Date. 931 */ 932 V8EXPORT bool IsDate() const; 933 934 /** 935 * Returns true if this value is a Boolean object. 936 */ 937 V8EXPORT bool IsBooleanObject() const; 938 939 /** 940 * Returns true if this value is a Number object. 941 */ 942 V8EXPORT bool IsNumberObject() const; 943 944 /** 945 * Returns true if this value is a String object. 946 */ 947 V8EXPORT bool IsStringObject() const; 948 949 /** 950 * Returns true if this value is a NativeError. 951 */ 952 V8EXPORT bool IsNativeError() const; 953 954 /** 955 * Returns true if this value is a RegExp. 956 */ 957 V8EXPORT bool IsRegExp() const; 958 959 V8EXPORT Local<Boolean> ToBoolean() const; 960 V8EXPORT Local<Number> ToNumber() const; 961 V8EXPORT Local<String> ToString() const; 962 V8EXPORT Local<String> ToDetailString() const; 963 V8EXPORT Local<Object> ToObject() const; 964 V8EXPORT Local<Integer> ToInteger() const; 965 V8EXPORT Local<Uint32> ToUint32() const; 966 V8EXPORT Local<Int32> ToInt32() const; 967 968 /** 969 * Attempts to convert a string to an array index. 970 * Returns an empty handle if the conversion fails. 971 */ 972 V8EXPORT Local<Uint32> ToArrayIndex() const; 973 974 V8EXPORT bool BooleanValue() const; 975 V8EXPORT double NumberValue() const; 976 V8EXPORT int64_t IntegerValue() const; 977 V8EXPORT uint32_t Uint32Value() const; 978 V8EXPORT int32_t Int32Value() const; 979 980 /** JS == */ 981 V8EXPORT bool Equals(Handle<Value> that) const; 982 V8EXPORT bool StrictEquals(Handle<Value> that) const; 983 984 private: 985 inline bool QuickIsString() const; 986 V8EXPORT bool FullIsString() const; 987 }; 988 989 990 /** 991 * The superclass of primitive values. See ECMA-262 4.3.2. 992 */ 993 class Primitive : public Value { }; 994 995 996 /** 997 * A primitive boolean value (ECMA-262, 4.3.14). Either the true 998 * or false value. 999 */ 1000 class Boolean : public Primitive { 1001 public: 1002 V8EXPORT bool Value() const; 1003 static inline Handle<Boolean> New(bool value); 1004 }; 1005 1006 1007 /** 1008 * A JavaScript string value (ECMA-262, 4.3.17). 1009 */ 1010 class String : public Primitive { 1011 public: 1012 /** 1013 * Returns the number of characters in this string. 1014 */ 1015 V8EXPORT int Length() const; 1016 1017 /** 1018 * Returns the number of bytes in the UTF-8 encoded 1019 * representation of this string. 1020 */ 1021 V8EXPORT int Utf8Length() const; 1022 1023 /** 1024 * A fast conservative check for non-ASCII characters. May 1025 * return true even for ASCII strings, but if it returns 1026 * false you can be sure that all characters are in the range 1027 * 0-127. 1028 */ 1029 V8EXPORT bool MayContainNonAscii() const; 1030 1031 /** 1032 * Write the contents of the string to an external buffer. 1033 * If no arguments are given, expects the buffer to be large 1034 * enough to hold the entire string and NULL terminator. Copies 1035 * the contents of the string and the NULL terminator into the 1036 * buffer. 1037 * 1038 * WriteUtf8 will not write partial UTF-8 sequences, preferring to stop 1039 * before the end of the buffer. 1040 * 1041 * Copies up to length characters into the output buffer. 1042 * Only null-terminates if there is enough space in the buffer. 1043 * 1044 * \param buffer The buffer into which the string will be copied. 1045 * \param start The starting position within the string at which 1046 * copying begins. 1047 * \param length The number of characters to copy from the string. For 1048 * WriteUtf8 the number of bytes in the buffer. 1049 * \param nchars_ref The number of characters written, can be NULL. 1050 * \param options Various options that might affect performance of this or 1051 * subsequent operations. 1052 * \return The number of characters copied to the buffer excluding the null 1053 * terminator. For WriteUtf8: The number of bytes copied to the buffer 1054 * including the null terminator (if written). 1055 */ 1056 enum WriteOptions { 1057 NO_OPTIONS = 0, 1058 HINT_MANY_WRITES_EXPECTED = 1, 1059 NO_NULL_TERMINATION = 2 1060 }; 1061 1062 // 16-bit character codes. 1063 V8EXPORT int Write(uint16_t* buffer, 1064 int start = 0, 1065 int length = -1, 1066 int options = NO_OPTIONS) const; 1067 // ASCII characters. 1068 V8EXPORT int WriteAscii(char* buffer, 1069 int start = 0, 1070 int length = -1, 1071 int options = NO_OPTIONS) const; 1072 // UTF-8 encoded characters. 1073 V8EXPORT int WriteUtf8(char* buffer, 1074 int length = -1, 1075 int* nchars_ref = NULL, 1076 int options = NO_OPTIONS) const; 1077 1078 /** 1079 * A zero length string. 1080 */ 1081 V8EXPORT static v8::Local<v8::String> Empty(); 1082 1083 /** 1084 * Returns true if the string is external 1085 */ 1086 V8EXPORT bool IsExternal() const; 1087 1088 /** 1089 * Returns true if the string is both external and ASCII 1090 */ 1091 V8EXPORT bool IsExternalAscii() const; 1092 1093 class V8EXPORT ExternalStringResourceBase { // NOLINT 1094 public: ~ExternalStringResourceBase()1095 virtual ~ExternalStringResourceBase() {} 1096 1097 protected: ExternalStringResourceBase()1098 ExternalStringResourceBase() {} 1099 1100 /** 1101 * Internally V8 will call this Dispose method when the external string 1102 * resource is no longer needed. The default implementation will use the 1103 * delete operator. This method can be overridden in subclasses to 1104 * control how allocated external string resources are disposed. 1105 */ Dispose()1106 virtual void Dispose() { delete this; } 1107 1108 private: 1109 // Disallow copying and assigning. 1110 ExternalStringResourceBase(const ExternalStringResourceBase&); 1111 void operator=(const ExternalStringResourceBase&); 1112 1113 friend class v8::internal::Heap; 1114 }; 1115 1116 /** 1117 * An ExternalStringResource is a wrapper around a two-byte string 1118 * buffer that resides outside V8's heap. Implement an 1119 * ExternalStringResource to manage the life cycle of the underlying 1120 * buffer. Note that the string data must be immutable. 1121 */ 1122 class V8EXPORT ExternalStringResource 1123 : public ExternalStringResourceBase { 1124 public: 1125 /** 1126 * Override the destructor to manage the life cycle of the underlying 1127 * buffer. 1128 */ ~ExternalStringResource()1129 virtual ~ExternalStringResource() {} 1130 1131 /** 1132 * The string data from the underlying buffer. 1133 */ 1134 virtual const uint16_t* data() const = 0; 1135 1136 /** 1137 * The length of the string. That is, the number of two-byte characters. 1138 */ 1139 virtual size_t length() const = 0; 1140 1141 protected: ExternalStringResource()1142 ExternalStringResource() {} 1143 }; 1144 1145 /** 1146 * An ExternalAsciiStringResource is a wrapper around an ASCII 1147 * string buffer that resides outside V8's heap. Implement an 1148 * ExternalAsciiStringResource to manage the life cycle of the 1149 * underlying buffer. Note that the string data must be immutable 1150 * and that the data must be strict (7-bit) ASCII, not Latin-1 or 1151 * UTF-8, which would require special treatment internally in the 1152 * engine and, in the case of UTF-8, do not allow efficient indexing. 1153 * Use String::New or convert to 16 bit data for non-ASCII. 1154 */ 1155 1156 class V8EXPORT ExternalAsciiStringResource 1157 : public ExternalStringResourceBase { 1158 public: 1159 /** 1160 * Override the destructor to manage the life cycle of the underlying 1161 * buffer. 1162 */ ~ExternalAsciiStringResource()1163 virtual ~ExternalAsciiStringResource() {} 1164 /** The string data from the underlying buffer.*/ 1165 virtual const char* data() const = 0; 1166 /** The number of ASCII characters in the string.*/ 1167 virtual size_t length() const = 0; 1168 protected: ExternalAsciiStringResource()1169 ExternalAsciiStringResource() {} 1170 }; 1171 1172 /** 1173 * Get the ExternalStringResource for an external string. Returns 1174 * NULL if IsExternal() doesn't return true. 1175 */ 1176 inline ExternalStringResource* GetExternalStringResource() const; 1177 1178 /** 1179 * Get the ExternalAsciiStringResource for an external ASCII string. 1180 * Returns NULL if IsExternalAscii() doesn't return true. 1181 */ 1182 V8EXPORT const ExternalAsciiStringResource* GetExternalAsciiStringResource() 1183 const; 1184 1185 static inline String* Cast(v8::Value* obj); 1186 1187 /** 1188 * Allocates a new string from either UTF-8 encoded or ASCII data. 1189 * The second parameter 'length' gives the buffer length. 1190 * If the data is UTF-8 encoded, the caller must 1191 * be careful to supply the length parameter. 1192 * If it is not given, the function calls 1193 * 'strlen' to determine the buffer length, it might be 1194 * wrong if 'data' contains a null character. 1195 */ 1196 V8EXPORT static Local<String> New(const char* data, int length = -1); 1197 1198 /** Allocates a new string from 16-bit character codes.*/ 1199 V8EXPORT static Local<String> New(const uint16_t* data, int length = -1); 1200 1201 /** Creates a symbol. Returns one if it exists already.*/ 1202 V8EXPORT static Local<String> NewSymbol(const char* data, int length = -1); 1203 1204 /** 1205 * Creates a new string by concatenating the left and the right strings 1206 * passed in as parameters. 1207 */ 1208 V8EXPORT static Local<String> Concat(Handle<String> left, 1209 Handle<String> right); 1210 1211 /** 1212 * Creates a new external string using the data defined in the given 1213 * resource. When the external string is no longer live on V8's heap the 1214 * resource will be disposed by calling its Dispose method. The caller of 1215 * this function should not otherwise delete or modify the resource. Neither 1216 * should the underlying buffer be deallocated or modified except through the 1217 * destructor of the external string resource. 1218 */ 1219 V8EXPORT static Local<String> NewExternal(ExternalStringResource* resource); 1220 1221 /** 1222 * Associate an external string resource with this string by transforming it 1223 * in place so that existing references to this string in the JavaScript heap 1224 * will use the external string resource. The external string resource's 1225 * character contents need to be equivalent to this string. 1226 * Returns true if the string has been changed to be an external string. 1227 * The string is not modified if the operation fails. See NewExternal for 1228 * information on the lifetime of the resource. 1229 */ 1230 V8EXPORT bool MakeExternal(ExternalStringResource* resource); 1231 1232 /** 1233 * Creates a new external string using the ASCII data defined in the given 1234 * resource. When the external string is no longer live on V8's heap the 1235 * resource will be disposed by calling its Dispose method. The caller of 1236 * this function should not otherwise delete or modify the resource. Neither 1237 * should the underlying buffer be deallocated or modified except through the 1238 * destructor of the external string resource. 1239 */ 1240 V8EXPORT static Local<String> NewExternal( 1241 ExternalAsciiStringResource* resource); 1242 1243 /** 1244 * Associate an external string resource with this string by transforming it 1245 * in place so that existing references to this string in the JavaScript heap 1246 * will use the external string resource. The external string resource's 1247 * character contents need to be equivalent to this string. 1248 * Returns true if the string has been changed to be an external string. 1249 * The string is not modified if the operation fails. See NewExternal for 1250 * information on the lifetime of the resource. 1251 */ 1252 V8EXPORT bool MakeExternal(ExternalAsciiStringResource* resource); 1253 1254 /** 1255 * Returns true if this string can be made external. 1256 */ 1257 V8EXPORT bool CanMakeExternal(); 1258 1259 /** Creates an undetectable string from the supplied ASCII or UTF-8 data.*/ 1260 V8EXPORT static Local<String> NewUndetectable(const char* data, 1261 int length = -1); 1262 1263 /** Creates an undetectable string from the supplied 16-bit character codes.*/ 1264 V8EXPORT static Local<String> NewUndetectable(const uint16_t* data, 1265 int length = -1); 1266 1267 /** 1268 * Converts an object to a UTF-8-encoded character array. Useful if 1269 * you want to print the object. If conversion to a string fails 1270 * (e.g. due to an exception in the toString() method of the object) 1271 * then the length() method returns 0 and the * operator returns 1272 * NULL. 1273 */ 1274 class V8EXPORT Utf8Value { 1275 public: 1276 explicit Utf8Value(Handle<v8::Value> obj); 1277 ~Utf8Value(); 1278 char* operator*() { return str_; } 1279 const char* operator*() const { return str_; } length()1280 int length() const { return length_; } 1281 private: 1282 char* str_; 1283 int length_; 1284 1285 // Disallow copying and assigning. 1286 Utf8Value(const Utf8Value&); 1287 void operator=(const Utf8Value&); 1288 }; 1289 1290 /** 1291 * Converts an object to an ASCII string. 1292 * Useful if you want to print the object. 1293 * If conversion to a string fails (eg. due to an exception in the toString() 1294 * method of the object) then the length() method returns 0 and the * operator 1295 * returns NULL. 1296 */ 1297 class V8EXPORT AsciiValue { 1298 public: 1299 explicit AsciiValue(Handle<v8::Value> obj); 1300 ~AsciiValue(); 1301 char* operator*() { return str_; } 1302 const char* operator*() const { return str_; } length()1303 int length() const { return length_; } 1304 private: 1305 char* str_; 1306 int length_; 1307 1308 // Disallow copying and assigning. 1309 AsciiValue(const AsciiValue&); 1310 void operator=(const AsciiValue&); 1311 }; 1312 1313 /** 1314 * Converts an object to a two-byte string. 1315 * If conversion to a string fails (eg. due to an exception in the toString() 1316 * method of the object) then the length() method returns 0 and the * operator 1317 * returns NULL. 1318 */ 1319 class V8EXPORT Value { 1320 public: 1321 explicit Value(Handle<v8::Value> obj); 1322 ~Value(); 1323 uint16_t* operator*() { return str_; } 1324 const uint16_t* operator*() const { return str_; } length()1325 int length() const { return length_; } 1326 private: 1327 uint16_t* str_; 1328 int length_; 1329 1330 // Disallow copying and assigning. 1331 Value(const Value&); 1332 void operator=(const Value&); 1333 }; 1334 1335 private: 1336 V8EXPORT void VerifyExternalStringResource(ExternalStringResource* val) const; 1337 V8EXPORT static void CheckCast(v8::Value* obj); 1338 }; 1339 1340 1341 /** 1342 * A JavaScript number value (ECMA-262, 4.3.20) 1343 */ 1344 class Number : public Primitive { 1345 public: 1346 V8EXPORT double Value() const; 1347 V8EXPORT static Local<Number> New(double value); 1348 static inline Number* Cast(v8::Value* obj); 1349 private: 1350 V8EXPORT Number(); 1351 V8EXPORT static void CheckCast(v8::Value* obj); 1352 }; 1353 1354 1355 /** 1356 * A JavaScript value representing a signed integer. 1357 */ 1358 class Integer : public Number { 1359 public: 1360 V8EXPORT static Local<Integer> New(int32_t value); 1361 V8EXPORT static Local<Integer> NewFromUnsigned(uint32_t value); 1362 V8EXPORT int64_t Value() const; 1363 static inline Integer* Cast(v8::Value* obj); 1364 private: 1365 V8EXPORT Integer(); 1366 V8EXPORT static void CheckCast(v8::Value* obj); 1367 }; 1368 1369 1370 /** 1371 * A JavaScript value representing a 32-bit signed integer. 1372 */ 1373 class Int32 : public Integer { 1374 public: 1375 V8EXPORT int32_t Value() const; 1376 private: 1377 V8EXPORT Int32(); 1378 }; 1379 1380 1381 /** 1382 * A JavaScript value representing a 32-bit unsigned integer. 1383 */ 1384 class Uint32 : public Integer { 1385 public: 1386 V8EXPORT uint32_t Value() const; 1387 private: 1388 V8EXPORT Uint32(); 1389 }; 1390 1391 1392 enum PropertyAttribute { 1393 None = 0, 1394 ReadOnly = 1 << 0, 1395 DontEnum = 1 << 1, 1396 DontDelete = 1 << 2 1397 }; 1398 1399 enum ExternalArrayType { 1400 kExternalByteArray = 1, 1401 kExternalUnsignedByteArray, 1402 kExternalShortArray, 1403 kExternalUnsignedShortArray, 1404 kExternalIntArray, 1405 kExternalUnsignedIntArray, 1406 kExternalFloatArray, 1407 kExternalDoubleArray, 1408 kExternalPixelArray 1409 }; 1410 1411 /** 1412 * Accessor[Getter|Setter] are used as callback functions when 1413 * setting|getting a particular property. See Object and ObjectTemplate's 1414 * method SetAccessor. 1415 */ 1416 typedef Handle<Value> (*AccessorGetter)(Local<String> property, 1417 const AccessorInfo& info); 1418 1419 1420 typedef void (*AccessorSetter)(Local<String> property, 1421 Local<Value> value, 1422 const AccessorInfo& info); 1423 1424 1425 /** 1426 * Access control specifications. 1427 * 1428 * Some accessors should be accessible across contexts. These 1429 * accessors have an explicit access control parameter which specifies 1430 * the kind of cross-context access that should be allowed. 1431 * 1432 * Additionally, for security, accessors can prohibit overwriting by 1433 * accessors defined in JavaScript. For objects that have such 1434 * accessors either locally or in their prototype chain it is not 1435 * possible to overwrite the accessor by using __defineGetter__ or 1436 * __defineSetter__ from JavaScript code. 1437 */ 1438 enum AccessControl { 1439 DEFAULT = 0, 1440 ALL_CAN_READ = 1, 1441 ALL_CAN_WRITE = 1 << 1, 1442 PROHIBITS_OVERWRITING = 1 << 2 1443 }; 1444 1445 1446 /** 1447 * A JavaScript object (ECMA-262, 4.3.3) 1448 */ 1449 class Object : public Value { 1450 public: 1451 V8EXPORT bool Set(Handle<Value> key, 1452 Handle<Value> value, 1453 PropertyAttribute attribs = None); 1454 1455 V8EXPORT bool Set(uint32_t index, 1456 Handle<Value> value); 1457 1458 // Sets a local property on this object bypassing interceptors and 1459 // overriding accessors or read-only properties. 1460 // 1461 // Note that if the object has an interceptor the property will be set 1462 // locally, but since the interceptor takes precedence the local property 1463 // will only be returned if the interceptor doesn't return a value. 1464 // 1465 // Note also that this only works for named properties. 1466 V8EXPORT bool ForceSet(Handle<Value> key, 1467 Handle<Value> value, 1468 PropertyAttribute attribs = None); 1469 1470 V8EXPORT Local<Value> Get(Handle<Value> key); 1471 1472 V8EXPORT Local<Value> Get(uint32_t index); 1473 1474 /** 1475 * Gets the property attributes of a property which can be None or 1476 * any combination of ReadOnly, DontEnum and DontDelete. Returns 1477 * None when the property doesn't exist. 1478 */ 1479 V8EXPORT PropertyAttribute GetPropertyAttributes(Handle<Value> key); 1480 1481 // TODO(1245389): Replace the type-specific versions of these 1482 // functions with generic ones that accept a Handle<Value> key. 1483 V8EXPORT bool Has(Handle<String> key); 1484 1485 V8EXPORT bool Delete(Handle<String> key); 1486 1487 // Delete a property on this object bypassing interceptors and 1488 // ignoring dont-delete attributes. 1489 V8EXPORT bool ForceDelete(Handle<Value> key); 1490 1491 V8EXPORT bool Has(uint32_t index); 1492 1493 V8EXPORT bool Delete(uint32_t index); 1494 1495 V8EXPORT bool SetAccessor(Handle<String> name, 1496 AccessorGetter getter, 1497 AccessorSetter setter = 0, 1498 Handle<Value> data = Handle<Value>(), 1499 AccessControl settings = DEFAULT, 1500 PropertyAttribute attribute = None); 1501 1502 /** 1503 * Returns an array containing the names of the enumerable properties 1504 * of this object, including properties from prototype objects. The 1505 * array returned by this method contains the same values as would 1506 * be enumerated by a for-in statement over this object. 1507 */ 1508 V8EXPORT Local<Array> GetPropertyNames(); 1509 1510 /** 1511 * This function has the same functionality as GetPropertyNames but 1512 * the returned array doesn't contain the names of properties from 1513 * prototype objects. 1514 */ 1515 V8EXPORT Local<Array> GetOwnPropertyNames(); 1516 1517 /** 1518 * Get the prototype object. This does not skip objects marked to 1519 * be skipped by __proto__ and it does not consult the security 1520 * handler. 1521 */ 1522 V8EXPORT Local<Value> GetPrototype(); 1523 1524 /** 1525 * Set the prototype object. This does not skip objects marked to 1526 * be skipped by __proto__ and it does not consult the security 1527 * handler. 1528 */ 1529 V8EXPORT bool SetPrototype(Handle<Value> prototype); 1530 1531 /** 1532 * Finds an instance of the given function template in the prototype 1533 * chain. 1534 */ 1535 V8EXPORT Local<Object> FindInstanceInPrototypeChain( 1536 Handle<FunctionTemplate> tmpl); 1537 1538 /** 1539 * Call builtin Object.prototype.toString on this object. 1540 * This is different from Value::ToString() that may call 1541 * user-defined toString function. This one does not. 1542 */ 1543 V8EXPORT Local<String> ObjectProtoToString(); 1544 1545 /** 1546 * Returns the name of the function invoked as a constructor for this object. 1547 */ 1548 V8EXPORT Local<String> GetConstructorName(); 1549 1550 /** Gets the number of internal fields for this Object. */ 1551 V8EXPORT int InternalFieldCount(); 1552 /** Gets the value in an internal field. */ 1553 inline Local<Value> GetInternalField(int index); 1554 /** Sets the value in an internal field. */ 1555 V8EXPORT void SetInternalField(int index, Handle<Value> value); 1556 1557 /** Gets a native pointer from an internal field. */ 1558 inline void* GetPointerFromInternalField(int index); 1559 1560 /** Sets a native pointer in an internal field. */ 1561 V8EXPORT void SetPointerInInternalField(int index, void* value); 1562 1563 // Testers for local properties. 1564 V8EXPORT bool HasOwnProperty(Handle<String> key); 1565 V8EXPORT bool HasRealNamedProperty(Handle<String> key); 1566 V8EXPORT bool HasRealIndexedProperty(uint32_t index); 1567 V8EXPORT bool HasRealNamedCallbackProperty(Handle<String> key); 1568 1569 /** 1570 * If result.IsEmpty() no real property was located in the prototype chain. 1571 * This means interceptors in the prototype chain are not called. 1572 */ 1573 V8EXPORT Local<Value> GetRealNamedPropertyInPrototypeChain( 1574 Handle<String> key); 1575 1576 /** 1577 * If result.IsEmpty() no real property was located on the object or 1578 * in the prototype chain. 1579 * This means interceptors in the prototype chain are not called. 1580 */ 1581 V8EXPORT Local<Value> GetRealNamedProperty(Handle<String> key); 1582 1583 /** Tests for a named lookup interceptor.*/ 1584 V8EXPORT bool HasNamedLookupInterceptor(); 1585 1586 /** Tests for an index lookup interceptor.*/ 1587 V8EXPORT bool HasIndexedLookupInterceptor(); 1588 1589 /** 1590 * Turns on access check on the object if the object is an instance of 1591 * a template that has access check callbacks. If an object has no 1592 * access check info, the object cannot be accessed by anyone. 1593 */ 1594 V8EXPORT void TurnOnAccessCheck(); 1595 1596 /** 1597 * Returns the identity hash for this object. The current implementation 1598 * uses a hidden property on the object to store the identity hash. 1599 * 1600 * The return value will never be 0. Also, it is not guaranteed to be 1601 * unique. 1602 */ 1603 V8EXPORT int GetIdentityHash(); 1604 1605 /** 1606 * Access hidden properties on JavaScript objects. These properties are 1607 * hidden from the executing JavaScript and only accessible through the V8 1608 * C++ API. Hidden properties introduced by V8 internally (for example the 1609 * identity hash) are prefixed with "v8::". 1610 */ 1611 V8EXPORT bool SetHiddenValue(Handle<String> key, Handle<Value> value); 1612 V8EXPORT Local<Value> GetHiddenValue(Handle<String> key); 1613 V8EXPORT bool DeleteHiddenValue(Handle<String> key); 1614 1615 /** 1616 * Returns true if this is an instance of an api function (one 1617 * created from a function created from a function template) and has 1618 * been modified since it was created. Note that this method is 1619 * conservative and may return true for objects that haven't actually 1620 * been modified. 1621 */ 1622 V8EXPORT bool IsDirty(); 1623 1624 /** 1625 * Clone this object with a fast but shallow copy. Values will point 1626 * to the same values as the original object. 1627 */ 1628 V8EXPORT Local<Object> Clone(); 1629 1630 /** 1631 * Returns the context in which the object was created. 1632 */ 1633 V8EXPORT Local<Context> CreationContext(); 1634 1635 /** 1636 * Set the backing store of the indexed properties to be managed by the 1637 * embedding layer. Access to the indexed properties will follow the rules 1638 * spelled out in CanvasPixelArray. 1639 * Note: The embedding program still owns the data and needs to ensure that 1640 * the backing store is preserved while V8 has a reference. 1641 */ 1642 V8EXPORT void SetIndexedPropertiesToPixelData(uint8_t* data, int length); 1643 V8EXPORT bool HasIndexedPropertiesInPixelData(); 1644 V8EXPORT uint8_t* GetIndexedPropertiesPixelData(); 1645 V8EXPORT int GetIndexedPropertiesPixelDataLength(); 1646 1647 /** 1648 * Set the backing store of the indexed properties to be managed by the 1649 * embedding layer. Access to the indexed properties will follow the rules 1650 * spelled out for the CanvasArray subtypes in the WebGL specification. 1651 * Note: The embedding program still owns the data and needs to ensure that 1652 * the backing store is preserved while V8 has a reference. 1653 */ 1654 V8EXPORT void SetIndexedPropertiesToExternalArrayData( 1655 void* data, 1656 ExternalArrayType array_type, 1657 int number_of_elements); 1658 V8EXPORT bool HasIndexedPropertiesInExternalArrayData(); 1659 V8EXPORT void* GetIndexedPropertiesExternalArrayData(); 1660 V8EXPORT ExternalArrayType GetIndexedPropertiesExternalArrayDataType(); 1661 V8EXPORT int GetIndexedPropertiesExternalArrayDataLength(); 1662 1663 /** 1664 * Checks whether a callback is set by the 1665 * ObjectTemplate::SetCallAsFunctionHandler method. 1666 * When an Object is callable this method returns true. 1667 */ 1668 V8EXPORT bool IsCallable(); 1669 1670 /** 1671 * Call an Object as a function if a callback is set by the 1672 * ObjectTemplate::SetCallAsFunctionHandler method. 1673 */ 1674 V8EXPORT Local<Value> CallAsFunction(Handle<Object> recv, 1675 int argc, 1676 Handle<Value> argv[]); 1677 1678 /** 1679 * Call an Object as a constructor if a callback is set by the 1680 * ObjectTemplate::SetCallAsFunctionHandler method. 1681 * Note: This method behaves like the Function::NewInstance method. 1682 */ 1683 V8EXPORT Local<Value> CallAsConstructor(int argc, 1684 Handle<Value> argv[]); 1685 1686 V8EXPORT static Local<Object> New(); 1687 static inline Object* Cast(Value* obj); 1688 1689 private: 1690 V8EXPORT Object(); 1691 V8EXPORT static void CheckCast(Value* obj); 1692 V8EXPORT Local<Value> CheckedGetInternalField(int index); 1693 V8EXPORT void* SlowGetPointerFromInternalField(int index); 1694 1695 /** 1696 * If quick access to the internal field is possible this method 1697 * returns the value. Otherwise an empty handle is returned. 1698 */ 1699 inline Local<Value> UncheckedGetInternalField(int index); 1700 }; 1701 1702 1703 /** 1704 * An instance of the built-in array constructor (ECMA-262, 15.4.2). 1705 */ 1706 class Array : public Object { 1707 public: 1708 V8EXPORT uint32_t Length() const; 1709 1710 /** 1711 * Clones an element at index |index|. Returns an empty 1712 * handle if cloning fails (for any reason). 1713 */ 1714 V8EXPORT Local<Object> CloneElementAt(uint32_t index); 1715 1716 /** 1717 * Creates a JavaScript array with the given length. If the length 1718 * is negative the returned array will have length 0. 1719 */ 1720 V8EXPORT static Local<Array> New(int length = 0); 1721 1722 static inline Array* Cast(Value* obj); 1723 private: 1724 V8EXPORT Array(); 1725 V8EXPORT static void CheckCast(Value* obj); 1726 }; 1727 1728 1729 /** 1730 * A JavaScript function object (ECMA-262, 15.3). 1731 */ 1732 class Function : public Object { 1733 public: 1734 V8EXPORT Local<Object> NewInstance() const; 1735 V8EXPORT Local<Object> NewInstance(int argc, Handle<Value> argv[]) const; 1736 V8EXPORT Local<Value> Call(Handle<Object> recv, 1737 int argc, 1738 Handle<Value> argv[]); 1739 V8EXPORT void SetName(Handle<String> name); 1740 V8EXPORT Handle<Value> GetName() const; 1741 1742 /** 1743 * Name inferred from variable or property assignment of this function. 1744 * Used to facilitate debugging and profiling of JavaScript code written 1745 * in an OO style, where many functions are anonymous but are assigned 1746 * to object properties. 1747 */ 1748 V8EXPORT Handle<Value> GetInferredName() const; 1749 1750 /** 1751 * Returns zero based line number of function body and 1752 * kLineOffsetNotFound if no information available. 1753 */ 1754 V8EXPORT int GetScriptLineNumber() const; 1755 /** 1756 * Returns zero based column number of function body and 1757 * kLineOffsetNotFound if no information available. 1758 */ 1759 V8EXPORT int GetScriptColumnNumber() const; 1760 V8EXPORT Handle<Value> GetScriptId() const; 1761 V8EXPORT ScriptOrigin GetScriptOrigin() const; 1762 static inline Function* Cast(Value* obj); 1763 V8EXPORT static const int kLineOffsetNotFound; 1764 1765 private: 1766 V8EXPORT Function(); 1767 V8EXPORT static void CheckCast(Value* obj); 1768 }; 1769 1770 1771 /** 1772 * An instance of the built-in Date constructor (ECMA-262, 15.9). 1773 */ 1774 class Date : public Object { 1775 public: 1776 V8EXPORT static Local<Value> New(double time); 1777 1778 /** 1779 * A specialization of Value::NumberValue that is more efficient 1780 * because we know the structure of this object. 1781 */ 1782 V8EXPORT double NumberValue() const; 1783 1784 static inline Date* Cast(v8::Value* obj); 1785 1786 /** 1787 * Notification that the embedder has changed the time zone, 1788 * daylight savings time, or other date / time configuration 1789 * parameters. V8 keeps a cache of various values used for 1790 * date / time computation. This notification will reset 1791 * those cached values for the current context so that date / 1792 * time configuration changes would be reflected in the Date 1793 * object. 1794 * 1795 * This API should not be called more than needed as it will 1796 * negatively impact the performance of date operations. 1797 */ 1798 V8EXPORT static void DateTimeConfigurationChangeNotification(); 1799 1800 private: 1801 V8EXPORT static void CheckCast(v8::Value* obj); 1802 }; 1803 1804 1805 /** 1806 * A Number object (ECMA-262, 4.3.21). 1807 */ 1808 class NumberObject : public Object { 1809 public: 1810 V8EXPORT static Local<Value> New(double value); 1811 1812 /** 1813 * Returns the Number held by the object. 1814 */ 1815 V8EXPORT double NumberValue() const; 1816 1817 static inline NumberObject* Cast(v8::Value* obj); 1818 1819 private: 1820 V8EXPORT static void CheckCast(v8::Value* obj); 1821 }; 1822 1823 1824 /** 1825 * A Boolean object (ECMA-262, 4.3.15). 1826 */ 1827 class BooleanObject : public Object { 1828 public: 1829 V8EXPORT static Local<Value> New(bool value); 1830 1831 /** 1832 * Returns the Boolean held by the object. 1833 */ 1834 V8EXPORT bool BooleanValue() const; 1835 1836 static inline BooleanObject* Cast(v8::Value* obj); 1837 1838 private: 1839 V8EXPORT static void CheckCast(v8::Value* obj); 1840 }; 1841 1842 1843 /** 1844 * A String object (ECMA-262, 4.3.18). 1845 */ 1846 class StringObject : public Object { 1847 public: 1848 V8EXPORT static Local<Value> New(Handle<String> value); 1849 1850 /** 1851 * Returns the String held by the object. 1852 */ 1853 V8EXPORT Local<String> StringValue() const; 1854 1855 static inline StringObject* Cast(v8::Value* obj); 1856 1857 private: 1858 V8EXPORT static void CheckCast(v8::Value* obj); 1859 }; 1860 1861 1862 /** 1863 * An instance of the built-in RegExp constructor (ECMA-262, 15.10). 1864 */ 1865 class RegExp : public Object { 1866 public: 1867 /** 1868 * Regular expression flag bits. They can be or'ed to enable a set 1869 * of flags. 1870 */ 1871 enum Flags { 1872 kNone = 0, 1873 kGlobal = 1, 1874 kIgnoreCase = 2, 1875 kMultiline = 4 1876 }; 1877 1878 /** 1879 * Creates a regular expression from the given pattern string and 1880 * the flags bit field. May throw a JavaScript exception as 1881 * described in ECMA-262, 15.10.4.1. 1882 * 1883 * For example, 1884 * RegExp::New(v8::String::New("foo"), 1885 * static_cast<RegExp::Flags>(kGlobal | kMultiline)) 1886 * is equivalent to evaluating "/foo/gm". 1887 */ 1888 V8EXPORT static Local<RegExp> New(Handle<String> pattern, 1889 Flags flags); 1890 1891 /** 1892 * Returns the value of the source property: a string representing 1893 * the regular expression. 1894 */ 1895 V8EXPORT Local<String> GetSource() const; 1896 1897 /** 1898 * Returns the flags bit field. 1899 */ 1900 V8EXPORT Flags GetFlags() const; 1901 1902 static inline RegExp* Cast(v8::Value* obj); 1903 1904 private: 1905 V8EXPORT static void CheckCast(v8::Value* obj); 1906 }; 1907 1908 1909 /** 1910 * A JavaScript value that wraps a C++ void*. This type of value is 1911 * mainly used to associate C++ data structures with JavaScript 1912 * objects. 1913 * 1914 * The Wrap function V8 will return the most optimal Value object wrapping the 1915 * C++ void*. The type of the value is not guaranteed to be an External object 1916 * and no assumptions about its type should be made. To access the wrapped 1917 * value Unwrap should be used, all other operations on that object will lead 1918 * to unpredictable results. 1919 */ 1920 class External : public Value { 1921 public: 1922 V8EXPORT static Local<Value> Wrap(void* data); 1923 static inline void* Unwrap(Handle<Value> obj); 1924 1925 V8EXPORT static Local<External> New(void* value); 1926 static inline External* Cast(Value* obj); 1927 V8EXPORT void* Value() const; 1928 private: 1929 V8EXPORT External(); 1930 V8EXPORT static void CheckCast(v8::Value* obj); 1931 static inline void* QuickUnwrap(Handle<v8::Value> obj); 1932 V8EXPORT static void* FullUnwrap(Handle<v8::Value> obj); 1933 }; 1934 1935 1936 // --- Templates --- 1937 1938 1939 /** 1940 * The superclass of object and function templates. 1941 */ 1942 class V8EXPORT Template : public Data { 1943 public: 1944 /** Adds a property to each instance created by this template.*/ 1945 void Set(Handle<String> name, Handle<Data> value, 1946 PropertyAttribute attributes = None); 1947 inline void Set(const char* name, Handle<Data> value); 1948 private: 1949 Template(); 1950 1951 friend class ObjectTemplate; 1952 friend class FunctionTemplate; 1953 }; 1954 1955 1956 /** 1957 * The argument information given to function call callbacks. This 1958 * class provides access to information about the context of the call, 1959 * including the receiver, the number and values of arguments, and 1960 * the holder of the function. 1961 */ 1962 class Arguments { 1963 public: 1964 inline int Length() const; 1965 inline Local<Value> operator[](int i) const; 1966 inline Local<Function> Callee() const; 1967 inline Local<Object> This() const; 1968 inline Local<Object> Holder() const; 1969 inline bool IsConstructCall() const; 1970 inline Local<Value> Data() const; 1971 private: 1972 static const int kDataIndex = 0; 1973 static const int kCalleeIndex = -1; 1974 static const int kHolderIndex = -2; 1975 1976 friend class ImplementationUtilities; 1977 inline Arguments(internal::Object** implicit_args, 1978 internal::Object** values, 1979 int length, 1980 bool is_construct_call); 1981 internal::Object** implicit_args_; 1982 internal::Object** values_; 1983 int length_; 1984 bool is_construct_call_; 1985 }; 1986 1987 1988 /** 1989 * The information passed to an accessor callback about the context 1990 * of the property access. 1991 */ 1992 class V8EXPORT AccessorInfo { 1993 public: AccessorInfo(internal::Object ** args)1994 inline AccessorInfo(internal::Object** args) 1995 : args_(args) { } 1996 inline Local<Value> Data() const; 1997 inline Local<Object> This() const; 1998 inline Local<Object> Holder() const; 1999 private: 2000 internal::Object** args_; 2001 }; 2002 2003 2004 typedef Handle<Value> (*InvocationCallback)(const Arguments& args); 2005 2006 /** 2007 * NamedProperty[Getter|Setter] are used as interceptors on object. 2008 * See ObjectTemplate::SetNamedPropertyHandler. 2009 */ 2010 typedef Handle<Value> (*NamedPropertyGetter)(Local<String> property, 2011 const AccessorInfo& info); 2012 2013 2014 /** 2015 * Returns the value if the setter intercepts the request. 2016 * Otherwise, returns an empty handle. 2017 */ 2018 typedef Handle<Value> (*NamedPropertySetter)(Local<String> property, 2019 Local<Value> value, 2020 const AccessorInfo& info); 2021 2022 /** 2023 * Returns a non-empty handle if the interceptor intercepts the request. 2024 * The result is an integer encoding property attributes (like v8::None, 2025 * v8::DontEnum, etc.) 2026 */ 2027 typedef Handle<Integer> (*NamedPropertyQuery)(Local<String> property, 2028 const AccessorInfo& info); 2029 2030 2031 /** 2032 * Returns a non-empty handle if the deleter intercepts the request. 2033 * The return value is true if the property could be deleted and false 2034 * otherwise. 2035 */ 2036 typedef Handle<Boolean> (*NamedPropertyDeleter)(Local<String> property, 2037 const AccessorInfo& info); 2038 2039 /** 2040 * Returns an array containing the names of the properties the named 2041 * property getter intercepts. 2042 */ 2043 typedef Handle<Array> (*NamedPropertyEnumerator)(const AccessorInfo& info); 2044 2045 2046 /** 2047 * Returns the value of the property if the getter intercepts the 2048 * request. Otherwise, returns an empty handle. 2049 */ 2050 typedef Handle<Value> (*IndexedPropertyGetter)(uint32_t index, 2051 const AccessorInfo& info); 2052 2053 2054 /** 2055 * Returns the value if the setter intercepts the request. 2056 * Otherwise, returns an empty handle. 2057 */ 2058 typedef Handle<Value> (*IndexedPropertySetter)(uint32_t index, 2059 Local<Value> value, 2060 const AccessorInfo& info); 2061 2062 2063 /** 2064 * Returns a non-empty handle if the interceptor intercepts the request. 2065 * The result is an integer encoding property attributes. 2066 */ 2067 typedef Handle<Integer> (*IndexedPropertyQuery)(uint32_t index, 2068 const AccessorInfo& info); 2069 2070 /** 2071 * Returns a non-empty handle if the deleter intercepts the request. 2072 * The return value is true if the property could be deleted and false 2073 * otherwise. 2074 */ 2075 typedef Handle<Boolean> (*IndexedPropertyDeleter)(uint32_t index, 2076 const AccessorInfo& info); 2077 2078 /** 2079 * Returns an array containing the indices of the properties the 2080 * indexed property getter intercepts. 2081 */ 2082 typedef Handle<Array> (*IndexedPropertyEnumerator)(const AccessorInfo& info); 2083 2084 2085 /** 2086 * Access type specification. 2087 */ 2088 enum AccessType { 2089 ACCESS_GET, 2090 ACCESS_SET, 2091 ACCESS_HAS, 2092 ACCESS_DELETE, 2093 ACCESS_KEYS 2094 }; 2095 2096 2097 /** 2098 * Returns true if cross-context access should be allowed to the named 2099 * property with the given key on the host object. 2100 */ 2101 typedef bool (*NamedSecurityCallback)(Local<Object> host, 2102 Local<Value> key, 2103 AccessType type, 2104 Local<Value> data); 2105 2106 2107 /** 2108 * Returns true if cross-context access should be allowed to the indexed 2109 * property with the given index on the host object. 2110 */ 2111 typedef bool (*IndexedSecurityCallback)(Local<Object> host, 2112 uint32_t index, 2113 AccessType type, 2114 Local<Value> data); 2115 2116 2117 /** 2118 * A FunctionTemplate is used to create functions at runtime. There 2119 * can only be one function created from a FunctionTemplate in a 2120 * context. The lifetime of the created function is equal to the 2121 * lifetime of the context. So in case the embedder needs to create 2122 * temporary functions that can be collected using Scripts is 2123 * preferred. 2124 * 2125 * A FunctionTemplate can have properties, these properties are added to the 2126 * function object when it is created. 2127 * 2128 * A FunctionTemplate has a corresponding instance template which is 2129 * used to create object instances when the function is used as a 2130 * constructor. Properties added to the instance template are added to 2131 * each object instance. 2132 * 2133 * A FunctionTemplate can have a prototype template. The prototype template 2134 * is used to create the prototype object of the function. 2135 * 2136 * The following example shows how to use a FunctionTemplate: 2137 * 2138 * \code 2139 * v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); 2140 * t->Set("func_property", v8::Number::New(1)); 2141 * 2142 * v8::Local<v8::Template> proto_t = t->PrototypeTemplate(); 2143 * proto_t->Set("proto_method", v8::FunctionTemplate::New(InvokeCallback)); 2144 * proto_t->Set("proto_const", v8::Number::New(2)); 2145 * 2146 * v8::Local<v8::ObjectTemplate> instance_t = t->InstanceTemplate(); 2147 * instance_t->SetAccessor("instance_accessor", InstanceAccessorCallback); 2148 * instance_t->SetNamedPropertyHandler(PropertyHandlerCallback, ...); 2149 * instance_t->Set("instance_property", Number::New(3)); 2150 * 2151 * v8::Local<v8::Function> function = t->GetFunction(); 2152 * v8::Local<v8::Object> instance = function->NewInstance(); 2153 * \endcode 2154 * 2155 * Let's use "function" as the JS variable name of the function object 2156 * and "instance" for the instance object created above. The function 2157 * and the instance will have the following properties: 2158 * 2159 * \code 2160 * func_property in function == true; 2161 * function.func_property == 1; 2162 * 2163 * function.prototype.proto_method() invokes 'InvokeCallback' 2164 * function.prototype.proto_const == 2; 2165 * 2166 * instance instanceof function == true; 2167 * instance.instance_accessor calls 'InstanceAccessorCallback' 2168 * instance.instance_property == 3; 2169 * \endcode 2170 * 2171 * A FunctionTemplate can inherit from another one by calling the 2172 * FunctionTemplate::Inherit method. The following graph illustrates 2173 * the semantics of inheritance: 2174 * 2175 * \code 2176 * FunctionTemplate Parent -> Parent() . prototype -> { } 2177 * ^ ^ 2178 * | Inherit(Parent) | .__proto__ 2179 * | | 2180 * FunctionTemplate Child -> Child() . prototype -> { } 2181 * \endcode 2182 * 2183 * A FunctionTemplate 'Child' inherits from 'Parent', the prototype 2184 * object of the Child() function has __proto__ pointing to the 2185 * Parent() function's prototype object. An instance of the Child 2186 * function has all properties on Parent's instance templates. 2187 * 2188 * Let Parent be the FunctionTemplate initialized in the previous 2189 * section and create a Child FunctionTemplate by: 2190 * 2191 * \code 2192 * Local<FunctionTemplate> parent = t; 2193 * Local<FunctionTemplate> child = FunctionTemplate::New(); 2194 * child->Inherit(parent); 2195 * 2196 * Local<Function> child_function = child->GetFunction(); 2197 * Local<Object> child_instance = child_function->NewInstance(); 2198 * \endcode 2199 * 2200 * The Child function and Child instance will have the following 2201 * properties: 2202 * 2203 * \code 2204 * child_func.prototype.__proto__ == function.prototype; 2205 * child_instance.instance_accessor calls 'InstanceAccessorCallback' 2206 * child_instance.instance_property == 3; 2207 * \endcode 2208 */ 2209 class V8EXPORT FunctionTemplate : public Template { 2210 public: 2211 /** Creates a function template.*/ 2212 static Local<FunctionTemplate> New( 2213 InvocationCallback callback = 0, 2214 Handle<Value> data = Handle<Value>(), 2215 Handle<Signature> signature = Handle<Signature>()); 2216 /** Returns the unique function instance in the current execution context.*/ 2217 Local<Function> GetFunction(); 2218 2219 /** 2220 * Set the call-handler callback for a FunctionTemplate. This 2221 * callback is called whenever the function created from this 2222 * FunctionTemplate is called. 2223 */ 2224 void SetCallHandler(InvocationCallback callback, 2225 Handle<Value> data = Handle<Value>()); 2226 2227 /** Get the InstanceTemplate. */ 2228 Local<ObjectTemplate> InstanceTemplate(); 2229 2230 /** Causes the function template to inherit from a parent function template.*/ 2231 void Inherit(Handle<FunctionTemplate> parent); 2232 2233 /** 2234 * A PrototypeTemplate is the template used to create the prototype object 2235 * of the function created by this template. 2236 */ 2237 Local<ObjectTemplate> PrototypeTemplate(); 2238 2239 2240 /** 2241 * Set the class name of the FunctionTemplate. This is used for 2242 * printing objects created with the function created from the 2243 * FunctionTemplate as its constructor. 2244 */ 2245 void SetClassName(Handle<String> name); 2246 2247 /** 2248 * Determines whether the __proto__ accessor ignores instances of 2249 * the function template. If instances of the function template are 2250 * ignored, __proto__ skips all instances and instead returns the 2251 * next object in the prototype chain. 2252 * 2253 * Call with a value of true to make the __proto__ accessor ignore 2254 * instances of the function template. Call with a value of false 2255 * to make the __proto__ accessor not ignore instances of the 2256 * function template. By default, instances of a function template 2257 * are not ignored. 2258 */ 2259 void SetHiddenPrototype(bool value); 2260 2261 /** 2262 * Sets the ReadOnly flag in the attributes of the 'prototype' property 2263 * of functions created from this FunctionTemplate to true. 2264 */ 2265 void ReadOnlyPrototype(); 2266 2267 /** 2268 * Returns true if the given object is an instance of this function 2269 * template. 2270 */ 2271 bool HasInstance(Handle<Value> object); 2272 2273 private: 2274 FunctionTemplate(); 2275 void AddInstancePropertyAccessor(Handle<String> name, 2276 AccessorGetter getter, 2277 AccessorSetter setter, 2278 Handle<Value> data, 2279 AccessControl settings, 2280 PropertyAttribute attributes); 2281 void SetNamedInstancePropertyHandler(NamedPropertyGetter getter, 2282 NamedPropertySetter setter, 2283 NamedPropertyQuery query, 2284 NamedPropertyDeleter remover, 2285 NamedPropertyEnumerator enumerator, 2286 Handle<Value> data); 2287 void SetIndexedInstancePropertyHandler(IndexedPropertyGetter getter, 2288 IndexedPropertySetter setter, 2289 IndexedPropertyQuery query, 2290 IndexedPropertyDeleter remover, 2291 IndexedPropertyEnumerator enumerator, 2292 Handle<Value> data); 2293 void SetInstanceCallAsFunctionHandler(InvocationCallback callback, 2294 Handle<Value> data); 2295 2296 friend class Context; 2297 friend class ObjectTemplate; 2298 }; 2299 2300 2301 /** 2302 * An ObjectTemplate is used to create objects at runtime. 2303 * 2304 * Properties added to an ObjectTemplate are added to each object 2305 * created from the ObjectTemplate. 2306 */ 2307 class V8EXPORT ObjectTemplate : public Template { 2308 public: 2309 /** Creates an ObjectTemplate. */ 2310 static Local<ObjectTemplate> New(); 2311 2312 /** Creates a new instance of this template.*/ 2313 Local<Object> NewInstance(); 2314 2315 /** 2316 * Sets an accessor on the object template. 2317 * 2318 * Whenever the property with the given name is accessed on objects 2319 * created from this ObjectTemplate the getter and setter callbacks 2320 * are called instead of getting and setting the property directly 2321 * on the JavaScript object. 2322 * 2323 * \param name The name of the property for which an accessor is added. 2324 * \param getter The callback to invoke when getting the property. 2325 * \param setter The callback to invoke when setting the property. 2326 * \param data A piece of data that will be passed to the getter and setter 2327 * callbacks whenever they are invoked. 2328 * \param settings Access control settings for the accessor. This is a bit 2329 * field consisting of one of more of 2330 * DEFAULT = 0, ALL_CAN_READ = 1, or ALL_CAN_WRITE = 2. 2331 * The default is to not allow cross-context access. 2332 * ALL_CAN_READ means that all cross-context reads are allowed. 2333 * ALL_CAN_WRITE means that all cross-context writes are allowed. 2334 * The combination ALL_CAN_READ | ALL_CAN_WRITE can be used to allow all 2335 * cross-context access. 2336 * \param attribute The attributes of the property for which an accessor 2337 * is added. 2338 */ 2339 void SetAccessor(Handle<String> name, 2340 AccessorGetter getter, 2341 AccessorSetter setter = 0, 2342 Handle<Value> data = Handle<Value>(), 2343 AccessControl settings = DEFAULT, 2344 PropertyAttribute attribute = None); 2345 2346 /** 2347 * Sets a named property handler on the object template. 2348 * 2349 * Whenever a named property is accessed on objects created from 2350 * this object template, the provided callback is invoked instead of 2351 * accessing the property directly on the JavaScript object. 2352 * 2353 * \param getter The callback to invoke when getting a property. 2354 * \param setter The callback to invoke when setting a property. 2355 * \param query The callback to invoke to check if a property is present, 2356 * and if present, get its attributes. 2357 * \param deleter The callback to invoke when deleting a property. 2358 * \param enumerator The callback to invoke to enumerate all the named 2359 * properties of an object. 2360 * \param data A piece of data that will be passed to the callbacks 2361 * whenever they are invoked. 2362 */ 2363 void SetNamedPropertyHandler(NamedPropertyGetter getter, 2364 NamedPropertySetter setter = 0, 2365 NamedPropertyQuery query = 0, 2366 NamedPropertyDeleter deleter = 0, 2367 NamedPropertyEnumerator enumerator = 0, 2368 Handle<Value> data = Handle<Value>()); 2369 2370 /** 2371 * Sets an indexed property handler on the object template. 2372 * 2373 * Whenever an indexed property is accessed on objects created from 2374 * this object template, the provided callback is invoked instead of 2375 * accessing the property directly on the JavaScript object. 2376 * 2377 * \param getter The callback to invoke when getting a property. 2378 * \param setter The callback to invoke when setting a property. 2379 * \param query The callback to invoke to check if an object has a property. 2380 * \param deleter The callback to invoke when deleting a property. 2381 * \param enumerator The callback to invoke to enumerate all the indexed 2382 * properties of an object. 2383 * \param data A piece of data that will be passed to the callbacks 2384 * whenever they are invoked. 2385 */ 2386 void SetIndexedPropertyHandler(IndexedPropertyGetter getter, 2387 IndexedPropertySetter setter = 0, 2388 IndexedPropertyQuery query = 0, 2389 IndexedPropertyDeleter deleter = 0, 2390 IndexedPropertyEnumerator enumerator = 0, 2391 Handle<Value> data = Handle<Value>()); 2392 2393 /** 2394 * Sets the callback to be used when calling instances created from 2395 * this template as a function. If no callback is set, instances 2396 * behave like normal JavaScript objects that cannot be called as a 2397 * function. 2398 */ 2399 void SetCallAsFunctionHandler(InvocationCallback callback, 2400 Handle<Value> data = Handle<Value>()); 2401 2402 /** 2403 * Mark object instances of the template as undetectable. 2404 * 2405 * In many ways, undetectable objects behave as though they are not 2406 * there. They behave like 'undefined' in conditionals and when 2407 * printed. However, properties can be accessed and called as on 2408 * normal objects. 2409 */ 2410 void MarkAsUndetectable(); 2411 2412 /** 2413 * Sets access check callbacks on the object template. 2414 * 2415 * When accessing properties on instances of this object template, 2416 * the access check callback will be called to determine whether or 2417 * not to allow cross-context access to the properties. 2418 * The last parameter specifies whether access checks are turned 2419 * on by default on instances. If access checks are off by default, 2420 * they can be turned on on individual instances by calling 2421 * Object::TurnOnAccessCheck(). 2422 */ 2423 void SetAccessCheckCallbacks(NamedSecurityCallback named_handler, 2424 IndexedSecurityCallback indexed_handler, 2425 Handle<Value> data = Handle<Value>(), 2426 bool turned_on_by_default = true); 2427 2428 /** 2429 * Gets the number of internal fields for objects generated from 2430 * this template. 2431 */ 2432 int InternalFieldCount(); 2433 2434 /** 2435 * Sets the number of internal fields for objects generated from 2436 * this template. 2437 */ 2438 void SetInternalFieldCount(int value); 2439 2440 private: 2441 ObjectTemplate(); 2442 static Local<ObjectTemplate> New(Handle<FunctionTemplate> constructor); 2443 friend class FunctionTemplate; 2444 }; 2445 2446 2447 /** 2448 * A Signature specifies which receivers and arguments a function can 2449 * legally be called with. 2450 */ 2451 class V8EXPORT Signature : public Data { 2452 public: 2453 static Local<Signature> New(Handle<FunctionTemplate> receiver = 2454 Handle<FunctionTemplate>(), 2455 int argc = 0, 2456 Handle<FunctionTemplate> argv[] = 0); 2457 private: 2458 Signature(); 2459 }; 2460 2461 2462 /** 2463 * A utility for determining the type of objects based on the template 2464 * they were constructed from. 2465 */ 2466 class V8EXPORT TypeSwitch : public Data { 2467 public: 2468 static Local<TypeSwitch> New(Handle<FunctionTemplate> type); 2469 static Local<TypeSwitch> New(int argc, Handle<FunctionTemplate> types[]); 2470 int match(Handle<Value> value); 2471 private: 2472 TypeSwitch(); 2473 }; 2474 2475 2476 // --- Extensions --- 2477 2478 class V8EXPORT ExternalAsciiStringResourceImpl 2479 : public String::ExternalAsciiStringResource { 2480 public: ExternalAsciiStringResourceImpl()2481 ExternalAsciiStringResourceImpl() : data_(0), length_(0) {} ExternalAsciiStringResourceImpl(const char * data,size_t length)2482 ExternalAsciiStringResourceImpl(const char* data, size_t length) 2483 : data_(data), length_(length) {} data()2484 const char* data() const { return data_; } length()2485 size_t length() const { return length_; } 2486 2487 private: 2488 const char* data_; 2489 size_t length_; 2490 }; 2491 2492 /** 2493 * Ignore 2494 */ 2495 class V8EXPORT Extension { // NOLINT 2496 public: 2497 // Note that the strings passed into this constructor must live as long 2498 // as the Extension itself. 2499 Extension(const char* name, 2500 const char* source = 0, 2501 int dep_count = 0, 2502 const char** deps = 0, 2503 int source_length = -1); ~Extension()2504 virtual ~Extension() { } 2505 virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction(v8::Handle<v8::String> name)2506 GetNativeFunction(v8::Handle<v8::String> name) { 2507 return v8::Handle<v8::FunctionTemplate>(); 2508 } 2509 name()2510 const char* name() const { return name_; } source_length()2511 size_t source_length() const { return source_length_; } source()2512 const String::ExternalAsciiStringResource* source() const { 2513 return &source_; } dependency_count()2514 int dependency_count() { return dep_count_; } dependencies()2515 const char** dependencies() { return deps_; } set_auto_enable(bool value)2516 void set_auto_enable(bool value) { auto_enable_ = value; } auto_enable()2517 bool auto_enable() { return auto_enable_; } 2518 2519 private: 2520 const char* name_; 2521 size_t source_length_; // expected to initialize before source_ 2522 ExternalAsciiStringResourceImpl source_; 2523 int dep_count_; 2524 const char** deps_; 2525 bool auto_enable_; 2526 2527 // Disallow copying and assigning. 2528 Extension(const Extension&); 2529 void operator=(const Extension&); 2530 }; 2531 2532 2533 void V8EXPORT RegisterExtension(Extension* extension); 2534 2535 2536 /** 2537 * Ignore 2538 */ 2539 class V8EXPORT DeclareExtension { 2540 public: DeclareExtension(Extension * extension)2541 inline DeclareExtension(Extension* extension) { 2542 RegisterExtension(extension); 2543 } 2544 }; 2545 2546 2547 // --- Statics --- 2548 2549 2550 Handle<Primitive> V8EXPORT Undefined(); 2551 Handle<Primitive> V8EXPORT Null(); 2552 Handle<Boolean> V8EXPORT True(); 2553 Handle<Boolean> V8EXPORT False(); 2554 2555 2556 /** 2557 * A set of constraints that specifies the limits of the runtime's memory use. 2558 * You must set the heap size before initializing the VM - the size cannot be 2559 * adjusted after the VM is initialized. 2560 * 2561 * If you are using threads then you should hold the V8::Locker lock while 2562 * setting the stack limit and you must set a non-default stack limit separately 2563 * for each thread. 2564 */ 2565 class V8EXPORT ResourceConstraints { 2566 public: 2567 ResourceConstraints(); max_young_space_size()2568 int max_young_space_size() const { return max_young_space_size_; } set_max_young_space_size(int value)2569 void set_max_young_space_size(int value) { max_young_space_size_ = value; } max_old_space_size()2570 int max_old_space_size() const { return max_old_space_size_; } set_max_old_space_size(int value)2571 void set_max_old_space_size(int value) { max_old_space_size_ = value; } max_executable_size()2572 int max_executable_size() { return max_executable_size_; } set_max_executable_size(int value)2573 void set_max_executable_size(int value) { max_executable_size_ = value; } stack_limit()2574 uint32_t* stack_limit() const { return stack_limit_; } 2575 // Sets an address beyond which the VM's stack may not grow. set_stack_limit(uint32_t * value)2576 void set_stack_limit(uint32_t* value) { stack_limit_ = value; } 2577 private: 2578 int max_young_space_size_; 2579 int max_old_space_size_; 2580 int max_executable_size_; 2581 uint32_t* stack_limit_; 2582 }; 2583 2584 2585 bool V8EXPORT SetResourceConstraints(ResourceConstraints* constraints); 2586 2587 2588 // --- Exceptions --- 2589 2590 2591 typedef void (*FatalErrorCallback)(const char* location, const char* message); 2592 2593 2594 typedef void (*MessageCallback)(Handle<Message> message, Handle<Value> data); 2595 2596 2597 /** 2598 * Schedules an exception to be thrown when returning to JavaScript. When an 2599 * exception has been scheduled it is illegal to invoke any JavaScript 2600 * operation; the caller must return immediately and only after the exception 2601 * has been handled does it become legal to invoke JavaScript operations. 2602 */ 2603 Handle<Value> V8EXPORT ThrowException(Handle<Value> exception); 2604 2605 /** 2606 * Create new error objects by calling the corresponding error object 2607 * constructor with the message. 2608 */ 2609 class V8EXPORT Exception { 2610 public: 2611 static Local<Value> RangeError(Handle<String> message); 2612 static Local<Value> ReferenceError(Handle<String> message); 2613 static Local<Value> SyntaxError(Handle<String> message); 2614 static Local<Value> TypeError(Handle<String> message); 2615 static Local<Value> Error(Handle<String> message); 2616 }; 2617 2618 2619 // --- Counters Callbacks --- 2620 2621 typedef int* (*CounterLookupCallback)(const char* name); 2622 2623 typedef void* (*CreateHistogramCallback)(const char* name, 2624 int min, 2625 int max, 2626 size_t buckets); 2627 2628 typedef void (*AddHistogramSampleCallback)(void* histogram, int sample); 2629 2630 // --- Memory Allocation Callback --- 2631 enum ObjectSpace { 2632 kObjectSpaceNewSpace = 1 << 0, 2633 kObjectSpaceOldPointerSpace = 1 << 1, 2634 kObjectSpaceOldDataSpace = 1 << 2, 2635 kObjectSpaceCodeSpace = 1 << 3, 2636 kObjectSpaceMapSpace = 1 << 4, 2637 kObjectSpaceLoSpace = 1 << 5, 2638 2639 kObjectSpaceAll = kObjectSpaceNewSpace | kObjectSpaceOldPointerSpace | 2640 kObjectSpaceOldDataSpace | kObjectSpaceCodeSpace | kObjectSpaceMapSpace | 2641 kObjectSpaceLoSpace 2642 }; 2643 2644 enum AllocationAction { 2645 kAllocationActionAllocate = 1 << 0, 2646 kAllocationActionFree = 1 << 1, 2647 kAllocationActionAll = kAllocationActionAllocate | kAllocationActionFree 2648 }; 2649 2650 typedef void (*MemoryAllocationCallback)(ObjectSpace space, 2651 AllocationAction action, 2652 int size); 2653 2654 // --- Leave Script Callback --- 2655 typedef void (*CallCompletedCallback)(); 2656 2657 // --- Failed Access Check Callback --- 2658 typedef void (*FailedAccessCheckCallback)(Local<Object> target, 2659 AccessType type, 2660 Local<Value> data); 2661 2662 // --- AllowCodeGenerationFromStrings callbacks --- 2663 2664 /** 2665 * Callback to check if code generation from strings is allowed. See 2666 * Context::AllowCodeGenerationFromStrings. 2667 */ 2668 typedef bool (*AllowCodeGenerationFromStringsCallback)(Local<Context> context); 2669 2670 // --- Garbage Collection Callbacks --- 2671 2672 /** 2673 * Applications can register callback functions which will be called 2674 * before and after a garbage collection. Allocations are not 2675 * allowed in the callback functions, you therefore cannot manipulate 2676 * objects (set or delete properties for example) since it is possible 2677 * such operations will result in the allocation of objects. 2678 */ 2679 enum GCType { 2680 kGCTypeScavenge = 1 << 0, 2681 kGCTypeMarkSweepCompact = 1 << 1, 2682 kGCTypeAll = kGCTypeScavenge | kGCTypeMarkSweepCompact 2683 }; 2684 2685 enum GCCallbackFlags { 2686 kNoGCCallbackFlags = 0, 2687 kGCCallbackFlagCompacted = 1 << 0 2688 }; 2689 2690 typedef void (*GCPrologueCallback)(GCType type, GCCallbackFlags flags); 2691 typedef void (*GCEpilogueCallback)(GCType type, GCCallbackFlags flags); 2692 2693 typedef void (*GCCallback)(); 2694 2695 2696 /** 2697 * Collection of V8 heap information. 2698 * 2699 * Instances of this class can be passed to v8::V8::HeapStatistics to 2700 * get heap statistics from V8. 2701 */ 2702 class V8EXPORT HeapStatistics { 2703 public: 2704 HeapStatistics(); total_heap_size()2705 size_t total_heap_size() { return total_heap_size_; } total_heap_size_executable()2706 size_t total_heap_size_executable() { return total_heap_size_executable_; } used_heap_size()2707 size_t used_heap_size() { return used_heap_size_; } heap_size_limit()2708 size_t heap_size_limit() { return heap_size_limit_; } 2709 2710 private: set_total_heap_size(size_t size)2711 void set_total_heap_size(size_t size) { total_heap_size_ = size; } set_total_heap_size_executable(size_t size)2712 void set_total_heap_size_executable(size_t size) { 2713 total_heap_size_executable_ = size; 2714 } set_used_heap_size(size_t size)2715 void set_used_heap_size(size_t size) { used_heap_size_ = size; } set_heap_size_limit(size_t size)2716 void set_heap_size_limit(size_t size) { heap_size_limit_ = size; } 2717 2718 size_t total_heap_size_; 2719 size_t total_heap_size_executable_; 2720 size_t used_heap_size_; 2721 size_t heap_size_limit_; 2722 2723 friend class V8; 2724 }; 2725 2726 2727 class RetainedObjectInfo; 2728 2729 /** 2730 * Isolate represents an isolated instance of the V8 engine. V8 2731 * isolates have completely separate states. Objects from one isolate 2732 * must not be used in other isolates. When V8 is initialized a 2733 * default isolate is implicitly created and entered. The embedder 2734 * can create additional isolates and use them in parallel in multiple 2735 * threads. An isolate can be entered by at most one thread at any 2736 * given time. The Locker/Unlocker API must be used to synchronize. 2737 */ 2738 class V8EXPORT Isolate { 2739 public: 2740 /** 2741 * Stack-allocated class which sets the isolate for all operations 2742 * executed within a local scope. 2743 */ 2744 class V8EXPORT Scope { 2745 public: Scope(Isolate * isolate)2746 explicit Scope(Isolate* isolate) : isolate_(isolate) { 2747 isolate->Enter(); 2748 } 2749 ~Scope()2750 ~Scope() { isolate_->Exit(); } 2751 2752 private: 2753 Isolate* const isolate_; 2754 2755 // Prevent copying of Scope objects. 2756 Scope(const Scope&); 2757 Scope& operator=(const Scope&); 2758 }; 2759 2760 /** 2761 * Creates a new isolate. Does not change the currently entered 2762 * isolate. 2763 * 2764 * When an isolate is no longer used its resources should be freed 2765 * by calling Dispose(). Using the delete operator is not allowed. 2766 */ 2767 static Isolate* New(); 2768 2769 /** 2770 * Returns the entered isolate for the current thread or NULL in 2771 * case there is no current isolate. 2772 */ 2773 static Isolate* GetCurrent(); 2774 2775 /** 2776 * Methods below this point require holding a lock (using Locker) in 2777 * a multi-threaded environment. 2778 */ 2779 2780 /** 2781 * Sets this isolate as the entered one for the current thread. 2782 * Saves the previously entered one (if any), so that it can be 2783 * restored when exiting. Re-entering an isolate is allowed. 2784 */ 2785 void Enter(); 2786 2787 /** 2788 * Exits this isolate by restoring the previously entered one in the 2789 * current thread. The isolate may still stay the same, if it was 2790 * entered more than once. 2791 * 2792 * Requires: this == Isolate::GetCurrent(). 2793 */ 2794 void Exit(); 2795 2796 /** 2797 * Disposes the isolate. The isolate must not be entered by any 2798 * thread to be disposable. 2799 */ 2800 void Dispose(); 2801 2802 /** 2803 * Associate embedder-specific data with the isolate 2804 */ 2805 void SetData(void* data); 2806 2807 /** 2808 * Retrive embedder-specific data from the isolate. 2809 * Returns NULL if SetData has never been called. 2810 */ 2811 void* GetData(); 2812 2813 private: 2814 Isolate(); 2815 Isolate(const Isolate&); 2816 ~Isolate(); 2817 Isolate& operator=(const Isolate&); 2818 void* operator new(size_t size); 2819 void operator delete(void*, size_t); 2820 }; 2821 2822 2823 class StartupData { 2824 public: 2825 enum CompressionAlgorithm { 2826 kUncompressed, 2827 kBZip2 2828 }; 2829 2830 const char* data; 2831 int compressed_size; 2832 int raw_size; 2833 }; 2834 2835 2836 /** 2837 * A helper class for driving V8 startup data decompression. It is based on 2838 * "CompressedStartupData" API functions from the V8 class. It isn't mandatory 2839 * for an embedder to use this class, instead, API functions can be used 2840 * directly. 2841 * 2842 * For an example of the class usage, see the "shell.cc" sample application. 2843 */ 2844 class V8EXPORT StartupDataDecompressor { // NOLINT 2845 public: 2846 StartupDataDecompressor(); 2847 virtual ~StartupDataDecompressor(); 2848 int Decompress(); 2849 2850 protected: 2851 virtual int DecompressData(char* raw_data, 2852 int* raw_data_size, 2853 const char* compressed_data, 2854 int compressed_data_size) = 0; 2855 2856 private: 2857 char** raw_data; 2858 }; 2859 2860 2861 /** 2862 * EntropySource is used as a callback function when v8 needs a source 2863 * of entropy. 2864 */ 2865 typedef bool (*EntropySource)(unsigned char* buffer, size_t length); 2866 2867 2868 /** 2869 * ReturnAddressLocationResolver is used as a callback function when v8 is 2870 * resolving the location of a return address on the stack. Profilers that 2871 * change the return address on the stack can use this to resolve the stack 2872 * location to whereever the profiler stashed the original return address. 2873 * When invoked, return_addr_location will point to a location on stack where 2874 * a machine return address resides, this function should return either the 2875 * same pointer, or a pointer to the profiler's copy of the original return 2876 * address. 2877 */ 2878 typedef uintptr_t (*ReturnAddressLocationResolver)( 2879 uintptr_t return_addr_location); 2880 2881 2882 /** 2883 * Interface for iterating though all external resources in the heap. 2884 */ 2885 class V8EXPORT ExternalResourceVisitor { // NOLINT 2886 public: ~ExternalResourceVisitor()2887 virtual ~ExternalResourceVisitor() {} VisitExternalString(Handle<String> string)2888 virtual void VisitExternalString(Handle<String> string) {} 2889 }; 2890 2891 2892 /** 2893 * Container class for static utility functions. 2894 */ 2895 class V8EXPORT V8 { 2896 public: 2897 /** Set the callback to invoke in case of fatal errors. */ 2898 static void SetFatalErrorHandler(FatalErrorCallback that); 2899 2900 /** 2901 * Set the callback to invoke to check if code generation from 2902 * strings should be allowed. 2903 */ 2904 static void SetAllowCodeGenerationFromStringsCallback( 2905 AllowCodeGenerationFromStringsCallback that); 2906 2907 /** 2908 * Ignore out-of-memory exceptions. 2909 * 2910 * V8 running out of memory is treated as a fatal error by default. 2911 * This means that the fatal error handler is called and that V8 is 2912 * terminated. 2913 * 2914 * IgnoreOutOfMemoryException can be used to not treat an 2915 * out-of-memory situation as a fatal error. This way, the contexts 2916 * that did not cause the out of memory problem might be able to 2917 * continue execution. 2918 */ 2919 static void IgnoreOutOfMemoryException(); 2920 2921 /** 2922 * Check if V8 is dead and therefore unusable. This is the case after 2923 * fatal errors such as out-of-memory situations. 2924 */ 2925 static bool IsDead(); 2926 2927 /** 2928 * The following 4 functions are to be used when V8 is built with 2929 * the 'compress_startup_data' flag enabled. In this case, the 2930 * embedder must decompress startup data prior to initializing V8. 2931 * 2932 * This is how interaction with V8 should look like: 2933 * int compressed_data_count = v8::V8::GetCompressedStartupDataCount(); 2934 * v8::StartupData* compressed_data = 2935 * new v8::StartupData[compressed_data_count]; 2936 * v8::V8::GetCompressedStartupData(compressed_data); 2937 * ... decompress data (compressed_data can be updated in-place) ... 2938 * v8::V8::SetDecompressedStartupData(compressed_data); 2939 * ... now V8 can be initialized 2940 * ... make sure the decompressed data stays valid until V8 shutdown 2941 * 2942 * A helper class StartupDataDecompressor is provided. It implements 2943 * the protocol of the interaction described above, and can be used in 2944 * most cases instead of calling these API functions directly. 2945 */ 2946 static StartupData::CompressionAlgorithm GetCompressedStartupDataAlgorithm(); 2947 static int GetCompressedStartupDataCount(); 2948 static void GetCompressedStartupData(StartupData* compressed_data); 2949 static void SetDecompressedStartupData(StartupData* decompressed_data); 2950 2951 /** 2952 * Adds a message listener. 2953 * 2954 * The same message listener can be added more than once and in that 2955 * case it will be called more than once for each message. 2956 */ 2957 static bool AddMessageListener(MessageCallback that, 2958 Handle<Value> data = Handle<Value>()); 2959 2960 /** 2961 * Remove all message listeners from the specified callback function. 2962 */ 2963 static void RemoveMessageListeners(MessageCallback that); 2964 2965 /** 2966 * Tells V8 to capture current stack trace when uncaught exception occurs 2967 * and report it to the message listeners. The option is off by default. 2968 */ 2969 static void SetCaptureStackTraceForUncaughtExceptions( 2970 bool capture, 2971 int frame_limit = 10, 2972 StackTrace::StackTraceOptions options = StackTrace::kOverview); 2973 2974 /** 2975 * Sets V8 flags from a string. 2976 */ 2977 static void SetFlagsFromString(const char* str, int length); 2978 2979 /** 2980 * Sets V8 flags from the command line. 2981 */ 2982 static void SetFlagsFromCommandLine(int* argc, 2983 char** argv, 2984 bool remove_flags); 2985 2986 /** Get the version string. */ 2987 static const char* GetVersion(); 2988 2989 /** 2990 * Enables the host application to provide a mechanism for recording 2991 * statistics counters. 2992 */ 2993 static void SetCounterFunction(CounterLookupCallback); 2994 2995 /** 2996 * Enables the host application to provide a mechanism for recording 2997 * histograms. The CreateHistogram function returns a 2998 * histogram which will later be passed to the AddHistogramSample 2999 * function. 3000 */ 3001 static void SetCreateHistogramFunction(CreateHistogramCallback); 3002 static void SetAddHistogramSampleFunction(AddHistogramSampleCallback); 3003 3004 /** 3005 * Enables the computation of a sliding window of states. The sliding 3006 * window information is recorded in statistics counters. 3007 */ 3008 static void EnableSlidingStateWindow(); 3009 3010 /** Callback function for reporting failed access checks.*/ 3011 static void SetFailedAccessCheckCallbackFunction(FailedAccessCheckCallback); 3012 3013 /** 3014 * Enables the host application to receive a notification before a 3015 * garbage collection. Allocations are not allowed in the 3016 * callback function, you therefore cannot manipulate objects (set 3017 * or delete properties for example) since it is possible such 3018 * operations will result in the allocation of objects. It is possible 3019 * to specify the GCType filter for your callback. But it is not possible to 3020 * register the same callback function two times with different 3021 * GCType filters. 3022 */ 3023 static void AddGCPrologueCallback( 3024 GCPrologueCallback callback, GCType gc_type_filter = kGCTypeAll); 3025 3026 /** 3027 * This function removes callback which was installed by 3028 * AddGCPrologueCallback function. 3029 */ 3030 static void RemoveGCPrologueCallback(GCPrologueCallback callback); 3031 3032 /** 3033 * The function is deprecated. Please use AddGCPrologueCallback instead. 3034 * Enables the host application to receive a notification before a 3035 * garbage collection. Allocations are not allowed in the 3036 * callback function, you therefore cannot manipulate objects (set 3037 * or delete properties for example) since it is possible such 3038 * operations will result in the allocation of objects. 3039 */ 3040 static void SetGlobalGCPrologueCallback(GCCallback); 3041 3042 /** 3043 * Enables the host application to receive a notification after a 3044 * garbage collection. Allocations are not allowed in the 3045 * callback function, you therefore cannot manipulate objects (set 3046 * or delete properties for example) since it is possible such 3047 * operations will result in the allocation of objects. It is possible 3048 * to specify the GCType filter for your callback. But it is not possible to 3049 * register the same callback function two times with different 3050 * GCType filters. 3051 */ 3052 static void AddGCEpilogueCallback( 3053 GCEpilogueCallback callback, GCType gc_type_filter = kGCTypeAll); 3054 3055 /** 3056 * This function removes callback which was installed by 3057 * AddGCEpilogueCallback function. 3058 */ 3059 static void RemoveGCEpilogueCallback(GCEpilogueCallback callback); 3060 3061 /** 3062 * The function is deprecated. Please use AddGCEpilogueCallback instead. 3063 * Enables the host application to receive a notification after a 3064 * major garbage collection. Allocations are not allowed in the 3065 * callback function, you therefore cannot manipulate objects (set 3066 * or delete properties for example) since it is possible such 3067 * operations will result in the allocation of objects. 3068 */ 3069 static void SetGlobalGCEpilogueCallback(GCCallback); 3070 3071 /** 3072 * Enables the host application to provide a mechanism to be notified 3073 * and perform custom logging when V8 Allocates Executable Memory. 3074 */ 3075 static void AddMemoryAllocationCallback(MemoryAllocationCallback callback, 3076 ObjectSpace space, 3077 AllocationAction action); 3078 3079 /** 3080 * Removes callback that was installed by AddMemoryAllocationCallback. 3081 */ 3082 static void RemoveMemoryAllocationCallback(MemoryAllocationCallback callback); 3083 3084 /** 3085 * Adds a callback to notify the host application when a script finished 3086 * running. If a script re-enters the runtime during executing, the 3087 * CallCompletedCallback is only invoked when the outer-most script 3088 * execution ends. Executing scripts inside the callback do not trigger 3089 * further callbacks. 3090 */ 3091 static void AddCallCompletedCallback(CallCompletedCallback callback); 3092 3093 /** 3094 * Removes callback that was installed by AddCallCompletedCallback. 3095 */ 3096 static void RemoveCallCompletedCallback(CallCompletedCallback callback); 3097 3098 /** 3099 * Allows the host application to group objects together. If one 3100 * object in the group is alive, all objects in the group are alive. 3101 * After each garbage collection, object groups are removed. It is 3102 * intended to be used in the before-garbage-collection callback 3103 * function, for instance to simulate DOM tree connections among JS 3104 * wrapper objects. 3105 * See v8-profiler.h for RetainedObjectInfo interface description. 3106 */ 3107 static void AddObjectGroup(Persistent<Value>* objects, 3108 size_t length, 3109 RetainedObjectInfo* info = NULL); 3110 3111 /** 3112 * Allows the host application to declare implicit references between 3113 * the objects: if |parent| is alive, all |children| are alive too. 3114 * After each garbage collection, all implicit references 3115 * are removed. It is intended to be used in the before-garbage-collection 3116 * callback function. 3117 */ 3118 static void AddImplicitReferences(Persistent<Object> parent, 3119 Persistent<Value>* children, 3120 size_t length); 3121 3122 /** 3123 * Initializes from snapshot if possible. Otherwise, attempts to 3124 * initialize from scratch. This function is called implicitly if 3125 * you use the API without calling it first. 3126 */ 3127 static bool Initialize(); 3128 3129 /** 3130 * Allows the host application to provide a callback which can be used 3131 * as a source of entropy for random number generators. 3132 */ 3133 static void SetEntropySource(EntropySource source); 3134 3135 /** 3136 * Allows the host application to provide a callback that allows v8 to 3137 * cooperate with a profiler that rewrites return addresses on stack. 3138 */ 3139 static void SetReturnAddressLocationResolver( 3140 ReturnAddressLocationResolver return_address_resolver); 3141 3142 /** 3143 * Adjusts the amount of registered external memory. Used to give 3144 * V8 an indication of the amount of externally allocated memory 3145 * that is kept alive by JavaScript objects. V8 uses this to decide 3146 * when to perform global garbage collections. Registering 3147 * externally allocated memory will trigger global garbage 3148 * collections more often than otherwise in an attempt to garbage 3149 * collect the JavaScript objects keeping the externally allocated 3150 * memory alive. 3151 * 3152 * \param change_in_bytes the change in externally allocated memory 3153 * that is kept alive by JavaScript objects. 3154 * \returns the adjusted value. 3155 */ 3156 static int AdjustAmountOfExternalAllocatedMemory(int change_in_bytes); 3157 3158 /** 3159 * Suspends recording of tick samples in the profiler. 3160 * When the V8 profiling mode is enabled (usually via command line 3161 * switches) this function suspends recording of tick samples. 3162 * Profiling ticks are discarded until ResumeProfiler() is called. 3163 * 3164 * See also the --prof and --prof_auto command line switches to 3165 * enable V8 profiling. 3166 */ 3167 static void PauseProfiler(); 3168 3169 /** 3170 * Resumes recording of tick samples in the profiler. 3171 * See also PauseProfiler(). 3172 */ 3173 static void ResumeProfiler(); 3174 3175 /** 3176 * Return whether profiler is currently paused. 3177 */ 3178 static bool IsProfilerPaused(); 3179 3180 /** 3181 * Retrieve the V8 thread id of the calling thread. 3182 * 3183 * The thread id for a thread should only be retrieved after the V8 3184 * lock has been acquired with a Locker object with that thread. 3185 */ 3186 static int GetCurrentThreadId(); 3187 3188 /** 3189 * Forcefully terminate execution of a JavaScript thread. This can 3190 * be used to terminate long-running scripts. 3191 * 3192 * TerminateExecution should only be called when then V8 lock has 3193 * been acquired with a Locker object. Therefore, in order to be 3194 * able to terminate long-running threads, preemption must be 3195 * enabled to allow the user of TerminateExecution to acquire the 3196 * lock. 3197 * 3198 * The termination is achieved by throwing an exception that is 3199 * uncatchable by JavaScript exception handlers. Termination 3200 * exceptions act as if they were caught by a C++ TryCatch exception 3201 * handler. If forceful termination is used, any C++ TryCatch 3202 * exception handler that catches an exception should check if that 3203 * exception is a termination exception and immediately return if 3204 * that is the case. Returning immediately in that case will 3205 * continue the propagation of the termination exception if needed. 3206 * 3207 * The thread id passed to TerminateExecution must have been 3208 * obtained by calling GetCurrentThreadId on the thread in question. 3209 * 3210 * \param thread_id The thread id of the thread to terminate. 3211 */ 3212 static void TerminateExecution(int thread_id); 3213 3214 /** 3215 * Forcefully terminate the current thread of JavaScript execution 3216 * in the given isolate. If no isolate is provided, the default 3217 * isolate is used. 3218 * 3219 * This method can be used by any thread even if that thread has not 3220 * acquired the V8 lock with a Locker object. 3221 * 3222 * \param isolate The isolate in which to terminate the current JS execution. 3223 */ 3224 static void TerminateExecution(Isolate* isolate = NULL); 3225 3226 /** 3227 * Is V8 terminating JavaScript execution. 3228 * 3229 * Returns true if JavaScript execution is currently terminating 3230 * because of a call to TerminateExecution. In that case there are 3231 * still JavaScript frames on the stack and the termination 3232 * exception is still active. 3233 * 3234 * \param isolate The isolate in which to check. 3235 */ 3236 static bool IsExecutionTerminating(Isolate* isolate = NULL); 3237 3238 /** 3239 * Releases any resources used by v8 and stops any utility threads 3240 * that may be running. Note that disposing v8 is permanent, it 3241 * cannot be reinitialized. 3242 * 3243 * It should generally not be necessary to dispose v8 before exiting 3244 * a process, this should happen automatically. It is only necessary 3245 * to use if the process needs the resources taken up by v8. 3246 */ 3247 static bool Dispose(); 3248 3249 /** 3250 * Get statistics about the heap memory usage. 3251 */ 3252 static void GetHeapStatistics(HeapStatistics* heap_statistics); 3253 3254 /** 3255 * Iterates through all external resources referenced from current isolate 3256 * heap. This method is not expected to be used except for debugging purposes 3257 * and may be quite slow. 3258 */ 3259 static void VisitExternalResources(ExternalResourceVisitor* visitor); 3260 3261 /** 3262 * Optional notification that the embedder is idle. 3263 * V8 uses the notification to reduce memory footprint. 3264 * This call can be used repeatedly if the embedder remains idle. 3265 * Returns true if the embedder should stop calling IdleNotification 3266 * until real work has been done. This indicates that V8 has done 3267 * as much cleanup as it will be able to do. 3268 * 3269 * The hint argument specifies the amount of work to be done in the function 3270 * on scale from 1 to 1000. There is no guarantee that the actual work will 3271 * match the hint. 3272 */ 3273 static bool IdleNotification(int hint = 1000); 3274 3275 /** 3276 * Optional notification that the system is running low on memory. 3277 * V8 uses these notifications to attempt to free memory. 3278 */ 3279 static void LowMemoryNotification(); 3280 3281 /** 3282 * Optional notification that a context has been disposed. V8 uses 3283 * these notifications to guide the GC heuristic. Returns the number 3284 * of context disposals - including this one - since the last time 3285 * V8 had a chance to clean up. 3286 */ 3287 static int ContextDisposedNotification(); 3288 3289 private: 3290 V8(); 3291 3292 static internal::Object** GlobalizeReference(internal::Object** handle); 3293 static void DisposeGlobal(internal::Object** global_handle); 3294 static void MakeWeak(internal::Object** global_handle, 3295 void* data, 3296 WeakReferenceCallback); 3297 static void ClearWeak(internal::Object** global_handle); 3298 static void MarkIndependent(internal::Object** global_handle); 3299 static bool IsGlobalNearDeath(internal::Object** global_handle); 3300 static bool IsGlobalWeak(internal::Object** global_handle); 3301 static void SetWrapperClassId(internal::Object** global_handle, 3302 uint16_t class_id); 3303 3304 template <class T> friend class Handle; 3305 template <class T> friend class Local; 3306 template <class T> friend class Persistent; 3307 friend class Context; 3308 }; 3309 3310 3311 /** 3312 * An external exception handler. 3313 */ 3314 class V8EXPORT TryCatch { 3315 public: 3316 /** 3317 * Creates a new try/catch block and registers it with v8. 3318 */ 3319 TryCatch(); 3320 3321 /** 3322 * Unregisters and deletes this try/catch block. 3323 */ 3324 ~TryCatch(); 3325 3326 /** 3327 * Returns true if an exception has been caught by this try/catch block. 3328 */ 3329 bool HasCaught() const; 3330 3331 /** 3332 * For certain types of exceptions, it makes no sense to continue 3333 * execution. 3334 * 3335 * Currently, the only type of exception that can be caught by a 3336 * TryCatch handler and for which it does not make sense to continue 3337 * is termination exception. Such exceptions are thrown when the 3338 * TerminateExecution methods are called to terminate a long-running 3339 * script. 3340 * 3341 * If CanContinue returns false, the correct action is to perform 3342 * any C++ cleanup needed and then return. 3343 */ 3344 bool CanContinue() const; 3345 3346 /** 3347 * Throws the exception caught by this TryCatch in a way that avoids 3348 * it being caught again by this same TryCatch. As with ThrowException 3349 * it is illegal to execute any JavaScript operations after calling 3350 * ReThrow; the caller must return immediately to where the exception 3351 * is caught. 3352 */ 3353 Handle<Value> ReThrow(); 3354 3355 /** 3356 * Returns the exception caught by this try/catch block. If no exception has 3357 * been caught an empty handle is returned. 3358 * 3359 * The returned handle is valid until this TryCatch block has been destroyed. 3360 */ 3361 Local<Value> Exception() const; 3362 3363 /** 3364 * Returns the .stack property of the thrown object. If no .stack 3365 * property is present an empty handle is returned. 3366 */ 3367 Local<Value> StackTrace() const; 3368 3369 /** 3370 * Returns the message associated with this exception. If there is 3371 * no message associated an empty handle is returned. 3372 * 3373 * The returned handle is valid until this TryCatch block has been 3374 * destroyed. 3375 */ 3376 Local<v8::Message> Message() const; 3377 3378 /** 3379 * Clears any exceptions that may have been caught by this try/catch block. 3380 * After this method has been called, HasCaught() will return false. 3381 * 3382 * It is not necessary to clear a try/catch block before using it again; if 3383 * another exception is thrown the previously caught exception will just be 3384 * overwritten. However, it is often a good idea since it makes it easier 3385 * to determine which operation threw a given exception. 3386 */ 3387 void Reset(); 3388 3389 /** 3390 * Set verbosity of the external exception handler. 3391 * 3392 * By default, exceptions that are caught by an external exception 3393 * handler are not reported. Call SetVerbose with true on an 3394 * external exception handler to have exceptions caught by the 3395 * handler reported as if they were not caught. 3396 */ 3397 void SetVerbose(bool value); 3398 3399 /** 3400 * Set whether or not this TryCatch should capture a Message object 3401 * which holds source information about where the exception 3402 * occurred. True by default. 3403 */ 3404 void SetCaptureMessage(bool value); 3405 3406 private: 3407 v8::internal::Isolate* isolate_; 3408 void* next_; 3409 void* exception_; 3410 void* message_; 3411 bool is_verbose_ : 1; 3412 bool can_continue_ : 1; 3413 bool capture_message_ : 1; 3414 bool rethrow_ : 1; 3415 3416 friend class v8::internal::Isolate; 3417 }; 3418 3419 3420 // --- Context --- 3421 3422 3423 /** 3424 * Ignore 3425 */ 3426 class V8EXPORT ExtensionConfiguration { 3427 public: ExtensionConfiguration(int name_count,const char * names[])3428 ExtensionConfiguration(int name_count, const char* names[]) 3429 : name_count_(name_count), names_(names) { } 3430 private: 3431 friend class ImplementationUtilities; 3432 int name_count_; 3433 const char** names_; 3434 }; 3435 3436 3437 /** 3438 * A sandboxed execution context with its own set of built-in objects 3439 * and functions. 3440 */ 3441 class V8EXPORT Context { 3442 public: 3443 /** 3444 * Returns the global proxy object or global object itself for 3445 * detached contexts. 3446 * 3447 * Global proxy object is a thin wrapper whose prototype points to 3448 * actual context's global object with the properties like Object, etc. 3449 * This is done that way for security reasons (for more details see 3450 * https://wiki.mozilla.org/Gecko:SplitWindow). 3451 * 3452 * Please note that changes to global proxy object prototype most probably 3453 * would break VM---v8 expects only global object as a prototype of 3454 * global proxy object. 3455 * 3456 * If DetachGlobal() has been invoked, Global() would return actual global 3457 * object until global is reattached with ReattachGlobal(). 3458 */ 3459 Local<Object> Global(); 3460 3461 /** 3462 * Detaches the global object from its context before 3463 * the global object can be reused to create a new context. 3464 */ 3465 void DetachGlobal(); 3466 3467 /** 3468 * Reattaches a global object to a context. This can be used to 3469 * restore the connection between a global object and a context 3470 * after DetachGlobal has been called. 3471 * 3472 * \param global_object The global object to reattach to the 3473 * context. For this to work, the global object must be the global 3474 * object that was associated with this context before a call to 3475 * DetachGlobal. 3476 */ 3477 void ReattachGlobal(Handle<Object> global_object); 3478 3479 /** Creates a new context. 3480 * 3481 * Returns a persistent handle to the newly allocated context. This 3482 * persistent handle has to be disposed when the context is no 3483 * longer used so the context can be garbage collected. 3484 * 3485 * \param extensions An optional extension configuration containing 3486 * the extensions to be installed in the newly created context. 3487 * 3488 * \param global_template An optional object template from which the 3489 * global object for the newly created context will be created. 3490 * 3491 * \param global_object An optional global object to be reused for 3492 * the newly created context. This global object must have been 3493 * created by a previous call to Context::New with the same global 3494 * template. The state of the global object will be completely reset 3495 * and only object identify will remain. 3496 */ 3497 static Persistent<Context> New( 3498 ExtensionConfiguration* extensions = NULL, 3499 Handle<ObjectTemplate> global_template = Handle<ObjectTemplate>(), 3500 Handle<Value> global_object = Handle<Value>()); 3501 3502 /** Returns the last entered context. */ 3503 static Local<Context> GetEntered(); 3504 3505 /** Returns the context that is on the top of the stack. */ 3506 static Local<Context> GetCurrent(); 3507 3508 /** 3509 * Returns the context of the calling JavaScript code. That is the 3510 * context of the top-most JavaScript frame. If there are no 3511 * JavaScript frames an empty handle is returned. 3512 */ 3513 static Local<Context> GetCalling(); 3514 3515 /** 3516 * Sets the security token for the context. To access an object in 3517 * another context, the security tokens must match. 3518 */ 3519 void SetSecurityToken(Handle<Value> token); 3520 3521 /** Restores the security token to the default value. */ 3522 void UseDefaultSecurityToken(); 3523 3524 /** Returns the security token of this context.*/ 3525 Handle<Value> GetSecurityToken(); 3526 3527 /** 3528 * Enter this context. After entering a context, all code compiled 3529 * and run is compiled and run in this context. If another context 3530 * is already entered, this old context is saved so it can be 3531 * restored when the new context is exited. 3532 */ 3533 void Enter(); 3534 3535 /** 3536 * Exit this context. Exiting the current context restores the 3537 * context that was in place when entering the current context. 3538 */ 3539 void Exit(); 3540 3541 /** Returns true if the context has experienced an out of memory situation. */ 3542 bool HasOutOfMemoryException(); 3543 3544 /** Returns true if V8 has a current context. */ 3545 static bool InContext(); 3546 3547 /** 3548 * Associate an additional data object with the context. This is mainly used 3549 * with the debugger to provide additional information on the context through 3550 * the debugger API. 3551 */ 3552 void SetData(Handle<String> data); 3553 Local<Value> GetData(); 3554 3555 /** 3556 * Control whether code generation from strings is allowed. Calling 3557 * this method with false will disable 'eval' and the 'Function' 3558 * constructor for code running in this context. If 'eval' or the 3559 * 'Function' constructor are used an exception will be thrown. 3560 * 3561 * If code generation from strings is not allowed the 3562 * V8::AllowCodeGenerationFromStrings callback will be invoked if 3563 * set before blocking the call to 'eval' or the 'Function' 3564 * constructor. If that callback returns true, the call will be 3565 * allowed, otherwise an exception will be thrown. If no callback is 3566 * set an exception will be thrown. 3567 */ 3568 void AllowCodeGenerationFromStrings(bool allow); 3569 3570 /** 3571 * Returns true if code generation from strings is allowed for the context. 3572 * For more details see AllowCodeGenerationFromStrings(bool) documentation. 3573 */ 3574 bool IsCodeGenerationFromStringsAllowed(); 3575 3576 /** 3577 * Stack-allocated class which sets the execution context for all 3578 * operations executed within a local scope. 3579 */ 3580 class Scope { 3581 public: Scope(Handle<Context> context)3582 explicit inline Scope(Handle<Context> context) : context_(context) { 3583 context_->Enter(); 3584 } ~Scope()3585 inline ~Scope() { context_->Exit(); } 3586 private: 3587 Handle<Context> context_; 3588 }; 3589 3590 private: 3591 friend class Value; 3592 friend class Script; 3593 friend class Object; 3594 friend class Function; 3595 }; 3596 3597 3598 /** 3599 * Multiple threads in V8 are allowed, but only one thread at a time 3600 * is allowed to use any given V8 isolate. See Isolate class 3601 * comments. The definition of 'using V8 isolate' includes 3602 * accessing handles or holding onto object pointers obtained 3603 * from V8 handles while in the particular V8 isolate. It is up 3604 * to the user of V8 to ensure (perhaps with locking) that this 3605 * constraint is not violated. In addition to any other synchronization 3606 * mechanism that may be used, the v8::Locker and v8::Unlocker classes 3607 * must be used to signal thead switches to V8. 3608 * 3609 * v8::Locker is a scoped lock object. While it's 3610 * active (i.e. between its construction and destruction) the current thread is 3611 * allowed to use the locked isolate. V8 guarantees that an isolate can be 3612 * locked by at most one thread at any time. In other words, the scope of a 3613 * v8::Locker is a critical section. 3614 * 3615 * Sample usage: 3616 * \code 3617 * ... 3618 * { 3619 * v8::Locker locker(isolate); 3620 * v8::Isolate::Scope isolate_scope(isolate); 3621 * ... 3622 * // Code using V8 and isolate goes here. 3623 * ... 3624 * } // Destructor called here 3625 * \endcode 3626 * 3627 * If you wish to stop using V8 in a thread A you can do this either 3628 * by destroying the v8::Locker object as above or by constructing a 3629 * v8::Unlocker object: 3630 * 3631 * \code 3632 * { 3633 * isolate->Exit(); 3634 * v8::Unlocker unlocker(isolate); 3635 * ... 3636 * // Code not using V8 goes here while V8 can run in another thread. 3637 * ... 3638 * } // Destructor called here. 3639 * isolate->Enter(); 3640 * \endcode 3641 * 3642 * The Unlocker object is intended for use in a long-running callback 3643 * from V8, where you want to release the V8 lock for other threads to 3644 * use. 3645 * 3646 * The v8::Locker is a recursive lock. That is, you can lock more than 3647 * once in a given thread. This can be useful if you have code that can 3648 * be called either from code that holds the lock or from code that does 3649 * not. The Unlocker is not recursive so you can not have several 3650 * Unlockers on the stack at once, and you can not use an Unlocker in a 3651 * thread that is not inside a Locker's scope. 3652 * 3653 * An unlocker will unlock several lockers if it has to and reinstate 3654 * the correct depth of locking on its destruction. eg.: 3655 * 3656 * \code 3657 * // V8 not locked. 3658 * { 3659 * v8::Locker locker(isolate); 3660 * Isolate::Scope isolate_scope(isolate); 3661 * // V8 locked. 3662 * { 3663 * v8::Locker another_locker(isolate); 3664 * // V8 still locked (2 levels). 3665 * { 3666 * isolate->Exit(); 3667 * v8::Unlocker unlocker(isolate); 3668 * // V8 not locked. 3669 * } 3670 * isolate->Enter(); 3671 * // V8 locked again (2 levels). 3672 * } 3673 * // V8 still locked (1 level). 3674 * } 3675 * // V8 Now no longer locked. 3676 * \endcode 3677 * 3678 * 3679 */ 3680 class V8EXPORT Unlocker { 3681 public: 3682 /** 3683 * Initialize Unlocker for a given Isolate. NULL means default isolate. 3684 */ 3685 explicit Unlocker(Isolate* isolate = NULL); 3686 ~Unlocker(); 3687 private: 3688 internal::Isolate* isolate_; 3689 }; 3690 3691 3692 class V8EXPORT Locker { 3693 public: 3694 /** 3695 * Initialize Locker for a given Isolate. NULL means default isolate. 3696 */ 3697 explicit Locker(Isolate* isolate = NULL); 3698 ~Locker(); 3699 3700 /** 3701 * Start preemption. 3702 * 3703 * When preemption is started, a timer is fired every n milliseconds 3704 * that will switch between multiple threads that are in contention 3705 * for the V8 lock. 3706 */ 3707 static void StartPreemption(int every_n_ms); 3708 3709 /** 3710 * Stop preemption. 3711 */ 3712 static void StopPreemption(); 3713 3714 /** 3715 * Returns whether or not the locker for a given isolate, or default isolate 3716 * if NULL is given, is locked by the current thread. 3717 */ 3718 static bool IsLocked(Isolate* isolate = NULL); 3719 3720 /** 3721 * Returns whether v8::Locker is being used by this V8 instance. 3722 */ 3723 static bool IsActive(); 3724 3725 private: 3726 bool has_lock_; 3727 bool top_level_; 3728 internal::Isolate* isolate_; 3729 3730 static bool active_; 3731 3732 // Disallow copying and assigning. 3733 Locker(const Locker&); 3734 void operator=(const Locker&); 3735 }; 3736 3737 3738 /** 3739 * An interface for exporting data from V8, using "push" model. 3740 */ 3741 class V8EXPORT OutputStream { // NOLINT 3742 public: 3743 enum OutputEncoding { 3744 kAscii = 0 // 7-bit ASCII. 3745 }; 3746 enum WriteResult { 3747 kContinue = 0, 3748 kAbort = 1 3749 }; ~OutputStream()3750 virtual ~OutputStream() {} 3751 /** Notify about the end of stream. */ 3752 virtual void EndOfStream() = 0; 3753 /** Get preferred output chunk size. Called only once. */ GetChunkSize()3754 virtual int GetChunkSize() { return 1024; } 3755 /** Get preferred output encoding. Called only once. */ GetOutputEncoding()3756 virtual OutputEncoding GetOutputEncoding() { return kAscii; } 3757 /** 3758 * Writes the next chunk of snapshot data into the stream. Writing 3759 * can be stopped by returning kAbort as function result. EndOfStream 3760 * will not be called in case writing was aborted. 3761 */ 3762 virtual WriteResult WriteAsciiChunk(char* data, int size) = 0; 3763 }; 3764 3765 3766 /** 3767 * An interface for reporting progress and controlling long-running 3768 * activities. 3769 */ 3770 class V8EXPORT ActivityControl { // NOLINT 3771 public: 3772 enum ControlOption { 3773 kContinue = 0, 3774 kAbort = 1 3775 }; ~ActivityControl()3776 virtual ~ActivityControl() {} 3777 /** 3778 * Notify about current progress. The activity can be stopped by 3779 * returning kAbort as the callback result. 3780 */ 3781 virtual ControlOption ReportProgressValue(int done, int total) = 0; 3782 }; 3783 3784 3785 // --- Implementation --- 3786 3787 3788 namespace internal { 3789 3790 const int kApiPointerSize = sizeof(void*); // NOLINT 3791 const int kApiIntSize = sizeof(int); // NOLINT 3792 3793 // Tag information for HeapObject. 3794 const int kHeapObjectTag = 1; 3795 const int kHeapObjectTagSize = 2; 3796 const intptr_t kHeapObjectTagMask = (1 << kHeapObjectTagSize) - 1; 3797 3798 // Tag information for Smi. 3799 const int kSmiTag = 0; 3800 const int kSmiTagSize = 1; 3801 const intptr_t kSmiTagMask = (1 << kSmiTagSize) - 1; 3802 3803 template <size_t ptr_size> struct SmiTagging; 3804 3805 // Smi constants for 32-bit systems. 3806 template <> struct SmiTagging<4> { 3807 static const int kSmiShiftSize = 0; 3808 static const int kSmiValueSize = 31; 3809 static inline int SmiToInt(internal::Object* value) { 3810 int shift_bits = kSmiTagSize + kSmiShiftSize; 3811 // Throw away top 32 bits and shift down (requires >> to be sign extending). 3812 return static_cast<int>(reinterpret_cast<intptr_t>(value)) >> shift_bits; 3813 } 3814 3815 // For 32-bit systems any 2 bytes aligned pointer can be encoded as smi 3816 // with a plain reinterpret_cast. 3817 static const uintptr_t kEncodablePointerMask = 0x1; 3818 static const int kPointerToSmiShift = 0; 3819 }; 3820 3821 // Smi constants for 64-bit systems. 3822 template <> struct SmiTagging<8> { 3823 static const int kSmiShiftSize = 31; 3824 static const int kSmiValueSize = 32; 3825 static inline int SmiToInt(internal::Object* value) { 3826 int shift_bits = kSmiTagSize + kSmiShiftSize; 3827 // Shift down and throw away top 32 bits. 3828 return static_cast<int>(reinterpret_cast<intptr_t>(value) >> shift_bits); 3829 } 3830 3831 // To maximize the range of pointers that can be encoded 3832 // in the available 32 bits, we require them to be 8 bytes aligned. 3833 // This gives 2 ^ (32 + 3) = 32G address space covered. 3834 // It might be not enough to cover stack allocated objects on some platforms. 3835 static const int kPointerAlignment = 3; 3836 3837 static const uintptr_t kEncodablePointerMask = 3838 ~(uintptr_t(0xffffffff) << kPointerAlignment); 3839 3840 static const int kPointerToSmiShift = 3841 kSmiTagSize + kSmiShiftSize - kPointerAlignment; 3842 }; 3843 3844 typedef SmiTagging<kApiPointerSize> PlatformSmiTagging; 3845 const int kSmiShiftSize = PlatformSmiTagging::kSmiShiftSize; 3846 const int kSmiValueSize = PlatformSmiTagging::kSmiValueSize; 3847 const uintptr_t kEncodablePointerMask = 3848 PlatformSmiTagging::kEncodablePointerMask; 3849 const int kPointerToSmiShift = PlatformSmiTagging::kPointerToSmiShift; 3850 3851 template <size_t ptr_size> struct InternalConstants; 3852 3853 // Internal constants for 32-bit systems. 3854 template <> struct InternalConstants<4> { 3855 static const int kStringResourceOffset = 3 * kApiPointerSize; 3856 }; 3857 3858 // Internal constants for 64-bit systems. 3859 template <> struct InternalConstants<8> { 3860 static const int kStringResourceOffset = 3 * kApiPointerSize; 3861 }; 3862 3863 /** 3864 * This class exports constants and functionality from within v8 that 3865 * is necessary to implement inline functions in the v8 api. Don't 3866 * depend on functions and constants defined here. 3867 */ 3868 class Internals { 3869 public: 3870 // These values match non-compiler-dependent values defined within 3871 // the implementation of v8. 3872 static const int kHeapObjectMapOffset = 0; 3873 static const int kMapInstanceTypeOffset = 1 * kApiPointerSize + kApiIntSize; 3874 static const int kStringResourceOffset = 3875 InternalConstants<kApiPointerSize>::kStringResourceOffset; 3876 3877 static const int kForeignAddressOffset = kApiPointerSize; 3878 static const int kJSObjectHeaderSize = 3 * kApiPointerSize; 3879 static const int kFullStringRepresentationMask = 0x07; 3880 static const int kExternalTwoByteRepresentationTag = 0x02; 3881 3882 static const int kJSObjectType = 0xaa; 3883 static const int kFirstNonstringType = 0x80; 3884 static const int kForeignType = 0x85; 3885 3886 static inline bool HasHeapObjectTag(internal::Object* value) { 3887 return ((reinterpret_cast<intptr_t>(value) & kHeapObjectTagMask) == 3888 kHeapObjectTag); 3889 } 3890 3891 static inline bool HasSmiTag(internal::Object* value) { 3892 return ((reinterpret_cast<intptr_t>(value) & kSmiTagMask) == kSmiTag); 3893 } 3894 3895 static inline int SmiValue(internal::Object* value) { 3896 return PlatformSmiTagging::SmiToInt(value); 3897 } 3898 3899 static inline int GetInstanceType(internal::Object* obj) { 3900 typedef internal::Object O; 3901 O* map = ReadField<O*>(obj, kHeapObjectMapOffset); 3902 return ReadField<uint8_t>(map, kMapInstanceTypeOffset); 3903 } 3904 3905 static inline void* GetExternalPointerFromSmi(internal::Object* value) { 3906 const uintptr_t address = reinterpret_cast<uintptr_t>(value); 3907 return reinterpret_cast<void*>(address >> kPointerToSmiShift); 3908 } 3909 3910 static inline void* GetExternalPointer(internal::Object* obj) { 3911 if (HasSmiTag(obj)) { 3912 return GetExternalPointerFromSmi(obj); 3913 } else if (GetInstanceType(obj) == kForeignType) { 3914 return ReadField<void*>(obj, kForeignAddressOffset); 3915 } else { 3916 return NULL; 3917 } 3918 } 3919 3920 static inline bool IsExternalTwoByteString(int instance_type) { 3921 int representation = (instance_type & kFullStringRepresentationMask); 3922 return representation == kExternalTwoByteRepresentationTag; 3923 } 3924 3925 template <typename T> 3926 static inline T ReadField(Object* ptr, int offset) { 3927 uint8_t* addr = reinterpret_cast<uint8_t*>(ptr) + offset - kHeapObjectTag; 3928 return *reinterpret_cast<T*>(addr); 3929 } 3930 3931 static inline bool CanCastToHeapObject(void* o) { return false; } 3932 static inline bool CanCastToHeapObject(Context* o) { return true; } 3933 static inline bool CanCastToHeapObject(String* o) { return true; } 3934 static inline bool CanCastToHeapObject(Object* o) { return true; } 3935 static inline bool CanCastToHeapObject(Message* o) { return true; } 3936 static inline bool CanCastToHeapObject(StackTrace* o) { return true; } 3937 static inline bool CanCastToHeapObject(StackFrame* o) { return true; } 3938 }; 3939 3940 } // namespace internal 3941 3942 3943 template <class T> 3944 Local<T>::Local() : Handle<T>() { } 3945 3946 3947 template <class T> 3948 Local<T> Local<T>::New(Handle<T> that) { 3949 if (that.IsEmpty()) return Local<T>(); 3950 T* that_ptr = *that; 3951 internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr); 3952 if (internal::Internals::CanCastToHeapObject(that_ptr)) { 3953 return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle( 3954 reinterpret_cast<internal::HeapObject*>(*p)))); 3955 } 3956 return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(*p))); 3957 } 3958 3959 3960 template <class T> 3961 Persistent<T> Persistent<T>::New(Handle<T> that) { 3962 if (that.IsEmpty()) return Persistent<T>(); 3963 internal::Object** p = reinterpret_cast<internal::Object**>(*that); 3964 return Persistent<T>(reinterpret_cast<T*>(V8::GlobalizeReference(p))); 3965 } 3966 3967 3968 template <class T> 3969 bool Persistent<T>::IsNearDeath() const { 3970 if (this->IsEmpty()) return false; 3971 return V8::IsGlobalNearDeath(reinterpret_cast<internal::Object**>(**this)); 3972 } 3973 3974 3975 template <class T> 3976 bool Persistent<T>::IsWeak() const { 3977 if (this->IsEmpty()) return false; 3978 return V8::IsGlobalWeak(reinterpret_cast<internal::Object**>(**this)); 3979 } 3980 3981 3982 template <class T> 3983 void Persistent<T>::Dispose() { 3984 if (this->IsEmpty()) return; 3985 V8::DisposeGlobal(reinterpret_cast<internal::Object**>(**this)); 3986 } 3987 3988 3989 template <class T> 3990 Persistent<T>::Persistent() : Handle<T>() { } 3991 3992 template <class T> 3993 void Persistent<T>::MakeWeak(void* parameters, WeakReferenceCallback callback) { 3994 V8::MakeWeak(reinterpret_cast<internal::Object**>(**this), 3995 parameters, 3996 callback); 3997 } 3998 3999 template <class T> 4000 void Persistent<T>::ClearWeak() { 4001 V8::ClearWeak(reinterpret_cast<internal::Object**>(**this)); 4002 } 4003 4004 template <class T> 4005 void Persistent<T>::MarkIndependent() { 4006 V8::MarkIndependent(reinterpret_cast<internal::Object**>(**this)); 4007 } 4008 4009 template <class T> 4010 void Persistent<T>::SetWrapperClassId(uint16_t class_id) { 4011 V8::SetWrapperClassId(reinterpret_cast<internal::Object**>(**this), class_id); 4012 } 4013 4014 Arguments::Arguments(internal::Object** implicit_args, 4015 internal::Object** values, int length, 4016 bool is_construct_call) 4017 : implicit_args_(implicit_args), 4018 values_(values), 4019 length_(length), 4020 is_construct_call_(is_construct_call) { } 4021 4022 4023 Local<Value> Arguments::operator[](int i) const { 4024 if (i < 0 || length_ <= i) return Local<Value>(*Undefined()); 4025 return Local<Value>(reinterpret_cast<Value*>(values_ - i)); 4026 } 4027 4028 4029 Local<Function> Arguments::Callee() const { 4030 return Local<Function>(reinterpret_cast<Function*>( 4031 &implicit_args_[kCalleeIndex])); 4032 } 4033 4034 4035 Local<Object> Arguments::This() const { 4036 return Local<Object>(reinterpret_cast<Object*>(values_ + 1)); 4037 } 4038 4039 4040 Local<Object> Arguments::Holder() const { 4041 return Local<Object>(reinterpret_cast<Object*>( 4042 &implicit_args_[kHolderIndex])); 4043 } 4044 4045 4046 Local<Value> Arguments::Data() const { 4047 return Local<Value>(reinterpret_cast<Value*>(&implicit_args_[kDataIndex])); 4048 } 4049 4050 4051 bool Arguments::IsConstructCall() const { 4052 return is_construct_call_; 4053 } 4054 4055 4056 int Arguments::Length() const { 4057 return length_; 4058 } 4059 4060 4061 template <class T> 4062 Local<T> HandleScope::Close(Handle<T> value) { 4063 internal::Object** before = reinterpret_cast<internal::Object**>(*value); 4064 internal::Object** after = RawClose(before); 4065 return Local<T>(reinterpret_cast<T*>(after)); 4066 } 4067 4068 Handle<Value> ScriptOrigin::ResourceName() const { 4069 return resource_name_; 4070 } 4071 4072 4073 Handle<Integer> ScriptOrigin::ResourceLineOffset() const { 4074 return resource_line_offset_; 4075 } 4076 4077 4078 Handle<Integer> ScriptOrigin::ResourceColumnOffset() const { 4079 return resource_column_offset_; 4080 } 4081 4082 4083 Handle<Boolean> Boolean::New(bool value) { 4084 return value ? True() : False(); 4085 } 4086 4087 4088 void Template::Set(const char* name, v8::Handle<Data> value) { 4089 Set(v8::String::New(name), value); 4090 } 4091 4092 4093 Local<Value> Object::GetInternalField(int index) { 4094 #ifndef V8_ENABLE_CHECKS 4095 Local<Value> quick_result = UncheckedGetInternalField(index); 4096 if (!quick_result.IsEmpty()) return quick_result; 4097 #endif 4098 return CheckedGetInternalField(index); 4099 } 4100 4101 4102 Local<Value> Object::UncheckedGetInternalField(int index) { 4103 typedef internal::Object O; 4104 typedef internal::Internals I; 4105 O* obj = *reinterpret_cast<O**>(this); 4106 if (I::GetInstanceType(obj) == I::kJSObjectType) { 4107 // If the object is a plain JSObject, which is the common case, 4108 // we know where to find the internal fields and can return the 4109 // value directly. 4110 int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index); 4111 O* value = I::ReadField<O*>(obj, offset); 4112 O** result = HandleScope::CreateHandle(value); 4113 return Local<Value>(reinterpret_cast<Value*>(result)); 4114 } else { 4115 return Local<Value>(); 4116 } 4117 } 4118 4119 4120 void* External::Unwrap(Handle<v8::Value> obj) { 4121 #ifdef V8_ENABLE_CHECKS 4122 return FullUnwrap(obj); 4123 #else 4124 return QuickUnwrap(obj); 4125 #endif 4126 } 4127 4128 4129 void* External::QuickUnwrap(Handle<v8::Value> wrapper) { 4130 typedef internal::Object O; 4131 O* obj = *reinterpret_cast<O**>(const_cast<v8::Value*>(*wrapper)); 4132 return internal::Internals::GetExternalPointer(obj); 4133 } 4134 4135 4136 void* Object::GetPointerFromInternalField(int index) { 4137 typedef internal::Object O; 4138 typedef internal::Internals I; 4139 4140 O* obj = *reinterpret_cast<O**>(this); 4141 4142 if (I::GetInstanceType(obj) == I::kJSObjectType) { 4143 // If the object is a plain JSObject, which is the common case, 4144 // we know where to find the internal fields and can return the 4145 // value directly. 4146 int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index); 4147 O* value = I::ReadField<O*>(obj, offset); 4148 return I::GetExternalPointer(value); 4149 } 4150 4151 return SlowGetPointerFromInternalField(index); 4152 } 4153 4154 4155 String* String::Cast(v8::Value* value) { 4156 #ifdef V8_ENABLE_CHECKS 4157 CheckCast(value); 4158 #endif 4159 return static_cast<String*>(value); 4160 } 4161 4162 4163 String::ExternalStringResource* String::GetExternalStringResource() const { 4164 typedef internal::Object O; 4165 typedef internal::Internals I; 4166 O* obj = *reinterpret_cast<O**>(const_cast<String*>(this)); 4167 String::ExternalStringResource* result; 4168 if (I::IsExternalTwoByteString(I::GetInstanceType(obj))) { 4169 void* value = I::ReadField<void*>(obj, I::kStringResourceOffset); 4170 result = reinterpret_cast<String::ExternalStringResource*>(value); 4171 } else { 4172 result = NULL; 4173 } 4174 #ifdef V8_ENABLE_CHECKS 4175 VerifyExternalStringResource(result); 4176 #endif 4177 return result; 4178 } 4179 4180 4181 bool Value::IsString() const { 4182 #ifdef V8_ENABLE_CHECKS 4183 return FullIsString(); 4184 #else 4185 return QuickIsString(); 4186 #endif 4187 } 4188 4189 bool Value::QuickIsString() const { 4190 typedef internal::Object O; 4191 typedef internal::Internals I; 4192 O* obj = *reinterpret_cast<O**>(const_cast<Value*>(this)); 4193 if (!I::HasHeapObjectTag(obj)) return false; 4194 return (I::GetInstanceType(obj) < I::kFirstNonstringType); 4195 } 4196 4197 4198 Number* Number::Cast(v8::Value* value) { 4199 #ifdef V8_ENABLE_CHECKS 4200 CheckCast(value); 4201 #endif 4202 return static_cast<Number*>(value); 4203 } 4204 4205 4206 Integer* Integer::Cast(v8::Value* value) { 4207 #ifdef V8_ENABLE_CHECKS 4208 CheckCast(value); 4209 #endif 4210 return static_cast<Integer*>(value); 4211 } 4212 4213 4214 Date* Date::Cast(v8::Value* value) { 4215 #ifdef V8_ENABLE_CHECKS 4216 CheckCast(value); 4217 #endif 4218 return static_cast<Date*>(value); 4219 } 4220 4221 4222 StringObject* StringObject::Cast(v8::Value* value) { 4223 #ifdef V8_ENABLE_CHECKS 4224 CheckCast(value); 4225 #endif 4226 return static_cast<StringObject*>(value); 4227 } 4228 4229 4230 NumberObject* NumberObject::Cast(v8::Value* value) { 4231 #ifdef V8_ENABLE_CHECKS 4232 CheckCast(value); 4233 #endif 4234 return static_cast<NumberObject*>(value); 4235 } 4236 4237 4238 BooleanObject* BooleanObject::Cast(v8::Value* value) { 4239 #ifdef V8_ENABLE_CHECKS 4240 CheckCast(value); 4241 #endif 4242 return static_cast<BooleanObject*>(value); 4243 } 4244 4245 4246 RegExp* RegExp::Cast(v8::Value* value) { 4247 #ifdef V8_ENABLE_CHECKS 4248 CheckCast(value); 4249 #endif 4250 return static_cast<RegExp*>(value); 4251 } 4252 4253 4254 Object* Object::Cast(v8::Value* value) { 4255 #ifdef V8_ENABLE_CHECKS 4256 CheckCast(value); 4257 #endif 4258 return static_cast<Object*>(value); 4259 } 4260 4261 4262 Array* Array::Cast(v8::Value* value) { 4263 #ifdef V8_ENABLE_CHECKS 4264 CheckCast(value); 4265 #endif 4266 return static_cast<Array*>(value); 4267 } 4268 4269 4270 Function* Function::Cast(v8::Value* value) { 4271 #ifdef V8_ENABLE_CHECKS 4272 CheckCast(value); 4273 #endif 4274 return static_cast<Function*>(value); 4275 } 4276 4277 4278 External* External::Cast(v8::Value* value) { 4279 #ifdef V8_ENABLE_CHECKS 4280 CheckCast(value); 4281 #endif 4282 return static_cast<External*>(value); 4283 } 4284 4285 4286 Local<Value> AccessorInfo::Data() const { 4287 return Local<Value>(reinterpret_cast<Value*>(&args_[-2])); 4288 } 4289 4290 4291 Local<Object> AccessorInfo::This() const { 4292 return Local<Object>(reinterpret_cast<Object*>(&args_[0])); 4293 } 4294 4295 4296 Local<Object> AccessorInfo::Holder() const { 4297 return Local<Object>(reinterpret_cast<Object*>(&args_[-1])); 4298 } 4299 4300 4301 /** 4302 * \example shell.cc 4303 * A simple shell that takes a list of expressions on the 4304 * command-line and executes them. 4305 */ 4306 4307 4308 /** 4309 * \example process.cc 4310 */ 4311 4312 4313 } // namespace v8 4314 4315 4316 #undef V8EXPORT 4317 #undef TYPE_CHECK 4318 4319 4320 #endif // V8_H_ 4321