1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** \mainpage V8 API Reference Guide 6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * V8 is Google's open source JavaScript engine. 8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * This set of documents provides reference material generated from the 10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * V8 header file, include/v8.h. 11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * For other documentation see http://code.google.com/apis/v8/ 13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifndef INCLUDE_V8_H_ 16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define INCLUDE_V8_H_ 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 18958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include <stddef.h> 19958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include <stdint.h> 20958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include <stdio.h> 21f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include <memory> 223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include <utility> 233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include <vector> 24958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "v8-version.h" // NOLINT(build/include) 26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "v8config.h" // NOLINT(build/include) 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// We reserve the V8_* prefix for macros defined in V8 public API and 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// assume there are no name conflicts with the embedder's code. 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_OS_WIN 32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Setup for Windows DLL export/import. When building the V8 DLL the 34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// BUILDING_V8_SHARED needs to be defined. When building a program which uses 35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// the V8 DLL USING_V8_SHARED needs to be defined. When either building the V8 36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// static library or building a program which uses the V8 static library neither 37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// BUILDING_V8_SHARED nor USING_V8_SHARED should be defined. 38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef BUILDING_V8_SHARED 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# define V8_EXPORT __declspec(dllexport) 40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#elif USING_V8_SHARED 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# define V8_EXPORT __declspec(dllimport) 42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#else 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# define V8_EXPORT 44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // BUILDING_V8_SHARED 45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#else // V8_OS_WIN 47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Setup for Linux shared library export. 49f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#if V8_HAS_ATTRIBUTE_VISIBILITY 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# ifdef BUILDING_V8_SHARED 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# define V8_EXPORT __attribute__ ((visibility("default"))) 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# else 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# define V8_EXPORT 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# endif 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#else 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# define V8_EXPORT 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // V8_OS_WIN 60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * The v8 JavaScript engine. 63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AccessorSignature; 67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Array; 68f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass ArrayBuffer; 69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Boolean; 703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass BooleanObject; 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Context; 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CpuProfiler; 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Data; 74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Date; 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass External; 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Function; 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass FunctionTemplate; 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HeapProfiler; 79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass ImplementationUtilities; 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Int32; 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Integer; 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Isolate; 83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <class T> 84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Maybe; 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Name; 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Number; 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass NumberObject; 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Object; 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ObjectOperationDescriptor; 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ObjectTemplate; 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Platform; 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Primitive; 93958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass Promise; 94f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass PropertyDescriptor; 95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Proxy; 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass RawOperationDescriptor; 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Script; 98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass SharedArrayBuffer; 99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Signature; 100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass StartupData; 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass StackFrame; 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass StackTrace; 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass String; 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass StringObject; 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Symbol; 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass SymbolObject; 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Private; 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Uint32; 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Utils; 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Value; 111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <class T> class Local; 112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <class T> 113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass MaybeLocal; 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class T> class Eternal; 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class T> class NonCopyablePersistentTraits; 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class T> class PersistentBase; 117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <class T, class M = NonCopyablePersistentTraits<T> > 118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Persistent; 119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <class T> 120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Global; 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class K, class V, class T> class PersistentValueMap; 122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <class K, class V, class T> 123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass PersistentValueMapBase; 124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <class K, class V, class T> 125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass GlobalValueMap; 126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class V, class T> class PersistentValueVector; 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class T, class P> class WeakCallbackObject; 128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass FunctionTemplate; 129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass ObjectTemplate; 130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Data; 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> class FunctionCallbackInfo; 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> class PropertyCallbackInfo; 13325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsenclass StackTrace; 13425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsenclass StackFrame; 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Isolate; 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CallHandlerHelper; 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass EscapableHandleScope; 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> class ReturnValue; 139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace experimental { 141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass FastAccessorBuilder; 142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace experimental 143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Arguments; 1467f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochclass Heap; 14744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HeapObject; 14844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Isolate; 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Object; 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct StreamedSource; 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> class CustomArguments; 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass PropertyCallbackArguments; 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass FunctionCallbackArguments; 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass GlobalHandles; 155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * General purpose unique identifier. 160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass UniqueId { 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit UniqueId(intptr_t data) 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : data_(data) {} 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool operator==(const UniqueId& other) const { 167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return data_ == other.data_; 168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool operator!=(const UniqueId& other) const { 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return data_ != other.data_; 172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool operator<(const UniqueId& other) const { 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return data_ < other.data_; 176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch intptr_t data_; 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 182257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// --- Handles --- 183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 18450ef84f5fad2def87d3fbc737bec4a32711fdef4Kristian Monsen#define TYPE_CHECK(T, S) \ 18550ef84f5fad2def87d3fbc737bec4a32711fdef4Kristian Monsen while (false) { \ 18650ef84f5fad2def87d3fbc737bec4a32711fdef4Kristian Monsen *(static_cast<T* volatile*>(0)) = static_cast<S*>(0); \ 187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * An object reference managed by the v8 garbage collector. 192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * All objects returned from v8 have to be tracked by the garbage 194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * collector so that it knows that the objects are still alive. Also, 195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * because the garbage collector may move objects, it is unsafe to 196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * point directly to an object. Instead, all objects are stored in 197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * handles which are known by the garbage collector and updated 198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * whenever an object moves. Handles should always be passed by value 199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * (except in cases like out-parameters) and they should never be 200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * allocated on the heap. 201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * There are two types of handles: local and persistent handles. 203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Local handles are light-weight and transient and typically used in 204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * local operations. They are managed by HandleScopes. Persistent 205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * handles can be used when storing objects across several independent 206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * operations and have to be explicitly deallocated when they're no 207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * longer used. 208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * It is safe to extract the object stored in the handle by 210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * dereferencing the handle (for instance, to extract the Object* from 211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * a Local<Object>); the value will still be governed by a handle 212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * behind the scenes and the same rules apply to these values as to 213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * their handles. 214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <class T> 216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Local { 217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE Local() : val_(0) {} 219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class S> 220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE Local(Local<S> that) 221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : val_(reinterpret_cast<T*>(*that)) { 222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * This check fails when trying to convert between incompatible 224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * handles. For example, converting from a Local<String> to a 225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Local<Number>. 226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block TYPE_CHECK(T, S); 228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns true if the handle is empty. 232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE bool IsEmpty() const { return val_ == 0; } 234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Sets the handle to be empty. IsEmpty() will then return true. 237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE void Clear() { val_ = 0; } 23969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE T* operator->() const { return val_; } 24169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE T* operator*() const { return val_; } 243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Checks whether two handles are the same. 246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns true if both are empty, or if the objects 247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * to which they refer are identical. 248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * The handles' references are not checked. 249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class S> 251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE bool operator==(const Local<S>& that) const { 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object** a = reinterpret_cast<internal::Object**>(this->val_); 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object** b = reinterpret_cast<internal::Object**>(that.val_); 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (a == 0) return b == 0; 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (b == 0) return false; 256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return *a == *b; 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class S> V8_INLINE bool operator==( 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PersistentBase<S>& that) const { 261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object** a = reinterpret_cast<internal::Object**>(this->val_); 262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object** b = reinterpret_cast<internal::Object**>(that.val_); 263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (a == 0) return b == 0; 264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (b == 0) return false; 265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return *a == *b; 266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Checks whether two handles are different. 270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns true if only one of the handles is empty, or if 271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * the objects to which they refer are different. 272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * The handles' references are not checked. 273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class S> 275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE bool operator!=(const Local<S>& that) const { 276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return !operator==(that); 277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class S> V8_INLINE bool operator!=( 280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Persistent<S>& that) const { 281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !operator==(that); 282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class S> V8_INLINE static Local<T> Cast(Local<S> that) { 285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef V8_ENABLE_CHECKS 286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // If we're going to perform the type check then we have to check 287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // that the handle isn't empty before doing the checked cast. 288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (that.IsEmpty()) return Local<T>(); 289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Local<T>(T::Cast(*that)); 291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 293f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch template <class S> 294f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V8_INLINE Local<S> As() const { 2956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return Local<S>::Cast(*this); 2966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 2976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Create a local handle for the content of another handle. 300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * The referee is kept alive by the local handle even when 301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * the original handle is destroyed/disposed. 302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static Local<T> New(Isolate* isolate, Local<T> that); 304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static Local<T> New(Isolate* isolate, 305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PersistentBase<T>& that); 306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class Utils; 309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class F> friend class Eternal; 310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class F> friend class PersistentBase; 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class F, class M> friend class Persistent; 312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class F> friend class Local; 313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class F> 314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend class MaybeLocal; 315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class F> friend class FunctionCallbackInfo; 316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class F> friend class PropertyCallbackInfo; 317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class String; 318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class Object; 319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class Context; 320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend class Private; 321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class F> friend class internal::CustomArguments; 322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend Local<Primitive> Undefined(Isolate* isolate); 323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend Local<Primitive> Null(Isolate* isolate); 324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend Local<Boolean> True(Isolate* isolate); 325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend Local<Boolean> False(Isolate* isolate); 326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class HandleScope; 327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class EscapableHandleScope; 328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class F1, class F2, class F3> 329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend class PersistentValueMapBase; 330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class F1, class F2> friend class PersistentValueVector; 3313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch template <class F> 3323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch friend class ReturnValue; 333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 334109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch explicit V8_INLINE Local(T* that) : val_(that) {} 335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static Local<T> New(Isolate* isolate, T* that); 336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch T* val_; 337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if !defined(V8_IMMINENT_DEPRECATION_WARNINGS) 341f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// Handle is an alias for Local for historical reasons. 342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <class T> 343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochusing Handle = Local<T>; 344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif 345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch/** 348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * A MaybeLocal<> is a wrapper around Local<> that enforces a check whether 349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * the Local<> is empty before it can be used. 350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * 351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * If an API method returns a MaybeLocal<>, the API method can potentially fail 352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * either because an exception is thrown, or because an exception is pending, 353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * e.g. because a previous API call threw an exception that hasn't been caught 354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * yet, or because a TerminateExecution exception was thrown. In that case, an 355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * empty MaybeLocal is returned. 356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <class T> 358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass MaybeLocal { 359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE MaybeLocal() : val_(nullptr) {} 361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class S> 362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE MaybeLocal(Local<S> that) 363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : val_(reinterpret_cast<T*>(*that)) { 364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch TYPE_CHECK(T, S); 365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE bool IsEmpty() const { return val_ == nullptr; } 368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class S> 370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT V8_INLINE bool ToLocal(Local<S>* out) const { 371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch out->val_ = IsEmpty() ? nullptr : this->val_; 372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return !IsEmpty(); 373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Will crash if the MaybeLocal<> is empty. 376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE Local<T> ToLocalChecked(); 377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class S> 379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE Local<S> FromMaybe(Local<S> default_value) const { 380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return IsEmpty() ? default_value : Local<S>(val_); 381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch T* val_; 385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Eternal handles are set-once handles that live for the life of the isolate. 389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class T> class Eternal { 390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Eternal() : index_(kInitialValue) { } 392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class S> 393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Eternal(Isolate* isolate, Local<S> handle) : index_(kInitialValue) { 394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Set(isolate, handle); 395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Can only be safely called if already set. 397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Local<T> Get(Isolate* isolate); 398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE bool IsEmpty() { return index_ == kInitialValue; } 399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class S> V8_INLINE void Set(Isolate* isolate, Local<S> handle); 400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kInitialValue = -1; 403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index_; 404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstatic const int kInternalFieldsInWeakCallback = 2; 408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertemplate <typename T> 411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass WeakCallbackInfo { 412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef void (*Callback)(const WeakCallbackInfo<T>& data); 414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WeakCallbackInfo(Isolate* isolate, T* parameter, 416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void* internal_fields[kInternalFieldsInWeakCallback], 417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Callback* callback) 418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : isolate_(isolate), parameter_(parameter), callback_(callback) { 419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < kInternalFieldsInWeakCallback; ++i) { 420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch internal_fields_[i] = internal_fields[i]; 421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 423958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE Isolate* GetIsolate() const { return isolate_; } 425958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V8_INLINE T* GetParameter() const { return parameter_; } 426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE void* GetInternalField(int index) const; 427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE V8_DEPRECATED("use indexed version", 429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void* GetInternalField1() const) { 430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return internal_fields_[0]; 431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE V8_DEPRECATED("use indexed version", 433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void* GetInternalField2() const) { 434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return internal_fields_[1]; 435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 437109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch V8_DEPRECATED("Not realiable once SetSecondPassCallback() was used.", 438109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch bool IsFirstPass() const) { 439109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return callback_ != nullptr; 440109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 441958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // When first called, the embedder MUST Reset() the Global which triggered the 443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // callback. The Global itself is unusable for anything else. No v8 other api 444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // calls may be called in the first callback. Should additional work be 445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // required, the embedder must set a second pass callback, which will be 446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // called after all the initial callbacks are processed. 447014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Calling SetSecondPassCallback on the second pass will immediately crash. 448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetSecondPassCallback(Callback callback) const { *callback_ = callback; } 449958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 450958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate_; 452958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier T* parameter_; 453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Callback* callback_; 454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void* internal_fields_[kInternalFieldsInWeakCallback]; 455958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 456958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 457958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 458bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// kParameter will pass a void* parameter back to the callback, kInternalFields 459bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// will pass the first two internal fields back to the callback, kFinalizer 460bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// will pass a void* parameter back, but is invoked before the object is 461bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// actually collected, so it can be resurrected. In the last case, it is not 462bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// possible to request a second pass callback. 463bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochenum class WeakCallbackType { kParameter, kInternalFields, kFinalizer }; 464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * An object reference that is independent of any handle scope. Where 467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * a Local handle only lives as long as the HandleScope in which it was 468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * allocated, a PersistentBase handle remains valid until it is explicitly 469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * disposed. 470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * A persistent handle contains a reference to a storage cell within 472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * the v8 engine which holds an object value and which is updated by 473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * the garbage collector whenever the object is moved. A new storage 474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * cell can be created using the constructor or PersistentBase::Reset and 475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * existing handles can be disposed using PersistentBase::Reset. 476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class T> class PersistentBase { 479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * If non-empty, destroy the underlying storage cell 482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * IsEmpty() will return true after this call. 483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE void Reset(); 485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * If non-empty, destroy the underlying storage cell 487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * and create a new one with the contents of other if other is non empty 488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class S> 490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE void Reset(Isolate* isolate, const Local<S>& other); 491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * If non-empty, destroy the underlying storage cell 494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * and create a new one with the contents of other if other is non empty 495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class S> 497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE void Reset(Isolate* isolate, const PersistentBase<S>& other); 498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 499958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V8_INLINE bool IsEmpty() const { return val_ == NULL; } 500958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V8_INLINE void Empty() { val_ = 0; } 501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 502014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE Local<T> Get(Isolate* isolate) const { 503014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Local<T>::New(isolate, *this); 504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 505014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class S> 507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE bool operator==(const PersistentBase<S>& that) const { 508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object** a = reinterpret_cast<internal::Object**>(this->val_); 509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object** b = reinterpret_cast<internal::Object**>(that.val_); 510958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (a == NULL) return b == NULL; 511958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (b == NULL) return false; 512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return *a == *b; 513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class S> 516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE bool operator==(const Local<S>& that) const { 517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object** a = reinterpret_cast<internal::Object**>(this->val_); 518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object** b = reinterpret_cast<internal::Object**>(that.val_); 519958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (a == NULL) return b == NULL; 520958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (b == NULL) return false; 521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return *a == *b; 522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class S> 525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE bool operator!=(const PersistentBase<S>& that) const { 526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !operator==(that); 527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class S> 530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE bool operator!=(const Local<S>& that) const { 531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !operator==(that); 532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Install a finalization callback on this object. 536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * NOTE: There is no guarantee as to *when* or even *if* the callback is 537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * invoked. The invocation is performed solely on a best effort basis. 538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * As always, GC-based finalization should *not* be relied upon for any 539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * critical form of resource management! 540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename P> 542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE void SetWeak(P* parameter, 543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typename WeakCallbackInfo<P>::Callback callback, 544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WeakCallbackType type); 545958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 546bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch /** 547bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * Turns this handle into a weak phantom handle without finalization callback. 548bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * The handle will be reset automatically when the garbage collector detects 549bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * that the object is no longer reachable. 550bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * A related function Isolate::NumberOfPhantomHandleResetsSinceLastCall 551bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * returns how many phantom handles were reset by the garbage collector. 552bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch */ 553bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch V8_INLINE void SetWeak(); 554bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<typename P> 556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE P* ClearWeak(); 557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(dcarney): remove this. 559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE void ClearWeak() { ClearWeak<void>(); } 560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 5623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * Allows the embedder to tell the v8 garbage collector that a certain object 5633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * is alive. Only allowed when the embedder is asked to trace its heap by 5643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * EmbedderHeapTracer. 5653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch */ 566c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_INLINE void RegisterExternalReference(Isolate* isolate) const; 5673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 5683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch /** 569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Marks the reference to this object independent. Garbage collector is free 570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * to ignore any object groups containing this object. Weak callback for an 571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * independent handle should not assume that it will be preceded by a global 572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * GC prologue callback or followed by a global GC epilogue callback. 573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE void MarkIndependent(); 575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 577014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Marks the reference to this object as active. The scavenge garbage 578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * collection should not reclaim the objects marked as active. 579014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * This bit is cleared after the each garbage collection pass. 580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE void MarkActive(); 582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE bool IsIndependent() const; 584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** Checks if the handle holds the only reference to an object. */ 586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE bool IsNearDeath() const; 587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** Returns true if the handle's reference is weak. */ 589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE bool IsWeak() const; 590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Assigns a wrapper class ID to the handle. See RetainedObjectInfo interface 593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * description in v8-profiler.h for details. 594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE void SetWrapperClassId(uint16_t class_id); 596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns the class ID previously assigned to this handle or 0 if no class ID 599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * was previously assigned. 600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE uint16_t WrapperClassId() const; 602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 603f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch PersistentBase(const PersistentBase& other) = delete; // NOLINT 604f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void operator=(const PersistentBase&) = delete; 605f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class Isolate; 608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class Utils; 609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class F> friend class Local; 610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class F1, class F2> friend class Persistent; 611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class F> 612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend class Global; 613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class F> friend class PersistentBase; 614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class F> friend class ReturnValue; 615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class F1, class F2, class F3> 616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend class PersistentValueMapBase; 617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class F1, class F2> friend class PersistentValueVector; 618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class Object; 619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit V8_INLINE PersistentBase(T* val) : val_(val) {} 621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static T* New(Isolate* isolate, T* that); 622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T* val_; 624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Default traits for Persistent. This class does not allow 629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * use of the copy constructor or assignment operator. 630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * At present kResetInDestructor is not set, but that will change in a future 631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * version. 632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class T> 634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass NonCopyablePersistentTraits { 635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef Persistent<T, NonCopyablePersistentTraits<T> > NonCopyablePersistent; 637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const bool kResetInDestructor = false; 638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class S, class M> 639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static void Copy(const Persistent<S, M>& source, 640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NonCopyablePersistent* dest) { 641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uncompilable<Object>(); 642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(dcarney): come up with a good compile error here. 644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class O> V8_INLINE static void Uncompilable() { 645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(O, Primitive); 646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Helper class traits to allow copying and assignment of Persistent. 652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * This will clone the contents of storage cell, but not any of the flags, etc. 653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class T> 655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct CopyablePersistentTraits { 656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef Persistent<T, CopyablePersistentTraits<T> > CopyablePersistent; 657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const bool kResetInDestructor = true; 658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class S, class M> 659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static V8_INLINE void Copy(const Persistent<S, M>& source, 660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CopyablePersistent* dest) { 661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // do nothing, just allow copy 662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A PersistentBase which allows copy and assignment. 668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 66962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Copy, assignment and destructor behavior is controlled by the traits 670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * class M. 671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Note: Persistent class hierarchy is subject to future changes. 673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class T, class M> class Persistent : public PersistentBase<T> { 675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A Persistent with no storage cell. 678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Persistent() : PersistentBase<T>(0) { } 680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Construct a Persistent from a Local. 682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * When the Local is non-empty, a new storage cell is created 683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * pointing to the same object, and no flags are set. 684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 685014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class S> 686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE Persistent(Isolate* isolate, Local<S> that) 687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : PersistentBase<T>(PersistentBase<T>::New(isolate, *that)) { 688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(T, S); 689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Construct a Persistent from a Persistent. 692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * When the Persistent is non-empty, a new storage cell is created 693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * pointing to the same object, and no flags are set. 694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class S, class M2> 696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Persistent(Isolate* isolate, const Persistent<S, M2>& that) 697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : PersistentBase<T>(PersistentBase<T>::New(isolate, *that)) { 698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(T, S); 699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * The copy constructors and assignment operator create a Persistent 702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * exactly as the Persistent constructor, but the Copy function from the 703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * traits class is called, allowing the setting of flags based on the 704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * copied Persistent. 705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Persistent(const Persistent& that) : PersistentBase<T>(0) { 707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Copy(that); 708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class S, class M2> 710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Persistent(const Persistent<S, M2>& that) : PersistentBase<T>(0) { 711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Copy(that); 712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Persistent& operator=(const Persistent& that) { // NOLINT 714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Copy(that); 715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return *this; 716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class S, class M2> 718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Persistent& operator=(const Persistent<S, M2>& that) { // NOLINT 719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Copy(that); 720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return *this; 721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 722a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * The destructor will dispose the Persistent based on the 724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * kResetInDestructor flags in the traits class. Since not calling dispose 725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * can result in a memory leak, it is recommended to always set this flag. 726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE ~Persistent() { 728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (M::kResetInDestructor) this->Reset(); 729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(dcarney): this is pretty useless, fix or remove 732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class S> 733f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V8_INLINE static Persistent<T>& Cast(const Persistent<S>& that) { // NOLINT 734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef V8_ENABLE_CHECKS 735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // If we're going to perform the type check then we have to check 736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // that the handle isn't empty before doing the checked cast. 737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!that.IsEmpty()) T::Cast(*that); 738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 739f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return reinterpret_cast<Persistent<T>&>(const_cast<Persistent<S>&>(that)); 740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(dcarney): this is pretty useless, fix or remove 743f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch template <class S> 744f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V8_INLINE Persistent<S>& As() const { // NOLINT 7456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return Persistent<S>::Cast(*this); 7466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 7476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class Isolate; 750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class Utils; 751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class F> friend class Local; 752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class F1, class F2> friend class Persistent; 753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class F> friend class ReturnValue; 754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 755109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch explicit V8_INLINE Persistent(T* that) : PersistentBase<T>(that) {} 756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE T* operator*() const { return this->val_; } 757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class S, class M2> 758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE void Copy(const Persistent<S, M2>& that); 759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A PersistentBase which has move semantics. 764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Note: Persistent class hierarchy is subject to future changes. 766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <class T> 768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Global : public PersistentBase<T> { 769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 770a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * A Global with no storage cell. 772a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE Global() : PersistentBase<T>(nullptr) {} 774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Construct a Global from a Local. 776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * When the Local is non-empty, a new storage cell is created 777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * pointing to the same object, and no flags are set. 778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class S> 780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE Global(Isolate* isolate, Local<S> that) 781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : PersistentBase<T>(PersistentBase<T>::New(isolate, *that)) { 782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(T, S); 783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Construct a Global from a PersistentBase. 786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * When the Persistent is non-empty, a new storage cell is created 787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * pointing to the same object, and no flags are set. 788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class S> 790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE Global(Isolate* isolate, const PersistentBase<S>& that) 791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : PersistentBase<T>(PersistentBase<T>::New(isolate, that.val_)) { 792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(T, S); 793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Move constructor. 796257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch */ 797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE Global(Global&& other) : PersistentBase<T>(other.val_) { // NOLINT 798014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch other.val_ = nullptr; 799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE ~Global() { this->Reset(); } 801257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch /** 802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Move via assignment. 803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 804014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class S> 805014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE Global& operator=(Global<S>&& rhs) { // NOLINT 806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(T, S); 807014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (this != &rhs) { 808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch this->Reset(); 809014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch this->val_ = rhs.val_; 810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch rhs.val_ = nullptr; 811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return *this; 813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Pass allows returning uniques from functions, etc. 81644f0eee88ff00398ff7f715fab053374d808c90dSteve Block */ 817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Global Pass() { return static_cast<Global&&>(*this); } // NOLINT 818014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /* 820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * For compatibility with Chromium's base::Bind (base::Passed). 821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef void MoveOnlyTypeForCPP03; 82344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 824f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Global(const Global&) = delete; 825f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void operator=(const Global&) = delete; 826f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 827a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 828014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class F> 829014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend class ReturnValue; 830014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE T* operator*() const { return this->val_; } 831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// UniquePersistent is an alias for Global for historical reason. 835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <class T> 836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochusing UniquePersistent = Global<T>; 837014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * A stack-allocated class that governs a number of local handles. 841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * After a handle scope has been created, all local handles will be 842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * allocated within that handle scope until either the handle scope is 843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * deleted or another handle scope is created. If there is already a 844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * handle scope and a new one is created, all allocations will take 845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * place in the new handle scope until it is deleted. After that, 846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * new handles will again be allocated in the original handle scope. 847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * After the handle scope of a local handle has been deleted the 849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * garbage collector will no longer track the object stored in the 850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * handle and may deallocate it. The behavior of accessing a handle 851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * for which the handle scope has been deleted is undefined. 852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT HandleScope { 854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 855109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch explicit HandleScope(Isolate* isolate); 856a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ~HandleScope(); 858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Counts the number of allocated handles. 861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static int NumberOfHandles(Isolate* isolate); 863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Isolate* GetIsolate() const { 865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<Isolate*>(isolate_); 866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 868f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch HandleScope(const HandleScope&) = delete; 869f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void operator=(const HandleScope&) = delete; 87062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void* operator new(size_t size); 87162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void operator delete(void*, size_t); 872f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE HandleScope() {} 875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Initialize(Isolate* isolate); 877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static internal::Object** CreateHandle(internal::Isolate* isolate, 879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object* value); 880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Uses heap_object to obtain the current Isolate. 883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static internal::Object** CreateHandle(internal::HeapObject* heap_object, 884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object* value); 885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 88644f0eee88ff00398ff7f715fab053374d808c90dSteve Block internal::Isolate* isolate_; 8875913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck internal::Object** prev_next_; 8885913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck internal::Object** prev_limit_; 889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Local::New uses CreateHandle with an Isolate* parameter. 891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class F> friend class Local; 892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Object::GetInternalField and Context::GetEmbedderData use CreateHandle with 894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // a HeapObject* in their shortcuts. 895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class Object; 896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class Context; 897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A HandleScope which first allocates a handle in the current scope 902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * which will be later filled with the escape value. 903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT EscapableHandleScope : public HandleScope { 905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 906109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch explicit EscapableHandleScope(Isolate* isolate); 907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE ~EscapableHandleScope() {} 908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Pushes the value into the previous scope and returns a handle to it. 911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Cannot be called twice. 912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class T> 914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Local<T> Escape(Local<T> value) { 915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object** slot = 916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Escape(reinterpret_cast<internal::Object**>(*value)); 917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Local<T>(reinterpret_cast<T*>(slot)); 918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 920f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch EscapableHandleScope(const EscapableHandleScope&) = delete; 921f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void operator=(const EscapableHandleScope&) = delete; 92262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void* operator new(size_t size); 92362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void operator delete(void*, size_t); 924f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object** Escape(internal::Object** escape_value); 927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object** escape_slot_; 928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass V8_EXPORT SealHandleScope { 931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch SealHandleScope(Isolate* isolate); 933014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ~SealHandleScope(); 934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 935f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch SealHandleScope(const SealHandleScope&) = delete; 936f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void operator=(const SealHandleScope&) = delete; 93762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void* operator new(size_t size); 93862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void operator delete(void*, size_t); 939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 940f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch private: 941f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch internal::Isolate* const isolate_; 942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch internal::Object** prev_limit_; 943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int prev_sealed_level_; 944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 9457f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// --- Special objects --- 948f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 949f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * The superclass of values and API object templates. 952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Data { 954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Data(); 956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * The optional attributes of ScriptOrigin. 961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass ScriptOriginOptions { 963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 96462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V8_INLINE ScriptOriginOptions(bool is_shared_cross_origin = false, 96562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool is_opaque = false, bool is_wasm = false, 96662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool is_module = false) 96762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch : flags_((is_shared_cross_origin ? kIsSharedCrossOrigin : 0) | 96862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch (is_wasm ? kIsWasm : 0) | (is_opaque ? kIsOpaque : 0) | 96962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch (is_module ? kIsModule : 0)) {} 970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE ScriptOriginOptions(int flags) 971014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : flags_(flags & 97262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch (kIsSharedCrossOrigin | kIsOpaque | kIsWasm | kIsModule)) {} 97362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsSharedCrossOrigin() const { 975014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return (flags_ & kIsSharedCrossOrigin) != 0; 976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 977014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsOpaque() const { return (flags_ & kIsOpaque) != 0; } 97862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool IsWasm() const { return (flags_ & kIsWasm) != 0; } 97962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool IsModule() const { return (flags_ & kIsModule) != 0; } 98062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int Flags() const { return flags_; } 982014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 983014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 984014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch enum { 98562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kIsSharedCrossOrigin = 1, 98662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kIsOpaque = 1 << 1, 98762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kIsWasm = 1 << 2, 98862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kIsModule = 1 << 3 989014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const int flags_; 991014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch/** 994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * The origin, within a file, of a script. 995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 9968defd9ff6930b4e24729971a61cf7469daf119beSteve Blockclass ScriptOrigin { 997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE ScriptOrigin( 999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> resource_name, 1000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Integer> resource_line_offset = Local<Integer>(), 1001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Integer> resource_column_offset = Local<Integer>(), 1002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Boolean> resource_is_shared_cross_origin = Local<Boolean>(), 1003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Integer> script_id = Local<Integer>(), 1004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> source_map_url = Local<Value>(), 100562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Local<Boolean> resource_is_opaque = Local<Boolean>(), 100662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Local<Boolean> is_wasm = Local<Boolean>(), 100762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Local<Boolean> is_module = Local<Boolean>()); 100862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE Local<Value> ResourceName() const; 1010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE Local<Integer> ResourceLineOffset() const; 1011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE Local<Integer> ResourceColumnOffset() const; 1012014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 1013014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Returns true for embedder's debugger scripts 1014014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 1015014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE Local<Integer> ScriptID() const; 1016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE Local<Value> SourceMapUrl() const; 1017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE ScriptOriginOptions Options() const { return options_; } 1018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1019a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> resource_name_; 1021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Integer> resource_line_offset_; 1022014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Integer> resource_column_offset_; 1023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ScriptOriginOptions options_; 1024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Integer> script_id_; 1025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> source_map_url_; 1026a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1027a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1029a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 1030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A compiled JavaScript script, not yet tied to a Context. 1031a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT UnboundScript { 1033a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1034402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu /** 1035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Binds the script to the currently entered context. 1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<Script> BindToCurrentContext(); 1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int GetId(); 1040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> GetScriptName(); 1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 1043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Data read from magic sourceURL comments. 1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 1045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> GetSourceURL(); 1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Data read from magic sourceMappingURL comments. 1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 1049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> GetSourceMappingURL(); 1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 1052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns zero based line number of the code_pos location in the script. 1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * -1 will be returned if no information available. 1054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 1055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int GetLineNumber(int code_pos); 1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNoScriptId = 0; 1058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 1059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1060f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch/** 1061f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * This is an unfinished experimental feature, and is only exposed 1062f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * here for internal testing purposes. DO NOT USE. 1063f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 1064f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * A compiled JavaScript module. 1065f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 1066f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass V8_EXPORT Module { 1067f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch public: 1068f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** 1069f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Returns the number of modules requested by this module. 1070f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 1071f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int GetModuleRequestsLength() const; 1072f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1073f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** 1074f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Returns the ith module specifier in this module. 1075f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * i must be < GetModuleRequestsLength() and >= 0. 1076f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 1077f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Local<String> GetModuleRequest(int i) const; 1078f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1079c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch /** 1080c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * Returns the identity hash for this object. 1081c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch */ 1082c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int GetIdentityHash() const; 1083f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1084f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch typedef MaybeLocal<Module> (*ResolveCallback)(Local<Context> context, 1085f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Local<String> specifier, 1086c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Local<Module> referrer); 1087f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1088f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** 1089f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * ModuleDeclarationInstantiation 1090f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 1091f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Returns false if an exception occurred during instantiation. 1092f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 1093c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_WARN_UNUSED_RESULT bool Instantiate(Local<Context> context, 1094c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch ResolveCallback callback); 1095f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1096f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** 1097f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * ModuleEvaluation 1098f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 1099f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Value> Evaluate(Local<Context> context); 1100f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}; 1101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 1103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A compiled JavaScript script, tied to a Context which was active when the 1104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * script was compiled. 1105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 1106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Script { 1107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 1109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A shorthand for ScriptCompiler::Compile(). 1110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 1111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_DEPRECATE_SOON( 1112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use maybe version", 1113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Script> Compile(Local<String> source, 1114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ScriptOrigin* origin = nullptr)); 1115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_WARN_UNUSED_RESULT MaybeLocal<Script> Compile( 1116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context, Local<String> source, 1117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ScriptOrigin* origin = nullptr); 1118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Script> V8_DEPRECATE_SOON("Use maybe version", 1120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Compile(Local<String> source, 1121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<String> file_name)); 1122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Runs the script returning the resulting value. It will be run in the 1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * context in which it was created (ScriptCompiler::CompileBound or 1126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * UnboundScript::BindToCurrentContext()). 1127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 1128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", Local<Value> Run()); 1129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Value> Run(Local<Context> context); 1130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 1132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns the corresponding context-unbound script. 1133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<UnboundScript> GetUnboundScript(); 1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 1136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 1139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * For compiling scripts. 1140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 1141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT ScriptCompiler { 1142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 1144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Compilation data that the embedder can cache and pass back to speed up 1145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * future compilations. The data is produced if the CompilerOptions passed to 1146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * the compilation functions in ScriptCompiler contains produce_data_to_cache 1147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * = true. The data to cache can then can be retrieved from 1148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * UnboundScript. 1149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 1150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch struct V8_EXPORT CachedData { 1151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum BufferPolicy { 1152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BufferNotOwned, 1153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BufferOwned 1154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 1155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CachedData() 1157958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier : data(NULL), 1158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier length(0), 1159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier rejected(false), 1160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier buffer_policy(BufferNotOwned) {} 1161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If buffer_policy is BufferNotOwned, the caller keeps the ownership of 1163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // data and guarantees that it stays alive until the CachedData object is 1164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // destroyed. If the policy is BufferOwned, the given data will be deleted 1165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // (with delete[]) when the CachedData object is destroyed. 1166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CachedData(const uint8_t* data, int length, 1167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BufferPolicy buffer_policy = BufferNotOwned); 1168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ~CachedData(); 1169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(marja): Async compilation; add constructors which take a callback 1170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // which will be called when V8 no longer needs the data. 1171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const uint8_t* data; 1172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int length; 1173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool rejected; 1174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BufferPolicy buffer_policy; 1175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1176f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Prevent copying. 1177f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch CachedData(const CachedData&) = delete; 1178f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch CachedData& operator=(const CachedData&) = delete; 1179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 1180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 1182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Source code which can be then compiled to a UnboundScript or Script. 1183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 1184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class Source { 1185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Source takes ownership of CachedData. 1187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Source(Local<String> source_string, const ScriptOrigin& origin, 1188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CachedData* cached_data = NULL); 1189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Source(Local<String> source_string, 1190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CachedData* cached_data = NULL); 1191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE ~Source(); 1192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Ownership of the CachedData or its buffers is *not* transferred to the 1194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // caller. The CachedData object is alive as long as the Source object is 1195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // alive. 1196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE const CachedData* GetCachedData() const; 1197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 119862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V8_INLINE const ScriptOriginOptions& GetResourceOptions() const; 119962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1200f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Prevent copying. 1201f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Source(const Source&) = delete; 1202f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Source& operator=(const Source&) = delete; 1203f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class ScriptCompiler; 1206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<String> source_string; 1208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Origin information 1210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> resource_name; 1211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Integer> resource_line_offset; 1212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Integer> resource_column_offset; 1213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ScriptOriginOptions resource_options; 1214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> source_map_url; 1215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Cached data from previous compilation (if a kConsume*Cache flag is 1217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // set), or hold newly generated cache data (kProduce*Cache flags) are 1218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // set when calling a compile method. 1219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CachedData* cached_data; 1220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 1221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 1223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * For streaming incomplete script data to V8. The embedder should implement a 1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * subclass of this class. 1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 1226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class V8_EXPORT ExternalSourceStream { 1227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual ~ExternalSourceStream() {} 1229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 1231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * V8 calls this to request the next chunk of data from the embedder. This 1232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * function will be called on a background thread, so it's OK to block and 1233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * wait for the data, if the embedder doesn't have data yet. Returns the 1234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * length of the data returned. When the data ends, GetMoreData should 1235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * return 0. Caller takes ownership of the data. 1236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 1237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * When streaming UTF-8 data, V8 handles multi-byte characters split between 1238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * two data chunks, but doesn't handle multi-byte characters split between 1239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * more than two data chunks. The embedder can avoid this problem by always 1240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * returning at least 2 bytes of data. 1241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 1242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * If the embedder wants to cancel the streaming, they should make the next 1243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * GetMoreData call return 0. V8 will interpret it as end of data (and most 1244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * probably, parsing will fail). The streaming task will return as soon as 1245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * V8 has parsed the data it received so far. 1246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 1247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual size_t GetMoreData(const uint8_t** src) = 0; 1248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 1250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * V8 calls this method to set a 'bookmark' at the current position in 1251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * the source stream, for the purpose of (maybe) later calling 1252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * ResetToBookmark. If ResetToBookmark is called later, then subsequent 1253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * calls to GetMoreData should return the same data as they did when 1254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * SetBookmark was called earlier. 1255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * 1256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * The embedder may return 'false' to indicate it cannot provide this 1257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * functionality. 1258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 1259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch virtual bool SetBookmark(); 1260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 1262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * V8 calls this to return to a previously set bookmark. 1263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 1264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch virtual void ResetToBookmark(); 1265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 1266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 1269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Source code which can be streamed into V8 in pieces. It will be parsed 1270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * while streaming. It can be compiled after the streaming is complete. 1271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * StreamedSource must be kept alive while the streaming task is ran (see 1272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * ScriptStreamingTask below). 1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 1274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class V8_EXPORT StreamedSource { 1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum Encoding { ONE_BYTE, TWO_BYTE, UTF8 }; 1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StreamedSource(ExternalSourceStream* source_stream, Encoding encoding); 1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ~StreamedSource(); 1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Ownership of the CachedData or its buffers is *not* transferred to the 1282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // caller. The CachedData object is alive as long as the StreamedSource 1283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // object is alive. 1284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const CachedData* GetCachedData() const; 1285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::StreamedSource* impl() const { return impl_; } 1287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1288f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Prevent copying. 1289f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch StreamedSource(const StreamedSource&) = delete; 1290f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch StreamedSource& operator=(const StreamedSource&) = delete; 1291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1292f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch private: 1293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::StreamedSource* impl_; 1294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 1297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A streaming task which the embedder must run on a background thread to 1298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * stream scripts into V8. Returned by ScriptCompiler::StartStreamingScript. 1299402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu */ 1300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class ScriptStreamingTask { 1301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual ~ScriptStreamingTask() {} 1303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void Run() = 0; 1304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 1305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum CompileOptions { 1307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kNoCompileOptions = 0, 1308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kProduceParserCache, 1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kConsumeParserCache, 1310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kProduceCodeCache, 1311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kConsumeCodeCache 1312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 1313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1314402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu /** 1315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Compiles the specified script (context-independent). 1316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Cached data as part of the source object can be optionally produced to be 1317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * consumed later to speed up compilation of identical source scripts. 1318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 1319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Note that when producing cached data, the source must point to NULL for 1320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * cached data. When consuming cached data, the cached data must have been 1321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * produced by the same version of V8. 1322402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu * 1323402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu * \param source Script source code. 1324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \return Compiled script object (context independent; for running it must be 1325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * bound to a context). 1326402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu */ 1327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_DEPRECATED("Use maybe version", 1328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<UnboundScript> CompileUnbound( 1329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Source* source, 1330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CompileOptions options = kNoCompileOptions)); 1331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_WARN_UNUSED_RESULT MaybeLocal<UnboundScript> CompileUnboundScript( 1332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate, Source* source, 1333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CompileOptions options = kNoCompileOptions); 1334402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu 1335402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu /** 1336402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu * Compiles the specified script (bound to current context). 1337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 1338402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu * \param source Script source code. 1339402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu * \param pre_data Pre-parsing data, as obtained by ScriptData::PreCompile() 1340402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu * using pre_data speeds compilation if it's done multiple times. 1341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Owned by caller, no references are kept when this function returns. 1342402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu * \return Compiled script object, bound to the context that was active 1343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * when this function was called. When run it will always use this 1344402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu * context. 1345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 1346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_DEPRECATED( 1347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use maybe version", 1348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Script> Compile(Isolate* isolate, Source* source, 1349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CompileOptions options = kNoCompileOptions)); 1350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_WARN_UNUSED_RESULT MaybeLocal<Script> Compile( 1351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context, Source* source, 1352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CompileOptions options = kNoCompileOptions); 1353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 1355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns a task which streams script data into V8, or NULL if the script 1356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * cannot be streamed. The user is responsible for running the task on a 1357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * background thread and deleting it. When ran, the task starts parsing the 1358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * script, and it will request data from the StreamedSource as needed. When 1359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * ScriptStreamingTask::Run exits, all data has been streamed and the script 1360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * can be compiled (see Compile below). 1361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 1362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * This API allows to start the streaming with as little data as possible, and 1363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * the remaining data (for example, the ScriptOrigin) is passed to Compile. 1364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 1365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static ScriptStreamingTask* StartStreamingScript( 1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate, StreamedSource* source, 1367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CompileOptions options = kNoCompileOptions); 1368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 1370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Compiles a streamed script (bound to current context). 1371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 1372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * This can only be called after the streaming has finished 1373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * (ScriptStreamingTask has been run). V8 doesn't construct the source string 1374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * during streaming, so the embedder needs to pass the full source here. 1375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 1376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_DEPRECATED("Use maybe version", 1377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Script> Compile(Isolate* isolate, 1378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StreamedSource* source, 1379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<String> full_source_string, 1380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const ScriptOrigin& origin)); 1381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_WARN_UNUSED_RESULT MaybeLocal<Script> Compile( 1382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context, StreamedSource* source, 1383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<String> full_source_string, const ScriptOrigin& origin); 1384958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1385958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 1386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Return a version tag for CachedData for the current V8 version & flags. 1387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * 1388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * This value is meant only for determining whether a previously generated 1389958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * CachedData instance is still valid; the tag has no other meaing. 1390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * 1391958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Background: The data carried by CachedData may depend on the exact 1392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * V8 version number or currently compiler flags. This means when 1393958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * persisting CachedData, the embedder must take care to not pass in 1394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * data from another V8 version, or the same version with different 1395958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * features enabled. 1396958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * 1397958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * The easiest way to do so is to clear the embedder's cache on any 1398958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * such change. 1399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * 1400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Alternatively, this tag can be stored alongside the cached data and 1401958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * compared when it is being used. 1402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 1403958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static uint32_t CachedDataVersionTag(); 1404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 1406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * This is an unfinished experimental feature, and is only exposed 1407f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * here for internal testing purposes. DO NOT USE. 1408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * 1409f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Compile an ES module, returning a Module that encapsulates 1410f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * the compiled code. 1411f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 1412f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Corresponds to the ParseModule abstract operation in the 1413f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * ECMAScript specification. 1414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 1415f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static V8_WARN_UNUSED_RESULT MaybeLocal<Module> CompileModule( 1416f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Isolate* isolate, Source* source); 1417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 1419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Compile a function for a given context. This is equivalent to running 1420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * 1421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * with (obj) { 1422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * return function(args) { ... } 1423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * } 1424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * 1425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * It is possible to specify multiple context extensions (obj in the above 1426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * example). 1427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 1428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_DEPRECATE_SOON("Use maybe version", 1429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Function> CompileFunctionInContext( 1430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Source* source, 1431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context, size_t arguments_count, 1432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<String> arguments[], 1433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t context_extension_count, 1434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Object> context_extensions[])); 1435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_WARN_UNUSED_RESULT MaybeLocal<Function> CompileFunctionInContext( 1436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context, Source* source, size_t arguments_count, 1437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<String> arguments[], size_t context_extension_count, 1438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Object> context_extensions[]); 1439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 1441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_WARN_UNUSED_RESULT MaybeLocal<UnboundScript> CompileUnboundInternal( 144262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate* isolate, Source* source, CompileOptions options); 1443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 1447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * An error message. 1448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 1449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Message { 1450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Local<String> Get() const; 1452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", Local<String> GetSourceLine() const); 1454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<String> GetSourceLine( 1455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context) const; 1456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 1458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns the origin for the script from where the function causing the 1459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * error originates. 1460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 1461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ScriptOrigin GetScriptOrigin() const; 1462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 1464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns the resource name for the script from where the function causing 1465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * the error originates. 1466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 1467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> GetScriptResourceName() const; 1468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 14703bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch * Exception stack trace. By default stack traces are not captured for 14713bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch * uncaught exceptions. SetCaptureStackTraceForUncaughtExceptions allows 14723bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch * to change this option. 14733bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch */ 1474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<StackTrace> GetStackTrace() const; 14753bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch 14763bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch /** 1477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns the number, 1-based, of the line where the error occurred. 1478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 1479014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", int GetLineNumber() const); 1480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<int> GetLineNumber(Local<Context> context) const; 1481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 1483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns the index within the script of the first character where 1484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * the error occurred. 1485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 1486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int GetStartPosition() const; 1487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 1489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns the index within the script of the last character where 1490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * the error occurred. 1491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 1492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int GetEndPosition() const; 1493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 149562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Returns the error level of the message. 149662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch */ 149762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int ErrorLevel() const; 149862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 149962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch /** 1500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns the index within the line of the first character where 1501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * the error occurred. 1502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 1503014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", int GetStartColumn() const); 1504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<int> GetStartColumn(Local<Context> context) const; 1505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 1507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns the index within the line of the last character where 1508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * the error occurred. 1509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 1510014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use maybe version", int GetEndColumn() const); 1511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<int> GetEndColumn(Local<Context> context) const; 1512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 1514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Passes on the value set by the embedder when it fed the script from which 1515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * this Message was generated to V8. 1516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 1517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsSharedCrossOrigin() const; 1518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsOpaque() const; 1519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // TODO(1245381): Print to a string instead of on a FILE. 1521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void PrintCurrentStackTrace(Isolate* isolate, FILE* out); 152225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 152325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen static const int kNoLineNumberInfo = 0; 152425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen static const int kNoColumnInfo = 0; 1525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNoScriptIdInfo = 0; 152625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen}; 152725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 152825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 152925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen/** 153025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * Representation of a JavaScript stack trace. The information collected is a 153125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * snapshot of the execution stack and the information remains valid after 153225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * execution continues. 153325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen */ 1534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT StackTrace { 153525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen public: 153625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen /** 153725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * Flags that determine what information is placed captured for each 153825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * StackFrame when grabbing the current stack trace. 153925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen */ 154025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen enum StackTraceOptions { 154125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen kLineNumber = 1, 154225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen kColumnOffset = 1 << 1 | kLineNumber, 154325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen kScriptName = 1 << 2, 154425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen kFunctionName = 1 << 3, 154525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen kIsEval = 1 << 4, 154625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen kIsConstructor = 1 << 5, 1547f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch kScriptNameOrSourceURL = 1 << 6, 1548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kScriptId = 1 << 7, 1549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kExposeFramesAcrossSecurityOrigins = 1 << 8, 155025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen kOverview = kLineNumber | kColumnOffset | kScriptName | kFunctionName, 1551f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch kDetailed = kOverview | kIsEval | kIsConstructor | kScriptNameOrSourceURL 155225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen }; 155325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 155425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen /** 155525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * Returns a StackFrame at a particular index. 155625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen */ 155725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen Local<StackFrame> GetFrame(uint32_t index) const; 155825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 155925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen /** 156025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * Returns the number of StackFrames. 156125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen */ 156225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen int GetFrameCount() const; 156325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 156425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen /** 156525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * Returns StackTrace as a v8::Array that contains StackFrame objects. 156625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen */ 156725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen Local<Array> AsArray(); 156825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 156925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen /** 1570257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * Grab a snapshot of the current JavaScript execution stack. 157125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * 157225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * \param frame_limit The maximum number of stack frames we want to capture. 157325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * \param options Enumerates the set of things we will capture for each 157425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * StackFrame. 157525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen */ 157625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen static Local<StackTrace> CurrentStackTrace( 1577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate, 157825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen int frame_limit, 157925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen StackTraceOptions options = kOverview); 158025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen}; 158125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 158225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 158325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen/** 158425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * A single JavaScript stack frame. 158525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen */ 1586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT StackFrame { 158725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen public: 158825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen /** 158925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * Returns the number, 1-based, of the line for the associate function call. 159025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * This method will return Message::kNoLineNumberInfo if it is unable to 159125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * retrieve the line number, or if kLineNumber was not passed as an option 159225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * when capturing the StackTrace. 159325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen */ 159425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen int GetLineNumber() const; 159525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 159625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen /** 159725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * Returns the 1-based column offset on the line for the associated function 159825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * call. 159925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * This method will return Message::kNoColumnInfo if it is unable to retrieve 160025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * the column number, or if kColumnOffset was not passed as an option when 160125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * capturing the StackTrace. 160225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen */ 160325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen int GetColumn() const; 160425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 160525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen /** 1606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns the id of the script for the function for this StackFrame. 1607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * This method will return Message::kNoScriptIdInfo if it is unable to 1608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * retrieve the script id, or if kScriptId was not passed as an option when 1609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * capturing the StackTrace. 1610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 1611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int GetScriptId() const; 1612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 161425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * Returns the name of the resource that contains the script for the 161525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * function for this StackFrame. 161625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen */ 161725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen Local<String> GetScriptName() const; 161825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 161925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen /** 1620f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch * Returns the name of the resource that contains the script for the 1621f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch * function for this StackFrame or sourceURL value if the script name 1622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * is undefined and its source ends with //# sourceURL=... string or 1623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * deprecated //@ sourceURL=... string. 1624f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch */ 1625f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch Local<String> GetScriptNameOrSourceURL() const; 1626f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 1627f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch /** 162825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * Returns the name of the function associated with this stack frame. 162925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen */ 163025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen Local<String> GetFunctionName() const; 163125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 163225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen /** 163325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * Returns whether or not the associated function is compiled via a call to 163425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * eval(). 163525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen */ 163625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen bool IsEval() const; 163725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 163825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen /** 1639257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * Returns whether or not the associated function is called as a 164025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen * constructor via "new". 164125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen */ 164225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen bool IsConstructor() const; 1643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1646958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// A StateTag represents a possible state of the VM. 1647958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierenum StateTag { JS, GC, COMPILER, OTHER, EXTERNAL, IDLE }; 1648958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1649958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// A RegisterState represents the current state of registers used 1650958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// by the sampling profiler API. 1651958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct RegisterState { 165213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch RegisterState() : pc(nullptr), sp(nullptr), fp(nullptr) {} 1653958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void* pc; // Instruction pointer. 1654958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void* sp; // Stack pointer. 1655958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void* fp; // Frame pointer. 1656958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1657958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1658958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// The output structure filled up by GetStackSample API function. 1659958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct SampleInfo { 166013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch size_t frames_count; // Number of frames collected. 166113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch StateTag vm_state; // Current VM state. 166213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch void* external_callback_entry; // External callback address if VM is 166313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // executing an external callback. 1664958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1665958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 1667bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * A JSON Parser and Stringifier. 1668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 1669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT JSON { 1670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 1672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Tries to parse the string |json_string| and returns it as value if 1673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * successful. 1674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 1675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \param json_string The string to parse. 1676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \return The corresponding value if successfully parsed. 1677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 1678bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static V8_DEPRECATED("Use the maybe version taking context", 1679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> Parse(Local<String> json_string)); 1680bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static V8_DEPRECATE_SOON("Use the maybe version taking context", 1681bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch MaybeLocal<Value> Parse(Isolate* isolate, 1682bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Local<String> json_string)); 1683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_WARN_UNUSED_RESULT MaybeLocal<Value> Parse( 1684bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Local<Context> context, Local<String> json_string); 1685bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 1686bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch /** 1687bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * Tries to stringify the JSON-serializable object |json_object| and returns 1688bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * it as string if successful. 1689bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * 1690bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * \param json_object The JSON-serializable object to stringify. 1691bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * \return The corresponding string if successfully stringified. 1692bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch */ 1693bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static V8_WARN_UNUSED_RESULT MaybeLocal<String> Stringify( 169413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Local<Context> context, Local<Object> json_object, 169513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Local<String> gap = Local<String>()); 1696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 1697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1698f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch/** 1699f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Value serialization compatible with the HTML structured clone algorithm. 1700f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * The format is backward-compatible (i.e. safe to store to disk). 1701f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 1702f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * WARNING: This API is under development, and changes (including incompatible 1703f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * changes to the API or wire format) may occur without notice until this 1704f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * warning is removed. 1705f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 1706f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass V8_EXPORT ValueSerializer { 1707f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch public: 1708f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch class V8_EXPORT Delegate { 1709f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch public: 1710f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch virtual ~Delegate() {} 1711f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1712f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /* 1713f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Handles the case where a DataCloneError would be thrown in the structured 1714f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * clone spec. Other V8 embedders may throw some other appropriate exception 1715f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * type. 1716f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 1717f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch virtual void ThrowDataCloneError(Local<String> message) = 0; 1718f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1719f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /* 1720f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * The embedder overrides this method to write some kind of host object, if 1721f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * possible. If not, a suitable exception should be thrown and 1722f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Nothing<bool>() returned. 1723f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 1724f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch virtual Maybe<bool> WriteHostObject(Isolate* isolate, Local<Object> object); 1725c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 1726c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch /* 172762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Called when the ValueSerializer is going to serialize a 172862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * SharedArrayBuffer object. The embedder must return an ID for the 172962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * object, using the same ID if this SharedArrayBuffer has already been 173062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * serialized in this buffer. When deserializing, this ID will be passed to 173162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * ValueDeserializer::TransferSharedArrayBuffer as |transfer_id|. 173262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * 173362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * If the object cannot be serialized, an 173462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * exception should be thrown and Nothing<uint32_t>() returned. 173562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch */ 173662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch virtual Maybe<uint32_t> GetSharedArrayBufferId( 173762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate* isolate, Local<SharedArrayBuffer> shared_array_buffer); 173862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 173962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch /* 1740c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * Allocates memory for the buffer of at least the size provided. The actual 1741c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * size (which may be greater or equal) is written to |actual_size|. If no 1742c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * buffer has been allocated yet, nullptr will be provided. 174362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * 174462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * If the memory cannot be allocated, nullptr should be returned. 174562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * |actual_size| will be ignored. It is assumed that |old_buffer| is still 174662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * valid in this case and has not been modified. 1747c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch */ 1748c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch virtual void* ReallocateBufferMemory(void* old_buffer, size_t size, 1749c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch size_t* actual_size); 1750c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 1751c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch /* 1752c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * Frees a buffer allocated with |ReallocateBufferMemory|. 1753c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch */ 1754c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch virtual void FreeBufferMemory(void* buffer); 1755f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch }; 1756f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1757f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch explicit ValueSerializer(Isolate* isolate); 1758f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch ValueSerializer(Isolate* isolate, Delegate* delegate); 1759f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch ~ValueSerializer(); 1760f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1761f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /* 1762f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Writes out a header, which includes the format version. 1763f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 1764f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void WriteHeader(); 1765f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1766f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /* 1767f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Serializes a JavaScript value into the buffer. 1768f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 1769f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<bool> WriteValue(Local<Context> context, 1770f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Local<Value> value); 1771f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1772f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /* 1773f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Returns the stored data. This serializer should not be used once the buffer 1774f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * is released. The contents are undefined if a previous write has failed. 1775f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 1776c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_DEPRECATE_SOON("Use Release()", std::vector<uint8_t> ReleaseBuffer()); 1777c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 1778c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch /* 1779c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * Returns the stored data (allocated using the delegate's 1780c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * AllocateBufferMemory) and its size. This serializer should not be used once 1781c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * the buffer is released. The contents are undefined if a previous write has 1782c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * failed. 1783c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch */ 1784c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_WARN_UNUSED_RESULT std::pair<uint8_t*, size_t> Release(); 1785f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1786f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /* 1787f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Marks an ArrayBuffer as havings its contents transferred out of band. 178862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Pass the corresponding ArrayBuffer in the deserializing context to 1789f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * ValueDeserializer::TransferArrayBuffer. 1790f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 1791f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void TransferArrayBuffer(uint32_t transfer_id, 1792f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Local<ArrayBuffer> array_buffer); 1793f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1794f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /* 1795f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Similar to TransferArrayBuffer, but for SharedArrayBuffer. 1796f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 179762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V8_DEPRECATE_SOON("Use Delegate::GetSharedArrayBufferId", 179862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void TransferSharedArrayBuffer( 179962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch uint32_t transfer_id, 180062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Local<SharedArrayBuffer> shared_array_buffer)); 180162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 180262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch /* 180362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Indicate whether to treat ArrayBufferView objects as host objects, 180462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * i.e. pass them to Delegate::WriteHostObject. This should not be 180562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * called when no Delegate was passed. 180662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * 180762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * The default is not to treat ArrayBufferViews as host objects. 180862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch */ 180962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void SetTreatArrayBufferViewsAsHostObjects(bool mode); 1810f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1811f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /* 1812f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Write raw data in various common formats to the buffer. 1813f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Note that integer types are written in base-128 varint format, not with a 1814f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * binary copy. For use during an override of Delegate::WriteHostObject. 1815f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 1816f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void WriteUint32(uint32_t value); 1817f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void WriteUint64(uint64_t value); 1818f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void WriteDouble(double value); 1819f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void WriteRawBytes(const void* source, size_t length); 1820f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1821f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch private: 1822f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch ValueSerializer(const ValueSerializer&) = delete; 1823f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void operator=(const ValueSerializer&) = delete; 1824f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1825f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch struct PrivateData; 1826f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch PrivateData* private_; 1827f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}; 1828f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1829f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch/** 1830f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Deserializes values from data written with ValueSerializer, or a compatible 1831f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * implementation. 1832f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 1833f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * WARNING: This API is under development, and changes (including incompatible 1834f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * changes to the API or wire format) may occur without notice until this 1835f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * warning is removed. 1836f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 1837f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass V8_EXPORT ValueDeserializer { 1838f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch public: 1839f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch class V8_EXPORT Delegate { 1840f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch public: 1841f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch virtual ~Delegate() {} 1842f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1843f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /* 1844f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * The embedder overrides this method to read some kind of host object, if 1845f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * possible. If not, a suitable exception should be thrown and 1846f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * MaybeLocal<Object>() returned. 1847f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 1848f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch virtual MaybeLocal<Object> ReadHostObject(Isolate* isolate); 1849f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch }; 1850f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1851f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch ValueDeserializer(Isolate* isolate, const uint8_t* data, size_t size); 1852f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch ValueDeserializer(Isolate* isolate, const uint8_t* data, size_t size, 1853f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Delegate* delegate); 1854f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch ~ValueDeserializer(); 1855f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1856f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /* 1857f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Reads and validates a header (including the format version). 1858f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * May, for example, reject an invalid or unsupported wire format. 1859f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 1860f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<bool> ReadHeader(Local<Context> context); 1861f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1862f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /* 1863f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Deserializes a JavaScript value from the buffer. 1864f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 1865f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Value> ReadValue(Local<Context> context); 1866f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1867f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /* 1868f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Accepts the array buffer corresponding to the one passed previously to 1869f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * ValueSerializer::TransferArrayBuffer. 1870f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 1871f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void TransferArrayBuffer(uint32_t transfer_id, 1872f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Local<ArrayBuffer> array_buffer); 1873f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1874f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /* 1875f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Similar to TransferArrayBuffer, but for SharedArrayBuffer. 187662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * The id is not necessarily in the same namespace as unshared ArrayBuffer 187762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * objects. 1878f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 187962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void TransferSharedArrayBuffer(uint32_t id, 1880f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Local<SharedArrayBuffer> shared_array_buffer); 1881f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1882f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /* 1883f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Must be called before ReadHeader to enable support for reading the legacy 1884f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * wire format (i.e., which predates this being shipped). 1885f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 1886f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Don't use this unless you need to read data written by previous versions of 1887f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * blink::ScriptValueSerializer. 1888f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 1889f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void SetSupportsLegacyWireFormat(bool supports_legacy_wire_format); 1890f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1891f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /* 1892f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Reads the underlying wire format version. Likely mostly to be useful to 1893f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * legacy code reading old wire format versions. Must be called after 1894f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * ReadHeader. 1895f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 1896f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch uint32_t GetWireFormatVersion() const; 1897f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1898f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /* 1899f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Reads raw data in various common formats to the buffer. 1900f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Note that integer types are read in base-128 varint format, not with a 1901f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * binary copy. For use during an override of Delegate::ReadHostObject. 1902f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 1903f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V8_WARN_UNUSED_RESULT bool ReadUint32(uint32_t* value); 1904f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V8_WARN_UNUSED_RESULT bool ReadUint64(uint64_t* value); 1905f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V8_WARN_UNUSED_RESULT bool ReadDouble(double* value); 1906f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V8_WARN_UNUSED_RESULT bool ReadRawBytes(size_t length, const void** data); 1907f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1908f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch private: 1909f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch ValueDeserializer(const ValueDeserializer&) = delete; 1910f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void operator=(const ValueDeserializer&) = delete; 1911f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1912f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch struct PrivateData; 1913f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch PrivateData* private_; 1914f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}; 1915014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch/** 1917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * A map whose keys are referenced weakly. It is similar to JavaScript WeakMap 1918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * but can be created without entering a v8::Context and hence shouldn't 1919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * escape to JavaScript. 1920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 1921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass V8_EXPORT NativeWeakMap : public Data { 1922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 1923014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<NativeWeakMap> New(Isolate* isolate); 1924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void Set(Local<Value> key, Local<Value> value); 1925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> Get(Local<Value> key); 1926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool Has(Local<Value> key); 1927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool Delete(Local<Value> key); 1928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 1929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1931257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// --- Value --- 1932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 1935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * The superclass of all JavaScript values and objects. 1936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 1937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Value : public Data { 1938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 1940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns true if this value is the undefined value. See ECMA-262 1941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 4.3.10. 1942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 1943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE bool IsUndefined() const; 1944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 1946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns true if this value is the null value. See ECMA-262 1947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 4.3.11. 1948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 1949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE bool IsNull() const; 1950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 195162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch /** 195262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Returns true if this value is either the null or the undefined value. 195362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * See ECMA-262 195462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * 4.3.11. and 4.3.12 1955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 195662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V8_INLINE bool IsNullOrUndefined() const; 195762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 195862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch /** 195962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Returns true if this value is true. 196062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch */ 1961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsTrue() const; 1962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 1964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns true if this value is false. 1965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 1966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsFalse() const; 1967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 1969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if this value is a symbol or a string. 1970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 1971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsName() const; 1972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 1974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns true if this value is an instance of the String type. 1975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * See ECMA-262 8.4. 1976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 1977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE bool IsString() const; 1978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 1980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if this value is a symbol. 1981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 1982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsSymbol() const; 1983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 1985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns true if this value is a function. 1986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 1987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsFunction() const; 1988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 1990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Returns true if this value is an array. Note that it will return false for 1991014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * an Proxy for an array. 1992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 1993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsArray() const; 1994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 1996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns true if this value is an object. 1997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 1998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsObject() const; 1999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 2001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns true if this value is boolean. 2002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsBoolean() const; 2004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 2006a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns true if this value is a number. 2007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsNumber() const; 2009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2010a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 2011a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns true if this value is external. 2012a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsExternal() const; 2014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 2016a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns true if this value is a 32-bit signed integer. 2017a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsInt32() const; 2019a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2020a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 20216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * Returns true if this value is a 32-bit unsigned integer. 20226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block */ 2023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsUint32() const; 20246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 20256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block /** 2026a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns true if this value is a Date. 2027a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsDate() const; 2029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 2031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if this value is an Arguments object. 2032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsArgumentsObject() const; 2034a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2035756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick /** 20363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch * Returns true if this value is a Boolean object. 20373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch */ 2038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsBooleanObject() const; 20393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 20403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch /** 20413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch * Returns true if this value is a Number object. 20423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch */ 2043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsNumberObject() const; 20443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 20453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch /** 20463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch * Returns true if this value is a String object. 20473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch */ 2048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsStringObject() const; 2049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 2051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if this value is a Symbol object. 2052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsSymbolObject() const; 20543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 20553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch /** 20563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch * Returns true if this value is a NativeError. 20573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch */ 2058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsNativeError() const; 20593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 20603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch /** 2061756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick * Returns true if this value is a RegExp. 2062756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick */ 2063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsRegExp() const; 2064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 2066f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Returns true if this value is an async function. 2067f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 2068f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch bool IsAsyncFunction() const; 2069f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 2070f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** 2071958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Returns true if this value is a Generator function. 2072958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 2073958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool IsGeneratorFunction() const; 2074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2075958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 2076958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Returns true if this value is a Generator object (iterator). 2077958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 2078958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool IsGeneratorObject() const; 2079958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2080958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 2081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if this value is a Promise. 2082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsPromise() const; 2084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 2086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if this value is a Map. 2087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsMap() const; 2089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 2091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if this value is a Set. 2092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsSet() const; 2094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 2096958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Returns true if this value is a Map Iterator. 2097958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 2098958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool IsMapIterator() const; 2099958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 2101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Returns true if this value is a Set Iterator. 2102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 2103958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool IsSetIterator() const; 2104958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 2106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if this value is a WeakMap. 2107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsWeakMap() const; 2109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 2111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if this value is a WeakSet. 2112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsWeakSet() const; 2114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 2116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if this value is an ArrayBuffer. 2117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsArrayBuffer() const; 2119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 2121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if this value is an ArrayBufferView. 2122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsArrayBufferView() const; 2124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 2126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if this value is one of TypedArrays. 2127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsTypedArray() const; 2129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 2131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if this value is an Uint8Array. 2132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsUint8Array() const; 2134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 2136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if this value is an Uint8ClampedArray. 2137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsUint8ClampedArray() const; 2139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 2141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if this value is an Int8Array. 2142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsInt8Array() const; 2144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 2146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if this value is an Uint16Array. 2147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsUint16Array() const; 2149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 2151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if this value is an Int16Array. 2152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsInt16Array() const; 2154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 2156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if this value is an Uint32Array. 2157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsUint32Array() const; 2159756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 2160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 2161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if this value is an Int32Array. 2162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsInt32Array() const; 2164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 2166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if this value is a Float32Array. 2167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsFloat32Array() const; 2169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 2171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if this value is a Float64Array. 2172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsFloat64Array() const; 2174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 2176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if this value is a DataView. 2177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsDataView() const; 2179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 2181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Returns true if this value is a SharedArrayBuffer. 2182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * This is an experimental feature. 2183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 2184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsSharedArrayBuffer() const; 2185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 2187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Returns true if this value is a JavaScript Proxy. 2188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 2189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsProxy() const; 2190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2191f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool IsWebAssemblyCompiledModule() const; 2192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Boolean> ToBoolean( 2194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context) const; 2195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Number> ToNumber( 2196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context) const; 2197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<String> ToString( 2198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context) const; 2199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<String> ToDetailString( 2200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context) const; 2201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Object> ToObject( 2202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context) const; 2203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Integer> ToInteger( 2204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context) const; 2205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Uint32> ToUint32( 2206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context) const; 2207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Int32> ToInt32(Local<Context> context) const; 2208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", 2210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Boolean> ToBoolean(Isolate* isolate) const); 2211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", 2212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Number> ToNumber(Isolate* isolate) const); 2213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", 2214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<String> ToString(Isolate* isolate) const); 2215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use maybe version", 2216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<String> ToDetailString(Isolate* isolate) const); 2217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", 2218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Object> ToObject(Isolate* isolate) const); 2219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", 2220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Integer> ToInteger(Isolate* isolate) const); 2221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use maybe version", 2222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Uint32> ToUint32(Isolate* isolate) const); 2223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", 2224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Int32> ToInt32(Isolate* isolate) const); 2225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline V8_DEPRECATE_SOON("Use maybe version", 2227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Boolean> ToBoolean() const); 2228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline V8_DEPRECATED("Use maybe version", Local<Number> ToNumber() const); 2229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline V8_DEPRECATE_SOON("Use maybe version", Local<String> ToString() const); 2230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline V8_DEPRECATED("Use maybe version", 2231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<String> ToDetailString() const); 2232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline V8_DEPRECATE_SOON("Use maybe version", Local<Object> ToObject() const); 2233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline V8_DEPRECATE_SOON("Use maybe version", 2234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Integer> ToInteger() const); 2235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline V8_DEPRECATED("Use maybe version", Local<Uint32> ToUint32() const); 2236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline V8_DEPRECATED("Use maybe version", Local<Int32> ToInt32() const); 2237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 2239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Attempts to convert a string to an array index. 2240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns an empty handle if the conversion fails. 2241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use maybe version", Local<Uint32> ToArrayIndex() const); 2243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Uint32> ToArrayIndex( 2244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context) const; 2245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<bool> BooleanValue(Local<Context> context) const; 2247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<double> NumberValue(Local<Context> context) const; 2248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<int64_t> IntegerValue( 2249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context) const; 2250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<uint32_t> Uint32Value( 2251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context) const; 2252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<int32_t> Int32Value(Local<Context> context) const; 2253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", bool BooleanValue() const); 2255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", double NumberValue() const); 2256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", int64_t IntegerValue() const); 2257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", uint32_t Uint32Value() const); 2258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", int32_t Int32Value() const); 2259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** JS == */ 2261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", bool Equals(Local<Value> that) const); 2262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<bool> Equals(Local<Context> context, 2263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> that) const; 2264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool StrictEquals(Local<Value> that) const; 2265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool SameValue(Local<Value> that) const; 2266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class T> V8_INLINE static Value* Cast(T* value); 22683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 226962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Local<String> TypeOf(Isolate*); 2270bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 2271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE bool QuickIsUndefined() const; 2273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE bool QuickIsNull() const; 227462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V8_INLINE bool QuickIsNullOrUndefined() const; 2275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE bool QuickIsString() const; 2276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool FullIsUndefined() const; 2277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool FullIsNull() const; 2278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool FullIsString() const; 2279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 2283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * The superclass of primitive values. See ECMA-262 4.3.2. 2284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Primitive : public Value { }; 2286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 2289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * A primitive boolean value (ECMA-262, 4.3.14). Either the true 2290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * or false value. 2291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Boolean : public Primitive { 2293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 2294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool Value() const; 2295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static Boolean* Cast(v8::Value* obj); 2296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static Local<Boolean> New(Isolate* isolate, bool value); 2297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 2299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void CheckCast(v8::Value* obj); 2300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 2301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 2304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A superclass for symbols and strings. 2305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Name : public Primitive { 2307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 2309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Returns the identity hash for this object. The current implementation 2310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * uses an inline property on the object to store the identity hash. 2311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * 2312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * The return value will never be 0. Also, it is not guaranteed to be 2313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * unique. 2314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 2315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int GetIdentityHash(); 2316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 231762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V8_INLINE static Name* Cast(Value* obj); 231862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 2319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 232062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static void CheckCast(Value* obj); 2321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum class NewStringType { kNormal, kInternalized }; 2325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 2328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * A JavaScript string value (ECMA-262, 4.3.17). 2329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT String : public Name { 2331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kMaxLength = (1 << 28) - 16; 2333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum Encoding { 2335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNKNOWN_ENCODING = 0x1, 2336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TWO_BYTE_ENCODING = 0x0, 233762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ONE_BYTE_ENCODING = 0x8 2338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 2339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 2340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns the number of characters in this string. 2341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int Length() const; 2343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 2345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns the number of bytes in the UTF-8 encoded 2346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * representation of this string. 2347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int Utf8Length() const; 2349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 2351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns whether this string is known to contain only one byte data. 2352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Does not read the string. 2353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * False negatives are possible. 2354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsOneByte() const; 2356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 2358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns whether this string contain only one byte data. 2359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Will read the entire string in some cases. 23603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch */ 2361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool ContainsOnlyOneByte() const; 23623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch /** 2364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Write the contents of the string to an external buffer. 2365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * If no arguments are given, expects the buffer to be large 2366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * enough to hold the entire string and NULL terminator. Copies 2367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * the contents of the string and the NULL terminator into the 2368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * buffer. 2369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 2370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch * WriteUtf8 will not write partial UTF-8 sequences, preferring to stop 2371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch * before the end of the buffer. 2372b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch * 2373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Copies up to length characters into the output buffer. 2374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Only null-terminates if there is enough space in the buffer. 2375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 2376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \param buffer The buffer into which the string will be copied. 2377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \param start The starting position within the string at which 2378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * copying begins. 2379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch * \param length The number of characters to copy from the string. For 2380b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch * WriteUtf8 the number of bytes in the buffer. 23816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * \param nchars_ref The number of characters written, can be NULL. 238269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch * \param options Various options that might affect performance of this or 23836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * subsequent operations. 2384b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch * \return The number of characters copied to the buffer excluding the null 2385b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch * terminator. For WriteUtf8: The number of bytes copied to the buffer 238669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch * including the null terminator (if written). 2387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 238869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch enum WriteOptions { 238969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch NO_OPTIONS = 0, 239069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch HINT_MANY_WRITES_EXPECTED = 1, 2391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NO_NULL_TERMINATION = 2, 2392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PRESERVE_ONE_BYTE_NULL = 4, 2393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Used by WriteUtf8 to replace orphan surrogate code units with the 2394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // unicode replacement character. Needs to be set to guarantee valid UTF-8 2395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // output. 2396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch REPLACE_INVALID_UTF8 = 8 23976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block }; 23986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2399589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch // 16-bit character codes. 2400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int Write(uint16_t* buffer, 2401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int start = 0, 2402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int length = -1, 2403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int options = NO_OPTIONS) const; 2404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // One byte characters. 2405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int WriteOneByte(uint8_t* buffer, 2406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int start = 0, 2407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int length = -1, 2408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int options = NO_OPTIONS) const; 2409589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch // UTF-8 encoded characters. 2410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int WriteUtf8(char* buffer, 2411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int length = -1, 2412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int* nchars_ref = NULL, 2413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int options = NO_OPTIONS) const; 2414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 2416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * A zero length string. 2417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 241862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V8_INLINE static Local<String> Empty(Isolate* isolate); 2419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 2421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns true if the string is external 2422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsExternal() const; 2424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 2426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if the string is both external and one-byte. 2427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsExternalOneByte() const; 2429e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 2430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class V8_EXPORT ExternalStringResourceBase { // NOLINT 2431e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke public: 2432e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke virtual ~ExternalStringResourceBase() {} 24337f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 2434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch virtual bool IsCompressible() const { return false; } 2435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2436e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke protected: 2437e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke ExternalStringResourceBase() {} 24387f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 24397f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch /** 24407f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch * Internally V8 will call this Dispose method when the external string 24417f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch * resource is no longer needed. The default implementation will use the 24427f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch * delete operator. This method can be overridden in subclasses to 24437f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch * control how allocated external string resources are disposed. 24447f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch */ 24457f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch virtual void Dispose() { delete this; } 24467f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 2447e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Disallow copying and assigning. 2448f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch ExternalStringResourceBase(const ExternalStringResourceBase&) = delete; 2449f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void operator=(const ExternalStringResourceBase&) = delete; 24507f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 2451f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch private: 245262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch friend class internal::Heap; 245362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch friend class v8::String; 2454e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke }; 2455e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 2456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 2457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * An ExternalStringResource is a wrapper around a two-byte string 2458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * buffer that resides outside V8's heap. Implement an 2459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * ExternalStringResource to manage the life cycle of the underlying 2460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * buffer. Note that the string data must be immutable. 2461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class V8_EXPORT ExternalStringResource 2463e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke : public ExternalStringResourceBase { 2464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 2466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Override the destructor to manage the life cycle of the underlying 2467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * buffer. 2468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual ~ExternalStringResource() {} 24707f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 24717f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch /** 24727f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch * The string data from the underlying buffer. 24737f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch */ 2474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual const uint16_t* data() const = 0; 24757f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 24767f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch /** 24777f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch * The length of the string. That is, the number of two-byte characters. 24787f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch */ 2479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual size_t length() const = 0; 24807f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 2481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block protected: 2482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ExternalStringResource() {} 2483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 2484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 2486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * An ExternalOneByteStringResource is a wrapper around an one-byte 2487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * string buffer that resides outside V8's heap. Implement an 2488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * ExternalOneByteStringResource to manage the life cycle of the 2489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * underlying buffer. Note that the string data must be immutable 2490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * and that the data must be Latin-1 and not UTF-8, which would require 2491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * special treatment internally in the engine and do not allow efficient 2492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * indexing. Use String::New or convert to 16 bit data for non-Latin1. 2493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class V8_EXPORT ExternalOneByteStringResource 2496e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke : public ExternalStringResourceBase { 2497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 2499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Override the destructor to manage the life cycle of the underlying 2500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * buffer. 2501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual ~ExternalOneByteStringResource() {} 2503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** The string data from the underlying buffer.*/ 2504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual const char* data() const = 0; 2505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** The number of Latin-1 characters in the string.*/ 2506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual size_t length() const = 0; 2507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block protected: 2508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalOneByteStringResource() {} 2509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 2510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 2512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * If the string is an external string, return the ExternalStringResourceBase 2513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * regardless of the encoding, otherwise return NULL. The encoding of the 2514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * string is returned in encoding_out. 2515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE ExternalStringResourceBase* GetExternalStringResourceBase( 2517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Encoding* encoding_out) const; 2518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 2520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the ExternalStringResource for an external string. Returns 2521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * NULL if IsExternal() doesn't return true. 2522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE ExternalStringResource* GetExternalStringResource() const; 2524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 2526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Get the ExternalOneByteStringResource for an external one-byte string. 2527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns NULL if IsExternalOneByte() doesn't return true. 2528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const ExternalOneByteStringResource* GetExternalOneByteStringResource() const; 2530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static String* Cast(v8::Value* obj); 2532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // TODO(dcarney): remove with deprecation of New functions. 2534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum NewStringType { 2535014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kNormalString = static_cast<int>(v8::NewStringType::kNormal), 2536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kInternalizedString = static_cast<int>(v8::NewStringType::kInternalized) 2537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 2538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** Allocates a new string from UTF-8 data.*/ 2540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_DEPRECATE_SOON( 2541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use maybe version", 2542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<String> NewFromUtf8(Isolate* isolate, const char* data, 2543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch NewStringType type = kNormalString, 2544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int length = -1)); 2545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** Allocates a new string from UTF-8 data. Only returns an empty value when 2547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * length > kMaxLength. **/ 2548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_WARN_UNUSED_RESULT MaybeLocal<String> NewFromUtf8( 2549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, const char* data, v8::NewStringType type, 2550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int length = -1); 2551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** Allocates a new string from Latin-1 data.*/ 2553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_DEPRECATED( 2554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use maybe version", 2555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<String> NewFromOneByte(Isolate* isolate, const uint8_t* data, 2556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch NewStringType type = kNormalString, 2557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int length = -1)); 2558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** Allocates a new string from Latin-1 data. Only returns an empty value 2560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * when length > kMaxLength. **/ 2561014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_WARN_UNUSED_RESULT MaybeLocal<String> NewFromOneByte( 2562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, const uint8_t* data, v8::NewStringType type, 2563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int length = -1); 2564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** Allocates a new string from UTF-16 data.*/ 2566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_DEPRECATE_SOON( 2567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use maybe version", 2568014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<String> NewFromTwoByte(Isolate* isolate, const uint16_t* data, 2569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch NewStringType type = kNormalString, 2570014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int length = -1)); 2571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** Allocates a new string from UTF-16 data. Only returns an empty value when 2573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * length > kMaxLength. **/ 2574014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_WARN_UNUSED_RESULT MaybeLocal<String> NewFromTwoByte( 2575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, const uint16_t* data, v8::NewStringType type, 2576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int length = -1); 2577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 25793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block * Creates a new string by concatenating the left and the right strings 25803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block * passed in as parameters. 25813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block */ 2582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<String> Concat(Local<String> left, Local<String> right); 25833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 25843ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block /** 2585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Creates a new external string using the data defined in the given 25867f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch * resource. When the external string is no longer live on V8's heap the 25877f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch * resource will be disposed by calling its Dispose method. The caller of 25887f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch * this function should not otherwise delete or modify the resource. Neither 25897f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch * should the underlying buffer be deallocated or modified except through the 25907f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch * destructor of the external string resource. 2591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_DEPRECATED("Use maybe version", 2593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<String> NewExternal( 2594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, ExternalStringResource* resource)); 2595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_WARN_UNUSED_RESULT MaybeLocal<String> NewExternalTwoByte( 2596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, ExternalStringResource* resource); 2597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 2599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Associate an external string resource with this string by transforming it 2600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * in place so that existing references to this string in the JavaScript heap 2601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * will use the external string resource. The external string resource's 2602257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * character contents need to be equivalent to this string. 2603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns true if the string has been changed to be an external string. 26047f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch * The string is not modified if the operation fails. See NewExternal for 26057f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch * information on the lifetime of the resource. 2606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool MakeExternal(ExternalStringResource* resource); 2608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 2610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Creates a new external string using the one-byte data defined in the given 26117f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch * resource. When the external string is no longer live on V8's heap the 26127f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch * resource will be disposed by calling its Dispose method. The caller of 26137f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch * this function should not otherwise delete or modify the resource. Neither 26147f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch * should the underlying buffer be deallocated or modified except through the 26157f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch * destructor of the external string resource. 2616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_DEPRECATE_SOON( 2618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use maybe version", 2619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<String> NewExternal(Isolate* isolate, 2620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ExternalOneByteStringResource* resource)); 2621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_WARN_UNUSED_RESULT MaybeLocal<String> NewExternalOneByte( 2622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, ExternalOneByteStringResource* resource); 2623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 2625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Associate an external string resource with this string by transforming it 2626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * in place so that existing references to this string in the JavaScript heap 2627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * will use the external string resource. The external string resource's 2628257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * character contents need to be equivalent to this string. 2629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns true if the string has been changed to be an external string. 26307f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch * The string is not modified if the operation fails. See NewExternal for 26317f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch * information on the lifetime of the resource. 2632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool MakeExternal(ExternalOneByteStringResource* resource); 2634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 2636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns true if this string can be made external. 2637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool CanMakeExternal(); 2639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 2641589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch * Converts an object to a UTF-8-encoded character array. Useful if 2642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * you want to print the object. If conversion to a string fails 2643589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch * (e.g. due to an exception in the toString() method of the object) 2644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * then the length() method returns 0 and the * operator returns 2645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * NULL. 2646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class V8_EXPORT Utf8Value { 2648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2649014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch explicit Utf8Value(Local<v8::Value> obj); 2650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ~Utf8Value(); 2651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block char* operator*() { return str_; } 2652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const char* operator*() const { return str_; } 2653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int length() const { return length_; } 2654f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 2655f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Disallow copying and assigning. 2656f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Utf8Value(const Utf8Value&) = delete; 2657f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void operator=(const Utf8Value&) = delete; 2658f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 2659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block char* str_; 2661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int length_; 2662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 2663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 2665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Converts an object to a two-byte string. 2666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * If conversion to a string fails (eg. due to an exception in the toString() 2667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * method of the object) then the length() method returns 0 and the * operator 2668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * returns NULL. 2669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class V8_EXPORT Value { 2671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch explicit Value(Local<v8::Value> obj); 2673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ~Value(); 2674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint16_t* operator*() { return str_; } 2675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const uint16_t* operator*() const { return str_; } 2676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int length() const { return length_; } 2677f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 2678f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Disallow copying and assigning. 2679f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Value(const Value&) = delete; 2680f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void operator=(const Value&) = delete; 2681f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 2682a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint16_t* str_; 2684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int length_; 2685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 26863ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 2687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void VerifyExternalStringResourceBase(ExternalStringResourceBase* v, 2689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Encoding encoding) const; 2690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void VerifyExternalStringResource(ExternalStringResource* val) const; 2691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void CheckCast(v8::Value* obj); 2692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 2696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A JavaScript symbol (ECMA-262 edition 6) 2697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Symbol : public Name { 2699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns the print name string of the symbol, or undefined if none. 2701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<Value> Name() const; 2702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Create a symbol. If name is not empty, it will be used as the description. 2704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Symbol> New(Isolate* isolate, 2705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<String> name = Local<String>()); 2706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Access global symbol registry. 2708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Note that symbols created this way are never collected, so 2709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // they should only be used for statically fixed properties. 2710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Also, there is only one global name space for the names used as keys. 2711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // To minimize the potential for clashes, use qualified names as keys. 2712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Local<Symbol> For(Isolate *isolate, Local<String> name); 2713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Retrieve a global symbol. Similar to |For|, but using a separate 2715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // registry that is not accessible by (and cannot clash with) JavaScript code. 2716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Local<Symbol> ForApi(Isolate *isolate, Local<String> name); 2717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Well-known symbols 2719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Local<Symbol> GetIterator(Isolate* isolate); 2720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Local<Symbol> GetUnscopables(Isolate* isolate); 272162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static Local<Symbol> GetToPrimitive(Isolate* isolate); 2722958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static Local<Symbol> GetToStringTag(Isolate* isolate); 2723014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Symbol> GetIsConcatSpreadable(Isolate* isolate); 2724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 272562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V8_INLINE static Symbol* Cast(Value* obj); 2726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Symbol(); 272962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static void CheckCast(Value* obj); 2730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 2734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A private symbol 2735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 2736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * This is an experimental feature. Use at your own risk. 2737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Private : public Data { 2739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns the print name string of the private symbol, or undefined if none. 2741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<Value> Name() const; 2742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Create a private symbol. If name is not empty, it will be the description. 2744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Private> New(Isolate* isolate, 2745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<String> name = Local<String>()); 2746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Retrieve a global private symbol. If a symbol with this name has not 2748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // been retrieved in the same isolate before, it is created. 2749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Note that private symbols created this way are never collected, so 2750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // they should only be used for statically fixed properties. 2751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Also, there is only one global name space for the names used as keys. 2752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // To minimize the potential for clashes, use qualified names as keys, 2753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // e.g., "Class#property". 2754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Private> ForApi(Isolate* isolate, Local<String> name); 2755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Private(); 2758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 2759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 2762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A JavaScript number value (ECMA-262, 4.3.20) 2763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Number : public Primitive { 2765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 2766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double Value() const; 2767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Local<Number> New(Isolate* isolate, double value); 2768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static Number* Cast(v8::Value* obj); 2769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 2770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Number(); 2771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void CheckCast(v8::Value* obj); 2772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 2773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 2776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A JavaScript value representing a signed integer. 2777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Integer : public Number { 2779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 2780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Local<Integer> New(Isolate* isolate, int32_t value); 2781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Local<Integer> NewFromUnsigned(Isolate* isolate, uint32_t value); 2782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int64_t Value() const; 2783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static Integer* Cast(v8::Value* obj); 2784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 2785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Integer(); 2786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void CheckCast(v8::Value* obj); 2787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 2791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * A JavaScript value representing a 32-bit signed integer. 2792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Int32 : public Integer { 2794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t Value() const; 2796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static Int32* Cast(v8::Value* obj); 2797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32(); 2800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void CheckCast(v8::Value* obj); 2801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 2805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * A JavaScript value representing a 32-bit unsigned integer. 2806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Uint32 : public Integer { 2808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t Value() const; 2810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static Uint32* Cast(v8::Value* obj); 2811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32(); 2814014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void CheckCast(v8::Value* obj); 2815a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2817f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch/** 2818f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * PropertyAttribute. 2819f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 2820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockenum PropertyAttribute { 2821f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** None. **/ 2822f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch None = 0, 2823f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** ReadOnly, i.e., not writable. **/ 2824f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch ReadOnly = 1 << 0, 2825f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** DontEnum, i.e., not enumerable. **/ 2826f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DontEnum = 1 << 1, 2827f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** DontDelete, i.e., not configurable. **/ 2828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DontDelete = 1 << 2 2829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 2832f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke * Accessor[Getter|Setter] are used as callback functions when 2833f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke * setting|getting a particular property. See Object and ObjectTemplate's 2834f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke * method SetAccessor. 2835f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke */ 2836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef void (*AccessorGetterCallback)( 2837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<String> property, 2838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PropertyCallbackInfo<Value>& info); 2839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef void (*AccessorNameGetterCallback)( 2840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<Name> property, 2841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PropertyCallbackInfo<Value>& info); 2842f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 2843f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 2844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef void (*AccessorSetterCallback)( 2845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<String> property, 2846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<Value> value, 2847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PropertyCallbackInfo<void>& info); 2848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef void (*AccessorNameSetterCallback)( 2849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<Name> property, 2850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<Value> value, 2851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PropertyCallbackInfo<void>& info); 2852f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 2853f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 2854f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke/** 2855f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke * Access control specifications. 2856f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke * 2857f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke * Some accessors should be accessible across contexts. These 2858f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke * accessors have an explicit access control parameter which specifies 2859f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke * the kind of cross-context access that should be allowed. 2860f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke * 2861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * TODO(dcarney): Remove PROHIBITS_OVERWRITING as it is now unused. 2862f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke */ 2863f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarkeenum AccessControl { 2864f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke DEFAULT = 0, 2865f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke ALL_CAN_READ = 1, 2866f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke ALL_CAN_WRITE = 1 << 1, 2867f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke PROHIBITS_OVERWRITING = 1 << 2 2868f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke}; 2869f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 28703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch/** 2871bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * Property filter bits. They can be or'ed to build a composite filter. 2872bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch */ 2873bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochenum PropertyFilter { 2874bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch ALL_PROPERTIES = 0, 2875bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch ONLY_WRITABLE = 1, 2876bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch ONLY_ENUMERABLE = 2, 2877bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch ONLY_CONFIGURABLE = 4, 2878bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch SKIP_STRINGS = 8, 2879bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch SKIP_SYMBOLS = 16 2880bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}; 2881bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 2882bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch/** 288313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * Keys/Properties filter enums: 288413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * 288513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * KeyCollectionMode limits the range of collected properties. kOwnOnly limits 288613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * the collected properties to the given Object only. kIncludesPrototypes will 288713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * include all keys of the objects's prototype chain as well. 288813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch */ 288913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochenum class KeyCollectionMode { kOwnOnly, kIncludePrototypes }; 289013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 289113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch/** 289213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * kIncludesIndices allows for integer indices to be collected, while 289313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * kSkipIndices will exclude integer indicies from being collected. 289413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch */ 289513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochenum class IndexFilter { kIncludeIndices, kSkipIndices }; 289613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 289713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch/** 28983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * Integrity level for objects. 28993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch */ 29003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochenum class IntegrityLevel { kFrozen, kSealed }; 2901f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 2902f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke/** 2903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * A JavaScript object (ECMA-262, 4.3.3) 2904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 2905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Object : public Value { 2906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2907014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", 2908014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool Set(Local<Value> key, Local<Value> value)); 2909014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context, 2910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> key, Local<Value> value); 2911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2912014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", 2913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool Set(uint32_t index, Local<Value> value)); 2914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context, uint32_t index, 2915014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> value); 2916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Implements CreateDataProperty (ECMA-262, 7.3.4). 2918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 2919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Defines a configurable, writable, enumerable property with the given value 2920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // on the object unless the property already exists and is not configurable 2921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // or the object is not extensible. 2922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 2923014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns true on success. 2924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<bool> CreateDataProperty(Local<Context> context, 2925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Name> key, 2926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> value); 2927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<bool> CreateDataProperty(Local<Context> context, 2928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint32_t index, 2929014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> value); 2930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Implements DefineOwnProperty. 2932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 2933014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // In general, CreateDataProperty will be faster, however, does not allow 2934014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // for specifying attributes. 2935014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 2936014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns true on success. 2937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<bool> DefineOwnProperty( 2938014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context, Local<Name> key, Local<Value> value, 2939014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyAttribute attributes = None); 29406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2941f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Implements Object.DefineProperty(O, P, Attributes), see Ecma-262 19.1.2.4. 2942f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // 2943f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // The defineProperty function is used to add an own property or 2944f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // update the attributes of an existing own property of an object. 2945f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // 2946f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Both data and accessor descriptors can be used. 2947f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // 2948f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // In general, CreateDataProperty is faster, however, does not allow 2949f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // for specifying attributes or an accessor descriptor. 2950f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // 2951f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // The PropertyDescriptor can change when redefining a property. 2952f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // 2953f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Returns true on success. 2954f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<bool> DefineProperty( 2955f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Local<Context> context, Local<Name> key, PropertyDescriptor& descriptor); 2956f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 2957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Sets an own property on this object bypassing interceptors and 2958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // overriding accessors or read-only properties. 2959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 2960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Note that if the object has an interceptor the property will be set 2961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // locally, but since the interceptor takes precedence the local property 2962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // will only be returned if the interceptor doesn't return a value. 2963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 2964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Note also that this only works for named properties. 2965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use CreateDataProperty / DefineOwnProperty", 2966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool ForceSet(Local<Value> key, Local<Value> value, 2967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyAttribute attribs = None)); 2968109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch V8_DEPRECATE_SOON("Use CreateDataProperty / DefineOwnProperty", 2969109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Maybe<bool> ForceSet(Local<Context> context, 2970109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Local<Value> key, Local<Value> value, 2971109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch PropertyAttribute attribs = None)); 2972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", Local<Value> Get(Local<Value> key)); 2974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context, 2975014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> key); 2976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2977014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", Local<Value> Get(uint32_t index)); 2978014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context, 2979014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint32_t index); 29806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 29813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch /** 29823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch * Gets the property attributes of a property which can be None or 29833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch * any combination of ReadOnly, DontEnum and DontDelete. Returns 29843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch * None when the property doesn't exist. 29853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch */ 2986014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use maybe version", 2987014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyAttribute GetPropertyAttributes(Local<Value> key)); 2988014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<PropertyAttribute> GetPropertyAttributes( 2989014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context, Local<Value> key); 29903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 2992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns Object.getOwnPropertyDescriptor as per ES5 section 15.2.3.3. 2993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 2994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use maybe version", 2995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> GetOwnPropertyDescriptor(Local<String> key)); 2996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Value> GetOwnPropertyDescriptor( 2997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context, Local<String> key); 2998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", bool Has(Local<Value> key)); 3000f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** 3001f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Object::Has() calls the abstract operation HasProperty(O, P) described 3002f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * in ECMA-262, 7.3.10. Has() returns 3003f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * true, if the object has the property, either own or on the prototype chain. 3004f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Interceptors, i.e., PropertyQueryCallbacks, are called if present. 3005f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 3006f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Has() has the same side effects as JavaScript's `variable in object`. 3007f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * For example, calling Has() on a revoked proxy will throw an exception. 3008f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 3009f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \note Has() converts the key to a name, which possibly calls back into 3010f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * JavaScript. 3011f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 3012f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * See also v8::Object::HasOwnProperty() and 3013f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * v8::Object::HasRealNamedProperty(). 3014f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 3015014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<bool> Has(Local<Context> context, 3016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> key); 3017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", bool Delete(Local<Value> key)); 3019014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // TODO(dcarney): mark V8_WARN_UNUSED_RESULT 3020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Maybe<bool> Delete(Local<Context> context, Local<Value> key); 3021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3022014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use maybe version", bool Has(uint32_t index)); 3023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<bool> Has(Local<Context> context, uint32_t index); 3024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use maybe version", bool Delete(uint32_t index)); 3026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // TODO(dcarney): mark V8_WARN_UNUSED_RESULT 3027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Maybe<bool> Delete(Local<Context> context, uint32_t index); 3028014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use maybe version", 3030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool SetAccessor(Local<String> name, 3031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AccessorGetterCallback getter, 3032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AccessorSetterCallback setter = 0, 3033014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> data = Local<Value>(), 3034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AccessControl settings = DEFAULT, 3035014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyAttribute attribute = None)); 3036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use maybe version", 3037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool SetAccessor(Local<Name> name, 3038014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AccessorNameGetterCallback getter, 3039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AccessorNameSetterCallback setter = 0, 3040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> data = Local<Value>(), 3041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AccessControl settings = DEFAULT, 3042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyAttribute attribute = None)); 3043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // TODO(dcarney): mark V8_WARN_UNUSED_RESULT 3044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Maybe<bool> SetAccessor(Local<Context> context, Local<Name> name, 3045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AccessorNameGetterCallback getter, 3046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AccessorNameSetterCallback setter = 0, 3047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MaybeLocal<Value> data = MaybeLocal<Value>(), 3048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AccessControl settings = DEFAULT, 3049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyAttribute attribute = None); 3050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetAccessorProperty(Local<Name> name, Local<Function> getter, 3052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Function> setter = Local<Function>(), 3053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PropertyAttribute attribute = None, 3054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AccessControl settings = DEFAULT); 3055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 3057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Functionality for private properties. 3058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * This is an experimental feature, use at your own risk. 3059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Note: Private properties are not inherited. Do not rely on this, since it 3060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * may change. 3061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 3062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Maybe<bool> HasPrivate(Local<Context> context, Local<Private> key); 3063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Maybe<bool> SetPrivate(Local<Context> context, Local<Private> key, 3064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> value); 3065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Maybe<bool> DeletePrivate(Local<Context> context, Local<Private> key); 3066014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MaybeLocal<Value> GetPrivate(Local<Context> context, Local<Private> key); 3067f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 3068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 3069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns an array containing the names of the enumerable properties 3070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * of this object, including properties from prototype objects. The 3071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * array returned by this method contains the same values as would 3072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * be enumerated by a for-in statement over this object. 3073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 3074014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", Local<Array> GetPropertyNames()); 3075014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Array> GetPropertyNames( 3076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context); 307713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Array> GetPropertyNames( 307813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Local<Context> context, KeyCollectionMode mode, 307913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch PropertyFilter property_filter, IndexFilter index_filter); 3080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 30823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch * This function has the same functionality as GetPropertyNames but 30833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch * the returned array doesn't contain the names of properties from 30843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch * prototype objects. 30853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch */ 3086014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", Local<Array> GetOwnPropertyNames()); 3087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Array> GetOwnPropertyNames( 3088014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context); 30893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 30903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch /** 3091bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * Returns an array containing the names of the filtered properties 3092bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * of this object, including properties from prototype objects. The 3093bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * array returned by this method contains the same values as would 3094bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * be enumerated by a for-in statement over this object. 3095bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch */ 3096bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Array> GetOwnPropertyNames( 3097bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Local<Context> context, PropertyFilter filter); 3098bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 3099bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch /** 3100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the prototype object. This does not skip objects marked to 3101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * be skipped by __proto__ and it does not consult the security 3102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * handler. 3103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 3104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<Value> GetPrototype(); 3105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 3107402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu * Set the prototype object. This does not skip objects marked to 3108402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu * be skipped by __proto__ and it does not consult the security 3109402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu * handler. 3110402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu */ 3111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use maybe version", bool SetPrototype(Local<Value> prototype)); 3112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<bool> SetPrototype(Local<Context> context, 3113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> prototype); 3114402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu 3115402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu /** 3116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Finds an instance of the given function template in the prototype 3117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * chain. 3118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 3119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Object> FindInstanceInPrototypeChain(Local<FunctionTemplate> tmpl); 3120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 3122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Call builtin Object.prototype.toString on this object. 3123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * This is different from Value::ToString() that may call 3124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * user-defined toString function. This one does not. 3125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 3126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use maybe version", Local<String> ObjectProtoToString()); 3127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<String> ObjectProtoToString( 3128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context); 3129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 31308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang /** 31318a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang * Returns the name of the function invoked as a constructor for this object. 31328a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang */ 3133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<String> GetConstructorName(); 31348a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 31353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch /** 31363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * Sets the integrity level of the object. 31373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch */ 31383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Maybe<bool> SetIntegrityLevel(Local<Context> context, IntegrityLevel level); 31393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 3140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** Gets the number of internal fields for this Object. */ 3141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int InternalFieldCount(); 3142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** Same as above, but works for Persistents */ 3144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static int InternalFieldCount( 3145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PersistentBase<Object>& object) { 3146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return object.val_->InternalFieldCount(); 3147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** Gets the value from an internal field. */ 3150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Local<Value> GetInternalField(int index); 3151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** Sets the value in an internal field. */ 3153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetInternalField(int index, Local<Value> value); 3154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 3156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Gets a 2-byte-aligned native pointer from an internal field. This field 3157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * must have been set by SetAlignedPointerInInternalField, everything else 3158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * leads to undefined behavior. 3159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 3160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE void* GetAlignedPointerFromInternalField(int index); 3161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** Same as above, but works for Persistents */ 3163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static void* GetAlignedPointerFromInternalField( 3164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PersistentBase<Object>& object, int index) { 3165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return object.val_->GetAlignedPointerFromInternalField(index); 3166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 31673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 3168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 3169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Sets a 2-byte-aligned native pointer in an internal field. To retrieve such 3170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * a field, GetAlignedPointerFromInternalField must be used, everything else 3171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * leads to undefined behavior. 3172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 3173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetAlignedPointerInInternalField(int index, void* value); 3174f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void SetAlignedPointerInInternalFields(int argc, int indices[], 3175f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void* values[]); 3176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Testers for local properties. 3178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use maybe version", bool HasOwnProperty(Local<String> key)); 3179f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3180f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** 3181f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * HasOwnProperty() is like JavaScript's Object.prototype.hasOwnProperty(). 3182f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 3183f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * See also v8::Object::Has() and v8::Object::HasRealNamedProperty(). 3184f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 3185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<bool> HasOwnProperty(Local<Context> context, 3186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Name> key); 3187bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<bool> HasOwnProperty(Local<Context> context, 3188bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch uint32_t index); 3189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", 3190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool HasRealNamedProperty(Local<String> key)); 3191f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** 3192f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Use HasRealNamedProperty() if you want to check if an object has an own 3193f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * property without causing side effects, i.e., without calling interceptors. 3194f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 3195f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * This function is similar to v8::Object::HasOwnProperty(), but it does not 3196f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * call interceptors. 3197f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 3198f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \note Consider using non-masking interceptors, i.e., the interceptors are 3199f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * not called if the receiver has the real named property. See 3200f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * `v8::PropertyHandlerFlags::kNonMasking`. 3201f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 3202f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * See also v8::Object::Has(). 3203f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 3204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<bool> HasRealNamedProperty(Local<Context> context, 3205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Name> key); 3206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", 3207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool HasRealIndexedProperty(uint32_t index)); 3208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<bool> HasRealIndexedProperty( 3209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context, uint32_t index); 3210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", 3211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool HasRealNamedCallbackProperty(Local<String> key)); 3212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<bool> HasRealNamedCallbackProperty( 3213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context, Local<Name> key); 3214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 3216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * If result.IsEmpty() no real property was located in the prototype chain. 3217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * This means interceptors in the prototype chain are not called. 3218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 3219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED( 3220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use maybe version", 3221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> GetRealNamedPropertyInPrototypeChain(Local<String> key)); 3222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Value> GetRealNamedPropertyInPrototypeChain( 3223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context, Local<Name> key); 3224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 3226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Gets the property attributes of a real property in the prototype chain, 3227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * which can be None or any combination of ReadOnly, DontEnum and DontDelete. 3228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Interceptors in the prototype chain are not called. 3229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 3230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED( 3231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use maybe version", 3232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Maybe<PropertyAttribute> GetRealNamedPropertyAttributesInPrototypeChain( 3233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<String> key)); 3234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<PropertyAttribute> 3235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GetRealNamedPropertyAttributesInPrototypeChain(Local<Context> context, 3236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Name> key); 3237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 3239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * If result.IsEmpty() no real property was located on the object or 3240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * in the prototype chain. 3241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * This means interceptors in the prototype chain are not called. 3242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 3243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use maybe version", 3244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> GetRealNamedProperty(Local<String> key)); 3245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Value> GetRealNamedProperty( 3246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context, Local<Name> key); 3247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 3249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Gets the property attributes of a real property which can be 3250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * None or any combination of ReadOnly, DontEnum and DontDelete. 3251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Interceptors in the prototype chain are not called. 3252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 3253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use maybe version", 3254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Maybe<PropertyAttribute> GetRealNamedPropertyAttributes( 3255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<String> key)); 3256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<PropertyAttribute> GetRealNamedPropertyAttributes( 3257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context, Local<Name> key); 3258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** Tests for a named lookup interceptor.*/ 3260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasNamedLookupInterceptor(); 3261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** Tests for an index lookup interceptor.*/ 3263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasIndexedLookupInterceptor(); 3264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 3266257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * Returns the identity hash for this object. The current implementation 3267257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * uses a hidden property on the object to store the identity hash. 3268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 3269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * The return value will never be 0. Also, it is not guaranteed to be 3270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * unique. 3271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 3272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int GetIdentityHash(); 3273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 3275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Clone this object with a fast but shallow copy. Values will point 3276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * to the same values as the original object. 3277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 3278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // TODO(dcarney): take an isolate and optionally bail out? 3279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<Object> Clone(); 3280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 32828b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch * Returns the context in which the object was created. 32838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch */ 3284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<Context> CreationContext(); 32858b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 3286f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** Same as above, but works for Persistents */ 3287f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V8_INLINE static Local<Context> CreationContext( 3288f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch const PersistentBase<Object>& object) { 3289f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return object.val_->CreationContext(); 3290f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 3291f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 32928b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch /** 3293257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * Checks whether a callback is set by the 3294257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * ObjectTemplate::SetCallAsFunctionHandler method. 3295257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * When an Object is callable this method returns true. 3296257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch */ 3297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsCallable(); 3298257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3299257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch /** 3300bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * True if this object is a constructor. 3301bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch */ 3302bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch bool IsConstructor(); 3303bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 3304bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch /** 3305589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch * Call an Object as a function if a callback is set by the 3306257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * ObjectTemplate::SetCallAsFunctionHandler method. 3307257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch */ 3308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use maybe version", 3309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> CallAsFunction(Local<Value> recv, int argc, 3310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> argv[])); 3311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Value> CallAsFunction(Local<Context> context, 3312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> recv, 3313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int argc, 3314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> argv[]); 3315257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3316257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch /** 3317257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * Call an Object as a constructor if a callback is set by the 3318257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * ObjectTemplate::SetCallAsFunctionHandler method. 3319257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * Note: This method behaves like the Function::NewInstance method. 3320257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch */ 3321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use maybe version", 3322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> CallAsConstructor(int argc, Local<Value> argv[])); 3323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Value> CallAsConstructor( 3324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context, int argc, Local<Value> argv[]); 3325257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 3327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Return the isolate to which the Object belongs to. 3328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 3329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Keep track of isolate correctly", Isolate* GetIsolate()); 3330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Local<Object> New(Isolate* isolate); 33323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 3333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static Object* Cast(Value* obj); 3334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 3336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object(); 3337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void CheckCast(Value* obj); 3338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<Value> SlowGetInternalField(int index); 3339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* SlowGetAlignedPointerFromInternalField(int index); 3340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 3341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 3344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * An instance of the built-in array constructor (ECMA-262, 15.4.2). 3345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 3346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Array : public Object { 3347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 3348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t Length() const; 3349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 3351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Clones an element at index |index|. Returns an empty 3352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * handle if cloning fails (for any reason). 3353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 3354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Cloning is not supported.", 3355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Object> CloneElementAt(uint32_t index)); 3356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Cloning is not supported.", 3357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MaybeLocal<Object> CloneElementAt(Local<Context> context, 3358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint32_t index)); 3359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 336044f0eee88ff00398ff7f715fab053374d808c90dSteve Block /** 336144f0eee88ff00398ff7f715fab053374d808c90dSteve Block * Creates a JavaScript array with the given length. If the length 336244f0eee88ff00398ff7f715fab053374d808c90dSteve Block * is negative the returned array will have length 0. 336344f0eee88ff00398ff7f715fab053374d808c90dSteve Block */ 3364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Local<Array> New(Isolate* isolate, int length = 0); 3365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static Array* Cast(Value* obj); 3367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 3368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Array(); 3369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void CheckCast(Value* obj); 3370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 3371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch/** 3374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * An instance of the built-in Map constructor (ECMA-262, 6th Edition, 23.1.1). 3375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 3376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass V8_EXPORT Map : public Object { 3377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 3378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t Size() const; 3379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void Clear(); 3380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context, 3381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> key); 3382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Map> Set(Local<Context> context, 3383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> key, 3384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> value); 3385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<bool> Has(Local<Context> context, 3386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> key); 3387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<bool> Delete(Local<Context> context, 3388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> key); 3389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 3391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Returns an array of length Size() * 2, where index N is the Nth key and 3392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * index N + 1 is the Nth value. 3393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 3394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Array> AsArray() const; 3395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 3397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Creates a new empty Map. 3398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 3399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Map> New(Isolate* isolate); 3400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static Map* Cast(Value* obj); 3402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 3404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Map(); 3405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void CheckCast(Value* obj); 3406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 3407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch/** 3410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * An instance of the built-in Set constructor (ECMA-262, 6th Edition, 23.2.1). 3411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 3412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass V8_EXPORT Set : public Object { 3413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 3414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t Size() const; 3415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void Clear(); 3416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Set> Add(Local<Context> context, 3417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> key); 3418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<bool> Has(Local<Context> context, 3419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> key); 3420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT Maybe<bool> Delete(Local<Context> context, 3421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> key); 3422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 3424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Returns an array of the keys in this Set. 3425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 3426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Array> AsArray() const; 3427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 3429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Creates a new empty Set. 3430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 3431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Set> New(Isolate* isolate); 3432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static Set* Cast(Value* obj); 3434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 3436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Set(); 3437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void CheckCast(Value* obj); 3438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 3439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 3442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ReturnValue { 3443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 3444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class S> V8_INLINE ReturnValue(const ReturnValue<S>& that) 3445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : value_(that.value_) { 3446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(T, S); 3447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Local setters 3449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename S> 3450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE V8_DEPRECATE_SOON("Use Global<> instead", 3451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void Set(const Persistent<S>& handle)); 3452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename S> 3453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE void Set(const Global<S>& handle); 3454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename S> 3455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE void Set(const Local<S> handle); 3456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Fast primitive setters 3457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE void Set(bool value); 3458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE void Set(double i); 3459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE void Set(int32_t i); 3460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE void Set(uint32_t i); 3461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Fast JS primitive setters 3462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE void SetNull(); 3463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE void SetUndefined(); 3464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE void SetEmptyString(); 3465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Convenience getter for Isolate 34663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V8_INLINE Isolate* GetIsolate() const; 3467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Pointer setter: Uncompilable to prevent inadvertent misuse. 3469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <typename S> 3470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE void Set(S* whatever); 347144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 34723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Getter. Creates a new Local<> so it comes with a certain performance 34733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // hit. If the ReturnValue was not yet set, this will return the undefined 34743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // value. 34753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V8_INLINE Local<Value> Get() const; 34763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 3477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 3478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class F> friend class ReturnValue; 3479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class F> friend class FunctionCallbackInfo; 3480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class F> friend class PropertyCallbackInfo; 3481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class F, class G, class H> 3482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend class PersistentValueMapBase; 3483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE void SetInternal(internal::Object* value) { *value_ = value; } 3484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE internal::Object* GetDefaultValue(); 3485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE explicit ReturnValue(internal::Object** slot); 3486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object** value_; 3487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 3488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 3491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * The argument information given to function call callbacks. This 3492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * class provides access to information about the context of the call, 3493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * including the receiver, the number and values of arguments, and 3494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * the holder of the function. 3495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 3496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 3497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass FunctionCallbackInfo { 3498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 3499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE int Length() const; 3500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Local<Value> operator[](int i) const; 3501109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch V8_INLINE V8_DEPRECATED("Use Data() to explicitly pass Callee instead", 3502109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Local<Function> Callee() const); 3503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Local<Object> This() const; 3504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Local<Object> Holder() const; 3505bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch V8_INLINE Local<Value> NewTarget() const; 3506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE bool IsConstructCall() const; 3507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Local<Value> Data() const; 3508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Isolate* GetIsolate() const; 3509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE ReturnValue<T> GetReturnValue() const; 3510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This shouldn't be public, but the arm compiler needs it. 3511bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kArgsLength = 8; 3512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 3514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class internal::FunctionCallbackArguments; 3515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class internal::CustomArguments<FunctionCallbackInfo>; 3516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kHolderIndex = 0; 3517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kIsolateIndex = 1; 3518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kReturnValueDefaultValueIndex = 2; 3519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kReturnValueIndex = 3; 3520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kDataIndex = 4; 3521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kCalleeIndex = 5; 3522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kContextSaveIndex = 6; 3523bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kNewTargetIndex = 7; 3524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE FunctionCallbackInfo(internal::Object** implicit_args, 3526bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch internal::Object** values, int length); 3527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object** implicit_args_; 3528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object** values_; 3529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int length_; 3530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 3531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 3534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * The information passed to a property callback about the context 3535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * of the property access. 3536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 3537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 3538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass PropertyCallbackInfo { 3539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 3540f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** 3541f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \return The isolate of the property access. 3542f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 3543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Isolate* GetIsolate() const; 3544f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3545f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** 3546f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \return The data set in the configuration, i.e., in 3547f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * `NamedPropertyHandlerConfiguration` or 3548f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * `IndexedPropertyHandlerConfiguration.` 3549f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 3550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Local<Value> Data() const; 3551f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3552f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** 3553f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \return The receiver. In many cases, this is the object on which the 3554f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * property access was intercepted. When using 3555c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * `Reflect.get`, `Function.prototype.call`, or similar functions, it is the 3556f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * object passed in as receiver or thisArg. 3557f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 3558f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \code 3559f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * void GetterCallback(Local<Name> name, 3560f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * const v8::PropertyCallbackInfo<v8::Value>& info) { 3561f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * auto context = info.GetIsolate()->GetCurrentContext(); 3562f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 3563f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * v8::Local<v8::Value> a_this = 3564f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * info.This() 3565f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * ->GetRealNamedProperty(context, v8_str("a")) 3566f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * .ToLocalChecked(); 3567f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * v8::Local<v8::Value> a_holder = 3568f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * info.Holder() 3569f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * ->GetRealNamedProperty(context, v8_str("a")) 3570f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * .ToLocalChecked(); 3571f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 3572f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * CHECK(v8_str("r")->Equals(context, a_this).FromJust()); 3573f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * CHECK(v8_str("obj")->Equals(context, a_holder).FromJust()); 3574f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 3575f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * info.GetReturnValue().Set(name); 3576f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * } 3577f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 3578f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * v8::Local<v8::FunctionTemplate> templ = 3579f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * v8::FunctionTemplate::New(isolate); 3580f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * templ->InstanceTemplate()->SetHandler( 3581f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * v8::NamedPropertyHandlerConfiguration(GetterCallback)); 3582f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * LocalContext env; 3583f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * env->Global() 3584f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local()) 3585f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * .ToLocalChecked() 3586f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * ->NewInstance(env.local()) 3587f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * .ToLocalChecked()) 3588f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * .FromJust(); 3589f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 3590f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * CompileRun("obj.a = 'obj'; var r = {a: 'r'}; Reflect.get(obj, 'x', r)"); 3591f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \endcode 3592f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 3593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Local<Object> This() const; 3594f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3595f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** 3596f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \return The object in the prototype chain of the receiver that has the 3597f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * interceptor. Suppose you have `x` and its prototype is `y`, and `y` 3598f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * has an interceptor. Then `info.This()` is `x` and `info.Holder()` is `y`. 3599f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * The Holder() could be a hidden object (the global object, rather 3600f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * than the global proxy). 3601f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 3602f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \note For security reasons, do not pass the object back into the runtime. 3603f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 3604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Local<Object> Holder() const; 3605f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3606f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** 3607f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \return The return value of the callback. 3608f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Can be changed by calling Set(). 3609f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \code 3610f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * info.GetReturnValue().Set(...) 3611f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \endcode 3612f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 3613f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 3614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE ReturnValue<T> GetReturnValue() const; 3615f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3616f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** 3617f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \return True if the intercepted function should throw if an error occurs. 3618f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Usually, `true` corresponds to `'use strict'`. 3619f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 3620c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * \note Always `false` when intercepting `Reflect.set()` 3621f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * independent of the language mode. 3622f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 3623109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch V8_INLINE bool ShouldThrowOnError() const; 3624f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This shouldn't be public, but the arm compiler needs it. 3626109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kArgsLength = 7; 3627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 3629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class MacroAssembler; 3630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class internal::PropertyCallbackArguments; 3631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class internal::CustomArguments<PropertyCallbackInfo>; 3632109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kShouldThrowOnErrorIndex = 0; 3633109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kHolderIndex = 1; 3634109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kIsolateIndex = 2; 3635109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kReturnValueDefaultValueIndex = 3; 3636109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kReturnValueIndex = 4; 3637109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kDataIndex = 5; 3638109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kThisIndex = 6; 3639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE PropertyCallbackInfo(internal::Object** args) : args_(args) {} 3641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object** args_; 3642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 3643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef void (*FunctionCallback)(const FunctionCallbackInfo<Value>& info); 3646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3647bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochenum class ConstructorBehavior { kThrow, kAllow }; 3648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 3650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * A JavaScript function object (ECMA-262, 15.3). 3651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 3652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Function : public Object { 3653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 3654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 3655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Create a function in the current execution context 3656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * for a given FunctionCallback. 3657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 3658bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static MaybeLocal<Function> New( 3659bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Local<Context> context, FunctionCallback callback, 3660bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Local<Value> data = Local<Value>(), int length = 0, 3661bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch ConstructorBehavior behavior = ConstructorBehavior::kAllow); 3662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_DEPRECATE_SOON( 3663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use maybe version", 3664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Function> New(Isolate* isolate, FunctionCallback callback, 3665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> data = Local<Value>(), int length = 0)); 3666014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3667014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use maybe version", 3668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Object> NewInstance(int argc, Local<Value> argv[]) const); 3669014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Object> NewInstance( 3670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context, int argc, Local<Value> argv[]) const; 3671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use maybe version", Local<Object> NewInstance() const); 3673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Object> NewInstance( 3674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context) const { 3675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return NewInstance(context, 0, nullptr); 3676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", 3679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> Call(Local<Value> recv, int argc, 3680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> argv[])); 3681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Value> Call(Local<Context> context, 3682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> recv, int argc, 3683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> argv[]); 3684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3685014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetName(Local<String> name); 3686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> GetName() const; 3687402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu 3688402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu /** 36893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch * Name inferred from variable or property assignment of this function. 36903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch * Used to facilitate debugging and profiling of JavaScript code written 36913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch * in an OO style, where many functions are anonymous but are assigned 36923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch * to object properties. 36933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch */ 3694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> GetInferredName() const; 3695014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 3697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * displayName if it is set, otherwise name if it is configured, otherwise 3698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * function name, otherwise inferred name. 3699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 3700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> GetDebugName() const; 3701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 3703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * User-defined name assigned to the "displayName" property of this function. 3704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Used to facilitate debugging and profiling of JavaScript code. 3705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 3706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> GetDisplayName() const; 37073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 37083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch /** 3709402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu * Returns zero based line number of function body and 3710402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu * kLineOffsetNotFound if no information available. 3711402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu */ 3712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int GetScriptLineNumber() const; 37133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch /** 37143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch * Returns zero based column number of function body and 37153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch * kLineOffsetNotFound if no information available. 37163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch */ 3717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int GetScriptColumnNumber() const; 3718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 3720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Tells whether this function is builtin. 3721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 372262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V8_DEPRECATED("this should no longer be used.", bool IsBuiltin() const); 3723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 3725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns scriptId. 3726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 3727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int ScriptId() const; 3728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 3730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns the original function if this function is bound, else returns 3731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * v8::Undefined. 3732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 3733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<Value> GetBoundFunction() const; 3734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ScriptOrigin GetScriptOrigin() const; 3736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static Function* Cast(Value* obj); 3737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kLineOffsetNotFound; 37383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 3740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Function(); 3741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void CheckCast(Value* obj); 3742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 3743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 3746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * An instance of the built-in Promise constructor (ES6 draft). 3747257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch */ 3748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Promise : public Object { 3749257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 375062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch /** 375162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * State of the promise. Each value corresponds to one of the possible values 375262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * of the [[PromiseState]] field. 375362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch */ 375462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch enum PromiseState { kPending, kFulfilled, kRejected }; 375562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 3756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class V8_EXPORT Resolver : public Object { 3757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 3758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 3759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Create a new resolver, along with an associated promise in pending state. 3760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 3761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_DEPRECATE_SOON("Use maybe version", 3762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Resolver> New(Isolate* isolate)); 3763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_WARN_UNUSED_RESULT MaybeLocal<Resolver> New( 3764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context); 3765257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 3767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Extract the associated promise. 3768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 3769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<Promise> GetPromise(); 3770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 3772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Resolve/reject the associated promise with a given value. 3773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Ignored if the promise is no longer pending. 3774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 3775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", void Resolve(Local<Value> value)); 3776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // TODO(dcarney): mark V8_WARN_UNUSED_RESULT 3777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Maybe<bool> Resolve(Local<Context> context, Local<Value> value); 3778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", void Reject(Local<Value> value)); 3780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // TODO(dcarney): mark V8_WARN_UNUSED_RESULT 3781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Maybe<bool> Reject(Local<Context> context, Local<Value> value); 3782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static Resolver* Cast(Value* obj); 3784257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 3786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Resolver(); 3787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void CheckCast(Value* obj); 3788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 3789257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3790257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch /** 3791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Register a resolution/rejection handler with a promise. 3792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * The handler is given the respective resolution/rejection value as 3793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * an argument. If the promise is already resolved/rejected, the handler is 3794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * invoked at the end of turn. 3795257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch */ 3796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use maybe version", 3797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Promise> Catch(Local<Function> handler)); 3798014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Promise> Catch(Local<Context> context, 3799014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Function> handler); 3800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3801014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use maybe version", 3802014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Promise> Then(Local<Function> handler)); 3803014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Promise> Then(Local<Context> context, 3804014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Function> handler); 3805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3806958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 3807958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Returns true if the promise has at least one derived promise, and 3808958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * therefore resolve/reject handlers (including default handler). 3809958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 3810958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool HasHandler(); 3811958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 381262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch /** 381362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Returns the content of the [[PromiseResult]] field. The Promise must not 381462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * be pending. 381562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch */ 381662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Local<Value> Result(); 381762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 381862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch /** 381962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Returns the value of the [[PromiseState]] field. 382062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch */ 382162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PromiseState State(); 382262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 3823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static Promise* Cast(Value* obj); 3824257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3825257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private: 3826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Promise(); 3827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void CheckCast(Value* obj); 3828257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 3829257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3830f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch/** 3831f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * An instance of a Property Descriptor, see Ecma-262 6.2.4. 3832f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 3833f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Properties in a descriptor are present or absent. If you do not set 3834f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * `enumerable`, `configurable`, and `writable`, they are absent. If `value`, 3835f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * `get`, or `set` are absent, but you must specify them in the constructor, use 3836f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * empty handles. 3837f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 3838f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Accessors `get` and `set` must be callable or undefined if they are present. 3839f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 3840f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \note Only query properties if they are present, i.e., call `x()` only if 3841f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * `has_x()` returns true. 3842f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 3843f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \code 3844f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * // var desc = {writable: false} 3845f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * v8::PropertyDescriptor d(Local<Value>()), false); 3846f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * d.value(); // error, value not set 3847f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * if (d.has_writable()) { 3848f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * d.writable(); // false 3849f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * } 3850f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 3851f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * // var desc = {value: undefined} 3852f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * v8::PropertyDescriptor d(v8::Undefined(isolate)); 3853f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 3854f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * // var desc = {get: undefined} 3855f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * v8::PropertyDescriptor d(v8::Undefined(isolate), Local<Value>())); 3856f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \endcode 3857f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 3858f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass V8_EXPORT PropertyDescriptor { 3859f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch public: 3860f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // GenericDescriptor 3861f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch PropertyDescriptor(); 3862f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3863f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // DataDescriptor 3864f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch PropertyDescriptor(Local<Value> value); 3865f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3866f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // DataDescriptor with writable property 3867f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch PropertyDescriptor(Local<Value> value, bool writable); 3868f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3869f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // AccessorDescriptor 3870f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch PropertyDescriptor(Local<Value> get, Local<Value> set); 3871f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3872f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch ~PropertyDescriptor(); 3873f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3874f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Local<Value> value() const; 3875f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch bool has_value() const; 3876f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3877f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Local<Value> get() const; 3878f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch bool has_get() const; 3879f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Local<Value> set() const; 3880f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch bool has_set() const; 3881f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3882f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void set_enumerable(bool enumerable); 3883f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch bool enumerable() const; 3884f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch bool has_enumerable() const; 3885f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3886f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void set_configurable(bool configurable); 3887f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch bool configurable() const; 3888f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch bool has_configurable() const; 3889f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3890f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch bool writable() const; 3891f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch bool has_writable() const; 3892f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3893f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch struct PrivateData; 3894f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch PrivateData* get_private() const { return private_; } 3895f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3896f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch PropertyDescriptor(const PropertyDescriptor&) = delete; 3897f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void operator=(const PropertyDescriptor&) = delete; 3898f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3899f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch private: 3900f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch PrivateData* private_; 3901f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}; 3902257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch/** 3904014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * An instance of the built-in Proxy constructor (ECMA-262, 6th Edition, 3905014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * 26.2.1). 3906014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 3907014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass V8_EXPORT Proxy : public Object { 3908014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 3909014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Object> GetTarget(); 3910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> GetHandler(); 3911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsRevoked(); 3912014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void Revoke(); 3913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 3915f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Creates a new Proxy for the target object. 3916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 3917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MaybeLocal<Proxy> New(Local<Context> context, 3918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Object> local_target, 3919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Object> local_handler); 3920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static Proxy* Cast(Value* obj); 3922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3923014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 3924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Proxy(); 3925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void CheckCast(Value* obj); 3926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 3927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3928f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass V8_EXPORT WasmCompiledModule : public Object { 3929f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 3930f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch typedef std::pair<std::unique_ptr<const uint8_t[]>, size_t> SerializedModule; 3931c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // A buffer that is owned by the caller. 3932c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch typedef std::pair<const uint8_t*, size_t> CallerOwnedBuffer; 3933c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Get the wasm-encoded bytes that were used to compile this module. 3934c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Local<String> GetWasmWireBytes(); 3935f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 3936c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Serialize the compiled module. The serialized data does not include the 3937c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // uncompiled bytes. 3938f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch SerializedModule Serialize(); 3939c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 3940c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // If possible, deserialize the module, otherwise compile it from the provided 3941c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // uncompiled bytes. 3942c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static MaybeLocal<WasmCompiledModule> DeserializeOrCompile( 3943c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Isolate* isolate, const CallerOwnedBuffer& serialized_module, 3944c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch const CallerOwnedBuffer& wire_bytes); 3945f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V8_INLINE static WasmCompiledModule* Cast(Value* obj); 3946f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 3947f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private: 3948c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static MaybeLocal<WasmCompiledModule> Deserialize( 3949c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Isolate* isolate, const CallerOwnedBuffer& serialized_module, 3950c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch const CallerOwnedBuffer& wire_bytes); 3951c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static MaybeLocal<WasmCompiledModule> Compile(Isolate* isolate, 3952c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch const uint8_t* start, 3953c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch size_t length); 3954f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch WasmCompiledModule(); 3955f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void CheckCast(Value* obj); 3956f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 3957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifndef V8_ARRAY_BUFFER_INTERNAL_FIELD_COUNT 3959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The number of required internal fields can be defined by embedder. 3960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define V8_ARRAY_BUFFER_INTERNAL_FIELD_COUNT 2 3961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 3962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum class ArrayBufferCreationMode { kInternalized, kExternalized }; 3965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3967257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch/** 3968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * An instance of the built-in ArrayBuffer constructor (ES6 draft 15.13.5). 39693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch */ 3970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT ArrayBuffer : public Object { 39713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 3972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 3973bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * A thread-safe allocator that V8 uses to allocate |ArrayBuffer|'s memory. 3974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * The allocator is a global V8 setting. It has to be set via 3975014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Isolate::CreateParams. 3976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 3977bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * Memory allocated through this allocator by V8 is accounted for as external 3978bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * memory by V8. Note that V8 keeps track of the memory for all internalized 3979bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * |ArrayBuffer|s. Responsibility for tracking external memory (using 3980bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * Isolate::AdjustAmountOfExternalAllocatedMemory) is handed over to the 3981bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * embedder upon externalization and taken over upon internalization (creating 3982bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * an internalized buffer from an existing buffer). 3983bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * 3984bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * Note that it is unsafe to call back into V8 from any of the allocator 3985bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * functions. 3986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 3987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class V8_EXPORT Allocator { // NOLINT 3988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 3989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual ~Allocator() {} 3990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 3992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Allocate |length| bytes. Return NULL if allocation is not successful. 3993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Memory should be initialized to zeroes. 3994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 3995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void* Allocate(size_t length) = 0; 3996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 3998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Allocate |length| bytes. Return NULL if allocation is not successful. 3999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Memory does not have to be initialized. 4000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void* AllocateUninitialized(size_t length) = 0; 4002f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 4004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Free the memory block of size |length|, pointed to by |data|. 4005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * That memory is guaranteed to be previously allocated by |Allocate|. 4006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void Free(void* data, size_t length) = 0; 4008f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4009f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch /** 4010f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * malloc/free based convenience allocator. 4011f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * 4012f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * Caller takes ownership. 4013f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch */ 4014f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static Allocator* NewDefaultAllocator(); 4015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 40163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 40173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch /** 4018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * The contents of an |ArrayBuffer|. Externalization of |ArrayBuffer| 4019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * returns an instance of this class, populated, with a pointer to data 4020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * and byte length. 4021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 4022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * The Data pointer of ArrayBuffer::Contents is always allocated with 4023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Allocator::Allocate that is set via Isolate::CreateParams. 40243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch */ 4025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class V8_EXPORT Contents { // NOLINT 4026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Contents() : data_(NULL), byte_length_(0) {} 40283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* Data() const { return data_; } 4030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t ByteLength() const { return byte_length_; } 40313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* data_; 4034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t byte_length_; 40353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class ArrayBuffer; 4037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 40383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 40393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 40403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch /** 4041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Data length in bytes. 40423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch */ 4043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t ByteLength() const; 40443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 4046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Create a new ArrayBuffer. Allocate |byte_length| bytes. 4047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Allocated memory will be owned by a created ArrayBuffer and 4048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * will be deallocated when it is garbage-collected, 4049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * unless the object is externalized. 4050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Local<ArrayBuffer> New(Isolate* isolate, size_t byte_length); 40523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 4054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Create a new ArrayBuffer over an existing memory block. 4055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * The created array buffer is by default immediately in externalized state. 4056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * The memory block will not be reclaimed when a created ArrayBuffer 4057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * is garbage-collected. 4058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<ArrayBuffer> New( 4060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, void* data, size_t byte_length, 4061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ArrayBufferCreationMode mode = ArrayBufferCreationMode::kExternalized); 40623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 4064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Returns true if ArrayBuffer is externalized, that is, does not 4065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * own its memory block. 4066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsExternal() const; 40683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 4070958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Returns true if this ArrayBuffer may be neutered. 4071958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 4072958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool IsNeuterable() const; 4073958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 4075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Neuters this ArrayBuffer and all its views (typed arrays). 4076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Neutering sets the byte length of the buffer and all typed arrays to zero, 4077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * preventing JavaScript from ever accessing underlying backing store. 4078958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * ArrayBuffer should have been externalized and must be neuterable. 4079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Neuter(); 40813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 40823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch /** 4083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Make this ArrayBuffer external. The pointer to underlying memory block 4084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * and byte length are returned as |Contents| structure. After ArrayBuffer 4085f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * had been externalized, it does no longer own the memory block. The caller 4086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * should take steps to free memory when it is no longer needed. 4087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 4088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * The memory block is guaranteed to be allocated with |Allocator::Allocate| 4089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * that has been set via Isolate::CreateParams. 40903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch */ 4091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Contents Externalize(); 4092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 4094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Get a pointer to the ArrayBuffer's underlying memory block without 4095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * externalizing it. If the ArrayBuffer is not externalized, this pointer 4096f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * will become invalid as soon as the ArrayBuffer gets garbage collected. 4097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * 4098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * The embedder should make sure to hold a strong reference to the 4099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * ArrayBuffer while accessing this pointer. 4100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * 4101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * The memory block is guaranteed to be allocated with |Allocator::Allocate|. 4102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 4103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Contents GetContents(); 4104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static ArrayBuffer* Cast(Value* obj); 41063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kInternalFieldCount = V8_ARRAY_BUFFER_INTERNAL_FIELD_COUNT; 41083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 41093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private: 4110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ArrayBuffer(); 4111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void CheckCast(Value* obj); 41123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 41133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 41143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifndef V8_ARRAY_BUFFER_VIEW_INTERNAL_FIELD_COUNT 4116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The number of required internal fields can be defined by embedder. 4117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define V8_ARRAY_BUFFER_VIEW_INTERNAL_FIELD_COUNT 2 4118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 4119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 41213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch/** 4122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A base class for an instance of one of "views" over ArrayBuffer, 4123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * including TypedArrays and DataView (ES6 draft 15.13). 4124257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch */ 4125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT ArrayBufferView : public Object { 4126257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 4127257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch /** 4128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns underlying ArrayBuffer. 4129257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch */ 4130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<ArrayBuffer> Buffer(); 4131257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch /** 4132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Byte offset in |Buffer|. 4133257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch */ 4134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t ByteOffset(); 4135257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch /** 4136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Size of a view in bytes. 4137257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch */ 4138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t ByteLength(); 4139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 4141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Copy the contents of the ArrayBufferView's buffer to an embedder defined 4142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * memory without additional overhead that calling ArrayBufferView::Buffer 4143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * might incur. 4144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * 4145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Will write at most min(|byte_length|, ByteLength) bytes starting at 4146f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * ByteOffset of the underlying buffer to the memory starting at |dest|. 4147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Returns the number of bytes actually written. 4148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 4149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t CopyContents(void* dest, size_t byte_length); 4150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 4152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Returns true if ArrayBufferView's backing ArrayBuffer has already been 4153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * allocated. 4154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 4155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool HasBuffer() const; 4156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static ArrayBufferView* Cast(Value* obj); 4158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kInternalFieldCount = 4160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_ARRAY_BUFFER_VIEW_INTERNAL_FIELD_COUNT; 4161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ArrayBufferView(); 4164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void CheckCast(Value* obj); 4165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4166257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 4169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A base class for an instance of TypedArray series of constructors 4170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * (ES6 draft 15.13.6). 4171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT TypedArray : public ArrayBufferView { 4173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4174257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch /** 4175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Number of elements in this typed array 4176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * (e.g. for Int16Array, |ByteLength|/2). 4177257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch */ 4178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t Length(); 4179257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static TypedArray* Cast(Value* obj); 4181257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4182257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private: 4183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypedArray(); 4184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void CheckCast(Value* obj); 4185257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 4186257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4187257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4188257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch/** 4189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * An instance of Uint8Array constructor (ES6 draft 15.13.6). 4190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 4191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Uint8Array : public TypedArray { 4192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 4193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Uint8Array> New(Local<ArrayBuffer> array_buffer, 4194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t byte_offset, size_t length); 4195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Uint8Array> New(Local<SharedArrayBuffer> shared_array_buffer, 4196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t byte_offset, size_t length); 4197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static Uint8Array* Cast(Value* obj); 4198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 4200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint8Array(); 4201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void CheckCast(Value* obj); 4202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 4203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 4206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * An instance of Uint8ClampedArray constructor (ES6 draft 15.13.6). 4207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Uint8ClampedArray : public TypedArray { 4209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Uint8ClampedArray> New(Local<ArrayBuffer> array_buffer, 4211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t byte_offset, size_t length); 4212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Uint8ClampedArray> New( 4213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<SharedArrayBuffer> shared_array_buffer, size_t byte_offset, 4214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t length); 4215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static Uint8ClampedArray* Cast(Value* obj); 4216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint8ClampedArray(); 4219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void CheckCast(Value* obj); 4220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 4223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * An instance of Int8Array constructor (ES6 draft 15.13.6). 4224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 4225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Int8Array : public TypedArray { 4226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 4227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Int8Array> New(Local<ArrayBuffer> array_buffer, 4228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t byte_offset, size_t length); 4229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Int8Array> New(Local<SharedArrayBuffer> shared_array_buffer, 4230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t byte_offset, size_t length); 4231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static Int8Array* Cast(Value* obj); 4232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int8Array(); 4235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void CheckCast(Value* obj); 4236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 4237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 4240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * An instance of Uint16Array constructor (ES6 draft 15.13.6). 4241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 4242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Uint16Array : public TypedArray { 4243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 4244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Uint16Array> New(Local<ArrayBuffer> array_buffer, 4245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t byte_offset, size_t length); 4246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Uint16Array> New(Local<SharedArrayBuffer> shared_array_buffer, 4247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t byte_offset, size_t length); 4248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static Uint16Array* Cast(Value* obj); 42493e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 4250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint16Array(); 4252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void CheckCast(Value* obj); 4253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 4254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 4257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * An instance of Int16Array constructor (ES6 draft 15.13.6). 4258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 4259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Int16Array : public TypedArray { 4260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 4261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Int16Array> New(Local<ArrayBuffer> array_buffer, 4262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t byte_offset, size_t length); 4263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Int16Array> New(Local<SharedArrayBuffer> shared_array_buffer, 4264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t byte_offset, size_t length); 4265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static Int16Array* Cast(Value* obj); 4266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 4268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int16Array(); 4269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void CheckCast(Value* obj); 4270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 4271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 4274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * An instance of Uint32Array constructor (ES6 draft 15.13.6). 4275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 4276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Uint32Array : public TypedArray { 4277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Uint32Array> New(Local<ArrayBuffer> array_buffer, 4279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t byte_offset, size_t length); 4280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Uint32Array> New(Local<SharedArrayBuffer> shared_array_buffer, 4281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t byte_offset, size_t length); 4282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static Uint32Array* Cast(Value* obj); 4283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32Array(); 4286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void CheckCast(Value* obj); 4287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 4291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * An instance of Int32Array constructor (ES6 draft 15.13.6). 4292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 4293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Int32Array : public TypedArray { 4294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Int32Array> New(Local<ArrayBuffer> array_buffer, 4296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t byte_offset, size_t length); 4297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Int32Array> New(Local<SharedArrayBuffer> shared_array_buffer, 4298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t byte_offset, size_t length); 4299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static Int32Array* Cast(Value* obj); 4300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32Array(); 4303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void CheckCast(Value* obj); 4304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 4308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * An instance of Float32Array constructor (ES6 draft 15.13.6). 4309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 4310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Float32Array : public TypedArray { 4311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Float32Array> New(Local<ArrayBuffer> array_buffer, 4313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t byte_offset, size_t length); 4314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Float32Array> New(Local<SharedArrayBuffer> shared_array_buffer, 4315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t byte_offset, size_t length); 4316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static Float32Array* Cast(Value* obj); 4317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Float32Array(); 4320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void CheckCast(Value* obj); 4321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 4325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * An instance of Float64Array constructor (ES6 draft 15.13.6). 4326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Float64Array : public TypedArray { 4328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Float64Array> New(Local<ArrayBuffer> array_buffer, 4330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t byte_offset, size_t length); 4331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Float64Array> New(Local<SharedArrayBuffer> shared_array_buffer, 4332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t byte_offset, size_t length); 4333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static Float64Array* Cast(Value* obj); 4334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Float64Array(); 4337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void CheckCast(Value* obj); 4338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 4342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * An instance of DataView constructor (ES6 draft 15.13.7). 4343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT DataView : public ArrayBufferView { 4345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<DataView> New(Local<ArrayBuffer> array_buffer, 4347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t byte_offset, size_t length); 4348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<DataView> New(Local<SharedArrayBuffer> shared_array_buffer, 4349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t byte_offset, size_t length); 4350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static DataView* Cast(Value* obj); 4351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DataView(); 4354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void CheckCast(Value* obj); 4355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 4359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * An instance of the built-in SharedArrayBuffer constructor. 4360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * This API is experimental and may change significantly. 4361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 4362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass V8_EXPORT SharedArrayBuffer : public Object { 4363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 4364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 4365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * The contents of an |SharedArrayBuffer|. Externalization of 4366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * |SharedArrayBuffer| returns an instance of this class, populated, with a 4367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * pointer to data and byte length. 4368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * 4369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * The Data pointer of SharedArrayBuffer::Contents is always allocated with 4370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * |ArrayBuffer::Allocator::Allocate| by the allocator specified in 4371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * v8::Isolate::CreateParams::array_buffer_allocator. 4372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * 4373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * This API is experimental and may change significantly. 4374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 4375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class V8_EXPORT Contents { // NOLINT 4376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 4377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Contents() : data_(NULL), byte_length_(0) {} 4378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void* Data() const { return data_; } 4380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t ByteLength() const { return byte_length_; } 4381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 4383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void* data_; 4384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t byte_length_; 4385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend class SharedArrayBuffer; 4387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 4388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 4391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Data length in bytes. 4392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 4393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t ByteLength() const; 4394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 4396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Create a new SharedArrayBuffer. Allocate |byte_length| bytes. 4397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Allocated memory will be owned by a created SharedArrayBuffer and 4398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * will be deallocated when it is garbage-collected, 4399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * unless the object is externalized. 4400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 4401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<SharedArrayBuffer> New(Isolate* isolate, size_t byte_length); 4402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 4404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Create a new SharedArrayBuffer over an existing memory block. The created 4405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * array buffer is immediately in externalized state unless otherwise 4406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * specified. The memory block will not be reclaimed when a created 4407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * SharedArrayBuffer is garbage-collected. 4408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 4409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<SharedArrayBuffer> New( 4410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, void* data, size_t byte_length, 4411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ArrayBufferCreationMode mode = ArrayBufferCreationMode::kExternalized); 4412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 4414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Returns true if SharedArrayBuffer is externalized, that is, does not 4415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * own its memory block. 4416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 4417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsExternal() const; 4418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 4420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Make this SharedArrayBuffer external. The pointer to underlying memory 4421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * block and byte length are returned as |Contents| structure. After 4422f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * SharedArrayBuffer had been externalized, it does no longer own the memory 4423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * block. The caller should take steps to free memory when it is no longer 4424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * needed. 4425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * 4426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * The memory block is guaranteed to be allocated with |Allocator::Allocate| 4427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * by the allocator specified in 4428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * v8::Isolate::CreateParams::array_buffer_allocator. 4429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * 4430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 4431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Contents Externalize(); 4432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 4434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Get a pointer to the ArrayBuffer's underlying memory block without 4435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * externalizing it. If the ArrayBuffer is not externalized, this pointer 4436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * will become invalid as soon as the ArrayBuffer became garbage collected. 4437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * 4438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * The embedder should make sure to hold a strong reference to the 4439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * ArrayBuffer while accessing this pointer. 4440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * 4441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * The memory block is guaranteed to be allocated with |Allocator::Allocate| 4442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * by the allocator specified in 4443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * v8::Isolate::CreateParams::array_buffer_allocator. 4444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 4445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Contents GetContents(); 4446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4447014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static SharedArrayBuffer* Cast(Value* obj); 4448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kInternalFieldCount = V8_ARRAY_BUFFER_INTERNAL_FIELD_COUNT; 4450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 4452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch SharedArrayBuffer(); 4453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void CheckCast(Value* obj); 4454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 4455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch/** 4458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * An instance of the built-in Date constructor (ECMA-262, 15.9). 4459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Date : public Object { 4461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_DEPRECATE_SOON("Use maybe version.", 4463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> New(Isolate* isolate, double time)); 4464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_WARN_UNUSED_RESULT MaybeLocal<Value> New(Local<Context> context, 4465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch double time); 4466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 4468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A specialization of Value::NumberValue that is more efficient 4469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * because we know the structure of this object. 4470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double ValueOf() const; 4472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 447362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V8_INLINE static Date* Cast(Value* obj); 4474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 4476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Notification that the embedder has changed the time zone, 4477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * daylight savings time, or other date / time configuration 4478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * parameters. V8 keeps a cache of various values used for 4479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * date / time computation. This notification will reset 4480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * those cached values for the current context so that date / 4481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * time configuration changes would be reflected in the Date 4482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * object. 4483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 4484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * This API should not be called more than needed as it will 4485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * negatively impact the performance of date operations. 4486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void DateTimeConfigurationChangeNotification(Isolate* isolate); 4488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 449062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static void CheckCast(Value* obj); 4491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 4495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A Number object (ECMA-262, 4.3.21). 4496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT NumberObject : public Object { 4498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Local<Value> New(Isolate* isolate, double value); 4500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double ValueOf() const; 4502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 450362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V8_INLINE static NumberObject* Cast(Value* obj); 4504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 450662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static void CheckCast(Value* obj); 4507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 4511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A Boolean object (ECMA-262, 4.3.15). 4512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT BooleanObject : public Object { 4514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Value> New(Isolate* isolate, bool value); 4516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Pass an isolate", static Local<Value> New(bool value)); 4517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool ValueOf() const; 4519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 452062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V8_INLINE static BooleanObject* Cast(Value* obj); 4521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 452362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static void CheckCast(Value* obj); 4524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 4528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A String object (ECMA-262, 4.3.18). 4529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT StringObject : public Object { 4531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Value> New(Local<String> value); 4533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<String> ValueOf() const; 4535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 453662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V8_INLINE static StringObject* Cast(Value* obj); 4537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 453962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static void CheckCast(Value* obj); 4540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 4544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A Symbol object (ECMA-262 edition 6). 4545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT SymbolObject : public Object { 4547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Value> New(Isolate* isolate, Local<Symbol> value); 4549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<Symbol> ValueOf() const; 4551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 455262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V8_INLINE static SymbolObject* Cast(Value* obj); 4553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 455562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static void CheckCast(Value* obj); 4556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 4560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * An instance of the built-in RegExp constructor (ECMA-262, 15.10). 4561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT RegExp : public Object { 4563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 4565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Regular expression flag bits. They can be or'ed to enable a set 4566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * of flags. 4567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum Flags { 4569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kNone = 0, 4570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kGlobal = 1, 4571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kIgnoreCase = 2, 4572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kMultiline = 4, 4573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kSticky = 8, 4574014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kUnicode = 16 4575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 4576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 4578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Creates a regular expression from the given pattern string and 4579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * the flags bit field. May throw a JavaScript exception as 4580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * described in ECMA-262, 15.10.4.1. 4581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 4582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * For example, 4583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * RegExp::New(v8::String::New("foo"), 4584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * static_cast<RegExp::Flags>(kGlobal | kMultiline)) 4585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * is equivalent to evaluating "/foo/gm". 4586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_DEPRECATE_SOON("Use maybe version", 4588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<RegExp> New(Local<String> pattern, 4589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Flags flags)); 4590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_WARN_UNUSED_RESULT MaybeLocal<RegExp> New(Local<Context> context, 4591014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<String> pattern, 4592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Flags flags); 4593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 4595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns the value of the source property: a string representing 4596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * the regular expression. 4597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<String> GetSource() const; 4599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 4601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns the flags bit field. 4602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Flags GetFlags() const; 4604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 460562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V8_INLINE static RegExp* Cast(Value* obj); 4606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 460862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static void CheckCast(Value* obj); 4609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 4613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A JavaScript value that wraps a C++ void*. This type of value is mainly used 4614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * to associate C++ data structures with JavaScript objects. 4615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT External : public Value { 4617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Local<External> New(Isolate* isolate, void* value); 4619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static External* Cast(Value* obj); 4620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* Value() const; 4621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void CheckCast(v8::Value* obj); 4623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 462562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define V8_INTRINSICS_LIST(F) \ 462662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch F(ArrayProto_entries, array_entries_iterator) \ 462762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch F(ArrayProto_forEach, array_for_each_iterator) \ 462862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch F(ArrayProto_keys, array_keys_iterator) \ 462962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch F(ArrayProto_values, array_values_iterator) 4630014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum Intrinsic { 4632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define V8_DECL_INTRINSIC(name, iname) k##name, 4633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INTRINSICS_LIST(V8_DECL_INTRINSIC) 4634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef V8_DECL_INTRINSIC 4635014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 4636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4637014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// --- Templates --- 4639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 4642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * The superclass of object and function templates. 4643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Template : public Data { 4645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4646bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch /** 4647bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * Adds a property to each instance created by this template. 4648bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * 4649bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * The property must be defined either as a primitive value, or a template. 4650bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch */ 4651014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void Set(Local<Name> name, Local<Data> value, 4652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PropertyAttribute attributes = None); 4653c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch void SetPrivate(Local<Private> name, Local<Data> value, 4654c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch PropertyAttribute attributes = None); 4655014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE void Set(Isolate* isolate, const char* name, Local<Data> value); 4656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetAccessorProperty( 4658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<Name> name, 4659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<FunctionTemplate> getter = Local<FunctionTemplate>(), 4660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<FunctionTemplate> setter = Local<FunctionTemplate>(), 4661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PropertyAttribute attribute = None, 4662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AccessControl settings = DEFAULT); 4663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 4665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Whenever the property with the given name is accessed on objects 4666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * created from this Template the getter and setter callbacks 4667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * are called instead of getting and setting the property directly 4668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * on the JavaScript object. 4669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 4670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \param name The name of the property for which an accessor is added. 4671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \param getter The callback to invoke when getting the property. 4672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \param setter The callback to invoke when setting the property. 4673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \param data A piece of data that will be passed to the getter and setter 4674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * callbacks whenever they are invoked. 4675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \param settings Access control settings for the accessor. This is a bit 4676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * field consisting of one of more of 4677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * DEFAULT = 0, ALL_CAN_READ = 1, or ALL_CAN_WRITE = 2. 4678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * The default is to not allow cross-context access. 4679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * ALL_CAN_READ means that all cross-context reads are allowed. 4680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * ALL_CAN_WRITE means that all cross-context writes are allowed. 4681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * The combination ALL_CAN_READ | ALL_CAN_WRITE can be used to allow all 4682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * cross-context access. 4683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \param attribute The attributes of the property for which an accessor 4684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * is added. 4685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \param signature The signature describes valid receivers for the accessor 4686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * and is used to perform implicit instance checks against them. If the 4687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * receiver is incompatible (i.e. is not an instance of the constructor as 4688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * defined by FunctionTemplate::HasInstance()), an implicit TypeError is 4689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * thrown and no callback is invoked. 4690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetNativeDataProperty( 4692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<String> name, AccessorGetterCallback getter, 4693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AccessorSetterCallback setter = 0, 4694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // TODO(dcarney): gcc can't handle Local below 4695014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> data = Local<Value>(), PropertyAttribute attribute = None, 4696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<AccessorSignature> signature = Local<AccessorSignature>(), 4697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AccessControl settings = DEFAULT); 4698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetNativeDataProperty( 4699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Name> name, AccessorNameGetterCallback getter, 4700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AccessorNameSetterCallback setter = 0, 4701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // TODO(dcarney): gcc can't handle Local below 4702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> data = Local<Value>(), PropertyAttribute attribute = None, 4703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<AccessorSignature> signature = Local<AccessorSignature>(), 4704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AccessControl settings = DEFAULT); 4705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 4707c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * Like SetNativeDataProperty, but V8 will replace the native data property 4708c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * with a real data property on first access. 4709c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch */ 4710c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch void SetLazyDataProperty(Local<Name> name, AccessorNameGetterCallback getter, 4711c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Local<Value> data = Local<Value>(), 4712c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch PropertyAttribute attribute = None); 4713c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 4714c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch /** 4715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * During template instantiation, sets the value with the intrinsic property 4716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * from the correct context. 4717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 4718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetIntrinsicDataProperty(Local<Name> name, Intrinsic intrinsic, 4719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyAttribute attribute = None); 4720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Template(); 4723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class ObjectTemplate; 4725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class FunctionTemplate; 4726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 4730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * NamedProperty[Getter|Setter] are used as interceptors on object. 4731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * See ObjectTemplate::SetNamedPropertyHandler. 4732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef void (*NamedPropertyGetterCallback)( 4734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<String> property, 4735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PropertyCallbackInfo<Value>& info); 4736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 4739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns the value if the setter intercepts the request. 4740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Otherwise, returns an empty handle. 4741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef void (*NamedPropertySetterCallback)( 4743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<String> property, 4744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<Value> value, 4745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PropertyCallbackInfo<Value>& info); 4746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 4749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns a non-empty handle if the interceptor intercepts the request. 4750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * The result is an integer encoding property attributes (like v8::None, 4751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * v8::DontEnum, etc.) 4752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef void (*NamedPropertyQueryCallback)( 4754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<String> property, 4755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PropertyCallbackInfo<Integer>& info); 4756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 4759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns a non-empty handle if the deleter intercepts the request. 4760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * The return value is true if the property could be deleted and false 4761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * otherwise. 4762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 4763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef void (*NamedPropertyDeleterCallback)( 4764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<String> property, 4765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PropertyCallbackInfo<Boolean>& info); 4766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 4769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns an array containing the names of the properties the named 4770a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * property getter intercepts. 4771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 4772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef void (*NamedPropertyEnumeratorCallback)( 4773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PropertyCallbackInfo<Array>& info); 4774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4776958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// TODO(dcarney): Deprecate and remove previous typedefs, and replace 4777958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// GenericNamedPropertyFooCallback with just NamedPropertyFooCallback. 4778f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 4779958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier/** 4780f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Interceptor for get requests on an object. 4781f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4782f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Use `info.GetReturnValue().Set()` to set the return value of the 4783f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * intercepted get request. 4784f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4785f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \param property The name of the property for which the request was 4786f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * intercepted. 4787f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \param info Information about the intercepted request, such as 4788f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * isolate, receiver, return value, or whether running in `'use strict`' mode. 4789f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * See `PropertyCallbackInfo`. 4790f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4791f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \code 4792f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * void GetterCallback( 4793f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Local<Name> name, 4794f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * const v8::PropertyCallbackInfo<v8::Value>& info) { 4795f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * info.GetReturnValue().Set(v8_num(42)); 4796f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * } 4797f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4798f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * v8::Local<v8::FunctionTemplate> templ = 4799f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * v8::FunctionTemplate::New(isolate); 4800f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * templ->InstanceTemplate()->SetHandler( 4801f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * v8::NamedPropertyHandlerConfiguration(GetterCallback)); 4802f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * LocalContext env; 4803f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * env->Global() 4804f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local()) 4805f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * .ToLocalChecked() 4806f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * ->NewInstance(env.local()) 4807f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * .ToLocalChecked()) 4808f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * .FromJust(); 4809f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * v8::Local<v8::Value> result = CompileRun("obj.a = 17; obj.a"); 4810f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * CHECK(v8_num(42)->Equals(env.local(), result).FromJust()); 4811f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \endcode 4812f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4813f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * See also `ObjectTemplate::SetHandler`. 4814958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 4815958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertypedef void (*GenericNamedPropertyGetterCallback)( 4816958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Local<Name> property, const PropertyCallbackInfo<Value>& info); 4817958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4818958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier/** 4819f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Interceptor for set requests on an object. 4820f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4821f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Use `info.GetReturnValue()` to indicate whether the request was intercepted 4822f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * or not. If the setter successfully intercepts the request, i.e., if the 4823f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * request should not be further executed, call 4824f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * `info.GetReturnValue().Set(value)`. If the setter 4825f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * did not intercept the request, i.e., if the request should be handled as 4826f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * if no interceptor is present, do not not call `Set()`. 4827f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4828f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \param property The name of the property for which the request was 4829f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * intercepted. 4830f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \param value The value which the property will have if the request 4831f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * is not intercepted. 4832f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \param info Information about the intercepted request, such as 4833f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * isolate, receiver, return value, or whether running in `'use strict'` mode. 4834f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * See `PropertyCallbackInfo`. 4835f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4836f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * See also 4837f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * `ObjectTemplate::SetHandler.` 4838958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 4839958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertypedef void (*GenericNamedPropertySetterCallback)( 4840958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Local<Name> property, Local<Value> value, 4841958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier const PropertyCallbackInfo<Value>& info); 4842958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4843958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier/** 4844f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Intercepts all requests that query the attributes of the 4845f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * property, e.g., getOwnPropertyDescriptor(), propertyIsEnumerable(), and 4846f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * defineProperty(). 4847f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4848f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Use `info.GetReturnValue().Set(value)` to set the property attributes. The 4849f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * value is an interger encoding a `v8::PropertyAttribute`. 4850f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4851f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \param property The name of the property for which the request was 4852f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * intercepted. 4853f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \param info Information about the intercepted request, such as 4854f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * isolate, receiver, return value, or whether running in `'use strict'` mode. 4855f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * See `PropertyCallbackInfo`. 4856f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4857f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \note Some functions query the property attributes internally, even though 4858f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * they do not return the attributes. For example, `hasOwnProperty()` can 4859f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * trigger this interceptor depending on the state of the object. 4860f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4861f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * See also 4862f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * `ObjectTemplate::SetHandler.` 4863958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 4864958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertypedef void (*GenericNamedPropertyQueryCallback)( 4865958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Local<Name> property, const PropertyCallbackInfo<Integer>& info); 4866958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4867958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier/** 4868f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Interceptor for delete requests on an object. 4869f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4870f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Use `info.GetReturnValue()` to indicate whether the request was intercepted 4871f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * or not. If the deleter successfully intercepts the request, i.e., if the 4872f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * request should not be further executed, call 4873f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * `info.GetReturnValue().Set(value)` with a boolean `value`. The `value` is 4874f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * used as the return value of `delete`. 4875f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4876f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \param property The name of the property for which the request was 4877f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * intercepted. 4878f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \param info Information about the intercepted request, such as 4879f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * isolate, receiver, return value, or whether running in `'use strict'` mode. 4880f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * See `PropertyCallbackInfo`. 4881f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4882f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \note If you need to mimic the behavior of `delete`, i.e., throw in strict 4883f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * mode instead of returning false, use `info.ShouldThrowOnError()` to determine 4884f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * if you are in strict mode. 4885f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4886f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * See also `ObjectTemplate::SetHandler.` 4887958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 4888958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertypedef void (*GenericNamedPropertyDeleterCallback)( 4889958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Local<Name> property, const PropertyCallbackInfo<Boolean>& info); 4890958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4892958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier/** 4893958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Returns an array containing the names of the properties the named 4894958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * property getter intercepts. 4895958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 4896958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertypedef void (*GenericNamedPropertyEnumeratorCallback)( 4897958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier const PropertyCallbackInfo<Array>& info); 4898958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4899f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch/** 4900f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Interceptor for defineProperty requests on an object. 4901f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4902f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Use `info.GetReturnValue()` to indicate whether the request was intercepted 4903f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * or not. If the definer successfully intercepts the request, i.e., if the 4904f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * request should not be further executed, call 4905f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * `info.GetReturnValue().Set(value)`. If the definer 4906f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * did not intercept the request, i.e., if the request should be handled as 4907f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * if no interceptor is present, do not not call `Set()`. 4908f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4909f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \param property The name of the property for which the request was 4910f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * intercepted. 4911f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \param desc The property descriptor which is used to define the 4912f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * property if the request is not intercepted. 4913f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \param info Information about the intercepted request, such as 4914f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * isolate, receiver, return value, or whether running in `'use strict'` mode. 4915f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * See `PropertyCallbackInfo`. 4916f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4917f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * See also `ObjectTemplate::SetHandler`. 4918f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 4919f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochtypedef void (*GenericNamedPropertyDefinerCallback)( 4920f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Local<Name> property, const PropertyDescriptor& desc, 4921f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch const PropertyCallbackInfo<Value>& info); 4922f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 4923f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch/** 4924f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Interceptor for getOwnPropertyDescriptor requests on an object. 4925f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4926f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Use `info.GetReturnValue().Set()` to set the return value of the 4927f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * intercepted request. The return value must be an object that 4928f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * can be converted to a PropertyDescriptor, e.g., a `v8::value` returned from 4929f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * `v8::Object::getOwnPropertyDescriptor`. 4930f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4931f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \param property The name of the property for which the request was 4932f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * intercepted. 4933f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \info Information about the intercepted request, such as 4934f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * isolate, receiver, return value, or whether running in `'use strict'` mode. 4935f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * See `PropertyCallbackInfo`. 4936f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4937f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * \note If GetOwnPropertyDescriptor is intercepted, it will 4938f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * always return true, i.e., indicate that the property was found. 4939f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4940f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * See also `ObjectTemplate::SetHandler`. 4941f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 4942f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochtypedef void (*GenericNamedPropertyDescriptorCallback)( 4943f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Local<Name> property, const PropertyCallbackInfo<Value>& info); 4944958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 4946f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * See `v8::GenericNamedPropertyGetterCallback`. 4947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 4948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef void (*IndexedPropertyGetterCallback)( 4949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t index, 4950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PropertyCallbackInfo<Value>& info); 4951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 4953f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * See `v8::GenericNamedPropertySetterCallback`. 4954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 4955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef void (*IndexedPropertySetterCallback)( 4956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t index, 4957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<Value> value, 4958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PropertyCallbackInfo<Value>& info); 4959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 4961f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * See `v8::GenericNamedPropertyQueryCallback`. 4962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 4963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef void (*IndexedPropertyQueryCallback)( 4964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t index, 4965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PropertyCallbackInfo<Integer>& info); 4966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 4968f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * See `v8::GenericNamedPropertyDeleterCallback`. 4969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 4970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef void (*IndexedPropertyDeleterCallback)( 4971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t index, 4972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PropertyCallbackInfo<Boolean>& info); 4973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 4975f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * See `v8::GenericNamedPropertyEnumeratorCallback`. 4976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 4977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef void (*IndexedPropertyEnumeratorCallback)( 4978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PropertyCallbackInfo<Array>& info); 4979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4980f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch/** 4981f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * See `v8::GenericNamedPropertyDefinerCallback`. 4982f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 4983f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochtypedef void (*IndexedPropertyDefinerCallback)( 4984f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch uint32_t index, const PropertyDescriptor& desc, 4985f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch const PropertyCallbackInfo<Value>& info); 4986f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 4987f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch/** 4988f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * See `v8::GenericNamedPropertyDescriptorCallback`. 4989f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 4990f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochtypedef void (*IndexedPropertyDescriptorCallback)( 4991f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch uint32_t index, const PropertyCallbackInfo<Value>& info); 4992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 4994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Access type specification. 4995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 4996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockenum AccessType { 4997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ACCESS_GET, 4998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ACCESS_SET, 4999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ACCESS_HAS, 5000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ACCESS_DELETE, 5001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ACCESS_KEYS 5002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 5003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 5006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Returns true if the given context should be allowed to access the given 5007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * object. 5008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 5009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtypedef bool (*AccessCheckCallback)(Local<Context> accessing_context, 5010109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Local<Object> accessed_object, 5011109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Local<Value> data); 5012a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5013a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 5014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * A FunctionTemplate is used to create functions at runtime. There 5015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * can only be one function created from a FunctionTemplate in a 5016a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * context. The lifetime of the created function is equal to the 5017a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * lifetime of the context. So in case the embedder needs to create 5018a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * temporary functions that can be collected using Scripts is 5019a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * preferred. 5020a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Any modification of a FunctionTemplate after first instantiation will trigger 5022f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * a crash. 5023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * 5024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * A FunctionTemplate can have properties, these properties are added to the 5025a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * function object when it is created. 5026a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5027a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * A FunctionTemplate has a corresponding instance template which is 5028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * used to create object instances when the function is used as a 5029a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * constructor. Properties added to the instance template are added to 5030a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * each object instance. 5031a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5032a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * A FunctionTemplate can have a prototype template. The prototype template 5033a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * is used to create the prototype object of the function. 5034a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5035a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * The following example shows how to use a FunctionTemplate: 5036a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5037a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \code 5038f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); 5039f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * t->Set(isolate, "func_property", v8::Number::New(isolate, 1)); 5040a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5041a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * v8::Local<v8::Template> proto_t = t->PrototypeTemplate(); 5042f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * proto_t->Set(isolate, 5043f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * "proto_method", 5044f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * v8::FunctionTemplate::New(isolate, InvokeCallback)); 5045f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * proto_t->Set(isolate, "proto_const", v8::Number::New(isolate, 2)); 5046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * v8::Local<v8::ObjectTemplate> instance_t = t->InstanceTemplate(); 5048f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * instance_t->SetAccessor(String::NewFromUtf8(isolate, "instance_accessor"), 5049f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * InstanceAccessorCallback); 5050f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * instance_t->SetNamedPropertyHandler(PropertyHandlerCallback); 5051f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * instance_t->Set(String::NewFromUtf8(isolate, "instance_property"), 5052f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * Number::New(isolate, 3)); 5053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * v8::Local<v8::Function> function = t->GetFunction(); 5055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * v8::Local<v8::Object> instance = function->NewInstance(); 5056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \endcode 5057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Let's use "function" as the JS variable name of the function object 5059a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * and "instance" for the instance object created above. The function 5060a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * and the instance will have the following properties: 5061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \code 5063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * func_property in function == true; 5064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * function.func_property == 1; 5065a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * function.prototype.proto_method() invokes 'InvokeCallback' 5067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * function.prototype.proto_const == 2; 5068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * instance instanceof function == true; 5070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * instance.instance_accessor calls 'InstanceAccessorCallback' 5071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * instance.instance_property == 3; 5072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \endcode 5073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5074a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * A FunctionTemplate can inherit from another one by calling the 5075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * FunctionTemplate::Inherit method. The following graph illustrates 5076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * the semantics of inheritance: 5077a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5078a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \code 5079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * FunctionTemplate Parent -> Parent() . prototype -> { } 5080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * ^ ^ 5081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * | Inherit(Parent) | .__proto__ 5082a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * | | 5083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * FunctionTemplate Child -> Child() . prototype -> { } 5084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \endcode 5085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * A FunctionTemplate 'Child' inherits from 'Parent', the prototype 5087a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * object of the Child() function has __proto__ pointing to the 5088a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Parent() function's prototype object. An instance of the Child 5089a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * function has all properties on Parent's instance templates. 5090a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Let Parent be the FunctionTemplate initialized in the previous 5092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * section and create a Child FunctionTemplate by: 5093a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5094a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \code 5095a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Local<FunctionTemplate> parent = t; 5096a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Local<FunctionTemplate> child = FunctionTemplate::New(); 5097a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * child->Inherit(parent); 5098a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5099a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Local<Function> child_function = child->GetFunction(); 5100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Local<Object> child_instance = child_function->NewInstance(); 5101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \endcode 5102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * The Child function and Child instance will have the following 5104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * properties: 5105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \code 5107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * child_func.prototype.__proto__ == function.prototype; 5108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * child_instance.instance_accessor calls 'InstanceAccessorCallback' 5109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * child_instance.instance_property == 3; 5110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \endcode 5111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 5112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT FunctionTemplate : public Template { 5113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 5114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** Creates a function template.*/ 5115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Local<FunctionTemplate> New( 5116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, FunctionCallback callback = 0, 5117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> data = Local<Value>(), 5118bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Local<Signature> signature = Local<Signature>(), int length = 0, 5119bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch ConstructorBehavior behavior = ConstructorBehavior::kAllow); 5120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 512113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch /** Get a template included in the snapshot by index. */ 5122f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static MaybeLocal<FunctionTemplate> FromSnapshot(Isolate* isolate, 5123f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch size_t index); 512413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 5125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 5126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Creates a function template with a fast handler. If a fast handler is set, 5127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * the callback cannot be null. 5128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 5129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<FunctionTemplate> NewWithFastHandler( 5130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, FunctionCallback callback, 5131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch experimental::FastAccessorBuilder* fast_handler = nullptr, 5132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> data = Local<Value>(), 5133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Signature> signature = Local<Signature>(), int length = 0); 5134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5135c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch /** 5136c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * Creates a function template backed/cached by a private property. 5137c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch */ 5138c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static Local<FunctionTemplate> NewWithCache( 5139c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Isolate* isolate, FunctionCallback callback, 5140c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Local<Private> cache_property, Local<Value> data = Local<Value>(), 5141c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Local<Signature> signature = Local<Signature>(), int length = 0); 5142c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 5143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** Returns the unique function instance in the current execution context.*/ 5144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", Local<Function> GetFunction()); 5145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Function> GetFunction( 5146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context); 5147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 5149f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * Similar to Context::NewRemoteContext, this creates an instance that 5150f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * isn't backed by an actual object. 5151f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * 5152f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * The InstanceTemplate of this FunctionTemplate must have access checks with 5153f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * handlers installed. 5154f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch */ 5155f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Object> NewRemoteInstance(); 5156f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 5157f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch /** 5158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Set the call-handler callback for a FunctionTemplate. This 5159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * callback is called whenever the function created from this 5160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * FunctionTemplate is called. 5161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 5162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetCallHandler( 5163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FunctionCallback callback, Local<Value> data = Local<Value>(), 5164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch experimental::FastAccessorBuilder* fast_handler = nullptr); 5165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** Set the predefined length property for the FunctionTemplate. */ 5167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetLength(int length); 5168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** Get the InstanceTemplate. */ 5170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Local<ObjectTemplate> InstanceTemplate(); 5171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 517262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch /** 517362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Causes the function template to inherit from a parent function template. 517462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * This means the the function's prototype.__proto__ is set to the parent 517562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * function's prototype. 517662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch **/ 5177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void Inherit(Local<FunctionTemplate> parent); 5178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 5180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * A PrototypeTemplate is the template used to create the prototype object 5181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * of the function created by this template. 5182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 5183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Local<ObjectTemplate> PrototypeTemplate(); 5184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 518662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * A PrototypeProviderTemplate is another function template whose prototype 518762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * property is used for this template. This is mutually exclusive with setting 518862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * a prototype template indirectly by calling PrototypeTemplate() or using 518962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Inherit(). 519062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch **/ 519162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void SetPrototypeProviderTemplate(Local<FunctionTemplate> prototype_provider); 519262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 519362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch /** 5194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Set the class name of the FunctionTemplate. This is used for 5195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * printing objects created with the function created from the 5196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * FunctionTemplate as its constructor. 5197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 5198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetClassName(Local<String> name); 5199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 5202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * When set to true, no access check will be performed on the receiver of a 5203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * function call. Currently defaults to true, but this is subject to change. 5204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 5205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetAcceptAnyReceiver(bool value); 5206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 5208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Determines whether the __proto__ accessor ignores instances of 5209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * the function template. If instances of the function template are 5210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * ignored, __proto__ skips all instances and instead returns the 5211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * next object in the prototype chain. 5212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Call with a value of true to make the __proto__ accessor ignore 5214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * instances of the function template. Call with a value of false 5215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * to make the __proto__ accessor not ignore instances of the 5216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * function template. By default, instances of a function template 5217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * are not ignored. 5218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 5219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void SetHiddenPrototype(bool value); 5220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 522269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch * Sets the ReadOnly flag in the attributes of the 'prototype' property 522369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch * of functions created from this FunctionTemplate to true. 52243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch */ 522569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch void ReadOnlyPrototype(); 52263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 52273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch /** 5228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Removes the prototype property from functions created from this 5229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * FunctionTemplate. 5230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 5231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void RemovePrototype(); 5232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 5234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns true if the given object is an instance of this function 5235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * template. 5236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 5237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool HasInstance(Local<Value> object); 5238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 5240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block FunctionTemplate(); 5241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block friend class Context; 5242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block friend class ObjectTemplate; 5243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 5244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5245f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch/** 5246f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Configuration flags for v8::NamedPropertyHandlerConfiguration or 5247f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * v8::IndexedPropertyHandlerConfiguration. 5248f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 5249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum class PropertyHandlerFlags { 5250f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** 5251f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * None. 5252f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 5253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kNone = 0, 5254f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 5255f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** 5256f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * See ALL_CAN_READ above. 5257f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 5258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kAllCanRead = 1, 5259f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 5260f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** Will not call into interceptor for properties on the receiver or prototype 5261f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * chain, i.e., only call into interceptor for properties that do not exist. 5262f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Currently only valid for named interceptors. 5263f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 5264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kNonMasking = 1 << 1, 5265f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 5266f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** 5267f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Will not call into interceptor for symbol lookup. Only meaningful for 5268f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * named interceptors. 5269f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 5270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kOnlyInterceptStrings = 1 << 2, 5271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 5272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct NamedPropertyHandlerConfiguration { 5274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier NamedPropertyHandlerConfiguration( 5275f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** Note: getter is required */ 5276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier GenericNamedPropertyGetterCallback getter = 0, 5277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier GenericNamedPropertySetterCallback setter = 0, 5278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier GenericNamedPropertyQueryCallback query = 0, 5279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier GenericNamedPropertyDeleterCallback deleter = 0, 5280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier GenericNamedPropertyEnumeratorCallback enumerator = 0, 5281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> data = Local<Value>(), 5282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier PropertyHandlerFlags flags = PropertyHandlerFlags::kNone) 5283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier : getter(getter), 5284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier setter(setter), 5285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier query(query), 5286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier deleter(deleter), 5287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier enumerator(enumerator), 5288f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch definer(0), 5289f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch descriptor(0), 5290f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch data(data), 5291f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch flags(flags) {} 5292f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 5293f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch NamedPropertyHandlerConfiguration( 5294f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch GenericNamedPropertyGetterCallback getter, 5295f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch GenericNamedPropertySetterCallback setter, 5296f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch GenericNamedPropertyDescriptorCallback descriptor, 5297f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch GenericNamedPropertyDeleterCallback deleter, 5298f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch GenericNamedPropertyEnumeratorCallback enumerator, 5299f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch GenericNamedPropertyDefinerCallback definer, 5300f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Local<Value> data = Local<Value>(), 5301f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch PropertyHandlerFlags flags = PropertyHandlerFlags::kNone) 5302f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch : getter(getter), 5303f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch setter(setter), 5304f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch query(0), 5305f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch deleter(deleter), 5306f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch enumerator(enumerator), 5307f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch definer(definer), 5308f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch descriptor(descriptor), 5309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier data(data), 5310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier flags(flags) {} 5311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier GenericNamedPropertyGetterCallback getter; 5313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier GenericNamedPropertySetterCallback setter; 5314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier GenericNamedPropertyQueryCallback query; 5315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier GenericNamedPropertyDeleterCallback deleter; 5316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier GenericNamedPropertyEnumeratorCallback enumerator; 5317f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch GenericNamedPropertyDefinerCallback definer; 5318f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch GenericNamedPropertyDescriptorCallback descriptor; 5319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> data; 5320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier PropertyHandlerFlags flags; 5321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 5322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct IndexedPropertyHandlerConfiguration { 5325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier IndexedPropertyHandlerConfiguration( 5326f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** Note: getter is required */ 5327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier IndexedPropertyGetterCallback getter = 0, 5328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier IndexedPropertySetterCallback setter = 0, 5329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier IndexedPropertyQueryCallback query = 0, 5330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier IndexedPropertyDeleterCallback deleter = 0, 5331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier IndexedPropertyEnumeratorCallback enumerator = 0, 5332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> data = Local<Value>(), 5333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier PropertyHandlerFlags flags = PropertyHandlerFlags::kNone) 5334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier : getter(getter), 5335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier setter(setter), 5336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier query(query), 5337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier deleter(deleter), 5338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier enumerator(enumerator), 5339f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch definer(0), 5340f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch descriptor(0), 5341f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch data(data), 5342f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch flags(flags) {} 5343f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 5344f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch IndexedPropertyHandlerConfiguration( 5345f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch IndexedPropertyGetterCallback getter, 5346f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch IndexedPropertySetterCallback setter, 5347f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch IndexedPropertyDescriptorCallback descriptor, 5348f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch IndexedPropertyDeleterCallback deleter, 5349f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch IndexedPropertyEnumeratorCallback enumerator, 5350f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch IndexedPropertyDefinerCallback definer, 5351f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Local<Value> data = Local<Value>(), 5352f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch PropertyHandlerFlags flags = PropertyHandlerFlags::kNone) 5353f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch : getter(getter), 5354f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch setter(setter), 5355f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch query(0), 5356f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch deleter(deleter), 5357f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch enumerator(enumerator), 5358f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch definer(definer), 5359f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch descriptor(descriptor), 5360958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier data(data), 5361958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier flags(flags) {} 5362958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5363958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier IndexedPropertyGetterCallback getter; 5364958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier IndexedPropertySetterCallback setter; 5365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier IndexedPropertyQueryCallback query; 5366958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier IndexedPropertyDeleterCallback deleter; 5367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier IndexedPropertyEnumeratorCallback enumerator; 5368f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch IndexedPropertyDefinerCallback definer; 5369f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch IndexedPropertyDescriptorCallback descriptor; 5370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> data; 5371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier PropertyHandlerFlags flags; 5372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 5373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 5376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * An ObjectTemplate is used to create objects at runtime. 5377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Properties added to an ObjectTemplate are added to each object 5379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * created from the ObjectTemplate. 5380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 5381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT ObjectTemplate : public Template { 5382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 5383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** Creates an ObjectTemplate. */ 5384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<ObjectTemplate> New( 5385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, 5386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<FunctionTemplate> constructor = Local<FunctionTemplate>()); 5387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_DEPRECATED("Use isolate version", Local<ObjectTemplate> New()); 5388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 538913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch /** Get a template included in the snapshot by index. */ 5390f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static MaybeLocal<ObjectTemplate> FromSnapshot(Isolate* isolate, 5391f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch size_t index); 539213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 5393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** Creates a new instance of this template.*/ 5394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version", Local<Object> NewInstance()); 5395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Object> NewInstance(Local<Context> context); 5396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 5398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Sets an accessor on the object template. 5399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Whenever the property with the given name is accessed on objects 5401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * created from this ObjectTemplate the getter and setter callbacks 5402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * are called instead of getting and setting the property directly 5403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * on the JavaScript object. 5404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \param name The name of the property for which an accessor is added. 5406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \param getter The callback to invoke when getting the property. 5407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \param setter The callback to invoke when setting the property. 5408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \param data A piece of data that will be passed to the getter and setter 5409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * callbacks whenever they are invoked. 5410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \param settings Access control settings for the accessor. This is a bit 5411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * field consisting of one of more of 5412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * DEFAULT = 0, ALL_CAN_READ = 1, or ALL_CAN_WRITE = 2. 5413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * The default is to not allow cross-context access. 5414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * ALL_CAN_READ means that all cross-context reads are allowed. 5415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * ALL_CAN_WRITE means that all cross-context writes are allowed. 5416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * The combination ALL_CAN_READ | ALL_CAN_WRITE can be used to allow all 5417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * cross-context access. 5418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \param attribute The attributes of the property for which an accessor 5419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * is added. 5420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \param signature The signature describes valid receivers for the accessor 5421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * and is used to perform implicit instance checks against them. If the 5422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * receiver is incompatible (i.e. is not an instance of the constructor as 5423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * defined by FunctionTemplate::HasInstance()), an implicit TypeError is 5424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * thrown and no callback is invoked. 5425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 5426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetAccessor( 5427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<String> name, AccessorGetterCallback getter, 5428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AccessorSetterCallback setter = 0, Local<Value> data = Local<Value>(), 5429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AccessControl settings = DEFAULT, PropertyAttribute attribute = None, 5430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<AccessorSignature> signature = Local<AccessorSignature>()); 5431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetAccessor( 5432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Name> name, AccessorNameGetterCallback getter, 5433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AccessorNameSetterCallback setter = 0, Local<Value> data = Local<Value>(), 5434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AccessControl settings = DEFAULT, PropertyAttribute attribute = None, 5435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<AccessorSignature> signature = Local<AccessorSignature>()); 5436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 5438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Sets a named property handler on the object template. 5439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Whenever a property whose name is a string is accessed on objects created 5441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * from this object template, the provided callback is invoked instead of 5442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * accessing the property directly on the JavaScript object. 5443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5444f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * SetNamedPropertyHandler() is different from SetHandler(), in 5445f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * that the latter can intercept symbol-named properties as well as 5446f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * string-named properties when called with a 5447f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * NamedPropertyHandlerConfiguration. New code should use SetHandler(). 5448958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * 5449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \param getter The callback to invoke when getting a property. 5450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \param setter The callback to invoke when setting a property. 54519dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen * \param query The callback to invoke to check if a property is present, 54529dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen * and if present, get its attributes. 5453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \param deleter The callback to invoke when deleting a property. 5454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \param enumerator The callback to invoke to enumerate all the named 5455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * properties of an object. 5456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \param data A piece of data that will be passed to the callbacks 5457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * whenever they are invoked. 5458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 5459958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // TODO(dcarney): deprecate 5460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetNamedPropertyHandler(NamedPropertyGetterCallback getter, 5461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch NamedPropertySetterCallback setter = 0, 5462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch NamedPropertyQueryCallback query = 0, 5463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch NamedPropertyDeleterCallback deleter = 0, 5464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch NamedPropertyEnumeratorCallback enumerator = 0, 5465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> data = Local<Value>()); 5466f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 5467f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch /** 5468f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * Sets a named property handler on the object template. 5469f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * 5470f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * Whenever a property whose name is a string or a symbol is accessed on 5471f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * objects created from this object template, the provided callback is 5472f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * invoked instead of accessing the property directly on the JavaScript 5473f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * object. 5474f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * 5475f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * @param configuration The NamedPropertyHandlerConfiguration that defines the 5476f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * callbacks to invoke when accessing a property. 5477f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch */ 5478958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void SetHandler(const NamedPropertyHandlerConfiguration& configuration); 5479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 5481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Sets an indexed property handler on the object template. 5482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Whenever an indexed property is accessed on objects created from 5484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * this object template, the provided callback is invoked instead of 5485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * accessing the property directly on the JavaScript object. 5486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \param getter The callback to invoke when getting a property. 5488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \param setter The callback to invoke when setting a property. 5489257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * \param query The callback to invoke to check if an object has a property. 5490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \param deleter The callback to invoke when deleting a property. 5491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \param enumerator The callback to invoke to enumerate all the indexed 5492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * properties of an object. 5493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \param data A piece of data that will be passed to the callbacks 5494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * whenever they are invoked. 5495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 5496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // TODO(dcarney): deprecate 5497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetIndexedPropertyHandler( 5498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IndexedPropertyGetterCallback getter, 5499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IndexedPropertySetterCallback setter = 0, 5500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IndexedPropertyQueryCallback query = 0, 5501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IndexedPropertyDeleterCallback deleter = 0, 5502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IndexedPropertyEnumeratorCallback enumerator = 0, 5503014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> data = Local<Value>()) { 5504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier SetHandler(IndexedPropertyHandlerConfiguration(getter, setter, query, 5505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier deleter, enumerator, data)); 5506958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5507f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 5508f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch /** 5509f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * Sets an indexed property handler on the object template. 5510f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * 5511f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * Whenever an indexed property is accessed on objects created from 5512f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * this object template, the provided callback is invoked instead of 5513f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * accessing the property directly on the JavaScript object. 5514f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * 5515f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * @param configuration The IndexedPropertyHandlerConfiguration that defines 5516f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * the callbacks to invoke when accessing a property. 5517f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch */ 5518f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void SetHandler(const IndexedPropertyHandlerConfiguration& configuration); 5519f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 5520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 5521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Sets the callback to be used when calling instances created from 5522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * this template as a function. If no callback is set, instances 5523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * behave like normal JavaScript objects that cannot be called as a 5524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * function. 5525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 5526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetCallAsFunctionHandler(FunctionCallback callback, 5527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> data = Local<Value>()); 5528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 5530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Mark object instances of the template as undetectable. 5531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * In many ways, undetectable objects behave as though they are not 5533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * there. They behave like 'undefined' in conditionals and when 5534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * printed. However, properties can be accessed and called as on 5535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * normal objects. 5536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 5537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void MarkAsUndetectable(); 5538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 5540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Sets access check callback on the object template and enables access 5541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * checks. 5542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * When accessing properties on instances of this object template, 5544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * the access check callback will be called to determine whether or 5545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * not to allow cross-context access to the properties. 5546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 5547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetAccessCheckCallback(AccessCheckCallback callback, 5548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> data = Local<Value>()); 5549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 555013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch /** 555113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * Like SetAccessCheckCallback but invokes an interceptor on failed access 555213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * checks instead of looking up all-can-read properties. You can only use 555313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * either this method or SetAccessCheckCallback, but not both at the same 555413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * time. 555513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch */ 555613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch void SetAccessCheckCallbackAndHandler( 555713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch AccessCheckCallback callback, 555813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch const NamedPropertyHandlerConfiguration& named_handler, 555913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch const IndexedPropertyHandlerConfiguration& indexed_handler, 556013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Local<Value> data = Local<Value>()); 5561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 5563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Gets the number of internal fields for objects generated from 5564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * this template. 5565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 5566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int InternalFieldCount(); 5567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 5569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Sets the number of internal fields for objects generated from 5570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * this template. 5571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 5572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void SetInternalFieldCount(int value); 5573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5574f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch /** 5575f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * Returns true if the object will be an immutable prototype exotic object. 5576f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch */ 5577f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool IsImmutableProto(); 5578f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 5579f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch /** 5580f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * Makes the ObjectTempate for an immutable prototype exotic object, with an 5581f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * immutable __proto__. 5582f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch */ 5583f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void SetImmutableProto(); 5584f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 5585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 5586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ObjectTemplate(); 5587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Local<ObjectTemplate> New(internal::Isolate* isolate, 5588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<FunctionTemplate> constructor); 5589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block friend class FunctionTemplate; 5590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 5591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 5594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * A Signature specifies which receiver is valid for a function. 5595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 5596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Signature : public Data { 5597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 5598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Signature> New( 5599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, 5600014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<FunctionTemplate> receiver = Local<FunctionTemplate>()); 5601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 5603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Signature(); 5604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 5605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 5608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * An AccessorSignature specifies which receivers are valid parameters 5609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * to an accessor callback. 5610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 5611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT AccessorSignature : public Data { 5612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 5613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<AccessorSignature> New( 5614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate, 5615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<FunctionTemplate> receiver = Local<FunctionTemplate>()); 5616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 5618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AccessorSignature(); 5619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 5620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5622257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// --- Extensions --- 5623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT ExternalOneByteStringResourceImpl 5625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : public String::ExternalOneByteStringResource { 56263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 5627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalOneByteStringResourceImpl() : data_(0), length_(0) {} 5628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalOneByteStringResourceImpl(const char* data, size_t length) 56293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : data_(data), length_(length) {} 56303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch const char* data() const { return data_; } 56313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch size_t length() const { return length_; } 56323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 56333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 56343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch const char* data_; 56353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch size_t length_; 56363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 5637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 5639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Ignore 5640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 5641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Extension { // NOLINT 5642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 56433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Note that the strings passed into this constructor must live as long 56443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // as the Extension itself. 5645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Extension(const char* name, 5646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const char* source = 0, 5647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int dep_count = 0, 56483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch const char** deps = 0, 56493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int source_length = -1); 5650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual ~Extension() { } 565162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch virtual Local<FunctionTemplate> GetNativeFunctionTemplate( 565262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate* isolate, Local<String> name) { 565362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return Local<FunctionTemplate>(); 5654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 5655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 56563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch const char* name() const { return name_; } 56573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch size_t source_length() const { return source_length_; } 5658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const String::ExternalOneByteStringResource* source() const { 56593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return &source_; } 5660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int dependency_count() { return dep_count_; } 5661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const char** dependencies() { return deps_; } 5662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void set_auto_enable(bool value) { auto_enable_ = value; } 5663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool auto_enable() { return auto_enable_; } 5664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5665f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Disallow copying and assigning. 5666f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Extension(const Extension&) = delete; 5667f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void operator=(const Extension&) = delete; 5668f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 5669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 5670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const char* name_; 56713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch size_t source_length_; // expected to initialize before source_ 5672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalOneByteStringResourceImpl source_; 5673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int dep_count_; 5674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const char** deps_; 5675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool auto_enable_; 5676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 5677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid V8_EXPORT RegisterExtension(Extension* extension); 5680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5682257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// --- Statics --- 5683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochV8_INLINE Local<Primitive> Undefined(Isolate* isolate); 5685014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochV8_INLINE Local<Primitive> Null(Isolate* isolate); 5686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochV8_INLINE Local<Boolean> True(Isolate* isolate); 5687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochV8_INLINE Local<Boolean> False(Isolate* isolate); 5688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 5690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * A set of constraints that specifies the limits of the runtime's memory use. 5691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * You must set the heap size before initializing the VM - the size cannot be 5692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * adjusted after the VM is initialized. 5693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 5694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * If you are using threads then you should hold the V8::Locker lock while 5695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * setting the stack limit and you must set a non-default stack limit separately 5696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * for each thread. 56973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * 56983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * The arguments for set_max_semi_space_size, set_max_old_space_size, 56993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * set_max_executable_size, set_code_range_size specify limits in MB. 5700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 5701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT ResourceConstraints { 5702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 5703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ResourceConstraints(); 5704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 5706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Configures the constraints with reasonable default values based on the 5707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * capabilities of the current device the VM is running on. 5708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 5709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \param physical_memory The total amount of physical memory on the current 5710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * device, in bytes. 5711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \param virtual_memory_limit The amount of virtual memory on the current 5712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * device, in bytes, or zero, if there is no limit. 5713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 5714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void ConfigureDefaults(uint64_t physical_memory, 5715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint64_t virtual_memory_limit); 5716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int max_semi_space_size() const { return max_semi_space_size_; } 57183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void set_max_semi_space_size(int limit_in_mb) { 57193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch max_semi_space_size_ = limit_in_mb; 57203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 5721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int max_old_space_size() const { return max_old_space_size_; } 57223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void set_max_old_space_size(int limit_in_mb) { 57233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch max_old_space_size_ = limit_in_mb; 57243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 5725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int max_executable_size() const { return max_executable_size_; } 57263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void set_max_executable_size(int limit_in_mb) { 57273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch max_executable_size_ = limit_in_mb; 57283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 5729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t* stack_limit() const { return stack_limit_; } 5730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Sets an address beyond which the VM's stack may not grow. 5731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void set_stack_limit(uint32_t* value) { stack_limit_ = value; } 5732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t code_range_size() const { return code_range_size_; } 57333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void set_code_range_size(size_t limit_in_mb) { 57343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch code_range_size_ = limit_in_mb; 5735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5736c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch size_t max_zone_pool_size() const { return max_zone_pool_size_; } 5737c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch void set_max_zone_pool_size(const size_t bytes) { 5738c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch max_zone_pool_size_ = bytes; 5739c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 5740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 5742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int max_semi_space_size_; 5743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int max_old_space_size_; 574490bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner int max_executable_size_; 5745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t* stack_limit_; 5746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t code_range_size_; 5747c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch size_t max_zone_pool_size_; 5748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 5749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5751257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// --- Exceptions --- 5752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktypedef void (*FatalErrorCallback)(const char* location, const char* message); 5755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5756f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtypedef void (*OOMErrorCallback)(const char* location, bool is_heap_oom); 5757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 575862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtypedef void (*MessageCallback)(Local<Message> message, Local<Value> data); 5759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// --- Tracing --- 5761a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef void (*LogEventCallback)(const char* name, int event); 5763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5764a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 5765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Create new error objects by calling the corresponding error object 5766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * constructor with the message. 5767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 5768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Exception { 5769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 5770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Value> RangeError(Local<String> message); 5771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Value> ReferenceError(Local<String> message); 5772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Value> SyntaxError(Local<String> message); 5773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Value> TypeError(Local<String> message); 5774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Value> Error(Local<String> message); 5775958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5776958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 5777958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Creates an error message for the given exception. 5778958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Will try to reconstruct the original stack trace from the exception value, 5779958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * or capture the current stack trace if not available. 5780958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 5781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Message> CreateMessage(Isolate* isolate, Local<Value> exception); 5782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use version with an Isolate*", 5783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<Message> CreateMessage(Local<Value> exception)); 5784958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5785958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 5786958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Returns the original stack trace that was captured at the creation time 5787958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * of a given exception, or an empty handle if not available. 5788958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 5789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Local<StackTrace> GetStackTrace(Local<Value> exception); 5790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 5791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5793257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// --- Counters Callbacks --- 5794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktypedef int* (*CounterLookupCallback)(const char* name); 5796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktypedef void* (*CreateHistogramCallback)(const char* name, 5798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int min, 5799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int max, 5800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block size_t buckets); 5801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktypedef void (*AddHistogramSampleCallback)(void* histogram, int sample); 5803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5804257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// --- Memory Allocation Callback --- 5805958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierenum ObjectSpace { 5806958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier kObjectSpaceNewSpace = 1 << 0, 5807014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kObjectSpaceOldSpace = 1 << 1, 5808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kObjectSpaceCodeSpace = 1 << 2, 5809014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kObjectSpaceMapSpace = 1 << 3, 5810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kObjectSpaceLoSpace = 1 << 4, 5811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kObjectSpaceAll = kObjectSpaceNewSpace | kObjectSpaceOldSpace | 5812014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kObjectSpaceCodeSpace | kObjectSpaceMapSpace | 5813014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kObjectSpaceLoSpace 5814958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 58159ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick 58169ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick enum AllocationAction { 58179ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick kAllocationActionAllocate = 1 << 0, 58189ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick kAllocationActionFree = 1 << 1, 58199ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick kAllocationActionAll = kAllocationActionAllocate | kAllocationActionFree 58209ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick }; 58219ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick 5822109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// --- Enter/Leave Script Callback --- 5823109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochtypedef void (*BeforeCallEnteredCallback)(Isolate*); 5824109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochtypedef void (*CallCompletedCallback)(Isolate*); 5825109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochtypedef void (*DeprecatedCallCompletedCallback)(); 58263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 582762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch/** 582862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * PromiseHook with type kInit is called when a new promise is 582962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * created. When a new promise is created as part of the chain in the 583062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * case of Promise.then or in the intermediate promises created by 583162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Promise.{race, all}/AsyncFunctionAwait, we pass the parent promise 583262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * otherwise we pass undefined. 583362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * 583462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * PromiseHook with type kResolve is called at the beginning of 583562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * resolve or reject function defined by CreateResolvingFunctions. 583662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * 583762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * PromiseHook with type kBefore is called at the beginning of the 583862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * PromiseReactionJob. 583962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * 584062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * PromiseHook with type kAfter is called right at the end of the 584162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * PromiseReactionJob. 584262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch */ 584362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochenum class PromiseHookType { kInit, kResolve, kBefore, kAfter }; 584462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 584562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtypedef void (*PromiseHook)(PromiseHookType type, Local<Promise> promise, 584662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Local<Value> parent); 584762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 5848958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// --- Promise Reject Callback --- 5849958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierenum PromiseRejectEvent { 5850958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier kPromiseRejectWithNoHandler = 0, 5851958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier kPromiseHandlerAddedAfterReject = 1 5852958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 5853958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5854958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass PromiseRejectMessage { 5855958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 5856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PromiseRejectMessage(Local<Promise> promise, PromiseRejectEvent event, 5857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> value, Local<StackTrace> stack_trace) 5858958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier : promise_(promise), 5859958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier event_(event), 5860958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier value_(value), 5861958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stack_trace_(stack_trace) {} 5862958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5863014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE Local<Promise> GetPromise() const { return promise_; } 5864958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V8_INLINE PromiseRejectEvent GetEvent() const { return event_; } 5865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE Local<Value> GetValue() const { return value_; } 5866958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use v8::Exception::CreateMessage(GetValue())->GetStackTrace()", 5868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE Local<StackTrace> GetStackTrace() const) { 5869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return stack_trace_; 5870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5871958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5872958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 5873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Promise> promise_; 5874958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier PromiseRejectEvent event_; 5875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> value_; 5876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<StackTrace> stack_trace_; 5877958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 5878958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5879958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertypedef void (*PromiseRejectCallback)(PromiseRejectMessage message); 5880958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 58813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// --- Microtasks Callbacks --- 58823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochtypedef void (*MicrotasksCompletedCallback)(Isolate*); 5883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef void (*MicrotaskCallback)(void* data); 5884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 58853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 58863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch/** 58873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * Policy for running microtasks: 58883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * - explicit: microtasks are invoked with Isolate::RunMicrotasks() method; 58893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * - scoped: microtasks invocation is controlled by MicrotasksScope objects; 58903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * - auto: microtasks are invoked when the script call depth decrements 58913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * to zero. 58923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch */ 58933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochenum class MicrotasksPolicy { kExplicit, kScoped, kAuto }; 58943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 58953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 58963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch/** 58973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * This scope is used to control microtasks when kScopeMicrotasksInvocation 58983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * is used on Isolate. In this mode every non-primitive call to V8 should be 58993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * done inside some MicrotasksScope. 59003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * Microtasks are executed when topmost MicrotasksScope marked as kRunMicrotasks 59013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * exits. 59023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * kDoNotRunMicrotasks should be used to annotate calls not intended to trigger 59033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * microtasks. 59043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch */ 59053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochclass V8_EXPORT MicrotasksScope { 59063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch public: 59073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch enum Type { kRunMicrotasks, kDoNotRunMicrotasks }; 59083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 59093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MicrotasksScope(Isolate* isolate, Type type); 59103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch ~MicrotasksScope(); 59113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 59123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch /** 59133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * Runs microtasks if no kRunMicrotasks scope is currently active. 59143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch */ 59153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static void PerformCheckpoint(Isolate* isolate); 59163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 59173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch /** 59183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * Returns current depth of nested kRunMicrotasks scopes. 59193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch */ 59203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static int GetCurrentDepth(Isolate* isolate); 59213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 5922bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch /** 5923bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * Returns true while microtasks are being executed. 5924bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch */ 5925bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static bool IsRunningMicrotasks(Isolate* isolate); 5926bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 5927f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Prevent copying. 5928f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch MicrotasksScope(const MicrotasksScope&) = delete; 5929f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch MicrotasksScope& operator=(const MicrotasksScope&) = delete; 5930f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 59313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch private: 59323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch internal::Isolate* const isolate_; 59333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bool run_; 59343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}; 59353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 59363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 5937257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// --- Failed Access Check Callback --- 5938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktypedef void (*FailedAccessCheckCallback)(Local<Object> target, 5939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block AccessType type, 5940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Local<Value> data); 5941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5942257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// --- AllowCodeGenerationFromStrings callbacks --- 5943257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 5944257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch/** 5945257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * Callback to check if code generation from strings is allowed. See 5946257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * Context::AllowCodeGenerationFromStrings. 5947257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch */ 5948257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochtypedef bool (*AllowCodeGenerationFromStringsCallback)(Local<Context> context); 5949257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 595062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// --- WASM compilation callbacks --- 595162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 595262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch/** 595362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Callback to check if a buffer source may be compiled to WASM, given 595462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * the compilation is attempted as a promise or not. 595562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch */ 595662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 595762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtypedef bool (*AllowWasmCompileCallback)(Isolate* isolate, Local<Value> source, 595862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool as_promise); 595962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 596062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtypedef bool (*AllowWasmInstantiateCallback)(Isolate* isolate, 596162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Local<Value> module_or_bytes, 596262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MaybeLocal<Value> ffi, 596362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool as_promise); 596462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 5965257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// --- Garbage Collection Callbacks --- 5966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 5968014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Applications can register callback functions which will be called before and 5969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * after certain garbage collection operations. Allocations are not allowed in 5970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * the callback functions, you therefore cannot manipulate objects (set or 5971014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * delete properties for example) since it is possible such operations will 5972014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * result in the allocation of objects. 5973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 59746ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockenum GCType { 59756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block kGCTypeScavenge = 1 << 0, 59766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block kGCTypeMarkSweepCompact = 1 << 1, 5977014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kGCTypeIncrementalMarking = 1 << 2, 5978014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kGCTypeProcessWeakCallbacks = 1 << 3, 5979014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kGCTypeAll = kGCTypeScavenge | kGCTypeMarkSweepCompact | 5980014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kGCTypeIncrementalMarking | kGCTypeProcessWeakCallbacks 59816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 59826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 5983109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch/** 5984109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch * GCCallbackFlags is used to notify additional information about the GC 5985109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch * callback. 5986109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch * - kGCCallbackFlagConstructRetainedObjectInfos: The GC callback is for 5987109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch * constructing retained object infos. 5988109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch * - kGCCallbackFlagForced: The GC callback is for a forced GC for testing. 5989109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch * - kGCCallbackFlagSynchronousPhantomCallbackProcessing: The GC callback 5990109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch * is called synchronously without getting posted to an idle task. 5991109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch * - kGCCallbackFlagCollectAllAvailableGarbage: The GC callback is called 5992109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch * in a phase where V8 is trying to collect all available garbage 5993109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch * (e.g., handling a low memory notification). 5994109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch */ 59956ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockenum GCCallbackFlags { 59966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block kNoGCCallbackFlags = 0, 5997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kGCCallbackFlagConstructRetainedObjectInfos = 1 << 1, 5998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kGCCallbackFlagForced = 1 << 2, 5999109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch kGCCallbackFlagSynchronousPhantomCallbackProcessing = 1 << 3, 6000109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch kGCCallbackFlagCollectAllAvailableGarbage = 1 << 4, 6001f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kGCCallbackFlagCollectAllExternalMemory = 1 << 5, 60026ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 60036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 6004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtypedef void (*GCCallback)(GCType type, GCCallbackFlags flags); 60056ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 6006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef void (*InterruptCallback)(Isolate* isolate, void* data); 6007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6008a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 60103ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block * Collection of V8 heap information. 60113ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block * 60123ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block * Instances of this class can be passed to v8::V8::HeapStatistics to 60133ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block * get heap statistics from V8. 60143ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block */ 6015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT HeapStatistics { 60163ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block public: 60173ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block HeapStatistics(); 60183ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block size_t total_heap_size() { return total_heap_size_; } 601990bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner size_t total_heap_size_executable() { return total_heap_size_executable_; } 6020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t total_physical_size() { return total_physical_size_; } 6021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t total_available_size() { return total_available_size_; } 60223ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block size_t used_heap_size() { return used_heap_size_; } 6023b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch size_t heap_size_limit() { return heap_size_limit_; } 60243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch size_t malloced_memory() { return malloced_memory_; } 6025f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch size_t peak_malloced_memory() { return peak_malloced_memory_; } 6026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t does_zap_garbage() { return does_zap_garbage_; } 60273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 60283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block private: 60293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block size_t total_heap_size_; 603090bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner size_t total_heap_size_executable_; 6031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t total_physical_size_; 6032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t total_available_size_; 60333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block size_t used_heap_size_; 6034b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch size_t heap_size_limit_; 60353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch size_t malloced_memory_; 6036f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch size_t peak_malloced_memory_; 6037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool does_zap_garbage_; 60383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 60393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block friend class V8; 6040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class Isolate; 60413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}; 60423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 60433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 6044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass V8_EXPORT HeapSpaceStatistics { 6045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 6046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HeapSpaceStatistics(); 6047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const char* space_name() { return space_name_; } 6048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t space_size() { return space_size_; } 6049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t space_used_size() { return space_used_size_; } 6050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t space_available_size() { return space_available_size_; } 6051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t physical_space_size() { return physical_space_size_; } 6052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 6054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const char* space_name_; 6055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t space_size_; 6056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t space_used_size_; 6057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t space_available_size_; 6058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t physical_space_size_; 6059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend class Isolate; 6061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 6062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass V8_EXPORT HeapObjectStatistics { 6065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 6066014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HeapObjectStatistics(); 6067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const char* object_type() { return object_type_; } 6068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const char* object_sub_type() { return object_sub_type_; } 6069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t object_count() { return object_count_; } 6070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t object_size() { return object_size_; } 6071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6072014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 6073014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const char* object_type_; 6074014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const char* object_sub_type_; 6075014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t object_count_; 6076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t object_size_; 6077014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6078014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend class Isolate; 6079014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 6080014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 608113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochclass V8_EXPORT HeapCodeStatistics { 608213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch public: 608313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch HeapCodeStatistics(); 608413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch size_t code_and_metadata_size() { return code_and_metadata_size_; } 608513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch size_t bytecode_and_metadata_size() { return bytecode_and_metadata_size_; } 608613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 608713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch private: 608813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch size_t code_and_metadata_size_; 608913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch size_t bytecode_and_metadata_size_; 609013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 609113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch friend class Isolate; 609213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}; 6093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 609444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass RetainedObjectInfo; 609544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 6096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 6098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * FunctionEntryHook is the type of the profile entry hook called at entry to 6099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * any generated function when function-level profiling is enabled. 6100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 6101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \param function the address of the function that's being entered. 6102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \param return_addr_location points to a location on stack where the machine 6103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * return address resides. This can be used to identify the caller of 6104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \p function, and/or modified to divert execution when \p function exits. 6105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 6106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \note the entry hook must not cause garbage collection. 6107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef void (*FunctionEntryHook)(uintptr_t function, 6109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t return_addr_location); 6110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 6112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A JIT code event is issued each time code is added, moved or removed. 6113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 6114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \note removal events are not currently issued. 6115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct JitCodeEvent { 6117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum EventType { 6118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CODE_ADDED, 6119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CODE_MOVED, 6120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CODE_REMOVED, 6121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CODE_ADD_LINE_POS_INFO, 6122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CODE_START_LINE_INFO_RECORDING, 6123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CODE_END_LINE_INFO_RECORDING 6124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 6125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Definition of the code position type. The "POSITION" type means the place 6126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // in the source code which are of interest when making stack traces to 6127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // pin-point the source location of a stack frame as close as possible. 6128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The "STATEMENT_POSITION" means the place at the beginning of each 6129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // statement, and is used to indicate possible break locations. 6130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum PositionType { POSITION, STATEMENT_POSITION }; 6131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Type of event. 6133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EventType type; 6134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Start of the instructions. 6135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* code_start; 6136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Size of the instructions. 6137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t code_len; 6138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Script info for CODE_ADDED event. 6139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<UnboundScript> script; 6140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // User-defined data for *_LINE_INFO_* event. It's used to hold the source 6141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // code line information which is returned from the 6142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // CODE_START_LINE_INFO_RECORDING event. And it's passed to subsequent 6143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // CODE_ADD_LINE_POS_INFO and CODE_END_LINE_INFO_RECORDING events. 6144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* user_data; 6145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch struct name_t { 6147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Name of the object associated with the code, note that the string is not 6148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // zero-terminated. 6149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* str; 6150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Number of chars in str. 6151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t len; 6152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 6153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch struct line_info_t { 6155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // PC offset 6156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t offset; 6157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Code postion 6158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t pos; 6159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The position type. 6160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PositionType position_type; 6161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 6162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch union { 6164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Only valid for CODE_ADDED. 6165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch struct name_t name; 6166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Only valid for CODE_ADD_LINE_POS_INFO 6168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch struct line_info_t line_info; 6169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // New location of instructions. Only valid for CODE_MOVED. 6171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* new_code_start; 6172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 6173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 6174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 617544f0eee88ff00398ff7f715fab053374d808c90dSteve Block/** 617613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * Option flags passed to the SetRAILMode function. 617713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * See documentation https://developers.google.com/web/tools/chrome-devtools/ 617813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * profile/evaluate-performance/rail 617913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch */ 618013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochenum RAILMode { 618113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Response performance mode: In this mode very low virtual machine latency 618213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // is provided. V8 will try to avoid JavaScript execution interruptions. 618313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Throughput may be throttled. 618413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch PERFORMANCE_RESPONSE, 618513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Animation performance mode: In this mode low virtual machine latency is 618613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // provided. V8 will try to avoid as many JavaScript execution interruptions 6187f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // as possible. Throughput may be throttled. This is the default mode. 618813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch PERFORMANCE_ANIMATION, 618913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Idle performance mode: The embedder is idle. V8 can complete deferred work 619013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // in this mode. 619113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch PERFORMANCE_IDLE, 619213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Load performance mode: In this mode high throughput is provided. V8 may 619313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // turn off latency optimizations. 619413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch PERFORMANCE_LOAD 619513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}; 619613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 619713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch/** 6198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Option flags passed to the SetJitCodeEventHandler function. 619944f0eee88ff00398ff7f715fab053374d808c90dSteve Block */ 6200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum JitCodeEventOptions { 6201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kJitCodeEventDefault = 0, 6202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Generate callbacks for already existent code. 6203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kJitCodeEventEnumExisting = 1 6204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 6205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 6208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Callback function passed to SetJitCodeEventHandler. 6209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 6210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \param event code add, move or removal event. 6211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef void (*JitCodeEventHandler)(const JitCodeEvent* event); 6213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 6216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Interface for iterating through all external resources in the heap. 6217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 6218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass V8_EXPORT ExternalResourceVisitor { // NOLINT 6219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 6220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier virtual ~ExternalResourceVisitor() {} 6221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch virtual void VisitExternalString(Local<String> string) {} 6222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 6223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 6224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 6225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier/** 6226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Interface for iterating through all the persistent handles in the heap. 6227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 6228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass V8_EXPORT PersistentHandleVisitor { // NOLINT 6229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 6230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier virtual ~PersistentHandleVisitor() {} 6231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier virtual void VisitPersistentHandle(Persistent<Value>* value, 6232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier uint16_t class_id) {} 6233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 6234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 62353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch/** 62363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * Memory pressure level for the MemoryPressureNotification. 62373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * kNone hints V8 that there is no memory pressure. 62383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * kModerate hints V8 to speed up incremental garbage collection at the cost of 62393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * of higher latency due to garbage collection pauses. 62403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * kCritical hints V8 to free memory as soon as possible. Garbage collection 62413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * pauses at this level will be large. 62423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch */ 62433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochenum class MemoryPressureLevel { kNone, kModerate, kCritical }; 62443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 62453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch/** 6246c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * Interface for tracing through the embedder heap. During a v8 garbage 62473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * collection, v8 collects hidden fields of all potential wrappers, and at the 62483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * end of its marking phase iterates the collection and asks the embedder to 6249c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * trace through its heap and use reporter to report each JavaScript object 6250c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * reachable from any of the given wrappers. 62513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * 6252bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * Before the first call to the TraceWrappersFrom function TracePrologue will be 6253bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * called. When the garbage collection cycle is finished, TraceEpilogue will be 6254bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * called. 62553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch */ 6256bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochclass V8_EXPORT EmbedderHeapTracer { 62573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch public: 625813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch enum ForceCompletionAction { FORCE_COMPLETION, DO_NOT_FORCE_COMPLETION }; 6259f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 626013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch struct AdvanceTracingActions { 626113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch explicit AdvanceTracingActions(ForceCompletionAction force_completion_) 626213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch : force_completion(force_completion_) {} 626313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 626413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch ForceCompletionAction force_completion; 626513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch }; 6266f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 626713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch /** 6268c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * Called by v8 to register internal fields of found wrappers. 6269c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * 6270c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * The embedder is expected to store them somewhere and trace reachable 6271c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * wrappers from them when called through |AdvanceTracing|. 627213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch */ 627313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch virtual void RegisterV8References( 627413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch const std::vector<std::pair<void*, void*> >& internal_fields) = 0; 6275f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 6276f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** 6277c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * Called at the beginning of a GC cycle. 62783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch */ 6279c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch virtual void TracePrologue() = 0; 6280f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 62813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch /** 6282c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * Called to to make a tracing step in the embedder. 6283c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * 6284c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * The embedder is expected to trace its heap starting from wrappers reported 6285c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * by RegisterV8References method, and report back all reachable wrappers. 6286c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * Furthermore, the embedder is expected to stop tracing by the given 6287c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * deadline. 628813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * 628913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * Returns true if there is still work to do. 62903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch */ 629113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch virtual bool AdvanceTracing(double deadline_in_ms, 629213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch AdvanceTracingActions actions) = 0; 6293f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 62943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch /** 6295c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * Called at the end of a GC cycle. 6296f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 6297f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Note that allocation is *not* allowed within |TraceEpilogue|. 62983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch */ 6299bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch virtual void TraceEpilogue() = 0; 63003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 630113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch /** 6302c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * Called upon entering the final marking pause. No more incremental marking 6303c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * steps will follow this call. 630413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch */ 6305c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch virtual void EnterFinalPause() = 0; 630613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 630713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch /** 6308c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * Called when tracing is aborted. 6309c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * 6310c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * The embedder is expected to throw away all intermediate data and reset to 6311c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch * the initial state. 631213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch */ 6313c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch virtual void AbortTracing() = 0; 631413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 6315f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch /** 6316f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Returns the number of wrappers that are still to be traced by the embedder. 6317f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 6318f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch virtual size_t NumberOfWrappersToTrace() { return 0; } 6319f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 63203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch protected: 63213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual ~EmbedderHeapTracer() = default; 63223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}; 6323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 6324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier/** 632562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Callback and supporting data used in SnapshotCreator to implement embedder 632662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * logic to serialize internal fields. 6327c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch */ 632862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochstruct SerializeInternalFieldsCallback { 632962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef StartupData (*CallbackFunction)(Local<Object> holder, int index, 633062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void* data); 633162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch SerializeInternalFieldsCallback(CallbackFunction function = nullptr, 633262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void* data_arg = nullptr) 633362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch : callback(function), data(data_arg) {} 633462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch CallbackFunction callback; 633562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void* data; 633662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 6337c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 6338c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch/** 633962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Callback and supporting data used to implement embedder logic to deserialize 634062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * internal fields. 6341c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch */ 634262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochstruct DeserializeInternalFieldsCallback { 634362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef void (*CallbackFunction)(Local<Object> holder, int index, 634462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch StartupData payload, void* data); 634562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DeserializeInternalFieldsCallback(CallbackFunction function = nullptr, 634662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void* data_arg = nullptr) 634762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch : callback(function), data(data_arg) {} 634862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void (*callback)(Local<Object> holder, int index, StartupData payload, 634962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void* data); 635062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void* data; 635162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 6352c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 6353c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch/** 6354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Isolate represents an isolated instance of the V8 engine. V8 isolates have 6355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * completely separate states. Objects from one isolate must not be used in 6356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * other isolates. The embedder can create multiple isolates and use them in 6357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * parallel in multiple threads. An isolate can be entered by at most one 6358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * thread at any given time. The Locker/Unlocker API must be used to 6359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * synchronize. 6360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Isolate { 636244f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 636344f0eee88ff00398ff7f715fab053374d808c90dSteve Block /** 6364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Initial configuration parameters for a new Isolate. 6365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch struct CreateParams { 6367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CreateParams() 636813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch : entry_hook(nullptr), 636913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch code_event_handler(nullptr), 637013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch snapshot_blob(nullptr), 637113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch counter_lookup_callback(nullptr), 637213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch create_histogram_callback(nullptr), 637313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch add_histogram_sample_callback(nullptr), 637413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch array_buffer_allocator(nullptr), 6375c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch external_references(nullptr), 637662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch allow_atomics_wait(true) {} 6377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * The optional entry_hook allows the host application to provide the 6380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * address of a function that's invoked on entry to every V8-generated 6381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * function. Note that entry_hook is invoked at the very start of each 638213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * generated function. Furthermore, if an entry_hook is given, V8 will 638313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * not use a snapshot, including custom snapshots. 6384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FunctionEntryHook entry_hook; 6386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Allows the host application to provide the address of a function that is 6389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * notified each time code is added, moved or removed. 6390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JitCodeEventHandler code_event_handler; 6392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * ResourceConstraints to use for the new Isolate. 6395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ResourceConstraints constraints; 6397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Explicitly specify a startup snapshot blob. The embedder owns the blob. 6400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 6401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StartupData* snapshot_blob; 6402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 6405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Enables the host application to provide a mechanism for recording 6406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * statistics counters. 6407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 6408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CounterLookupCallback counter_lookup_callback; 6409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 6411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Enables the host application to provide a mechanism for recording 6412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * histograms. The CreateHistogram function returns a 6413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * histogram which will later be passed to the AddHistogramSample 6414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * function. 6415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 6416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CreateHistogramCallback create_histogram_callback; 6417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AddHistogramSampleCallback add_histogram_sample_callback; 6418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 6420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * The ArrayBuffer::Allocator to use for allocating and freeing the backing 6421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * store of ArrayBuffers. 6422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ArrayBuffer::Allocator* array_buffer_allocator; 642413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 642513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch /** 642613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * Specifies an optional nullptr-terminated array of raw addresses in the 642713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * embedder that V8 can match against during serialization and use for 642813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * deserialization. This array and its content must stay valid for the 642913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * entire lifetime of the isolate. 643013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch */ 643113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch intptr_t* external_references; 6432c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 6433c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch /** 643462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Whether calling Atomics.wait (a function that may block) is allowed in 643562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * this isolate. 6436c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch */ 643762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool allow_atomics_wait; 6438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 6439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 644244f0eee88ff00398ff7f715fab053374d808c90dSteve Block * Stack-allocated class which sets the isolate for all operations 644344f0eee88ff00398ff7f715fab053374d808c90dSteve Block * executed within a local scope. 644444f0eee88ff00398ff7f715fab053374d808c90dSteve Block */ 6445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class V8_EXPORT Scope { 644644f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 644744f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit Scope(Isolate* isolate) : isolate_(isolate) { 644844f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate->Enter(); 644944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 645044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 645144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ~Scope() { isolate_->Exit(); } 645244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 6453f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Prevent copying of Scope objects. 6454f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Scope(const Scope&) = delete; 6455f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Scope& operator=(const Scope&) = delete; 6456f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 645744f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 645844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* const isolate_; 645944f0eee88ff00398ff7f715fab053374d808c90dSteve Block }; 646044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 6461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Assert that no Javascript code is invoked. 6464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class V8_EXPORT DisallowJavascriptExecutionScope { 6466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 6467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum OnFailure { CRASH_ON_FAILURE, THROW_ON_FAILURE }; 6468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowJavascriptExecutionScope(Isolate* isolate, OnFailure on_failure); 6470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ~DisallowJavascriptExecutionScope(); 6471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6472f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Prevent copying of Scope objects. 6473f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DisallowJavascriptExecutionScope(const DisallowJavascriptExecutionScope&) = 6474f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch delete; 6475f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DisallowJavascriptExecutionScope& operator=( 6476f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch const DisallowJavascriptExecutionScope&) = delete; 6477f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 6478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 6479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool on_failure_; 6480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* internal_; 6481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 6482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Introduce exception to DisallowJavascriptExecutionScope. 6486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class V8_EXPORT AllowJavascriptExecutionScope { 6488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 6489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit AllowJavascriptExecutionScope(Isolate* isolate); 6490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ~AllowJavascriptExecutionScope(); 6491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6492f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Prevent copying of Scope objects. 6493f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch AllowJavascriptExecutionScope(const AllowJavascriptExecutionScope&) = 6494f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch delete; 6495f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch AllowJavascriptExecutionScope& operator=( 6496f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch const AllowJavascriptExecutionScope&) = delete; 6497f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 6498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 6499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* internal_throws_; 6500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* internal_assert_; 6501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 6502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Do not run microtasks while this scope is active, even if microtasks are 6505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * automatically executed otherwise. 6506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class V8_EXPORT SuppressMicrotaskExecutionScope { 6508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 6509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit SuppressMicrotaskExecutionScope(Isolate* isolate); 6510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ~SuppressMicrotaskExecutionScope(); 6511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Prevent copying of Scope objects. 6513f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch SuppressMicrotaskExecutionScope(const SuppressMicrotaskExecutionScope&) = 6514f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch delete; 6515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SuppressMicrotaskExecutionScope& operator=( 6516f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch const SuppressMicrotaskExecutionScope&) = delete; 6517f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 6518f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch private: 6519f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch internal::Isolate* const isolate_; 6520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 6521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Types of garbage collections that can be requested via 6524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * RequestGarbageCollectionForTesting. 6525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum GarbageCollectionType { 6527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFullGarbageCollection, 6528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kMinorGarbageCollection 6529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 6530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Features reported via the SetUseCounterCallback callback. Do not change 6533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * assigned numbers of existing items; add new features to the end of this 6534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * list. 6535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum UseCounterFeature { 6537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kUseAsm = 0, 6538958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier kBreakIterator = 1, 6539014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kLegacyConst = 2, 6540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kMarkDequeOverflow = 3, 6541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kStoreBufferOverflow = 4, 6542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kSlotsBufferOverflow = 5, 6543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kObjectObserve = 6, 6544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kForcedGC = 7, 6545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kSloppyMode = 8, 6546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kStrictMode = 9, 6547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kStrongMode = 10, 6548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kRegExpPrototypeStickyGetter = 11, 6549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kRegExpPrototypeToString = 12, 6550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kRegExpPrototypeUnicodeGetter = 13, 6551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kIntlV8Parse = 14, 6552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kIntlPattern = 15, 6553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kIntlResolved = 16, 6554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kPromiseChain = 17, 6555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kPromiseAccept = 18, 6556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kPromiseDefer = 19, 6557109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch kHtmlCommentInExternalScript = 20, 6558109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch kHtmlComment = 21, 6559109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch kSloppyModeBlockScopedFunctionRedefinition = 22, 6560109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch kForInInitializer = 23, 6561109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch kArrayProtectorDirtied = 24, 6562109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch kArraySpeciesModified = 25, 6563109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch kArrayPrototypeConstructorModified = 26, 6564109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch kArrayInstanceProtoModified = 27, 6565109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch kArrayInstanceConstructorModified = 28, 65663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch kLegacyFunctionDeclaration = 29, 65673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch kRegExpPrototypeSourceGetter = 30, 65683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch kRegExpPrototypeOldFlagGetter = 31, 6569bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch kDecimalWithLeadingZeroInStrictMode = 32, 657013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kLegacyDateParser = 33, 657113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kDefineGetterOrSetterWouldThrow = 34, 6572f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kFunctionConstructorReturnedUndefined = 35, 657362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kAssigmentExpressionLHSIsCallInSloppy = 36, 657462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kAssigmentExpressionLHSIsCallInStrict = 37, 657562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kPromiseConstructorReturnedUndefined = 38, 6576109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 6577bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // If you add new values here, you'll also need to update Chromium's: 6578bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // UseCounter.h, V8PerIsolateData.cpp, histograms.xml 6579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kUseCounterFeatureCount // This enum value must be last. 6580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 6581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 658262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch enum MessageErrorLevel { 658362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kMessageLog = (1 << 0), 658462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kMessageDebug = (1 << 1), 658562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kMessageInfo = (1 << 2), 658662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kMessageError = (1 << 3), 658762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kMessageWarning = (1 << 4), 658862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kMessageAll = kMessageLog | kMessageDebug | kMessageInfo | kMessageError | 658962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kMessageWarning, 659062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch }; 659162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 6592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef void (*UseCounterCallback)(Isolate* isolate, 6593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UseCounterFeature feature); 6594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 659644f0eee88ff00398ff7f715fab053374d808c90dSteve Block /** 659744f0eee88ff00398ff7f715fab053374d808c90dSteve Block * Creates a new isolate. Does not change the currently entered 659844f0eee88ff00398ff7f715fab053374d808c90dSteve Block * isolate. 659944f0eee88ff00398ff7f715fab053374d808c90dSteve Block * 660044f0eee88ff00398ff7f715fab053374d808c90dSteve Block * When an isolate is no longer used its resources should be freed 660144f0eee88ff00398ff7f715fab053374d808c90dSteve Block * by calling Dispose(). Using the delete operator is not allowed. 6602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 6603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * V8::Initialize() must have run prior to this. 660444f0eee88ff00398ff7f715fab053374d808c90dSteve Block */ 6605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Isolate* New(const CreateParams& params); 660644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 660744f0eee88ff00398ff7f715fab053374d808c90dSteve Block /** 660844f0eee88ff00398ff7f715fab053374d808c90dSteve Block * Returns the entered isolate for the current thread or NULL in 660944f0eee88ff00398ff7f715fab053374d808c90dSteve Block * case there is no current isolate. 6610958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * 6611958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * This method must not be invoked before V8::Initialize() was invoked. 661244f0eee88ff00398ff7f715fab053374d808c90dSteve Block */ 661344f0eee88ff00398ff7f715fab053374d808c90dSteve Block static Isolate* GetCurrent(); 661444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 661544f0eee88ff00398ff7f715fab053374d808c90dSteve Block /** 6616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Custom callback used by embedders to help V8 determine if it should abort 6617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * when it throws and no internal handler is predicted to catch the 6618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * exception. If --abort-on-uncaught-exception is used on the command line, 6619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * then V8 will abort if either: 6620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * - no custom callback is set. 6621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * - the custom callback set returns true. 6622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Otherwise, the custom callback will not be called and V8 will not abort. 6623014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 6624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef bool (*AbortOnUncaughtExceptionCallback)(Isolate*); 6625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetAbortOnUncaughtExceptionCallback( 6626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AbortOnUncaughtExceptionCallback callback); 6627014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6628014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 66293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * Optional notification that the system is running low on memory. 66303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * V8 uses these notifications to guide heuristics. 66313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * It is allowed to call this function from another thread while 66323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * the isolate is executing long running JavaScript code. 66333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch */ 66343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void MemoryPressureNotification(MemoryPressureLevel level); 66353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 66363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch /** 663744f0eee88ff00398ff7f715fab053374d808c90dSteve Block * Methods below this point require holding a lock (using Locker) in 663844f0eee88ff00398ff7f715fab053374d808c90dSteve Block * a multi-threaded environment. 663944f0eee88ff00398ff7f715fab053374d808c90dSteve Block */ 664044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 664144f0eee88ff00398ff7f715fab053374d808c90dSteve Block /** 664244f0eee88ff00398ff7f715fab053374d808c90dSteve Block * Sets this isolate as the entered one for the current thread. 664344f0eee88ff00398ff7f715fab053374d808c90dSteve Block * Saves the previously entered one (if any), so that it can be 664444f0eee88ff00398ff7f715fab053374d808c90dSteve Block * restored when exiting. Re-entering an isolate is allowed. 664544f0eee88ff00398ff7f715fab053374d808c90dSteve Block */ 664644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Enter(); 664744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 664844f0eee88ff00398ff7f715fab053374d808c90dSteve Block /** 664944f0eee88ff00398ff7f715fab053374d808c90dSteve Block * Exits this isolate by restoring the previously entered one in the 665044f0eee88ff00398ff7f715fab053374d808c90dSteve Block * current thread. The isolate may still stay the same, if it was 665144f0eee88ff00398ff7f715fab053374d808c90dSteve Block * entered more than once. 665244f0eee88ff00398ff7f715fab053374d808c90dSteve Block * 665344f0eee88ff00398ff7f715fab053374d808c90dSteve Block * Requires: this == Isolate::GetCurrent(). 665444f0eee88ff00398ff7f715fab053374d808c90dSteve Block */ 665544f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Exit(); 665644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 665744f0eee88ff00398ff7f715fab053374d808c90dSteve Block /** 665844f0eee88ff00398ff7f715fab053374d808c90dSteve Block * Disposes the isolate. The isolate must not be entered by any 665944f0eee88ff00398ff7f715fab053374d808c90dSteve Block * thread to be disposable. 666044f0eee88ff00398ff7f715fab053374d808c90dSteve Block */ 666144f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Dispose(); 666244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 6663257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch /** 6664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Discards all V8 thread-specific data for the Isolate. Should be used 6665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * if a thread is terminating and it has used an Isolate that will outlive 6666014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * the thread -- all thread-specific data for an Isolate is discarded when 6667014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * an Isolate is disposed so this call is pointless if an Isolate is about 6668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * to be Disposed. 6669014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 6670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void DiscardThreadSpecificMetadata(); 6671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 6673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Associate embedder-specific data with the isolate. |slot| has to be 6674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * between 0 and GetNumberOfDataSlots() - 1. 6675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE void SetData(uint32_t slot, void* data); 6677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Retrieve embedder-specific data from the isolate. 6680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns NULL if SetData has never been called for the given |slot|. 6681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE void* GetData(uint32_t slot); 6683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns the maximum number of available embedder data slots. Valid slots 6686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * are in the range of 0 - GetNumberOfDataSlots() - 1. 6687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static uint32_t GetNumberOfDataSlots(); 6689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Get statistics about the heap memory usage. 6692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void GetHeapStatistics(HeapStatistics* heap_statistics); 6694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Returns the number of spaces in the heap. 6697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 6698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t NumberOfHeapSpaces(); 6699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 6701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Get the memory usage of a space in the heap. 6702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * 6703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * \param space_statistics The HeapSpaceStatistics object to fill in 6704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * statistics. 6705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * \param index The index of the space to get statistics from, which ranges 6706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * from 0 to NumberOfHeapSpaces() - 1. 6707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * \returns true on success. 6708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 6709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool GetHeapSpaceStatistics(HeapSpaceStatistics* space_statistics, 6710014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t index); 6711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 6713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Returns the number of types of objects tracked in the heap at GC. 6714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 6715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t NumberOfTrackedHeapObjectTypes(); 6716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 6718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Get statistics about objects in the heap. 6719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * 6720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * \param object_statistics The HeapObjectStatistics object to fill in 6721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * statistics of objects of given type, which were live in the previous GC. 6722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * \param type_index The index of the type of object to fill details about, 6723014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * which ranges from 0 to NumberOfTrackedHeapObjectTypes() - 1. 6724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * \returns true on success. 6725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 6726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool GetHeapObjectStatisticsAtLastGC(HeapObjectStatistics* object_statistics, 6727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t type_index); 6728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 673013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * Get statistics about code and its metadata in the heap. 673113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * 673213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * \param object_statistics The HeapCodeStatistics object to fill in 673313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * statistics of code, bytecode and their metadata. 673413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * \returns true on success. 673513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch */ 673613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch bool GetHeapCodeAndMetadataStatistics(HeapCodeStatistics* object_statistics); 673713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 673813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch /** 6739958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Get a call stack sample from the isolate. 6740958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * \param state Execution state. 6741958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * \param frames Caller allocated buffer to store stack frames. 6742958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * \param frames_limit Maximum number of frames to capture. The buffer must 6743958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * be large enough to hold the number of frames. 6744958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * \param sample_info The sample info is filled up by the function 6745958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * provides number of actual captured stack frames and 6746958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * the current VM state. 6747958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * \note GetStackSample should only be called when the JS thread is paused or 6748958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * interrupted. Otherwise the behavior is undefined. 6749958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 6750958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void GetStackSample(const RegisterState& state, void** frames, 6751958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier size_t frames_limit, SampleInfo* sample_info); 6752958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 6753958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 6754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Adjusts the amount of registered external memory. Used to give V8 an 6755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * indication of the amount of externally allocated memory that is kept alive 6756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * by JavaScript objects. V8 uses this to decide when to perform global 6757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * garbage collections. Registering externally allocated memory will trigger 6758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * global garbage collections more often than it would otherwise in an attempt 6759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * to garbage collect the JavaScript objects that keep the externally 6760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * allocated memory alive. 6761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 6762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \param change_in_bytes the change in externally allocated memory that is 6763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * kept alive by JavaScript objects. 6764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \returns the adjusted value. 6765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE int64_t 6767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AdjustAmountOfExternalAllocatedMemory(int64_t change_in_bytes); 6768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6770bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * Returns the number of phantom handles without callbacks that were reset 6771bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch * by the garbage collector since the last call to this function. 6772bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch */ 6773bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch size_t NumberOfPhantomHandleResetsSinceLastCall(); 6774bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 6775bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch /** 6776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns heap profiler for this isolate. Will return NULL until the isolate 6777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * is initialized. 6778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HeapProfiler* GetHeapProfiler(); 6780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns CPU profiler for this isolate. Will return NULL unless the isolate 6783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * is initialized. It is the embedder's responsibility to stop all CPU 6784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * profiling activities if it has started any. 6785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6786f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V8_DEPRECATE_SOON("CpuProfiler should be created with CpuProfiler::New call.", 6787f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CpuProfiler* GetCpuProfiler()); 6788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** Returns true if this isolate has a current context. */ 6790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool InContext(); 6791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 6793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Returns the context of the currently running JavaScript, or the context 6794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * on the top of the stack if no JavaScript is running. 6795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 6796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<Context> GetCurrentContext(); 6797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns the context of the calling JavaScript code. That is the 6800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * context of the top-most JavaScript frame. If there are no 6801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * JavaScript frames an empty handle is returned. 6802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6803014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON( 6804014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Calling context concept is not compatible with tail calls, and will be " 6805014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "removed.", 6806014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> GetCallingContext()); 6807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** Returns the last context entered through V8's C++ API. */ 6809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<Context> GetEnteredContext(); 6810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 681262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Returns either the last context entered through V8's C++ API, or the 681362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * context of the currently running microtask while processing microtasks. 681462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * If a context is entered while executing a microtask, that context is 681562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * returned. 681662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch */ 681762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Local<Context> GetEnteredOrMicrotaskContext(); 681862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 681962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch /** 6820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Schedules an exception to be thrown when returning to JavaScript. When an 6821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * exception has been scheduled it is illegal to invoke any JavaScript 6822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * operation; the caller must return immediately and only after the exception 6823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * has been handled does it become legal to invoke JavaScript operations. 6824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<Value> ThrowException(Local<Value> exception); 6826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Allows the host application to group objects together. If one 6829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * object in the group is alive, all objects in the group are alive. 6830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * After each garbage collection, object groups are removed. It is 6831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * intended to be used in the before-garbage-collection callback 6832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * function, for instance to simulate DOM tree connections among JS 6833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * wrapper objects. Object groups for all dependent handles need to 6834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * be provided for kGCTypeMarkSweepCompact collections, for all other 6835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * garbage collection types it is sufficient to provide object groups 6836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * for partially dependent handles only. 6837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 683862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch template <typename T> 683962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V8_DEPRECATED("Use EmbedderHeapTracer", 684062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void SetObjectGroupId(const Persistent<T>& object, 684162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch UniqueId id)); 6842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Allows the host application to declare implicit references from an object 6845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * group to an object. If the objects of the object group are alive, the child 6846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * object is alive too. After each garbage collection, all implicit references 6847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * are removed. It is intended to be used in the before-garbage-collection 6848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * callback function. 6849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 685062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch template <typename T> 685162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V8_DEPRECATED("Use EmbedderHeapTracer", 685262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void SetReferenceFromGroup(UniqueId id, 685362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch const Persistent<T>& child)); 6854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Allows the host application to declare implicit references from an object 6857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * to another object. If the parent object is alive, the child object is alive 6858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * too. After each garbage collection, all implicit references are removed. It 6859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * is intended to be used in the before-garbage-collection callback function. 6860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 686162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch template <typename T, typename S> 686262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V8_DEPRECATED("Use EmbedderHeapTracer", 686362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void SetReference(const Persistent<T>& parent, 686462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch const Persistent<S>& child)); 6865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6866014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef void (*GCCallback)(Isolate* isolate, GCType type, 6867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GCCallbackFlags flags); 6868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Enables the host application to receive a notification before a 6871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * garbage collection. Allocations are allowed in the callback function, 6872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * but the callback is not re-entrant: if the allocation inside it will 6873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * trigger the garbage collection, the callback won't be called again. 6874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * It is possible to specify the GCType filter for your callback. But it is 6875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * not possible to register the same callback function two times with 6876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * different GCType filters. 6877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void AddGCPrologueCallback(GCCallback callback, 6879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GCType gc_type_filter = kGCTypeAll); 6880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * This function removes callback which was installed by 6883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * AddGCPrologueCallback function. 6884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6885014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void RemoveGCPrologueCallback(GCCallback callback); 6886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 68883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * Sets the embedder heap tracer for the isolate. 68893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch */ 68903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void SetEmbedderHeapTracer(EmbedderHeapTracer* tracer); 68913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 68923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch /** 6893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Enables the host application to receive a notification after a 6894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * garbage collection. Allocations are allowed in the callback function, 6895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * but the callback is not re-entrant: if the allocation inside it will 6896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * trigger the garbage collection, the callback won't be called again. 6897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * It is possible to specify the GCType filter for your callback. But it is 6898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * not possible to register the same callback function two times with 6899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * different GCType filters. 6900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6901014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void AddGCEpilogueCallback(GCCallback callback, 6902014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GCType gc_type_filter = kGCTypeAll); 6903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * This function removes callback which was installed by 6906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * AddGCEpilogueCallback function. 6907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6908014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void RemoveGCEpilogueCallback(GCCallback callback); 6909958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 6910958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 6911958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Forcefully terminate the current thread of JavaScript execution 6912958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * in the given isolate. 6913958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * 6914958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * This method can be used by any thread even if that thread has not 6915958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * acquired the V8 lock with a Locker object. 6916958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 6917958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void TerminateExecution(); 6918958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 6919958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 6920958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Is V8 terminating JavaScript execution. 6921958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * 6922958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Returns true if JavaScript execution is currently terminating 6923958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * because of a call to TerminateExecution. In that case there are 6924958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * still JavaScript frames on the stack and the termination 6925958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * exception is still active. 6926958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 6927958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool IsExecutionTerminating(); 6928958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 6929958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 6930958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Resume execution capability in the given isolate, whose execution 6931958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * was previously forcefully terminated using TerminateExecution(). 6932958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * 6933958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * When execution is forcefully terminated using TerminateExecution(), 6934958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * the isolate can not resume execution until all JavaScript frames 6935958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * have propagated the uncatchable exception which is generated. This 6936958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * method allows the program embedding the engine to handle the 6937958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * termination event and resume execution capability, even if 6938958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * JavaScript frames remain on the stack. 6939958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * 6940958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * This method can be used by any thread even if that thread has not 6941958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * acquired the V8 lock with a Locker object. 6942958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 6943958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void CancelTerminateExecution(); 6944958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 6945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Request V8 to interrupt long running JavaScript code and invoke 6947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * the given |callback| passing the given |data| to it. After |callback| 6948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * returns control will be returned to the JavaScript code. 6949958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * There may be a number of interrupt requests in flight. 6950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Can be called from another thread without acquiring a |Locker|. 6951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Registered |callback| must not reenter interrupted Isolate. 6952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void RequestInterrupt(InterruptCallback callback, void* data); 6954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Request garbage collection in this Isolate. It is only valid to call this 6957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * function if --expose_gc was specified. 6958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 6959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * This should only be used for testing purposes and not to enforce a garbage 6960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * collection schedule. It has strong negative impact on the garbage 6961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * collection performance. Use IdleNotificationDeadline() or 6962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * LowMemoryNotification() instead to influence the garbage collection 6963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * schedule. 6964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void RequestGarbageCollectionForTesting(GarbageCollectionType type); 6966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Set the callback to invoke for logging event. 6969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetEventLogger(LogEventCallback that); 6971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6973109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch * Adds a callback to notify the host application right before a script 6974109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch * is about to run. If a script re-enters the runtime during executing, the 6975109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch * BeforeCallEnteredCallback is invoked for each re-entrance. 6976109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch * Executing scripts inside the callback will re-trigger the callback. 6977109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch */ 6978109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch void AddBeforeCallEnteredCallback(BeforeCallEnteredCallback callback); 6979109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 6980109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch /** 6981109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch * Removes callback that was installed by AddBeforeCallEnteredCallback. 6982109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch */ 6983109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch void RemoveBeforeCallEnteredCallback(BeforeCallEnteredCallback callback); 6984109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 6985109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch /** 6986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Adds a callback to notify the host application when a script finished 6987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * running. If a script re-enters the runtime during executing, the 6988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * CallCompletedCallback is only invoked when the outer-most script 6989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * execution ends. Executing scripts inside the callback do not trigger 6990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * further callbacks. 6991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 6992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void AddCallCompletedCallback(CallCompletedCallback callback); 6993109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch V8_DEPRECATE_SOON( 6994109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch "Use callback with parameter", 6995109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch void AddCallCompletedCallback(DeprecatedCallCompletedCallback callback)); 6996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 6998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Removes callback that was installed by AddCallCompletedCallback. 6999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 7000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void RemoveCallCompletedCallback(CallCompletedCallback callback); 7001109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch V8_DEPRECATE_SOON( 7002109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch "Use callback with parameter", 7003109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch void RemoveCallCompletedCallback( 7004109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DeprecatedCallCompletedCallback callback)); 7005958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7006958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 700762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Experimental: Set the PromiseHook callback for various promise 700862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * lifecycle events. 700962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch */ 701062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void SetPromiseHook(PromiseHook hook); 701162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 701262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch /** 7013958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Set callback to notify about promise reject with no handler, or 7014958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * revocation of such a previous notification once the handler is added. 7015958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 7016958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void SetPromiseRejectCallback(PromiseRejectCallback callback); 7017958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 7019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Experimental: Runs the Microtask Work Queue until empty 7020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Any exceptions thrown by microtask callbacks are swallowed. 7021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 7022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void RunMicrotasks(); 7023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 7025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Experimental: Enqueues the callback to the Microtask Work Queue 7026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 7027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void EnqueueMicrotask(Local<Function> microtask); 7028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 7030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Experimental: Enqueues the callback to the Microtask Work Queue 7031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 7032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void EnqueueMicrotask(MicrotaskCallback microtask, void* data = NULL); 7033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 70343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch /** 70353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * Experimental: Controls how Microtasks are invoked. See MicrotasksPolicy 70363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * for details. 7037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 70383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void SetMicrotasksPolicy(MicrotasksPolicy policy); 70393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V8_DEPRECATE_SOON("Use SetMicrotasksPolicy", 70403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void SetAutorunMicrotasks(bool autorun)); 7041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 70433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * Experimental: Returns the policy controlling how Microtasks are invoked. 7044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 70453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MicrotasksPolicy GetMicrotasksPolicy() const; 70463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V8_DEPRECATE_SOON("Use GetMicrotasksPolicy", 70473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bool WillAutorunMicrotasks() const); 70483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 70493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch /** 70503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * Experimental: adds a callback to notify the host application after 70513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * microtasks were run. The callback is triggered by explicit RunMicrotasks 70523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * call or automatic microtasks execution (see SetAutorunMicrotasks). 70533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * 70543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * Callback will trigger even if microtasks were attempted to run, 70553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * but the microtasks queue was empty and no single microtask was actually 70563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * executed. 70573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * 70583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * Executing scriptsinside the callback will not re-trigger microtasks and 70593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * the callback. 70603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch */ 70613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void AddMicrotasksCompletedCallback(MicrotasksCompletedCallback callback); 70623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 70633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch /** 70643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * Removes callback that was installed by AddMicrotasksCompletedCallback. 70653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch */ 70663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void RemoveMicrotasksCompletedCallback(MicrotasksCompletedCallback callback); 7067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 7069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Sets a callback for counting the number of times a feature of V8 is used. 7070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 7071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetUseCounterCallback(UseCounterCallback callback); 7072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 7074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Enables the host application to provide a mechanism for recording 7075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * statistics counters. 7076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 7077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetCounterFunction(CounterLookupCallback); 7078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 7080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Enables the host application to provide a mechanism for recording 7081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * histograms. The CreateHistogram function returns a 7082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * histogram which will later be passed to the AddHistogramSample 7083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * function. 7084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 7085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetCreateHistogramFunction(CreateHistogramCallback); 7086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetAddHistogramSampleFunction(AddHistogramSampleCallback); 7087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 7089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Optional notification that the embedder is idle. 7090958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * V8 uses the notification to perform garbage collection. 7091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * This call can be used repeatedly if the embedder remains idle. 7092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Returns true if the embedder should stop calling IdleNotificationDeadline 7093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * until real work has been done. This indicates that V8 has done 7094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * as much cleanup as it will be able to do. 7095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 7096958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * The deadline_in_seconds argument specifies the deadline V8 has to finish 7097958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * garbage collection work. deadline_in_seconds is compared with 7098958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * MonotonicallyIncreasingTime() and should be based on the same timebase as 7099958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * that function. There is no guarantee that the actual work will be done 7100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * within the time limit. 7101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 7102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool IdleNotificationDeadline(double deadline_in_seconds); 7103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("use IdleNotificationDeadline()", 7105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IdleNotification(int idle_time_in_ms)); 7106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 7108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Optional notification that the system is running low on memory. 7109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * V8 uses these notifications to attempt to free memory. 7110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 7111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void LowMemoryNotification(); 7112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 7114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Optional notification that a context has been disposed. V8 uses 7115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * these notifications to guide the GC heuristic. Returns the number 7116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * of context disposals - including this one - since the last time 7117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * V8 had a chance to clean up. 7118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * 7119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * The optional parameter |dependant_context| specifies whether the disposed 7120958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * context was depending on state from other contexts or not. 7121257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch */ 7122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int ContextDisposedNotification(bool dependant_context = true); 7123257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 7124257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch /** 7125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Optional notification that the isolate switched to the foreground. 7126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * V8 uses these notifications to guide heuristics. 7127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 7128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void IsolateInForegroundNotification(); 7129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 7131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Optional notification that the isolate switched to the background. 7132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * V8 uses these notifications to guide heuristics. 7133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 7134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void IsolateInBackgroundNotification(); 7135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 713713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * Optional notification to tell V8 the current performance requirements 713813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * of the embedder based on RAIL. 713913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * V8 uses these notifications to guide heuristics. 714013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * This is an unfinished experimental feature. Semantics and implementation 714113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * may change frequently. 714213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch */ 714313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch void SetRAILMode(RAILMode rail_mode); 714413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 714513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch /** 714662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Optional notification to tell V8 the current isolate is used for debugging 714762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * and requires higher heap limit. 714862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch */ 714962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void IncreaseHeapLimitForDebugging(); 715062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 715162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch /** 715262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Restores the original heap limit after IncreaseHeapLimitForDebugging(). 715362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch */ 715462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void RestoreOriginalHeapLimit(); 715562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 715662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch /** 715762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Returns true if the heap limit was increased for debugging and the 715862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * original heap limit was not restored yet. 715962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch */ 716062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool IsHeapLimitIncreasedForDebugging(); 716162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 716262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch /** 7163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Allows the host application to provide the address of a function that is 7164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * notified each time code is added, moved or removed. 7165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 7166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \param options options for the JIT code event handler. 7167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \param event_handler the JIT code event handler, which will be invoked 7168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * each time code is added, moved or removed. 7169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \note \p event_handler won't get notified of existent code. 7170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \note since code removal notifications are not currently issued, the 7171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \p event_handler may get notifications of code that overlaps earlier 7172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * code notifications. This happens when code areas are reused, and the 7173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * earlier overlapping code areas should therefore be discarded. 7174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \note the events passed to \p event_handler and the strings they point to 7175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * are not guaranteed to live past each call. The \p event_handler must 7176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * copy strings and other parameters it needs to keep around. 7177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \note the set of events declared in JitCodeEvent::EventType is expected to 7178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * grow over time, and the JitCodeEvent structure is expected to accrue 7179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * new members. The \p event_handler function must ignore event codes 7180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * it does not recognize to maintain future compatibility. 7181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \note Use Isolate::CreateParams to get events for code executed during 7182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Isolate setup. 7183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 7184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetJitCodeEventHandler(JitCodeEventOptions options, 7185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JitCodeEventHandler event_handler); 7186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 7188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Modifies the stack limit for this Isolate. 7189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 7190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \param stack_limit An address beyond which the Vm's stack may not grow. 7191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 7192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \note If you are using threads then you should hold the V8::Locker lock 7193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * while setting the stack limit and you must set a non-default stack 7194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * limit separately for each thread. 7195257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch */ 7196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetStackLimit(uintptr_t stack_limit); 7197257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 7198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 7199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Returns a memory range that can potentially contain jitted code. 7200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * 7201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * On Win64, embedders are advised to install function table callbacks for 7202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * these ranges, as default SEH won't be able to unwind through jitted code. 7203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * 7204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * The first page of the code range is reserved for the embedder and is 7205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * committed, writable, and executable. 7206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * 7207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Might be empty on other platforms. 7208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * 7209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * https://code.google.com/p/v8/issues/detail?id=3598 7210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 7211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void GetCodeRange(void** start, size_t* length_in_bytes); 7212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** Set the callback to invoke in case of fatal errors. */ 7214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void SetFatalErrorHandler(FatalErrorCallback that); 7215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7216f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch /** Set the callback to invoke in case of OOM errors. */ 7217f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void SetOOMErrorHandler(OOMErrorCallback that); 7218f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 7219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 7220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Set the callback to invoke to check if code generation from 7221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * strings should be allowed. 7222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 7223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void SetAllowCodeGenerationFromStringsCallback( 7224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier AllowCodeGenerationFromStringsCallback callback); 7225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 722762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Set the callback to invoke to check if wasm compilation from 722862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * the specified object is allowed. By default, wasm compilation 722962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * is allowed. 723062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * 723162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Similar for instantiate. 723262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch */ 723362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void SetAllowWasmCompileCallback(AllowWasmCompileCallback callback); 723462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void SetAllowWasmInstantiateCallback(AllowWasmInstantiateCallback callback); 723562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 723662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch /** 7237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Check if V8 is dead and therefore unusable. This is the case after 7238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * fatal errors such as out-of-memory situations. 7239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 7240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool IsDead(); 7241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 724362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Adds a message listener (errors only). 7244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * 7245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * The same message listener can be added more than once and in that 7246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * case it will be called more than once for each message. 7247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * 7248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * If data is specified, it will be passed to the callback when it is called. 7249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Otherwise, the exception object will be passed to the callback instead. 7250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 7251958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool AddMessageListener(MessageCallback that, 7252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> data = Local<Value>()); 7253958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 725562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Adds a message listener. 725662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * 725762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * The same message listener can be added more than once and in that 725862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * case it will be called more than once for each message. 725962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * 726062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * If data is specified, it will be passed to the callback when it is called. 726162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Otherwise, the exception object will be passed to the callback instead. 726262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * 726362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * A listener can listen for particular error levels by providing a mask. 726462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch */ 726562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool AddMessageListenerWithErrorLevel(MessageCallback that, 726662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int message_levels, 726762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Local<Value> data = Local<Value>()); 726862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 726962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch /** 7270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Remove all message listeners from the specified callback function. 7271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 7272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void RemoveMessageListeners(MessageCallback that); 7273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** Callback function for reporting failed access checks.*/ 7275958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void SetFailedAccessCheckCallbackFunction(FailedAccessCheckCallback); 7276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 7278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Tells V8 to capture current stack trace when uncaught exception occurs 7279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * and report it to the message listeners. The option is off by default. 7280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 7281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void SetCaptureStackTraceForUncaughtExceptions( 7282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool capture, int frame_limit = 10, 7283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier StackTrace::StackTraceOptions options = StackTrace::kOverview); 7284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 7286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Iterates through all external resources referenced from current isolate 7287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * heap. GC is not invoked prior to iterating, therefore there is no 7288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * guarantee that visited objects are still alive. 7289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 7290958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void VisitExternalResources(ExternalResourceVisitor* visitor); 7291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 7293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Iterates through all the persistent handles in the current isolate's heap 7294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * that have class_ids. 7295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 7296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void VisitHandlesWithClassIds(PersistentHandleVisitor* visitor); 7297958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7298958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 7299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Iterates through all the persistent handles in the current isolate's heap 7300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * that have class_ids and are candidates to be marked as partially dependent 7301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * handles. This will visit handles to young objects created since the last 7302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * garbage collection but is free to visit an arbitrary superset of these 7303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * objects. 7304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 7305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void VisitHandlesForPartialDependence(PersistentHandleVisitor* visitor); 7306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 7308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Iterates through all the persistent handles in the current isolate's heap 7309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * that have class_ids and are weak to be marked as inactive if there is no 7310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * pending activity for the handle. 7311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 7312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void VisitWeakHandles(PersistentHandleVisitor* visitor); 7313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 731413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch /** 731513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * Check if this isolate is in use. 731613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * True if at least one thread Enter'ed this isolate. 731713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch */ 731813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch bool IsInUse(); 731913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 7320f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Isolate() = delete; 7321f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch ~Isolate() = delete; 7322f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Isolate(const Isolate&) = delete; 7323f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Isolate& operator=(const Isolate&) = delete; 7324f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void* operator new(size_t size) = delete; 7325f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void operator delete(void*, size_t) = delete; 7326f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 732744f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 7328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class K, class V, class Traits> 7329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend class PersistentValueMapBase; 7330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetObjectGroupId(internal::Object** object, UniqueId id); 7332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetReferenceFromGroup(UniqueId id, internal::Object** object); 7333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetReference(internal::Object** parent, internal::Object** child); 7334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void ReportExternalAllocationLimitReached(); 7335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 733644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 7337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT StartupData { 7338257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 7339257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch const char* data; 7340257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int raw_size; 7341257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 7342257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 73433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 73443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch/** 73453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch * EntropySource is used as a callback function when v8 needs a source 73463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch * of entropy. 73473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch */ 73483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochtypedef bool (*EntropySource)(unsigned char* buffer, size_t length); 73493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 73503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch/** 73513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch * ReturnAddressLocationResolver is used as a callback function when v8 is 73523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch * resolving the location of a return address on the stack. Profilers that 73533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch * change the return address on the stack can use this to resolve the stack 73543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch * location to whereever the profiler stashed the original return address. 7355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 7356f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * \param return_addr_location A location on stack where a machine 7357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * return address resides. 7358f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * \returns Either return_addr_location, or else a pointer to the profiler's 7359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * copy of the original return address. 7360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 7361f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * \note The resolver function must not cause garbage collection. 73623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch */ 73633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtypedef uintptr_t (*ReturnAddressLocationResolver)( 73643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch uintptr_t return_addr_location); 73653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 73663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 73673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch/** 7368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Container class for static utility functions. 7369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 7370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT V8 { 7371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 7372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** Set the callback to invoke in case of fatal errors. */ 7373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static V8_DEPRECATED( 7374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use isolate version", 7375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetFatalErrorHandler(FatalErrorCallback that)); 7376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 7378257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * Set the callback to invoke to check if code generation from 7379257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * strings should be allowed. 7380257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch */ 7381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static V8_DEPRECATED( 7382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use isolate version", void SetAllowCodeGenerationFromStringsCallback( 7383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AllowCodeGenerationFromStringsCallback that)); 7384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 7386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Check if V8 is dead and therefore unusable. This is the case after 7387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * fatal errors such as out-of-memory situations. 7388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 7389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static V8_DEPRECATED("Use isolate version", bool IsDead()); 7390257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 7391257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch /** 7392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Hand startup data to V8, in case the embedder has chosen to build 7393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * V8 with external startup data. 7394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 7395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Note: 7396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * - By default the startup data is linked into the V8 library, in which 7397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * case this function is not meaningful. 7398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * - If this needs to be called, it needs to be called before V8 7399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * tries to make use of its built-ins. 7400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * - To avoid unnecessary copies of data, V8 will point directly into the 7401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * given data blob, so pretty please keep it around until V8 exit. 7402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * - Compression of the startup blob might be useful, but needs to 7403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * handled entirely on the embedders' side. 7404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * - The call will abort if the data is invalid. 7405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 7406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void SetNativesDataBlob(StartupData* startup_blob); 7407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void SetSnapshotDataBlob(StartupData* startup_blob); 7408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 74103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * Bootstrap an isolate and a context from scratch to create a startup 74113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * snapshot. Include the side-effects of running the optional script. 7412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Returns { NULL, 0 } on failure. 74133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * The caller acquires ownership of the data array in the return value. 7414958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 74153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static StartupData CreateSnapshotDataBlob(const char* embedded_source = NULL); 74163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 74173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch /** 74183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * Bootstrap an isolate and a context from the cold startup blob, run the 74193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * warm-up script to trigger code compilation. The side effects are then 74203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * discarded. The resulting startup snapshot will include compiled code. 74213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * Returns { NULL, 0 } on failure. 74223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * The caller acquires ownership of the data array in the return value. 74233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * The argument startup blob is untouched. 74243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch */ 74253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static StartupData WarmUpSnapshotDataBlob(StartupData cold_startup_blob, 74263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch const char* warmup_source); 7427958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7428958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 7429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Adds a message listener. 7430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 7431257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * The same message listener can be added more than once and in that 7432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * case it will be called more than once for each message. 7433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 7434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * If data is specified, it will be passed to the callback when it is called. 7435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Otherwise, the exception object will be passed to the callback instead. 7436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 7437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static V8_DEPRECATED( 7438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use isolate version", 7439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool AddMessageListener(MessageCallback that, 7440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> data = Local<Value>())); 7441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 7443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Remove all message listeners from the specified callback function. 7444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 7445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static V8_DEPRECATED( 7446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use isolate version", void RemoveMessageListeners(MessageCallback that)); 7447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 74493bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch * Tells V8 to capture current stack trace when uncaught exception occurs 74503bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch * and report it to the message listeners. The option is off by default. 74513bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch */ 7452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static V8_DEPRECATED( 7453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use isolate version", 7454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetCaptureStackTraceForUncaughtExceptions( 7455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool capture, int frame_limit = 10, 7456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StackTrace::StackTraceOptions options = StackTrace::kOverview)); 74573bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch 74583bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch /** 7459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Sets V8 flags from a string. 7460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 7461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void SetFlagsFromString(const char* str, int length); 7462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 7464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Sets V8 flags from the command line. 7465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 7466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void SetFlagsFromCommandLine(int* argc, 7467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block char** argv, 7468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool remove_flags); 7469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** Get the version string. */ 7471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const char* GetVersion(); 7472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** Callback function for reporting failed access checks.*/ 7474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static V8_DEPRECATED( 7475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use isolate version", 7476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetFailedAccessCheckCallbackFunction(FailedAccessCheckCallback)); 7477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 7479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Enables the host application to receive a notification before a 74806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * garbage collection. Allocations are not allowed in the 74816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * callback function, you therefore cannot manipulate objects (set 74826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * or delete properties for example) since it is possible such 74836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * operations will result in the allocation of objects. It is possible 74846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * to specify the GCType filter for your callback. But it is not possible to 74856ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * register the same callback function two times with different 74866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * GCType filters. 74876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block */ 7488014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_DEPRECATED( 7489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use isolate version", 7490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void AddGCPrologueCallback(GCCallback callback, 7491014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GCType gc_type_filter = kGCTypeAll)); 74926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 74936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block /** 74946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * This function removes callback which was installed by 74956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * AddGCPrologueCallback function. 74966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block */ 7497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static V8_DEPRECATED( 7498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use isolate version", 7499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void RemoveGCPrologueCallback(GCCallback callback)); 75006ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 75016ded16be15dd865a9b21ea304d5273c8be299c87Steve Block /** 7502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Enables the host application to receive a notification after a 75036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * garbage collection. Allocations are not allowed in the 75046ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * callback function, you therefore cannot manipulate objects (set 75056ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * or delete properties for example) since it is possible such 75066ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * operations will result in the allocation of objects. It is possible 75076ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * to specify the GCType filter for your callback. But it is not possible to 75086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * register the same callback function two times with different 75096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * GCType filters. 75106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block */ 7511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static V8_DEPRECATED( 7512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use isolate version", 7513014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void AddGCEpilogueCallback(GCCallback callback, 7514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GCType gc_type_filter = kGCTypeAll)); 75156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 75166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block /** 75176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * This function removes callback which was installed by 75186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * AddGCEpilogueCallback function. 75196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block */ 7520014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static V8_DEPRECATED( 7521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use isolate version", 7522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void RemoveGCEpilogueCallback(GCCallback callback)); 75236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 75246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block /** 7525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Initializes V8. This function needs to be called before the first Isolate 7526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * is created. It always returns true. 7527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 7528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool Initialize(); 7529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 75313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch * Allows the host application to provide a callback which can be used 75323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch * as a source of entropy for random number generators. 75333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch */ 75343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static void SetEntropySource(EntropySource source); 75353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 75363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch /** 75373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch * Allows the host application to provide a callback that allows v8 to 75383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch * cooperate with a profiler that rewrites return addresses on stack. 75393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch */ 75403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static void SetReturnAddressLocationResolver( 75413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ReturnAddressLocationResolver return_address_resolver); 75423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 75433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch /** 754444f0eee88ff00398ff7f715fab053374d808c90dSteve Block * Forcefully terminate the current thread of JavaScript execution 7545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * in the given isolate. 7546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 7547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * This method can be used by any thread even if that thread has not 7548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * acquired the V8 lock with a Locker object. 754944f0eee88ff00398ff7f715fab053374d808c90dSteve Block * 755044f0eee88ff00398ff7f715fab053374d808c90dSteve Block * \param isolate The isolate in which to terminate the current JS execution. 7551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 7552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static V8_DEPRECATED("Use isolate version", 7553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void TerminateExecution(Isolate* isolate)); 7554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 75566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * Is V8 terminating JavaScript execution. 75576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * 75586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * Returns true if JavaScript execution is currently terminating 75596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * because of a call to TerminateExecution. In that case there are 75606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * still JavaScript frames on the stack and the termination 75616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * exception is still active. 75623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch * 75633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch * \param isolate The isolate in which to check. 75646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block */ 7565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static V8_DEPRECATED( 7566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use isolate version", 7567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsExecutionTerminating(Isolate* isolate = NULL)); 75686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 75696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block /** 7570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Resume execution capability in the given isolate, whose execution 7571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * was previously forcefully terminated using TerminateExecution(). 7572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 7573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * When execution is forcefully terminated using TerminateExecution(), 7574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * the isolate can not resume execution until all JavaScript frames 7575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * have propagated the uncatchable exception which is generated. This 7576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * method allows the program embedding the engine to handle the 7577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * termination event and resume execution capability, even if 7578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * JavaScript frames remain on the stack. 7579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 7580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * This method can be used by any thread even if that thread has not 7581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * acquired the V8 lock with a Locker object. 7582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 7583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \param isolate The isolate in which to resume execution capability. 7584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 7585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static V8_DEPRECATED( 7586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use isolate version", void CancelTerminateExecution(Isolate* isolate)); 7587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 7589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Releases any resources used by v8 and stops any utility threads 7590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * that may be running. Note that disposing v8 is permanent, it 7591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * cannot be reinitialized. 7592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 7593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * It should generally not be necessary to dispose v8 before exiting 7594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * a process, this should happen automatically. It is only necessary 7595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * to use if the process needs the resources taken up by v8. 7596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 7597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool Dispose(); 7598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 75993ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block /** 7600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Iterates through all external resources referenced from current isolate 7601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * heap. GC is not invoked prior to iterating, therefore there is no 7602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * guarantee that visited objects are still alive. 76033ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block */ 7604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static V8_DEPRECATED( 7605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use isolate version", 7606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void VisitExternalResources(ExternalResourceVisitor* visitor)); 7607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 7609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Iterates through all the persistent handles in the current isolate's heap 7610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * that have class_ids. 76113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch */ 7612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static V8_DEPRECATED( 7613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use isolate version", 7614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void VisitHandlesWithClassIds(PersistentHandleVisitor* visitor)); 7615958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7616958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 7617958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Iterates through all the persistent handles in isolate's heap that have 7618958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * class_ids. 7619958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 7620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static V8_DEPRECATED( 7621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use isolate version", 7622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void VisitHandlesWithClassIds(Isolate* isolate, 7623014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PersistentHandleVisitor* visitor)); 76243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 76253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch /** 7626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Iterates through all the persistent handles in the current isolate's heap 7627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * that have class_ids and are candidates to be marked as partially dependent 7628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * handles. This will visit handles to young objects created since the last 7629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * garbage collection but is free to visit an arbitrary superset of these 7630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * objects. 7631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 7632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE static V8_DEPRECATED( 7633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Use isolate version", 7634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void VisitHandlesForPartialDependence(Isolate* isolate, 7635014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PersistentHandleVisitor* visitor)); 7636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 7638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Initialize the ICU library bundled with V8. The embedder should only 7639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * invoke this method when using the bundled ICU. Returns true on success. 76403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch * 7641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * If V8 was compiled with the ICU data in an external file, the location 7642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * of the data file has to be provided. 7643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 764413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V8_DEPRECATE_SOON( 764513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch "Use version with default location.", 764613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static bool InitializeICU(const char* icu_data_file = nullptr)); 764713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 764813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch /** 764913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * Initialize the ICU library bundled with V8. The embedder should only 765013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * invoke this method when using the bundled ICU. If V8 was compiled with 765113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * the ICU data in an external file and when the default location of that 765213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * file should be used, a path to the executable must be provided. 765313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * Returns true on success. 765413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * 765513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * The default is a file called icudtl.dat side-by-side with the executable. 765613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * 765713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * Optionally, the location of the data file can be provided to override the 765813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * default. 765913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch */ 766013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static bool InitializeICUDefaultLocation(const char* exec_path, 766113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch const char* icu_data_file = nullptr); 7662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 7664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Initialize the external startup data. The embedder only needs to 7665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * invoke this method when external startup data was enabled in a build. 7666014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * 7667014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * If V8 was compiled with the startup data in an external file, then 7668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * V8 needs to be given those external files during startup. There are 7669014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * three ways to do this: 7670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * - InitializeExternalStartupData(const char*) 7671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * This will look in the given directory for files "natives_blob.bin" 7672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * and "snapshot_blob.bin" - which is what the default build calls them. 7673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * - InitializeExternalStartupData(const char*, const char*) 7674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * As above, but will directly use the two given file names. 7675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * - Call SetNativesDataBlob, SetNativesDataBlob. 7676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * This will read the blobs from the given data structures and will 7677014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * not perform any file IO. 7678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 7679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void InitializeExternalStartupData(const char* directory_path); 7680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void InitializeExternalStartupData(const char* natives_blob, 7681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const char* snapshot_blob); 7682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 7683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Sets the v8::Platform to use. This should be invoked before V8 is 7684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * initialized. 7685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 7686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void InitializePlatform(Platform* platform); 7687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 76886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block /** 7689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Clears all references to the v8::Platform. This should be invoked after 7690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * V8 was disposed. 76916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block */ 7692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void ShutdownPlatform(); 76936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 7694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 7695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block V8(); 7696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static internal::Object** GlobalizeReference(internal::Isolate* isolate, 7698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object** handle); 7699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static internal::Object** CopyPersistent(internal::Object** handle); 7700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void DisposeGlobal(internal::Object** global_handle); 7701bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static void MakeWeak(internal::Object** location, void* data, 7702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WeakCallbackInfo<void>::Callback weak_callback, 7703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WeakCallbackType type); 7704bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static void MakeWeak(internal::Object** location, void* data, 7705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Must be 0 or -1. 7706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int internal_field_index1, 7707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Must be 1 or -1. 7708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int internal_field_index2, 7709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WeakCallbackInfo<void>::Callback weak_callback); 7710bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static void MakeWeak(internal::Object*** location_addr); 7711bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static void* ClearWeak(internal::Object** location); 7712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Eternalize(Isolate* isolate, 7713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Value* handle, 7714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int* index); 7715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Local<Value> GetEternal(Isolate* isolate, int index); 7716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7717c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static void RegisterExternallyReferencedObject(internal::Object** object, 7718c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch internal::Isolate* isolate); 7719c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 7720bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch template <class K, class V, class T> 7721bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch friend class PersistentValueMapBase; 7722bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 7723014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void FromJustIsNothing(); 7724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void ToLocalEmpty(); 7725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void InternalFieldOutOfBounds(int index); 7726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block template <class T> friend class Local; 7727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class T> 7728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend class MaybeLocal; 7729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class T> 7730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend class Maybe; 7731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class T> 7732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend class WeakCallbackInfo; 7733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class T> friend class Eternal; 7734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class T> friend class PersistentBase; 7735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class T, class M> friend class Persistent; 7736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block friend class Context; 7737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 7738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 773913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch/** 774013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * Helper class to create a snapshot data blob. 774113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch */ 7742c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass V8_EXPORT SnapshotCreator { 774313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch public: 774413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch enum class FunctionCodeHandling { kClear, kKeep }; 774513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 774613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch /** 774713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * Create and enter an isolate, and set it up for serialization. 774813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * The isolate is either created from scratch or from an existing snapshot. 774913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * The caller keeps ownership of the argument snapshot. 775013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * \param existing_blob existing snapshot from which to create this one. 775113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * \param external_references a null-terminated array of external references 775213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * that must be equivalent to CreateParams::external_references. 775313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch */ 775413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch SnapshotCreator(intptr_t* external_references = nullptr, 775513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch StartupData* existing_blob = nullptr); 775613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 775713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch ~SnapshotCreator(); 775813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 775913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch /** 776013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * \returns the isolate prepared by the snapshot creator. 776113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch */ 776213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Isolate* GetIsolate(); 776313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 776413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch /** 776562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Set the default context to be included in the snapshot blob. 776662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * The snapshot will not contain the global proxy, and we expect one or a 776762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * global object template to create one, to be provided upon deserialization. 776862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch */ 776962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void SetDefaultContext(Local<Context> context); 777062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 777162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch /** 777262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Add additional context to be included in the snapshot blob. 777362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * The snapshot will include the global proxy. 777462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * 777562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * \param callback optional callback to serialize internal fields. 777662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * 777713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * \returns the index of the context in the snapshot blob. 777813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch */ 777962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch size_t AddContext(Local<Context> context, 778062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch SerializeInternalFieldsCallback callback = 778162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch SerializeInternalFieldsCallback()); 778213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 778313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch /** 778413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * Add a template to be included in the snapshot blob. 778513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * \returns the index of the template in the snapshot blob. 778613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch */ 778713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch size_t AddTemplate(Local<Template> template_obj); 778813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 778913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch /** 779013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * Created a snapshot data blob. 779113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * This must not be called from within a handle scope. 779213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * \param function_code_handling whether to include compiled function code 779313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * in the snapshot. 779413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * \returns { nullptr, 0 } on failure, and a startup snapshot on success. The 779513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch * caller acquires ownership of the data array in the return value. 779613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch */ 779762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch StartupData CreateBlob(FunctionCodeHandling function_code_handling); 779813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 7799f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Disallow copying and assigning. 7800f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch SnapshotCreator(const SnapshotCreator&) = delete; 7801f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void operator=(const SnapshotCreator&) = delete; 7802f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 780313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch private: 780413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch void* data_; 780513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}; 7806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 7808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * A simple Maybe type, representing an object which may or may not have a 7809014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * value, see https://hackage.haskell.org/package/base/docs/Data-Maybe.html. 7810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * 7811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * If an API method returns a Maybe<>, the API method can potentially fail 7812014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * either because an exception is thrown, or because an exception is pending, 7813014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * e.g. because a previous API call threw an exception that hasn't been caught 7814014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * yet, or because a TerminateExecution exception was thrown. In that case, a 7815014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * "Nothing" value is returned. 7816014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 7817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <class T> 7818014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Maybe { 7819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 7820f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V8_INLINE bool IsNothing() const { return !has_value_; } 7821f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V8_INLINE bool IsJust() const { return has_value_; } 7822f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 7823f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Will crash if the Maybe<> is nothing. 7824f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V8_INLINE T ToChecked() const { return FromJust(); } 7825f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 7826f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V8_WARN_UNUSED_RESULT V8_INLINE bool To(T* out) const { 7827f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (V8_LIKELY(IsJust())) *out = value_; 7828f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return IsJust(); 7829f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 7830014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7831014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Will crash if the Maybe<> is nothing. 7832014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE T FromJust() const { 7833014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (V8_UNLIKELY(!IsJust())) V8::FromJustIsNothing(); 7834f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return value_; 7835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 7836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7837014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE T FromMaybe(const T& default_value) const { 7838f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return has_value_ ? value_ : default_value; 7839014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 7840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7841014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE bool operator==(const Maybe& other) const { 7842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return (IsJust() == other.IsJust()) && 7843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch (!IsJust() || FromJust() == other.FromJust()); 7844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 7845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7846014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_INLINE bool operator!=(const Maybe& other) const { 7847014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return !operator==(other); 7848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 7849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 7851f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Maybe() : has_value_(false) {} 7852f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch explicit Maybe(const T& t) : has_value_(true), value_(t) {} 7853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7854f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool has_value_; 7855f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch T value_; 7856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class U> 7858014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend Maybe<U> Nothing(); 7859014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class U> 7860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend Maybe<U> Just(const U& u); 7861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 7862014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7863014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7864014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <class T> 7865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochinline Maybe<T> Nothing() { 7866014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Maybe<T>(); 7867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 7868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <class T> 7871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochinline Maybe<T> Just(const T& t) { 7872014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Maybe<T>(t); 7873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 7874014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch/** 7877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * An external exception handler. 7878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 7879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT TryCatch { 7880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 7881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 7882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Creates a new try/catch block and registers it with v8. Note that 7883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * all TryCatch blocks should be stack allocated because the memory 7884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * location itself is compared against JavaScript try/catch blocks. 7885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 7886014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATED("Use isolate version", TryCatch()); 7887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 7889958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * Creates a new try/catch block and registers it with v8. Note that 7890958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * all TryCatch blocks should be stack allocated because the memory 7891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * location itself is compared against JavaScript try/catch blocks. 7892958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 7893958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier TryCatch(Isolate* isolate); 7894958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7895958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /** 7896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Unregisters and deletes this try/catch block. 7897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 7898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ~TryCatch(); 7899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 7901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns true if an exception has been caught by this try/catch block. 7902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 7903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool HasCaught() const; 7904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 7906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * For certain types of exceptions, it makes no sense to continue execution. 7907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 7908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * If CanContinue returns false, the correct action is to perform any C++ 7909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * cleanup needed and then return. If CanContinue returns false and 7910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * HasTerminated returns true, it is possible to call 7911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * CancelTerminateExecution in order to continue calling into the engine. 7912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 7913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool CanContinue() const; 7914a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 7916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns true if an exception has been caught due to script execution 7917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * being terminated. 7918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 7919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * There is no JavaScript representation of an execution termination 7920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * exception. Such exceptions are thrown when the TerminateExecution 7921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * methods are called to terminate a long-running script. 7922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 7923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * If such an exception has been thrown, HasTerminated will return true, 7924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * indicating that it is possible to call CancelTerminateExecution in order 7925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * to continue calling into the engine. 7926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 7927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasTerminated() const; 7928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 7930d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block * Throws the exception caught by this TryCatch in a way that avoids 7931d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block * it being caught again by this same TryCatch. As with ThrowException 7932d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block * it is illegal to execute any JavaScript operations after calling 7933d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block * ReThrow; the caller must return immediately to where the exception 7934d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block * is caught. 7935d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block */ 7936014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> ReThrow(); 7937d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 7938d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block /** 7939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns the exception caught by this try/catch block. If no exception has 7940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * been caught an empty handle is returned. 7941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 7942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * The returned handle is valid until this TryCatch block has been destroyed. 7943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 7944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Local<Value> Exception() const; 7945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 7947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns the .stack property of the thrown object. If no .stack 7948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * property is present an empty handle is returned. 7949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 7950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_DEPRECATE_SOON("Use maybe version.", Local<Value> StackTrace() const); 7951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_WARN_UNUSED_RESULT MaybeLocal<Value> StackTrace( 7952014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context) const; 7953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 7955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns the message associated with this exception. If there is 7956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * no message associated an empty handle is returned. 7957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 7958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * The returned handle is valid until this TryCatch block has been 7959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * destroyed. 7960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 7961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Local<v8::Message> Message() const; 7962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 7964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Clears any exceptions that may have been caught by this try/catch block. 7965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * After this method has been called, HasCaught() will return false. Cancels 7966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * the scheduled exception if it is caught and ReThrow() is not called before. 7967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 7968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * It is not necessary to clear a try/catch block before using it again; if 7969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * another exception is thrown the previously caught exception will just be 7970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * overwritten. However, it is often a good idea since it makes it easier 7971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * to determine which operation threw a given exception. 7972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 7973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Reset(); 7974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 7976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Set verbosity of the external exception handler. 7977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 7978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * By default, exceptions that are caught by an external exception 7979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * handler are not reported. Call SetVerbose with true on an 7980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * external exception handler to have exceptions caught by the 7981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * handler reported as if they were not caught. 7982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 7983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void SetVerbose(bool value); 7984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 7986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Set whether or not this TryCatch should capture a Message object 7987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * which holds source information about where the exception 7988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * occurred. True by default. 7989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 7990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void SetCaptureMessage(bool value); 7991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 7993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * There are cases when the raw address of C++ TryCatch object cannot be 7994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * used for comparisons with addresses into the JS stack. The cases are: 7995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 1) ARM, ARM64 and MIPS simulators which have separate JS stack. 7996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 2) Address sanitizer allocates local C++ object in the heap when 7997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * UseAfterReturn mode is enabled. 7998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * This method returns address that can be used for comparisons with 7999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * addresses into the JS stack. When neither simulator nor ASAN's 8000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * UseAfterReturn is enabled, then the address returned will be the address 8001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * of the C++ try catch handler itself. 8002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 800362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static void* JSStackComparableAddress(TryCatch* handler) { 8004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (handler == NULL) return NULL; 8005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return handler->js_stack_comparable_address_; 8006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8008f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch TryCatch(const TryCatch&) = delete; 8009f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void operator=(const TryCatch&) = delete; 801062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void* operator new(size_t size); 801162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void operator delete(void*, size_t); 8012f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 8013d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block private: 8014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void ResetInternal(); 8015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 801662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch internal::Isolate* isolate_; 801762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch TryCatch* next_; 8018a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void* exception_; 8019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* message_obj_; 8020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* js_stack_comparable_address_; 8021d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block bool is_verbose_ : 1; 8022d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block bool can_continue_ : 1; 8023d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block bool capture_message_ : 1; 8024d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block bool rethrow_ : 1; 8025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool has_terminated_ : 1; 8026d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 802762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch friend class internal::Isolate; 8028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 8029a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8030a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8031257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// --- Context --- 8032a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8033a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8034a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 8035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A container for extension names. 8036a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 8037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT ExtensionConfiguration { 8038a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 8039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExtensionConfiguration() : name_count_(0), names_(NULL) { } 8040a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ExtensionConfiguration(int name_count, const char* names[]) 8041a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : name_count_(name_count), names_(names) { } 8042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char** begin() const { return &names_[0]; } 8044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char** end() const { return &names_[name_count_]; } 8045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 8047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const int name_count_; 8048a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const char** names_; 8049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 8050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 8052a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * A sandboxed execution context with its own set of built-in objects 8053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * and functions. 8054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 8055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Context { 8056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 80571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block /** 8058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns the global proxy object. 80591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block * 8060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Global proxy object is a thin wrapper whose prototype points to actual 8061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * context's global object with the properties like Object, etc. This is done 8062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * that way for security reasons (for more details see 80631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block * https://wiki.mozilla.org/Gecko:SplitWindow). 80641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block * 80651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block * Please note that changes to global proxy object prototype most probably 8066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * would break VM---v8 expects only global object as a prototype of global 8067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * proxy object. 80681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block */ 8069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Local<Object> Global(); 8070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 8072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Detaches the global object from its context before 8073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * the global object can be reused to create a new context. 8074a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 8075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void DetachGlobal(); 8076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 807774b3c146906ea120f97974b0e16aec75c17ebf66Andrei Popescu /** 8078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Creates a new context and returns a handle to the newly allocated 8079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * context. 8080f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke * 8081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * \param isolate The isolate in which to create the context. 80829fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block * 80839fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block * \param extensions An optional extension configuration containing 80849fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block * the extensions to be installed in the newly created context. 80859fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block * 80869fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block * \param global_template An optional object template from which the 80879fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block * global object for the newly created context will be created. 80889fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block * 80899fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block * \param global_object An optional global object to be reused for 80909fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block * the newly created context. This global object must have been 80919fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block * created by a previous call to Context::New with the same global 80929fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block * template. The state of the global object will be completely reset 80939fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block * and only object identify will remain. 8094f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke */ 8095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Local<Context> New( 8096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, ExtensionConfiguration* extensions = NULL, 8097f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch MaybeLocal<ObjectTemplate> global_template = MaybeLocal<ObjectTemplate>(), 8098f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch MaybeLocal<Value> global_object = MaybeLocal<Value>()); 8099f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 810062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch /** 810162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * Create a new context from a (non-default) context snapshot. There 810262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * is no way to provide a global object template since we do not create 810362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * a new global object from template, but we can reuse a global object. 810462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * 810562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * \param isolate See v8::Context::New. 810662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * 810762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * \param context_snapshot_index The index of the context snapshot to 810862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * deserialize from. Use v8::Context::New for the default snapshot. 810962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * 811062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * \param internal_fields_deserializer Optional callback to deserialize 811162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * internal fields. It should match the SerializeInternalFieldCallback used 811262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * to serialize. 811362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * 811462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * \param extensions See v8::Context::New. 811562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * 811662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch * \param global_object See v8::Context::New. 811762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch */ 811862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 8119f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static MaybeLocal<Context> FromSnapshot( 8120f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Isolate* isolate, size_t context_snapshot_index, 812162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DeserializeInternalFieldsCallback internal_fields_deserializer = 812262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DeserializeInternalFieldsCallback(), 8123f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ExtensionConfiguration* extensions = nullptr, 8124f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch MaybeLocal<Value> global_object = MaybeLocal<Value>()); 8125f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 8126f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch /** 8127f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * Returns an global object that isn't backed by an actual context. 8128f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * 8129f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * The global template needs to have access checks with handlers installed. 8130f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * If an existing global object is passed in, the global object is detached 8131f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * from its context. 8132f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * 8133f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * Note that this is different from a detached context where all accesses to 8134f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * the global proxy will fail. Instead, the access check handlers are invoked. 8135f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * 8136f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * It is also not possible to detach an object returned by this method. 8137f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * Instead, the access check handlers need to return nothing to achieve the 8138f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * same effect. 8139f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * 8140f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * It is possible, however, to create a new context from the global object 8141f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * returned by this method. 8142f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch */ 8143f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static MaybeLocal<Object> NewRemoteContext( 8144f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Isolate* isolate, Local<ObjectTemplate> global_template, 8145f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch MaybeLocal<Value> global_object = MaybeLocal<Value>()); 8146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 8148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Sets the security token for the context. To access an object in 8149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * another context, the security tokens must match. 8150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 8151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetSecurityToken(Local<Value> token); 8152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** Restores the security token to the default value. */ 8154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void UseDefaultSecurityToken(); 8155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** Returns the security token of this context.*/ 8157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> GetSecurityToken(); 8158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 8160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Enter this context. After entering a context, all code compiled 8161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * and run is compiled and run in this context. If another context 8162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * is already entered, this old context is saved so it can be 8163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * restored when the new context is exited. 8164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 8165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Enter(); 8166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 8168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Exit this context. Exiting the current context restores the 8169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * context that was in place when entering the current context. 8170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 8171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Exit(); 8172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** Returns an isolate associated with a current context. */ 817462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate* GetIsolate(); 8175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 8177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * The field at kDebugIdIndex is reserved for V8 debugger implementation. 8178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * The value is propagated to the scripts compiled in given Context and 8179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * can be used for filtering scripts. 8180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 8181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch enum EmbedderDataFields { kDebugIdIndex = 0 }; 8182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 8184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Gets the embedder data with the given index, which must have been set by a 8185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * previous call to SetEmbedderData with the same index. Note that index 0 8186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * currently has a special meaning for Chrome's debugger. 8187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 8188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE Local<Value> GetEmbedderData(int index); 8189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 8191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Gets the binding object used by V8 extras. Extra natives get a reference 8192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * to this object and can use it to "export" functionality by adding 8193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * properties. Extra natives can also "import" functionality by accessing 8194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * properties added by the embedder using the V8 API. 8195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 8196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Object> GetExtrasBindingObject(); 8197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 8199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Sets the embedder data with the given index, growing the data as 8200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * needed. Note that index 0 currently has a special meaning for Chrome's 8201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * debugger. 8202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 8203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetEmbedderData(int index, Local<Value> value); 8204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 8206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Gets a 2-byte-aligned native pointer from the embedder data with the given 8207f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * index, which must have been set by a previous call to 8208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * SetAlignedPointerInEmbedderData with the same index. Note that index 0 8209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * currently has a special meaning for Chrome's debugger. 8210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 8211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE void* GetAlignedPointerFromEmbedderData(int index); 8212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 8214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Sets a 2-byte-aligned native pointer in the embedder data with the given 8215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * index, growing the data as needed. Note that index 0 currently has a 8216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * special meaning for Chrome's debugger. 8217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 8218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetAlignedPointerInEmbedderData(int index, void* value); 8219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 8221257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * Control whether code generation from strings is allowed. Calling 8222257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * this method with false will disable 'eval' and the 'Function' 8223257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * constructor for code running in this context. If 'eval' or the 8224257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * 'Function' constructor are used an exception will be thrown. 8225257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * 8226257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * If code generation from strings is not allowed the 8227257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * V8::AllowCodeGenerationFromStrings callback will be invoked if 8228257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * set before blocking the call to 'eval' or the 'Function' 8229257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * constructor. If that callback returns true, the call will be 8230257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * allowed, otherwise an exception will be thrown. If no callback is 8231257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * set an exception will be thrown. 8232257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch */ 8233257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void AllowCodeGenerationFromStrings(bool allow); 8234257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 8235257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch /** 82363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch * Returns true if code generation from strings is allowed for the context. 82373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch * For more details see AllowCodeGenerationFromStrings(bool) documentation. 82383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch */ 82393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool IsCodeGenerationFromStringsAllowed(); 82403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 82413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch /** 8242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Sets the error description for the exception that is thrown when 8243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * code generation from strings is not allowed and 'eval' or the 'Function' 8244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * constructor are called. 8245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 8246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetErrorMessageForCodeGenerationFromStrings(Local<String> message); 8247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /** 8249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch * Estimate the memory in bytes retained by this context. 8250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch */ 8251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t EstimatedSize(); 8252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /** 8254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Stack-allocated class which sets the execution context for all 8255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * operations executed within a local scope. 8256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 82578defd9ff6930b4e24729971a61cf7469daf119beSteve Block class Scope { 8258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 8259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch explicit V8_INLINE Scope(Local<Context> context) : context_(context) { 8260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block context_->Enter(); 8261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 8262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE ~Scope() { context_->Exit(); } 8263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 8265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Context> context_; 8266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 8267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 8269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block friend class Value; 8270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block friend class Script; 8271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block friend class Object; 8272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block friend class Function; 8273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<Value> SlowGetEmbedderData(int index); 8275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* SlowGetAlignedPointerFromEmbedderData(int index); 8276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 8277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 8280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Multiple threads in V8 are allowed, but only one thread at a time is allowed 8281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * to use any given V8 isolate, see the comments in the Isolate class. The 8282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * definition of 'using a V8 isolate' includes accessing handles or holding onto 8283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * object pointers obtained from V8 handles while in the particular V8 isolate. 8284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * It is up to the user of V8 to ensure, perhaps with locking, that this 8285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * constraint is not violated. In addition to any other synchronization 8286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * mechanism that may be used, the v8::Locker and v8::Unlocker classes must be 8287f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch * used to signal thread switches to V8. 828844f0eee88ff00398ff7f715fab053374d808c90dSteve Block * 8289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * v8::Locker is a scoped lock object. While it's active, i.e. between its 8290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * construction and destruction, the current thread is allowed to use the locked 8291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * isolate. V8 guarantees that an isolate can be locked by at most one thread at 8292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * any time. In other words, the scope of a v8::Locker is a critical section. 8293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 8294257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * Sample usage: 8295257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch* \code 8296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * ... 8297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * { 8298257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * v8::Locker locker(isolate); 8299257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * v8::Isolate::Scope isolate_scope(isolate); 8300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * ... 8301257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * // Code using V8 and isolate goes here. 8302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * ... 8303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * } // Destructor called here 8304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \endcode 8305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 8306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * If you wish to stop using V8 in a thread A you can do this either by 8307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * destroying the v8::Locker object as above or by constructing a v8::Unlocker 8308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * object: 8309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 8310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \code 8311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * { 8312257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * isolate->Exit(); 8313257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * v8::Unlocker unlocker(isolate); 8314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * ... 8315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * // Code not using V8 goes here while V8 can run in another thread. 8316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * ... 8317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * } // Destructor called here. 8318257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * isolate->Enter(); 8319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \endcode 8320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 8321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * The Unlocker object is intended for use in a long-running callback from V8, 8322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * where you want to release the V8 lock for other threads to use. 8323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 8324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * The v8::Locker is a recursive lock, i.e. you can lock more than once in a 8325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * given thread. This can be useful if you have code that can be called either 8326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * from code that holds the lock or from code that does not. The Unlocker is 8327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * not recursive so you can not have several Unlockers on the stack at once, and 8328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * you can not use an Unlocker in a thread that is not inside a Locker's scope. 8329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 8330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * An unlocker will unlock several lockers if it has to and reinstate the 8331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * correct depth of locking on its destruction, e.g.: 8332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 8333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \code 8334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * // V8 not locked. 8335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * { 8336257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * v8::Locker locker(isolate); 8337257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * Isolate::Scope isolate_scope(isolate); 8338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * // V8 locked. 8339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * { 8340257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * v8::Locker another_locker(isolate); 8341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * // V8 still locked (2 levels). 8342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * { 8343257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * isolate->Exit(); 8344257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * v8::Unlocker unlocker(isolate); 8345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * // V8 not locked. 8346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * } 8347257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * isolate->Enter(); 8348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * // V8 locked again (2 levels). 8349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * } 8350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * // V8 still locked (1 level). 8351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * } 8352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * // V8 Now no longer locked. 8353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \endcode 8354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 8355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Unlocker { 8356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 8357257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch /** 8358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Initialize Unlocker for a given Isolate. 8359257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch */ 8360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE explicit Unlocker(Isolate* isolate) { Initialize(isolate); } 8361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ~Unlocker(); 8363257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private: 8364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Initialize(Isolate* isolate); 8365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8366257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch internal::Isolate* isolate_; 8367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 8368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass V8_EXPORT Locker { 8371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 8372257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch /** 8373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Initialize Locker for a given Isolate. 8374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 8375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE explicit Locker(Isolate* isolate) { Initialize(isolate); } 8376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ~Locker(); 8378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 8380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns whether or not the locker for a given isolate, is locked by the 8381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * current thread. 8382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 8383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static bool IsLocked(Isolate* isolate); 8384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block /** 8386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Returns whether v8::Locker is being used by this V8 instance. 8387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 838869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch static bool IsActive(); 8389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8390f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Disallow copying and assigning. 8391f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Locker(const Locker&) = delete; 8392f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void operator=(const Locker&) = delete; 8393f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 8394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 8395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Initialize(Isolate* isolate); 8396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool has_lock_; 8398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool top_level_; 8399257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch internal::Isolate* isolate_; 8400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 8401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8403257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// --- Implementation --- 8404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 8407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 84083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst int kApiPointerSize = sizeof(void*); // NOLINT 84093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst int kApiIntSize = sizeof(int); // NOLINT 8410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int kApiInt64Size = sizeof(int64_t); // NOLINT 8411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Tag information for HeapObject. 8413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst int kHeapObjectTag = 1; 8414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst int kHeapObjectTagSize = 2; 8415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst intptr_t kHeapObjectTagMask = (1 << kHeapObjectTagSize) - 1; 8416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Tag information for Smi. 8418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst int kSmiTag = 0; 8419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst int kSmiTagSize = 1; 8420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst intptr_t kSmiTagMask = (1 << kSmiTagSize) - 1; 8421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8422b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochtemplate <size_t ptr_size> struct SmiTagging; 84233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 8424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<int kSmiShiftSize> 8425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochV8_INLINE internal::Object* IntToSmi(int value) { 8426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int smi_shift_bits = kSmiTagSize + kSmiShiftSize; 8427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t tagged_value = 8428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (static_cast<uintptr_t>(value) << smi_shift_bits) | kSmiTag; 8429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<internal::Object*>(tagged_value); 8430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 84323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// Smi constants for 32-bit systems. 8433b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochtemplate <> struct SmiTagging<4> { 8434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum { kSmiShiftSize = 0, kSmiValueSize = 31 }; 8435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static int SmiShiftSize() { return kSmiShiftSize; } 8436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static int SmiValueSize() { return kSmiValueSize; } 8437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static int SmiToInt(const internal::Object* value) { 84383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block int shift_bits = kSmiTagSize + kSmiShiftSize; 84393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block // Throw away top 32 bits and shift down (requires >> to be sign extending). 84403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return static_cast<int>(reinterpret_cast<intptr_t>(value)) >> shift_bits; 84413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block } 8442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static internal::Object* IntToSmi(int value) { 8443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return internal::IntToSmi<kSmiShiftSize>(value); 8444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static bool IsValidSmi(intptr_t value) { 8446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // To be representable as an tagged small integer, the two 8447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // most-significant bits of 'value' must be either 00 or 11 due to 8448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // sign-extension. To check this we add 01 to the two 8449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // most-significant bits, and check if the most-significant bit is 0 8450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 8451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // CAUTION: The original code below: 8452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // bool result = ((value + 0x40000000) & 0x80000000) == 0; 8453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // may lead to incorrect results according to the C language spec, and 8454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // in fact doesn't work correctly with gcc4.1.1 in some cases: The 8455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // compiler may produce undefined results in case of signed integer 8456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // overflow. The computation must be done w/ unsigned ints. 8457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<uintptr_t>(value + 0x40000000U) < 0x80000000U; 8458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 84593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}; 84603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 84613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// Smi constants for 64-bit systems. 8462b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochtemplate <> struct SmiTagging<8> { 8463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum { kSmiShiftSize = 31, kSmiValueSize = 32 }; 8464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static int SmiShiftSize() { return kSmiShiftSize; } 8465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static int SmiValueSize() { return kSmiValueSize; } 8466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static int SmiToInt(const internal::Object* value) { 84673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block int shift_bits = kSmiTagSize + kSmiShiftSize; 84683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block // Shift down and throw away top 32 bits. 84693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return static_cast<int>(reinterpret_cast<intptr_t>(value) >> shift_bits); 84703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block } 8471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static internal::Object* IntToSmi(int value) { 8472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return internal::IntToSmi<kSmiShiftSize>(value); 8473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static bool IsValidSmi(intptr_t value) { 8475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // To be representable as a long smi, the value must be a 32-bit integer. 8476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (value == static_cast<int32_t>(value)); 8477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 84783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}; 84793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 8480b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochtypedef SmiTagging<kApiPointerSize> PlatformSmiTagging; 8481b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochconst int kSmiShiftSize = PlatformSmiTagging::kSmiShiftSize; 8482b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochconst int kSmiValueSize = PlatformSmiTagging::kSmiValueSize; 8483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochV8_INLINE static bool SmiValuesAre31Bits() { return kSmiValueSize == 31; } 8484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochV8_INLINE static bool SmiValuesAre32Bits() { return kSmiValueSize == 32; } 8485d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 8486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 8487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * This class exports constants and functionality from within v8 that 8488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * is necessary to implement inline functions in the v8 api. Don't 8489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * depend on functions and constants defined here. 8490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 8491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Internals { 8492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 8493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // These values match non-compiler-dependent values defined within 8494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // the implementation of v8. 8495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kHeapObjectMapOffset = 0; 8496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kMapInstanceTypeAndBitFieldOffset = 8497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1 * kApiPointerSize + kApiIntSize; 8498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kStringResourceOffset = 3 * kApiPointerSize; 8499d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 8500f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kOddballKindOffset = 4 * kApiPointerSize + sizeof(double); 8501257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static const int kForeignAddressOffset = kApiPointerSize; 85028a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang static const int kJSObjectHeaderSize = 3 * kApiPointerSize; 8503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kFixedArrayHeaderSize = 2 * kApiPointerSize; 8504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kContextHeaderSize = 2 * kApiPointerSize; 8505014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kContextEmbedderDataIndex = 5; 850662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kFullStringRepresentationMask = 0x0f; 850762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kStringEncodingMask = 0x8; 85087f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kExternalTwoByteRepresentationTag = 0x02; 850962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kExternalOneByteRepresentationTag = 0x0a; 8510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kIsolateEmbedderDataOffset = 0 * kApiPointerSize; 851213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kExternalMemoryOffset = 4 * kApiPointerSize; 851313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kExternalMemoryLimitOffset = 851413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kExternalMemoryOffset + kApiInt64Size; 851513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kIsolateRootsOffset = kExternalMemoryLimitOffset + 851613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kApiInt64Size + kApiInt64Size + 851713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kApiPointerSize + kApiPointerSize; 85183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kUndefinedValueRootIndex = 4; 85193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kTheHoleValueRootIndex = 5; 85203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kNullValueRootIndex = 6; 85213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kTrueValueRootIndex = 7; 85223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kFalseValueRootIndex = 8; 85233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kEmptyStringRootIndex = 9; 8524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNodeClassIdOffset = 1 * kApiPointerSize; 8526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNodeFlagsOffset = 1 * kApiPointerSize + 3; 8527958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kNodeStateMask = 0x7; 8528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNodeStateIsWeakValue = 2; 8529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNodeStateIsPendingValue = 3; 8530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNodeStateIsNearDeathValue = 4; 8531958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kNodeIsIndependentShift = 3; 8532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kNodeIsActiveShift = 4; 8533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 853462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kJSApiObjectType = 0xb9; 853562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kJSObjectType = 0xba; 85369dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen static const int kFirstNonstringType = 0x80; 853762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kOddballType = 0x82; 853862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kForeignType = 0x86; 8539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kUndefinedOddballKind = 5; 8541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNullOddballKind = 3; 8542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const uint32_t kNumIsolateDataSlots = 4; 8544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_EXPORT static void CheckInitializedImpl(v8::Isolate* isolate); 8546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static void CheckInitialized(v8::Isolate* isolate) { 8547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_ENABLE_CHECKS 8548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckInitializedImpl(isolate); 8549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 8550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static bool HasHeapObjectTag(const internal::Object* value) { 8553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ((reinterpret_cast<intptr_t>(value) & kHeapObjectTagMask) == 8554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kHeapObjectTag); 8555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 8556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static int SmiValue(const internal::Object* value) { 8558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return PlatformSmiTagging::SmiToInt(value); 8559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 8560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static internal::Object* IntToSmi(int value) { 8562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return PlatformSmiTagging::IntToSmi(value); 85633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block } 85643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 8565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static bool IsValidSmi(intptr_t value) { 8566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return PlatformSmiTagging::IsValidSmi(value); 85673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block } 85683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 8569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static int GetInstanceType(const internal::Object* obj) { 8570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Object O; 8571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch O* map = ReadField<O*>(obj, kHeapObjectMapOffset); 8572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Map::InstanceType is defined so that it will always be loaded into 8573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the LS 8 bits of one 16-bit word, regardless of endianess. 8574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReadField<uint16_t>(map, kMapInstanceTypeAndBitFieldOffset) & 0xff; 8575b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 8576b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 8577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static int GetOddballKind(const internal::Object* obj) { 8578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Object O; 8579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return SmiValue(ReadField<O*>(obj, kOddballKindOffset)); 8580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 8581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static bool IsExternalTwoByteString(int instance_type) { 8583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int representation = (instance_type & kFullStringRepresentationMask); 8584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return representation == kExternalTwoByteRepresentationTag; 8585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 8586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static uint8_t GetNodeFlag(internal::Object** obj, int shift) { 8588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset; 8589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return *addr & static_cast<uint8_t>(1U << shift); 8590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static void UpdateNodeFlag(internal::Object** obj, 8593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool value, int shift) { 8594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset; 8595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint8_t mask = static_cast<uint8_t>(1U << shift); 8596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *addr = static_cast<uint8_t>((*addr & ~mask) | (value << shift)); 8597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static uint8_t GetNodeState(internal::Object** obj) { 8600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset; 8601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return *addr & kNodeStateMask; 8602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static void UpdateNodeState(internal::Object** obj, 8605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint8_t value) { 8606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset; 8607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *addr = static_cast<uint8_t>((*addr & ~kNodeStateMask) | value); 8608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static void SetEmbedderData(v8::Isolate* isolate, 8611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t slot, 8612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* data) { 8613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + 8614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kIsolateEmbedderDataOffset + slot * kApiPointerSize; 8615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *reinterpret_cast<void**>(addr) = data; 8616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static void* GetEmbedderData(const v8::Isolate* isolate, 8619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t slot) { 8620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const uint8_t* addr = reinterpret_cast<const uint8_t*>(isolate) + 8621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kIsolateEmbedderDataOffset + slot * kApiPointerSize; 8622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return *reinterpret_cast<void* const*>(addr); 8623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static internal::Object** GetRoot(v8::Isolate* isolate, 8626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index) { 8627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + kIsolateRootsOffset; 8628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<internal::Object**>(addr + index * kApiPointerSize); 8629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block template <typename T> 8632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static T ReadField(const internal::Object* ptr, int offset) { 8633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const uint8_t* addr = 8634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reinterpret_cast<const uint8_t*>(ptr) + offset - kHeapObjectTag; 8635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return *reinterpret_cast<const T*>(addr); 8636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 863744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 8638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <typename T> 8639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8_INLINE static T ReadEmbedderData(const v8::Context* context, int index) { 8640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Object O; 8641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 8642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch O* ctx = *reinterpret_cast<O* const*>(context); 8643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int embedder_data_offset = I::kContextHeaderSize + 8644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (internal::kApiPointerSize * I::kContextEmbedderDataIndex); 8645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch O* embedder_data = I::ReadField<O*>(ctx, embedder_data_offset); 8646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int value_offset = 8647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch I::kFixedArrayHeaderSize + (internal::kApiPointerSize * index); 8648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return I::ReadField<T>(embedder_data, value_offset); 8649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 8651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 86523e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu} // namespace internal 8653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <class T> 8656014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLocal<T> Local<T>::New(Isolate* isolate, Local<T> that) { 8657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return New(isolate, that.val_); 8658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 8659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class T> 8661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLocal<T> Local<T>::New(Isolate* isolate, const PersistentBase<T>& that) { 8662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return New(isolate, that.val_); 8663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <class T> 8667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLocal<T> Local<T>::New(Isolate* isolate, T* that) { 8668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (that == NULL) return Local<T>(); 8669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T* that_ptr = that; 8670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr); 8671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle( 8672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reinterpret_cast<internal::Isolate*>(isolate), *p))); 8673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 8674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class T> 8677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class S> 8678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Eternal<T>::Set(Isolate* isolate, Local<S> handle) { 8679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(T, S); 8680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8::Eternalize(isolate, reinterpret_cast<Value*>(*handle), &this->index_); 8681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 8682a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class T> 8685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLocal<T> Eternal<T>::Get(Isolate* isolate) { 8686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Local<T>(reinterpret_cast<T*>(*V8::GetEternal(isolate, index_))); 8687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 8688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <class T> 8691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLocal<T> MaybeLocal<T>::ToLocalChecked() { 8692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (V8_UNLIKELY(val_ == nullptr)) V8::ToLocalEmpty(); 8693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Local<T>(val_); 8694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 8695014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <class T> 8698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid* WeakCallbackInfo<T>::GetInternalField(int index) const { 8699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef V8_ENABLE_CHECKS 8700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (index < 0 || index >= kInternalFieldsInWeakCallback) { 8701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8::InternalFieldOutOfBounds(index); 8702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 8703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif 8704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return internal_fields_[index]; 8705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 8706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <class T> 8709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochT* PersistentBase<T>::New(Isolate* isolate, T* that) { 8710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (that == NULL) return NULL; 8711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object** p = reinterpret_cast<internal::Object**>(that); 8712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<T*>( 8713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8::GlobalizeReference(reinterpret_cast<internal::Isolate*>(isolate), 8714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch p)); 8715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class T, class M> 8719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class S, class M2> 8720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Persistent<T, M>::Copy(const Persistent<S, M2>& that) { 8721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(T, S); 8722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch this->Reset(); 8723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (that.IsEmpty()) return; 8724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object** p = reinterpret_cast<internal::Object**>(that.val_); 8725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch this->val_ = reinterpret_cast<T*>(V8::CopyPersistent(p)); 8726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch M::Copy(that, this); 8727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <class T> 8731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool PersistentBase<T>::IsIndependent() const { 8732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 8733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsEmpty()) return false; 8734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return I::GetNodeFlag(reinterpret_cast<internal::Object**>(this->val_), 8735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch I::kNodeIsIndependentShift); 8736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 8737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <class T> 8740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool PersistentBase<T>::IsNearDeath() const { 8741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 8742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsEmpty()) return false; 8743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint8_t node_state = 8744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch I::GetNodeState(reinterpret_cast<internal::Object**>(this->val_)); 8745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return node_state == I::kNodeStateIsNearDeathValue || 8746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node_state == I::kNodeStateIsPendingValue; 8747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 8748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 875044f0eee88ff00398ff7f715fab053374d808c90dSteve Blocktemplate <class T> 8751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool PersistentBase<T>::IsWeak() const { 8752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 8753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsEmpty()) return false; 8754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return I::GetNodeState(reinterpret_cast<internal::Object**>(this->val_)) == 8755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch I::kNodeStateIsWeakValue; 8756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class T> 8760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid PersistentBase<T>::Reset() { 8761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsEmpty()) return; 8762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8::DisposeGlobal(reinterpret_cast<internal::Object**>(this->val_)); 8763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val_ = 0; 8764257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 8765257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 8766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class T> 8768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class S> 8769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid PersistentBase<T>::Reset(Isolate* isolate, const Local<S>& other) { 8770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(T, S); 8771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Reset(); 8772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (other.IsEmpty()) return; 8773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch this->val_ = New(isolate, other.val_); 8774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class T> 8778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class S> 8779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid PersistentBase<T>::Reset(Isolate* isolate, 8780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PersistentBase<S>& other) { 8781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(T, S); 8782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Reset(); 8783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (other.IsEmpty()) return; 8784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch this->val_ = New(isolate, other.val_); 8785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class T> 8789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename P> 8790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochV8_INLINE void PersistentBase<T>::SetWeak( 8791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch P* parameter, typename WeakCallbackInfo<P>::Callback callback, 8792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WeakCallbackType type) { 8793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef typename WeakCallbackInfo<void>::Callback Callback; 8794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8::MakeWeak(reinterpret_cast<internal::Object**>(this->val_), parameter, 8795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch reinterpret_cast<Callback>(callback), type); 8796958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8797958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8798bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochtemplate <class T> 8799bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid PersistentBase<T>::SetWeak() { 8800bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch V8::MakeWeak(reinterpret_cast<internal::Object***>(&this->val_)); 8801bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch} 8802958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8803958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertemplate <class T> 8804958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertemplate <typename P> 8805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochP* PersistentBase<T>::ClearWeak() { 8806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<P*>( 8807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8::ClearWeak(reinterpret_cast<internal::Object**>(this->val_))); 8808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 88103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochtemplate <class T> 8811c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochvoid PersistentBase<T>::RegisterExternalReference(Isolate* isolate) const { 88123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (IsEmpty()) return; 8813c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8::RegisterExternallyReferencedObject( 8814c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch reinterpret_cast<internal::Object**>(this->val_), 8815c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch reinterpret_cast<internal::Isolate*>(isolate)); 88163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 8817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class T> 8819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid PersistentBase<T>::MarkIndependent() { 8820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 8821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsEmpty()) return; 8822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(this->val_), 8823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch true, 8824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch I::kNodeIsIndependentShift); 8825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class T> 8828014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid PersistentBase<T>::MarkActive() { 8829014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef internal::Internals I; 8830014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (this->IsEmpty()) return; 8831014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(this->val_), true, 8832014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch I::kNodeIsActiveShift); 8833014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 8834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <class T> 8837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid PersistentBase<T>::SetWrapperClassId(uint16_t class_id) { 8838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 8839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsEmpty()) return; 8840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object** obj = reinterpret_cast<internal::Object**>(this->val_); 8841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset; 8842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *reinterpret_cast<uint16_t*>(addr) = class_id; 8843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class T> 8847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint16_t PersistentBase<T>::WrapperClassId() const { 8848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 8849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsEmpty()) return 0; 8850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object** obj = reinterpret_cast<internal::Object**>(this->val_); 8851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset; 8852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return *reinterpret_cast<uint16_t*>(addr); 8853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 8857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochReturnValue<T>::ReturnValue(internal::Object** slot) : value_(slot) {} 8858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 8860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename S> 8861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid ReturnValue<T>::Set(const Persistent<S>& handle) { 8862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(T, S); 8863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (V8_UNLIKELY(handle.IsEmpty())) { 8864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *value_ = GetDefaultValue(); 8865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 8866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *value_ = *reinterpret_cast<internal::Object**>(*handle); 8867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename T> 8871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename S> 8872014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid ReturnValue<T>::Set(const Global<S>& handle) { 8873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch TYPE_CHECK(T, S); 8874014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (V8_UNLIKELY(handle.IsEmpty())) { 8875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch *value_ = GetDefaultValue(); 8876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 8877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch *value_ = *reinterpret_cast<internal::Object**>(*handle); 8878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 8879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 8880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename T> 8882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename S> 8883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid ReturnValue<T>::Set(const Local<S> handle) { 8884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(T, S); 8885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (V8_UNLIKELY(handle.IsEmpty())) { 8886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *value_ = GetDefaultValue(); 8887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 8888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *value_ = *reinterpret_cast<internal::Object**>(*handle); 8889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 8893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid ReturnValue<T>::Set(double i) { 8894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(T, Number); 8895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Set(Number::New(GetIsolate(), i)); 8896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 8899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid ReturnValue<T>::Set(int32_t i) { 8900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(T, Integer); 8901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 8902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (V8_LIKELY(I::IsValidSmi(i))) { 8903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *value_ = I::IntToSmi(i); 8904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 8905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Set(Integer::New(GetIsolate(), i)); 8907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 8910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid ReturnValue<T>::Set(uint32_t i) { 8911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(T, Integer); 8912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Can't simply use INT32_MAX here for whatever reason. 8913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool fits_into_int32_t = (i & (1U << 31)) == 0; 8914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (V8_LIKELY(fits_into_int32_t)) { 8915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Set(static_cast<int32_t>(i)); 8916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 8917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Set(Integer::NewFromUnsigned(GetIsolate(), i)); 8919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 8922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid ReturnValue<T>::Set(bool value) { 8923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(T, Boolean); 8924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 8925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int root_index; 8926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value) { 8927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch root_index = I::kTrueValueRootIndex; 8928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 8929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch root_index = I::kFalseValueRootIndex; 8930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *value_ = *I::GetRoot(GetIsolate(), root_index); 8932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 8935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid ReturnValue<T>::SetNull() { 8936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(T, Primitive); 8937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 8938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *value_ = *I::GetRoot(GetIsolate(), I::kNullValueRootIndex); 8939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 8942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid ReturnValue<T>::SetUndefined() { 8943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(T, Primitive); 8944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 8945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *value_ = *I::GetRoot(GetIsolate(), I::kUndefinedValueRootIndex); 8946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 8949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid ReturnValue<T>::SetEmptyString() { 8950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(T, String); 8951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 8952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *value_ = *I::GetRoot(GetIsolate(), I::kEmptyStringRootIndex); 8953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 89553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochtemplate <typename T> 89563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochIsolate* ReturnValue<T>::GetIsolate() const { 8957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Isolate is always the pointer below the default value on the stack. 8958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return *reinterpret_cast<Isolate**>(&value_[-2]); 8959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 89613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochtemplate <typename T> 89623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochLocal<Value> ReturnValue<T>::Get() const { 89633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch typedef internal::Internals I; 89643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (*value_ == *I::GetRoot(GetIsolate(), I::kTheHoleValueRootIndex)) 89653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return Local<Value>(*Undefined(GetIsolate())); 89663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return Local<Value>::New(GetIsolate(), reinterpret_cast<Value*>(value_)); 89673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 89683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 89693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochtemplate <typename T> 89703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochtemplate <typename S> 8971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid ReturnValue<T>::Set(S* whatever) { 8972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Uncompilable to prevent inadvertent misuse. 8973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(S*, Primitive); 897444f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 89758defd9ff6930b4e24729971a61cf7469daf119beSteve Block 8976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 8977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinternal::Object* ReturnValue<T>::GetDefaultValue() { 8978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Default value is always the pointer below value_ on the stack. 8979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return value_[-1]; 8980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 8981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8982bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochtemplate <typename T> 8983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFunctionCallbackInfo<T>::FunctionCallbackInfo(internal::Object** implicit_args, 8984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::Object** values, 8985bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch int length) 8986bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch : implicit_args_(implicit_args), values_(values), length_(length) {} 89878defd9ff6930b4e24729971a61cf7469daf119beSteve Block 8988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 8989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLocal<Value> FunctionCallbackInfo<T>::operator[](int i) const { 8990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (i < 0 || length_ <= i) return Local<Value>(*Undefined(GetIsolate())); 8991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Local<Value>(reinterpret_cast<Value*>(values_ - i)); 8992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 8993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 8996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLocal<Function> FunctionCallbackInfo<T>::Callee() const { 89973e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu return Local<Function>(reinterpret_cast<Function*>( 89983e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu &implicit_args_[kCalleeIndex])); 8999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 9003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLocal<Object> FunctionCallbackInfo<T>::This() const { 9004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Local<Object>(reinterpret_cast<Object*>(values_ + 1)); 9005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9006a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 9009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLocal<Object> FunctionCallbackInfo<T>::Holder() const { 90103e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu return Local<Object>(reinterpret_cast<Object*>( 90113e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu &implicit_args_[kHolderIndex])); 9012a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9013a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9014bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochtemplate <typename T> 9015bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochLocal<Value> FunctionCallbackInfo<T>::NewTarget() const { 9016bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return Local<Value>( 9017bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch reinterpret_cast<Value*>(&implicit_args_[kNewTargetIndex])); 9018bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch} 9019a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9020bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochtemplate <typename T> 9021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLocal<Value> FunctionCallbackInfo<T>::Data() const { 90223e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu return Local<Value>(reinterpret_cast<Value*>(&implicit_args_[kDataIndex])); 9023a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9025a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 9027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochIsolate* FunctionCallbackInfo<T>::GetIsolate() const { 9028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return *reinterpret_cast<Isolate**>(&implicit_args_[kIsolateIndex]); 9029a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9030a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9031a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 9033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochReturnValue<T> FunctionCallbackInfo<T>::GetReturnValue() const { 9034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReturnValue<T>(&implicit_args_[kReturnValueIndex]); 9035a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9036a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9037a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 9039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool FunctionCallbackInfo<T>::IsConstructCall() const { 9040bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return !NewTarget()->IsUndefined(); 9041a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9042a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 9045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint FunctionCallbackInfo<T>::Length() const { 9046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return length_; 9047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochScriptOrigin::ScriptOrigin(Local<Value> resource_name, 9050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Integer> resource_line_offset, 9051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Integer> resource_column_offset, 9052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Boolean> resource_is_shared_cross_origin, 9053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Integer> script_id, 9054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<Value> source_map_url, 905562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Local<Boolean> resource_is_opaque, 905662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Local<Boolean> is_wasm, Local<Boolean> is_module) 9057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : resource_name_(resource_name), 9058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch resource_line_offset_(resource_line_offset), 9059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch resource_column_offset_(resource_column_offset), 906062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch options_(!resource_is_shared_cross_origin.IsEmpty() && 9061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch resource_is_shared_cross_origin->IsTrue(), 906262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch !resource_is_opaque.IsEmpty() && resource_is_opaque->IsTrue(), 906362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch !is_wasm.IsEmpty() && is_wasm->IsTrue(), 906462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch !is_module.IsEmpty() && is_module->IsTrue()), 9065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch script_id_(script_id), 9066014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch source_map_url_(source_map_url) {} 9067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLocal<Value> ScriptOrigin::ResourceName() const { return resource_name_; } 9069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLocal<Integer> ScriptOrigin::ResourceLineOffset() const { 9072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return resource_line_offset_; 9073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9074a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLocal<Integer> ScriptOrigin::ResourceColumnOffset() const { 9077a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return resource_column_offset_; 9078a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9081014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLocal<Integer> ScriptOrigin::ScriptID() const { return script_id_; } 9082a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLocal<Value> ScriptOrigin::SourceMapUrl() const { return source_map_url_; } 9085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochScriptCompiler::Source::Source(Local<String> string, const ScriptOrigin& origin, 9088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CachedData* data) 9089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : source_string(string), 9090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch resource_name(origin.ResourceName()), 9091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch resource_line_offset(origin.ResourceLineOffset()), 9092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch resource_column_offset(origin.ResourceColumnOffset()), 9093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch resource_options(origin.Options()), 9094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch source_map_url(origin.SourceMapUrl()), 9095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cached_data(data) {} 9096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochScriptCompiler::Source::Source(Local<String> string, 9099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CachedData* data) 9100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : source_string(string), cached_data(data) {} 9101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochScriptCompiler::Source::~Source() { 9104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete cached_data; 9105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst ScriptCompiler::CachedData* ScriptCompiler::Source::GetCachedData() 9109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const { 9110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return cached_data; 9111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 911362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochconst ScriptOriginOptions& ScriptCompiler::Source::GetResourceOptions() const { 911462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return resource_options; 911562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 9116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLocal<Boolean> Boolean::New(Isolate* isolate, bool value) { 9118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return value ? True(isolate) : False(isolate); 9119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 912162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid Template::Set(Isolate* isolate, const char* name, Local<Data> value) { 912262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Set(String::NewFromUtf8(isolate, name, NewStringType::kInternalized) 9123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch .ToLocalChecked(), 9124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch value); 9125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLocal<Value> Object::GetInternalField(int index) { 9129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifndef V8_ENABLE_CHECKS 91303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block typedef internal::Object O; 9131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::HeapObject HO; 91323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block typedef internal::Internals I; 91333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block O* obj = *reinterpret_cast<O**>(this); 9134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Fast path: If the object is a plain JSObject, which is the common case, we 9135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // know where to find the internal fields and can return the value directly. 9136bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch auto instance_type = I::GetInstanceType(obj); 9137bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch if (instance_type == I::kJSObjectType || 9138bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch instance_type == I::kJSApiObjectType) { 91398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index); 91403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block O* value = I::ReadField<O*>(obj, offset); 9141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch O** result = HandleScope::CreateHandle(reinterpret_cast<HO*>(obj), value); 9142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Local<Value>(reinterpret_cast<Value*>(result)); 91433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block } 9144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return SlowGetInternalField(index); 9146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 91473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 9148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid* Object::GetAlignedPointerFromInternalField(int index) { 9150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifndef V8_ENABLE_CHECKS 9151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Object O; 9152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 9153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch O* obj = *reinterpret_cast<O**>(this); 9154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Fast path: If the object is a plain JSObject, which is the common case, we 9155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // know where to find the internal fields and can return the value directly. 9156bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch auto instance_type = I::GetInstanceType(obj); 9157bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch if (V8_LIKELY(instance_type == I::kJSObjectType || 9158bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch instance_type == I::kJSApiObjectType)) { 9159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index); 9160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return I::ReadField<void*>(obj, offset); 9161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return SlowGetAlignedPointerFromInternalField(index); 9164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockString* String::Cast(v8::Value* value) { 9167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef V8_ENABLE_CHECKS 9168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CheckCast(value); 9169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 9170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<String*>(value); 9171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLocal<String> String::Empty(Isolate* isolate) { 9175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Object* S; 9176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 9177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch I::CheckInitialized(isolate); 9178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch S* slot = I::GetRoot(isolate, I::kEmptyStringRootIndex); 9179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Local<String>(reinterpret_cast<String*>(slot)); 9180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockString::ExternalStringResource* String::GetExternalStringResource() const { 9184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block typedef internal::Object O; 9185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block typedef internal::Internals I; 9186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch O* obj = *reinterpret_cast<O* const*>(this); 9187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block String::ExternalStringResource* result; 91883ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block if (I::IsExternalTwoByteString(I::GetInstanceType(obj))) { 9189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void* value = I::ReadField<void*>(obj, I::kStringResourceOffset); 9190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block result = reinterpret_cast<String::ExternalStringResource*>(value); 9191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 9192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block result = NULL; 9193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 9194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef V8_ENABLE_CHECKS 9195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block VerifyExternalStringResource(result); 9196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 9197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return result; 9198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochString::ExternalStringResourceBase* String::GetExternalStringResourceBase( 9202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String::Encoding* encoding_out) const { 9203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Object O; 9204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 9205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch O* obj = *reinterpret_cast<O* const*>(this); 9206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int type = I::GetInstanceType(obj) & I::kFullStringRepresentationMask; 9207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *encoding_out = static_cast<Encoding>(type & I::kStringEncodingMask); 9208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalStringResourceBase* resource = NULL; 9209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type == I::kExternalOneByteRepresentationTag || 9210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch type == I::kExternalTwoByteRepresentationTag) { 9211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* value = I::ReadField<void*>(obj, I::kStringResourceOffset); 9212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch resource = static_cast<ExternalStringResourceBase*>(value); 9213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_ENABLE_CHECKS 9215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VerifyExternalStringResourceBase(resource, *encoding_out); 9216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return resource; 9218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Value::IsUndefined() const { 9222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_ENABLE_CHECKS 9223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return FullIsUndefined(); 9224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#else 9225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return QuickIsUndefined(); 9226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Value::QuickIsUndefined() const { 9230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Object O; 9231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 9232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch O* obj = *reinterpret_cast<O* const*>(this); 9233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!I::HasHeapObjectTag(obj)) return false; 9234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (I::GetInstanceType(obj) != I::kOddballType) return false; 9235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (I::GetOddballKind(obj) == I::kUndefinedOddballKind); 9236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Value::IsNull() const { 9240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_ENABLE_CHECKS 9241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return FullIsNull(); 9242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#else 9243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return QuickIsNull(); 9244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Value::QuickIsNull() const { 9248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Object O; 9249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 9250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch O* obj = *reinterpret_cast<O* const*>(this); 9251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!I::HasHeapObjectTag(obj)) return false; 9252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (I::GetInstanceType(obj) != I::kOddballType) return false; 9253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (I::GetOddballKind(obj) == I::kNullOddballKind); 9254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 925662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool Value::IsNullOrUndefined() const { 925762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#ifdef V8_ENABLE_CHECKS 925862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return FullIsNull() || FullIsUndefined(); 925962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#else 926062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return QuickIsNullOrUndefined(); 926162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#endif 926262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 926362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 926462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool Value::QuickIsNullOrUndefined() const { 926562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef internal::Object O; 926662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef internal::Internals I; 926762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch O* obj = *reinterpret_cast<O* const*>(this); 926862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (!I::HasHeapObjectTag(obj)) return false; 926962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (I::GetInstanceType(obj) != I::kOddballType) return false; 927062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int kind = I::GetOddballKind(obj); 927162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return kind == I::kNullOddballKind || kind == I::kUndefinedOddballKind; 927262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 9273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Value::IsString() const { 9275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef V8_ENABLE_CHECKS 9276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return FullIsString(); 9277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#else 9278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return QuickIsString(); 9279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 9280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Value::QuickIsString() const { 9283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block typedef internal::Object O; 9284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block typedef internal::Internals I; 9285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch O* obj = *reinterpret_cast<O* const*>(this); 9286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!I::HasHeapObjectTag(obj)) return false; 92873ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return (I::GetInstanceType(obj) < I::kFirstNonstringType); 9288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class T> Value* Value::Cast(T* value) { 9292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<Value*>(value); 9293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierLocal<Boolean> Value::ToBoolean() const { 9297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ToBoolean(Isolate::GetCurrent()->GetCurrentContext()) 9298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch .FromMaybe(Local<Boolean>()); 9299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 9300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierLocal<Number> Value::ToNumber() const { 9303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ToNumber(Isolate::GetCurrent()->GetCurrentContext()) 9304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch .FromMaybe(Local<Number>()); 9305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 9306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierLocal<String> Value::ToString() const { 9309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ToString(Isolate::GetCurrent()->GetCurrentContext()) 9310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch .FromMaybe(Local<String>()); 9311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 9312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierLocal<String> Value::ToDetailString() const { 9315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ToDetailString(Isolate::GetCurrent()->GetCurrentContext()) 9316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch .FromMaybe(Local<String>()); 9317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 9318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierLocal<Object> Value::ToObject() const { 9321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ToObject(Isolate::GetCurrent()->GetCurrentContext()) 9322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch .FromMaybe(Local<Object>()); 9323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 9324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierLocal<Integer> Value::ToInteger() const { 9327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ToInteger(Isolate::GetCurrent()->GetCurrentContext()) 9328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch .FromMaybe(Local<Integer>()); 9329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 9330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierLocal<Uint32> Value::ToUint32() const { 9333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ToUint32(Isolate::GetCurrent()->GetCurrentContext()) 9334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch .FromMaybe(Local<Uint32>()); 9335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 9336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLocal<Int32> Value::ToInt32() const { 9339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ToInt32(Isolate::GetCurrent()->GetCurrentContext()) 9340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch .FromMaybe(Local<Int32>()); 9341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 9342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochBoolean* Boolean::Cast(v8::Value* value) { 9345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef V8_ENABLE_CHECKS 9346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckCast(value); 9347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif 9348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return static_cast<Boolean*>(value); 9349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 9350958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochName* Name::Cast(v8::Value* value) { 9353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_ENABLE_CHECKS 9354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckCast(value); 9355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<Name*>(value); 9357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSymbol* Symbol::Cast(v8::Value* value) { 9361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_ENABLE_CHECKS 9362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckCast(value); 9363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<Symbol*>(value); 9365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockNumber* Number::Cast(v8::Value* value) { 9369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef V8_ENABLE_CHECKS 9370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CheckCast(value); 9371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 9372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<Number*>(value); 9373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockInteger* Integer::Cast(v8::Value* value) { 9377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef V8_ENABLE_CHECKS 9378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CheckCast(value); 9379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 9380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<Integer*>(value); 9381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochInt32* Int32::Cast(v8::Value* value) { 9385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef V8_ENABLE_CHECKS 9386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckCast(value); 9387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif 9388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return static_cast<Int32*>(value); 9389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 9390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochUint32* Uint32::Cast(v8::Value* value) { 9393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef V8_ENABLE_CHECKS 9394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckCast(value); 9395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif 9396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return static_cast<Uint32*>(value); 9397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 9398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDate* Date::Cast(v8::Value* value) { 9401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef V8_ENABLE_CHECKS 9402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CheckCast(value); 9403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 9404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<Date*>(value); 9405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 94083fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochStringObject* StringObject::Cast(v8::Value* value) { 94093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#ifdef V8_ENABLE_CHECKS 94103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch CheckCast(value); 94113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#endif 94123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return static_cast<StringObject*>(value); 94133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 94143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 94153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 9416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSymbolObject* SymbolObject::Cast(v8::Value* value) { 9417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_ENABLE_CHECKS 9418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckCast(value); 9419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<SymbolObject*>(value); 9421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 94243fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochNumberObject* NumberObject::Cast(v8::Value* value) { 94253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#ifdef V8_ENABLE_CHECKS 94263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch CheckCast(value); 94273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#endif 94283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return static_cast<NumberObject*>(value); 94293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 94303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 94313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 94323fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBooleanObject* BooleanObject::Cast(v8::Value* value) { 94333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#ifdef V8_ENABLE_CHECKS 94343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch CheckCast(value); 94353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#endif 94363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return static_cast<BooleanObject*>(value); 94373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 94383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 94393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 9440f87a203d89e1bbb6708282e0b64dbd13d59b723dBen MurdochRegExp* RegExp::Cast(v8::Value* value) { 9441f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch#ifdef V8_ENABLE_CHECKS 9442f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CheckCast(value); 9443f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch#endif 9444f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch return static_cast<RegExp*>(value); 9445f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch} 9446f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 9447f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 9448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* Object::Cast(v8::Value* value) { 9449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef V8_ENABLE_CHECKS 9450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CheckCast(value); 9451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 9452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<Object*>(value); 9453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockArray* Array::Cast(v8::Value* value) { 9457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef V8_ENABLE_CHECKS 9458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CheckCast(value); 9459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 9460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<Array*>(value); 9461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMap* Map::Cast(v8::Value* value) { 9465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef V8_ENABLE_CHECKS 9466014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckCast(value); 9467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif 9468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return static_cast<Map*>(value); 9469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 9470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9472014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSet* Set::Cast(v8::Value* value) { 9473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef V8_ENABLE_CHECKS 9474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckCast(value); 9475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif 9476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return static_cast<Set*>(value); 9477014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 9478014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9479014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochPromise* Promise::Cast(v8::Value* value) { 9481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_ENABLE_CHECKS 9482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckCast(value); 9483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<Promise*>(value); 9485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9488014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochProxy* Proxy::Cast(v8::Value* value) { 9489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef V8_ENABLE_CHECKS 9490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckCast(value); 9491014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif 9492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return static_cast<Proxy*>(value); 9493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 9494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9495f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochWasmCompiledModule* WasmCompiledModule::Cast(v8::Value* value) { 9496f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#ifdef V8_ENABLE_CHECKS 9497f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CheckCast(value); 9498f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif 9499f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return static_cast<WasmCompiledModule*>(value); 9500f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 9501014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochPromise::Resolver* Promise::Resolver::Cast(v8::Value* value) { 9503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_ENABLE_CHECKS 9504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckCast(value); 9505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<Promise::Resolver*>(value); 9507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochArrayBuffer* ArrayBuffer::Cast(v8::Value* value) { 9511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_ENABLE_CHECKS 9512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckCast(value); 9513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<ArrayBuffer*>(value); 9515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochArrayBufferView* ArrayBufferView::Cast(v8::Value* value) { 9519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_ENABLE_CHECKS 9520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckCast(value); 9521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<ArrayBufferView*>(value); 9523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTypedArray* TypedArray::Cast(v8::Value* value) { 9527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_ENABLE_CHECKS 9528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckCast(value); 9529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<TypedArray*>(value); 9531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochUint8Array* Uint8Array::Cast(v8::Value* value) { 9535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_ENABLE_CHECKS 9536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckCast(value); 9537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<Uint8Array*>(value); 9539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInt8Array* Int8Array::Cast(v8::Value* value) { 9543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_ENABLE_CHECKS 9544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckCast(value); 9545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<Int8Array*>(value); 9547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochUint16Array* Uint16Array::Cast(v8::Value* value) { 9551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_ENABLE_CHECKS 9552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckCast(value); 9553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<Uint16Array*>(value); 9555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInt16Array* Int16Array::Cast(v8::Value* value) { 9559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_ENABLE_CHECKS 9560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckCast(value); 9561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<Int16Array*>(value); 9563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochUint32Array* Uint32Array::Cast(v8::Value* value) { 9567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_ENABLE_CHECKS 9568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckCast(value); 9569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<Uint32Array*>(value); 9571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInt32Array* Int32Array::Cast(v8::Value* value) { 9575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_ENABLE_CHECKS 9576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckCast(value); 9577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<Int32Array*>(value); 9579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFloat32Array* Float32Array::Cast(v8::Value* value) { 9583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_ENABLE_CHECKS 9584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckCast(value); 9585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<Float32Array*>(value); 9587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFloat64Array* Float64Array::Cast(v8::Value* value) { 9591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_ENABLE_CHECKS 9592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckCast(value); 9593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<Float64Array*>(value); 9595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochUint8ClampedArray* Uint8ClampedArray::Cast(v8::Value* value) { 9599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_ENABLE_CHECKS 9600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckCast(value); 9601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<Uint8ClampedArray*>(value); 9603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochDataView* DataView::Cast(v8::Value* value) { 9607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_ENABLE_CHECKS 9608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckCast(value); 9609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<DataView*>(value); 9611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSharedArrayBuffer* SharedArrayBuffer::Cast(v8::Value* value) { 9615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef V8_ENABLE_CHECKS 9616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CheckCast(value); 9617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif 9618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return static_cast<SharedArrayBuffer*>(value); 9619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 9620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockFunction* Function::Cast(v8::Value* value) { 9623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef V8_ENABLE_CHECKS 9624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CheckCast(value); 9625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 9626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<Function*>(value); 9627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockExternal* External::Cast(v8::Value* value) { 9631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef V8_ENABLE_CHECKS 9632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CheckCast(value); 9633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 9634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<External*>(value); 9635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 9639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochIsolate* PropertyCallbackInfo<T>::GetIsolate() const { 9640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return *reinterpret_cast<Isolate**>(&args_[kIsolateIndex]); 9641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 9645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLocal<Value> PropertyCallbackInfo<T>::Data() const { 9646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Local<Value>(reinterpret_cast<Value*>(&args_[kDataIndex])); 9647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 9651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLocal<Object> PropertyCallbackInfo<T>::This() const { 9652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Local<Object>(reinterpret_cast<Object*>(&args_[kThisIndex])); 9653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 9657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLocal<Object> PropertyCallbackInfo<T>::Holder() const { 9658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Local<Object>(reinterpret_cast<Object*>(&args_[kHolderIndex])); 9659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 9663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochReturnValue<T> PropertyCallbackInfo<T>::GetReturnValue() const { 9664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReturnValue<T>(&args_[kReturnValueIndex]); 9665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9667109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochtemplate <typename T> 9668109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool PropertyCallbackInfo<T>::ShouldThrowOnError() const { 9669109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch typedef internal::Internals I; 9670109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return args_[kShouldThrowOnErrorIndex] != I::IntToSmi(0); 9671109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 9672109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 9673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLocal<Primitive> Undefined(Isolate* isolate) { 9675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Object* S; 9676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 9677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch I::CheckInitialized(isolate); 9678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch S* slot = I::GetRoot(isolate, I::kUndefinedValueRootIndex); 9679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Local<Primitive>(reinterpret_cast<Primitive*>(slot)); 9680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLocal<Primitive> Null(Isolate* isolate) { 9684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Object* S; 9685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 9686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch I::CheckInitialized(isolate); 9687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch S* slot = I::GetRoot(isolate, I::kNullValueRootIndex); 9688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Local<Primitive>(reinterpret_cast<Primitive*>(slot)); 9689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLocal<Boolean> True(Isolate* isolate) { 9693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Object* S; 9694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 9695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch I::CheckInitialized(isolate); 9696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch S* slot = I::GetRoot(isolate, I::kTrueValueRootIndex); 9697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Local<Boolean>(reinterpret_cast<Boolean*>(slot)); 9698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLocal<Boolean> False(Isolate* isolate) { 9702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Object* S; 9703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 9704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch I::CheckInitialized(isolate); 9705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch S* slot = I::GetRoot(isolate, I::kFalseValueRootIndex); 9706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Local<Boolean>(reinterpret_cast<Boolean*>(slot)); 9707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Isolate::SetData(uint32_t slot, void* data) { 9711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 9712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch I::SetEmbedderData(this, slot, data); 9713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid* Isolate::GetData(uint32_t slot) { 9717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 9718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return I::GetEmbedderData(this, slot); 9719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint32_t Isolate::GetNumberOfDataSlots() { 9723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 9724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return I::kNumIsolateDataSlots; 9725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint64_t Isolate::AdjustAmountOfExternalAllocatedMemory( 9729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int64_t change_in_bytes) { 9730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 973113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch int64_t* external_memory = reinterpret_cast<int64_t*>( 973213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch reinterpret_cast<uint8_t*>(this) + I::kExternalMemoryOffset); 973313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch const int64_t external_memory_limit = *reinterpret_cast<int64_t*>( 973413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch reinterpret_cast<uint8_t*>(this) + I::kExternalMemoryLimitOffset); 973513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch const int64_t amount = *external_memory + change_in_bytes; 973613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch *external_memory = amount; 973713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (change_in_bytes > 0 && amount > external_memory_limit) { 9738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ReportExternalAllocationLimitReached(); 9739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 974013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return *external_memory; 9741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 9745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Isolate::SetObjectGroupId(const Persistent<T>& object, 9746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UniqueId id) { 9747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(Value, T); 974862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch SetObjectGroupId(reinterpret_cast<internal::Object**>(object.val_), id); 9749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 9753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Isolate::SetReferenceFromGroup(UniqueId id, 9754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Persistent<T>& object) { 9755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(Value, T); 975662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch SetReferenceFromGroup(id, reinterpret_cast<internal::Object**>(object.val_)); 9757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 9758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T, typename S> 9761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Isolate::SetReference(const Persistent<T>& parent, 9762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Persistent<S>& child) { 9763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(Object, T); 9764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPE_CHECK(Value, S); 976562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch SetReference(reinterpret_cast<internal::Object**>(parent.val_), 976662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch reinterpret_cast<internal::Object**>(child.val_)); 9767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLocal<Value> Context::GetEmbedderData(int index) { 9771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifndef V8_ENABLE_CHECKS 9772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Object O; 9773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::HeapObject HO; 9774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 9775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HO* context = *reinterpret_cast<HO**>(this); 9776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch O** result = 9777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HandleScope::CreateHandle(context, I::ReadEmbedderData<O*>(this, index)); 9778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Local<Value>(reinterpret_cast<Value*>(result)); 9779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#else 9780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return SlowGetEmbedderData(index); 9781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid* Context::GetAlignedPointerFromEmbedderData(int index) { 9786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifndef V8_ENABLE_CHECKS 9787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef internal::Internals I; 9788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return I::ReadEmbedderData<void*>(this, index); 9789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#else 9790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return SlowGetAlignedPointerFromEmbedderData(index); 9791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 9793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9795958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid V8::SetAllowCodeGenerationFromStringsCallback( 9796958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier AllowCodeGenerationFromStringsCallback callback) { 9797958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Isolate* isolate = Isolate::GetCurrent(); 9798958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isolate->SetAllowCodeGenerationFromStringsCallback(callback); 9799958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 9800958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9801958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9802958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierbool V8::IsDead() { 9803958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Isolate* isolate = Isolate::GetCurrent(); 9804958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return isolate->IsDead(); 9805958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 9806958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9807958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool V8::AddMessageListener(MessageCallback that, Local<Value> data) { 9809958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Isolate* isolate = Isolate::GetCurrent(); 9810958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return isolate->AddMessageListener(that, data); 9811958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 9812958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9813958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9814958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid V8::RemoveMessageListeners(MessageCallback that) { 9815958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Isolate* isolate = Isolate::GetCurrent(); 9816958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isolate->RemoveMessageListeners(that); 9817958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 9818958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9819958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9820958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid V8::SetFailedAccessCheckCallbackFunction( 9821958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FailedAccessCheckCallback callback) { 9822958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Isolate* isolate = Isolate::GetCurrent(); 9823958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isolate->SetFailedAccessCheckCallbackFunction(callback); 9824958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 9825958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9826958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9827958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid V8::SetCaptureStackTraceForUncaughtExceptions( 9828958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool capture, int frame_limit, StackTrace::StackTraceOptions options) { 9829958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Isolate* isolate = Isolate::GetCurrent(); 9830958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isolate->SetCaptureStackTraceForUncaughtExceptions(capture, frame_limit, 9831958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier options); 9832958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 9833958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9834958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9835958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid V8::SetFatalErrorHandler(FatalErrorCallback callback) { 9836958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Isolate* isolate = Isolate::GetCurrent(); 9837958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isolate->SetFatalErrorHandler(callback); 9838958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 9839958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid V8::RemoveGCPrologueCallback(GCCallback callback) { 9841958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Isolate* isolate = Isolate::GetCurrent(); 9842958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isolate->RemoveGCPrologueCallback( 984362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch reinterpret_cast<Isolate::GCCallback>(callback)); 9844958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 9845958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9846958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9847014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid V8::RemoveGCEpilogueCallback(GCCallback callback) { 9848958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Isolate* isolate = Isolate::GetCurrent(); 9849958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isolate->RemoveGCEpilogueCallback( 985062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch reinterpret_cast<Isolate::GCCallback>(callback)); 9851958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 9852958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9853958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid V8::TerminateExecution(Isolate* isolate) { isolate->TerminateExecution(); } 9854958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9855958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9856958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierbool V8::IsExecutionTerminating(Isolate* isolate) { 9857958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (isolate == NULL) { 9858958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isolate = Isolate::GetCurrent(); 9859958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 9860958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return isolate->IsExecutionTerminating(); 9861958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 9862958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9863958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9864958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid V8::CancelTerminateExecution(Isolate* isolate) { 9865958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isolate->CancelTerminateExecution(); 9866958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 9867958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9868958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9869958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid V8::VisitExternalResources(ExternalResourceVisitor* visitor) { 9870958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Isolate* isolate = Isolate::GetCurrent(); 9871958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isolate->VisitExternalResources(visitor); 9872958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 9873958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9874958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9875958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid V8::VisitHandlesWithClassIds(PersistentHandleVisitor* visitor) { 9876958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Isolate* isolate = Isolate::GetCurrent(); 9877958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isolate->VisitHandlesWithClassIds(visitor); 9878958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 9879958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9880958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9881958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid V8::VisitHandlesWithClassIds(Isolate* isolate, 9882958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier PersistentHandleVisitor* visitor) { 9883958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isolate->VisitHandlesWithClassIds(visitor); 9884958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 9885958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9886958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9887958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid V8::VisitHandlesForPartialDependence(Isolate* isolate, 9888958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier PersistentHandleVisitor* visitor) { 9889958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isolate->VisitHandlesForPartialDependence(visitor); 9890958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 9891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 9893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \example shell.cc 9894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * A simple shell that takes a list of expressions on the 9895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * command-line and executes them. 9896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 9897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 9900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \example process.cc 9901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 9902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} // namespace v8 9905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef TYPE_CHECK 9908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif // INCLUDE_V8_H_ 9911