13ef787dbeca8a5fb1086949cda830dccee07bfbdBen 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#ifndef V8_API_H_ 6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_API_H_ 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "include/v8-testing.h" 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/contexts.h" 10c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#include "src/debug/debug-interface.h" 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/factory.h" 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/isolate.h" 13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/list.h" 14b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Constants used in the implementation of the API. The most natural thing 18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// would usually be to place these with the classes that use them, but 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// we want to keep them out of v8.h because it is an externally 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// visible file. 21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Consts { 22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block enum TemplateType { 24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block FUNCTION_TEMPLATE = 0, 25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OBJECT_TEMPLATE = 1 26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate <typename T> inline T ToCData(v8::internal::Object* obj) { 30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block STATIC_ASSERT(sizeof(T) == sizeof(v8::internal::Address)); 31c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (obj == v8::internal::Smi::kZero) return nullptr; 32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<T>( 333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch reinterpret_cast<intptr_t>( 343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch v8::internal::Foreign::cast(obj)->foreign_address())); 35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <typename T> 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline v8::internal::Handle<v8::internal::Object> FromCData( 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::internal::Isolate* isolate, T obj) { 41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block STATIC_ASSERT(sizeof(T) == sizeof(v8::internal::Address)); 42c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (obj == nullptr) return handle(v8::internal::Smi::kZero, isolate); 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return isolate->factory()->NewForeign( 44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block reinterpret_cast<v8::internal::Address>(reinterpret_cast<intptr_t>(obj))); 45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 48d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockclass ApiFunction { 49d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block public: 50d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block explicit ApiFunction(v8::internal::Address addr) : addr_(addr) { } 51d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block v8::internal::Address address() { return addr_; } 52d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block private: 53d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block v8::internal::Address addr_; 54d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block}; 55d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 56d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass RegisteredExtension { 59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block explicit RegisteredExtension(Extension* extension); 61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void Register(RegisteredExtension* that); 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void UnregisterAll(); 63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Extension* extension() { return extension_; } 64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegisteredExtension* next() { return next_; } 65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static RegisteredExtension* first_extension() { return first_extension_; } 66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Extension* extension_; 68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegisteredExtension* next_; 69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static RegisteredExtension* first_extension_; 70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define OPEN_HANDLE_LIST(V) \ 7362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Template, TemplateInfo) \ 7462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(FunctionTemplate, FunctionTemplateInfo) \ 7562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(ObjectTemplate, ObjectTemplateInfo) \ 7662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Signature, FunctionTemplateInfo) \ 7762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(AccessorSignature, FunctionTemplateInfo) \ 7862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Data, Object) \ 7962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(RegExp, JSRegExp) \ 8062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Object, JSReceiver) \ 8162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Array, JSArray) \ 8262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Map, JSMap) \ 8362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Set, JSSet) \ 8462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(ArrayBuffer, JSArrayBuffer) \ 8562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(ArrayBufferView, JSArrayBufferView) \ 8662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(TypedArray, JSTypedArray) \ 8762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Uint8Array, JSTypedArray) \ 8862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Uint8ClampedArray, JSTypedArray) \ 8962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Int8Array, JSTypedArray) \ 9062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Uint16Array, JSTypedArray) \ 9162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Int16Array, JSTypedArray) \ 9262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Uint32Array, JSTypedArray) \ 9362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Int32Array, JSTypedArray) \ 9462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Float32Array, JSTypedArray) \ 9562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Float64Array, JSTypedArray) \ 9662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(DataView, JSDataView) \ 9762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(SharedArrayBuffer, JSArrayBuffer) \ 9862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Name, Name) \ 9962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(String, String) \ 10062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Symbol, Symbol) \ 10162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Script, JSFunction) \ 10262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(UnboundScript, SharedFunctionInfo) \ 10362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Module, Module) \ 10462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Function, JSReceiver) \ 10562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Message, JSMessageObject) \ 10662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Context, Context) \ 10762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(External, Object) \ 10862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(StackTrace, JSArray) \ 10962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(StackFrame, JSObject) \ 11062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Proxy, JSProxy) \ 11162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(NativeWeakMap, JSWeakMap) \ 11262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(debug::GeneratorObject, JSGeneratorObject) \ 11362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(debug::Script, Script) \ 11462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Promise, JSPromise) 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Utils { 117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline bool ApiCheck(bool condition, 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* location, 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* message) { 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!condition) Utils::ReportApiFailure(location, message); 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return condition; 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 124f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void ReportOOMFailure(const char* location, bool is_heap_oom); 125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Context> ToLocal( 127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::Context> obj); 128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Value> ToLocal( 129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::Object> obj); 130f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static inline Local<Module> ToLocal( 131f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::internal::Handle<v8::internal::Module> obj); 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Local<Name> ToLocal( 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::internal::Handle<v8::internal::Name> obj); 134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<String> ToLocal( 135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::String> obj); 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Local<Symbol> ToLocal( 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::internal::Handle<v8::internal::Symbol> obj); 138f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch static inline Local<RegExp> ToLocal( 139f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch v8::internal::Handle<v8::internal::JSRegExp> obj); 140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Object> ToLocal( 141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::internal::Handle<v8::internal::JSReceiver> obj); 142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline Local<Object> ToLocal( 143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::JSObject> obj); 144f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static inline Local<Function> ToLocal( 145f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::internal::Handle<v8::internal::JSFunction> obj); 146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Array> ToLocal( 147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::JSArray> obj); 148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline Local<Map> ToLocal( 149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::internal::Handle<v8::internal::JSMap> obj); 150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline Local<Set> ToLocal( 151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::internal::Handle<v8::internal::JSSet> obj); 152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline Local<Proxy> ToLocal( 153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::internal::Handle<v8::internal::JSProxy> obj); 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Local<ArrayBuffer> ToLocal( 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::internal::Handle<v8::internal::JSArrayBuffer> obj); 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Local<ArrayBufferView> ToLocal( 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::internal::Handle<v8::internal::JSArrayBufferView> obj); 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Local<DataView> ToLocal( 159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::internal::Handle<v8::internal::JSDataView> obj); 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Local<TypedArray> ToLocal( 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::internal::Handle<v8::internal::JSTypedArray> obj); 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Local<Uint8Array> ToLocalUint8Array( 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::internal::Handle<v8::internal::JSTypedArray> obj); 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Local<Uint8ClampedArray> ToLocalUint8ClampedArray( 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::internal::Handle<v8::internal::JSTypedArray> obj); 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Local<Int8Array> ToLocalInt8Array( 167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::internal::Handle<v8::internal::JSTypedArray> obj); 168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Local<Uint16Array> ToLocalUint16Array( 169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::internal::Handle<v8::internal::JSTypedArray> obj); 170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Local<Int16Array> ToLocalInt16Array( 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::internal::Handle<v8::internal::JSTypedArray> obj); 172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Local<Uint32Array> ToLocalUint32Array( 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::internal::Handle<v8::internal::JSTypedArray> obj); 174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Local<Int32Array> ToLocalInt32Array( 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::internal::Handle<v8::internal::JSTypedArray> obj); 176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Local<Float32Array> ToLocalFloat32Array( 177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::internal::Handle<v8::internal::JSTypedArray> obj); 178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Local<Float64Array> ToLocalFloat64Array( 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::internal::Handle<v8::internal::JSTypedArray> obj); 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline Local<SharedArrayBuffer> ToLocalShared( 182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::internal::Handle<v8::internal::JSArrayBuffer> obj); 183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Message> MessageToLocal( 185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::Object> obj); 186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static inline Local<Promise> PromiseToLocal( 187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier v8::internal::Handle<v8::internal::JSObject> obj); 18825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen static inline Local<StackTrace> StackTraceToLocal( 18925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen v8::internal::Handle<v8::internal::JSArray> obj); 19025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen static inline Local<StackFrame> StackFrameToLocal( 19125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen v8::internal::Handle<v8::internal::JSObject> obj); 192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Number> NumberToLocal( 193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::Object> obj); 194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Integer> IntegerToLocal( 195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::Object> obj); 196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Uint32> Uint32ToLocal( 197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::Object> obj); 198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<FunctionTemplate> ToLocal( 199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::FunctionTemplateInfo> obj); 200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<ObjectTemplate> ToLocal( 201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::ObjectTemplateInfo> obj); 202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline Local<Signature> SignatureToLocal( 203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::internal::Handle<v8::internal::FunctionTemplateInfo> obj); 204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Local<AccessorSignature> AccessorSignatureToLocal( 205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::internal::Handle<v8::internal::FunctionTemplateInfo> obj); 206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Local<External> ExternalToLocal( 207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::internal::Handle<v8::internal::JSObject> obj); 208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline Local<NativeWeakMap> NativeWeakMapToLocal( 209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::internal::Handle<v8::internal::JSWeakMap> obj); 210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline Local<Function> CallableToLocal( 211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::internal::Handle<v8::internal::JSReceiver> obj); 212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_OPEN_HANDLE(From, To) \ 214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline v8::internal::Handle<v8::internal::To> \ 215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OpenHandle(const From* that, bool allow_empty_handle = false); 216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOPEN_HANDLE_LIST(DECLARE_OPEN_HANDLE) 218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef DECLARE_OPEN_HANDLE 220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class From, class To> 222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Local<To> Convert(v8::internal::Handle<From> obj) { 22313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DCHECK(obj.is_null() || 22413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch (obj->IsSmi() || 22513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch !obj->IsTheHole(i::HeapObject::cast(*obj)->GetIsolate()))); 226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Local<To>(reinterpret_cast<To*>(obj.location())); 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class T> 230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline v8::internal::Handle<v8::internal::Object> OpenPersistent( 231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const v8::Persistent<T>& persistent) { 232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return v8::internal::Handle<v8::internal::Object>( 233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reinterpret_cast<v8::internal::Object**>(persistent.val_)); 234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class T> 237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline v8::internal::Handle<v8::internal::Object> OpenPersistent( 238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::Persistent<T>* persistent) { 239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return OpenPersistent(*persistent); 240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class From, class To> 243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline v8::internal::Handle<To> OpenHandle(v8::Local<From> handle) { 244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return OpenHandle(*handle); 245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void ReportApiFailure(const char* location, const char* message); 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <class T> 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline T* ToApi(v8::internal::Handle<v8::internal::Object> obj) { 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<T*>(obj.location()); 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class T> 258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline v8::Local<T> ToApiHandle( 259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::internal::Handle<v8::internal::Object> obj) { 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Utils::Convert<v8::internal::Object, T>(obj); 261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <class T> 265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochinline bool ToLocal(v8::internal::MaybeHandle<v8::internal::Object> maybe, 266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<T>* local) { 267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::internal::Handle<v8::internal::Object> handle; 268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (maybe.ToHandle(&handle)) { 269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch *local = Utils::Convert<v8::internal::Object, T>(handle); 270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return true; 271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return false; 273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementations of ToLocal 277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define MAKE_TO_LOCAL(Name, From, To) \ 279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Local<v8::To> Utils::Name(v8::internal::Handle<v8::internal::From> obj) { \ 280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Convert<v8::internal::From, v8::To>(obj); \ 281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define MAKE_TO_LOCAL_TYPED_ARRAY(Type, typeName, TYPE, ctype, size) \ 285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<v8::Type##Array> Utils::ToLocal##Type##Array( \ 286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::internal::Handle<v8::internal::JSTypedArray> obj) { \ 287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(obj->type() == v8::internal::kExternal##Type##Array); \ 288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Convert<v8::internal::JSTypedArray, v8::Type##Array>(obj); \ 289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, Context, Context) 293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, Object, Value) 294f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochMAKE_TO_LOCAL(ToLocal, Module, Module) 295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMAKE_TO_LOCAL(ToLocal, Name, Name) 296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, String, String) 297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMAKE_TO_LOCAL(ToLocal, Symbol, Symbol) 298f87a203d89e1bbb6708282e0b64dbd13d59b723dBen MurdochMAKE_TO_LOCAL(ToLocal, JSRegExp, RegExp) 299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMAKE_TO_LOCAL(ToLocal, JSReceiver, Object) 300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, JSObject, Object) 301f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochMAKE_TO_LOCAL(ToLocal, JSFunction, Function) 302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, JSArray, Array) 303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMAKE_TO_LOCAL(ToLocal, JSMap, Map) 304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMAKE_TO_LOCAL(ToLocal, JSSet, Set) 305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMAKE_TO_LOCAL(ToLocal, JSProxy, Proxy) 306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMAKE_TO_LOCAL(ToLocal, JSArrayBuffer, ArrayBuffer) 307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMAKE_TO_LOCAL(ToLocal, JSArrayBufferView, ArrayBufferView) 308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMAKE_TO_LOCAL(ToLocal, JSDataView, DataView) 309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMAKE_TO_LOCAL(ToLocal, JSTypedArray, TypedArray) 310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMAKE_TO_LOCAL(ToLocalShared, JSArrayBuffer, SharedArrayBuffer) 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTYPED_ARRAYS(MAKE_TO_LOCAL_TYPED_ARRAY) 313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, FunctionTemplateInfo, FunctionTemplate) 315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, ObjectTemplateInfo, ObjectTemplate) 316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMAKE_TO_LOCAL(SignatureToLocal, FunctionTemplateInfo, Signature) 317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMAKE_TO_LOCAL(AccessorSignatureToLocal, FunctionTemplateInfo, AccessorSignature) 318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(MessageToLocal, Object, Message) 319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierMAKE_TO_LOCAL(PromiseToLocal, JSObject, Promise) 32025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian MonsenMAKE_TO_LOCAL(StackTraceToLocal, JSArray, StackTrace) 32125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian MonsenMAKE_TO_LOCAL(StackFrameToLocal, JSObject, StackFrame) 322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(NumberToLocal, Object, Number) 323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(IntegerToLocal, Object, Integer) 324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(Uint32ToLocal, Object, Uint32) 325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMAKE_TO_LOCAL(ExternalToLocal, JSObject, External) 326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMAKE_TO_LOCAL(NativeWeakMapToLocal, JSWeakMap, NativeWeakMap) 327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMAKE_TO_LOCAL(CallableToLocal, JSReceiver, Function) 328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef MAKE_TO_LOCAL_TYPED_ARRAY 330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef MAKE_TO_LOCAL 331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementations of OpenHandle 334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define MAKE_OPEN_HANDLE(From, To) \ 336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::internal::Handle<v8::internal::To> Utils::OpenHandle( \ 337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const v8::From* that, bool allow_empty_handle) { \ 338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(allow_empty_handle || that != NULL); \ 339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(that == NULL || \ 340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch (*reinterpret_cast<v8::internal::Object* const*>(that))->Is##To()); \ 341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return v8::internal::Handle<v8::internal::To>( \ 342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch reinterpret_cast<v8::internal::To**>(const_cast<v8::From*>(that))); \ 343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOPEN_HANDLE_LIST(MAKE_OPEN_HANDLE) 346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef MAKE_OPEN_HANDLE 348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef OPEN_HANDLE_LIST 349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 35362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass V8_EXPORT_PRIVATE DeferredHandles { 354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ~DeferredHandles(); 356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DeferredHandles(Object** first_block_limit, Isolate* isolate) 359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : next_(NULL), 360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch previous_(NULL), 361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch first_block_limit_(first_block_limit), 362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate_(isolate) { 363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate->LinkDeferredHandles(this); 364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Iterate(ObjectVisitor* v); 367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch List<Object**> blocks_; 369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DeferredHandles* next_; 370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DeferredHandles* previous_; 371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object** first_block_limit_; 372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate_; 373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class HandleScopeImplementer; 375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class Isolate; 376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// This class is here in order to be able to declare it a friend of 380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// HandleScope. Moving these methods to be members of HandleScope would be 38144f0eee88ff00398ff7f715fab053374d808c90dSteve Block// neat in some ways, but it would expose internal implementation details in 382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// our public header file, which is undesirable. 383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 38444f0eee88ff00398ff7f715fab053374d808c90dSteve Block// An isolate has a single instance of this class to hold the current thread's 38544f0eee88ff00398ff7f715fab053374d808c90dSteve Block// data. In multithreaded V8 programs this data is copied in and out of storage 386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// so that the currently executing thread always has its own copy of this 387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// data. 388257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HandleScopeImplementer { 389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 390257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch explicit HandleScopeImplementer(Isolate* isolate) 391257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch : isolate_(isolate), 392257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch blocks_(0), 393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block entered_contexts_(0), 394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block saved_contexts_(0), 395f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch microtask_context_(nullptr), 396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_(NULL), 397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch call_depth_(0), 3983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch microtasks_depth_(0), 3993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch microtasks_suppressions_(0), 400f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch entered_context_count_during_microtasks_(0), 4013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#ifdef DEBUG 4023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch debug_microtasks_depth_(0), 4033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#endif 4043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch microtasks_policy_(v8::MicrotasksPolicy::kAuto), 405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch last_handle_before_deferred_block_(NULL) { } 406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 40769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch ~HandleScopeImplementer() { 40869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch DeleteArray(spare_); 40969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 41069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Threading support for handle data. 412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int ArchiveSpacePerThread(); 41344f0eee88ff00398ff7f715fab053374d808c90dSteve Block char* RestoreThread(char* from); 41444f0eee88ff00398ff7f715fab053374d808c90dSteve Block char* ArchiveThread(char* to); 41544f0eee88ff00398ff7f715fab053374d808c90dSteve Block void FreeThreadResources(); 416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Garbage collection support. 41844f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Iterate(v8::internal::ObjectVisitor* v); 419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static char* Iterate(v8::internal::ObjectVisitor* v, char* data); 420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline internal::Object** GetSpareOrNewBlock(); 4235913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck inline void DeleteExtensions(internal::Object** prev_limit); 424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Call depth represents nested v8 api calls. 426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void IncrementCallDepth() {call_depth_++;} 427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void DecrementCallDepth() {call_depth_--;} 428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool CallDepthIsZero() { return call_depth_ == 0; } 429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Microtasks scope depth represents nested scopes controlling microtasks 4313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // invocation, which happens when depth reaches zero. 4323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void IncrementMicrotasksScopeDepth() {microtasks_depth_++;} 4333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void DecrementMicrotasksScopeDepth() {microtasks_depth_--;} 4343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline int GetMicrotasksScopeDepth() { return microtasks_depth_; } 4353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 4363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Possibly nested microtasks suppression scopes prevent microtasks 4373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // from running. 4383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void IncrementMicrotasksSuppressions() {microtasks_suppressions_++;} 4393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void DecrementMicrotasksSuppressions() {microtasks_suppressions_--;} 4403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline bool HasMicrotasksSuppressions() { return !!microtasks_suppressions_; } 4413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 4423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#ifdef DEBUG 4433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // In debug we check that calls not intended to invoke microtasks are 4443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // still correctly wrapped with microtask scopes. 4453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void IncrementDebugMicrotasksScopeDepth() {debug_microtasks_depth_++;} 4463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void DecrementDebugMicrotasksScopeDepth() {debug_microtasks_depth_--;} 4473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline bool DebugMicrotasksScopeDepthIsZero() { 4483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return debug_microtasks_depth_ == 0; 4493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 4503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#endif 4513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 4523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void set_microtasks_policy(v8::MicrotasksPolicy policy); 4533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline v8::MicrotasksPolicy microtasks_policy() const; 4543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void EnterContext(Handle<Context> context); 456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void LeaveContext(); 457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool LastEnteredContextWas(Handle<Context> context); 458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the last entered context or an empty handle if no 460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // contexts have been entered. 461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Handle<Context> LastEnteredContext(); 462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 463f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void EnterMicrotaskContext(Handle<Context> context); 464f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void LeaveMicrotaskContext(); 465f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline Handle<Context> MicrotaskContext(); 466f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline bool MicrotaskContextIsLastEnteredContext() const { 467f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return microtask_context_ && 468f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch entered_context_count_during_microtasks_ == 469f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch entered_contexts_.length(); 470f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 471f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void SaveContext(Context* context); 473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Context* RestoreContext(); 474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool HasSavedContexts(); 475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline List<internal::Object**>* blocks() { return &blocks_; } 477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate() const { return isolate_; } 478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void ReturnBlock(Object** block) { 480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(block != NULL); 481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (spare_ != NULL) DeleteArray(spare_); 482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch spare_ = block; 483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void ResetAfterArchive() { 487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block blocks_.Initialize(0); 488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block entered_contexts_.Initialize(0); 489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block saved_contexts_.Initialize(0); 490f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch microtask_context_ = nullptr; 491f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch entered_context_count_during_microtasks_ = 0; 492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_ = NULL; 493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch last_handle_before_deferred_block_ = NULL; 494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block call_depth_ = 0; 495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Free() { 498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(blocks_.length() == 0); 499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(entered_contexts_.length() == 0); 500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(saved_contexts_.length() == 0); 501f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DCHECK(!microtask_context_); 502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block blocks_.Free(); 503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block entered_contexts_.Free(); 504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block saved_contexts_.Free(); 505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (spare_ != NULL) { 506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DeleteArray(spare_); 507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_ = NULL; 508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(call_depth_ == 0); 510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void BeginDeferredScope(); 513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DeferredHandles* Detach(Object** prev_limit); 514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 515257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Isolate* isolate_; 516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block List<internal::Object**> blocks_; 517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Used as a stack to keep track of entered contexts. 518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch List<Context*> entered_contexts_; 519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Used as a stack to keep track of saved contexts. 520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block List<Context*> saved_contexts_; 521f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Context* microtask_context_; 522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object** spare_; 523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int call_depth_; 5243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int microtasks_depth_; 5253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int microtasks_suppressions_; 526f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int entered_context_count_during_microtasks_; 5273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#ifdef DEBUG 5283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int debug_microtasks_depth_; 5293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#endif 5303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch v8::MicrotasksPolicy microtasks_policy_; 531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object** last_handle_before_deferred_block_; 532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // This is only used for threading support. 533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HandleScopeData handle_scope_data_; 534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void IterateThis(ObjectVisitor* v); 536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block char* RestoreThreadHelper(char* from); 537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block char* ArchiveThreadHelper(char* to); 538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class DeferredHandles; 540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class DeferredHandleScope; 541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_COPY_AND_ASSIGN(HandleScopeImplementer); 543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst int kHandleBlockSize = v8::internal::KB - 2; // fit in one page 547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid HandleScopeImplementer::set_microtasks_policy( 5503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch v8::MicrotasksPolicy policy) { 5513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch microtasks_policy_ = policy; 5523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 5533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 5543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 5553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochv8::MicrotasksPolicy HandleScopeImplementer::microtasks_policy() const { 5563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return microtasks_policy_; 5573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 5583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 5593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HandleScopeImplementer::SaveContext(Context* context) { 561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block saved_contexts_.Add(context); 562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockContext* HandleScopeImplementer::RestoreContext() { 566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return saved_contexts_.RemoveLast(); 567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool HandleScopeImplementer::HasSavedContexts() { 571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return !saved_contexts_.is_empty(); 572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid HandleScopeImplementer::EnterContext(Handle<Context> context) { 576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch entered_contexts_.Add(*context); 577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid HandleScopeImplementer::LeaveContext() { 581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block entered_contexts_.RemoveLast(); 582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool HandleScopeImplementer::LastEnteredContextWas(Handle<Context> context) { 586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !entered_contexts_.is_empty() && entered_contexts_.last() == *context; 587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Context> HandleScopeImplementer::LastEnteredContext() { 591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (entered_contexts_.is_empty()) return Handle<Context>::null(); 592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Handle<Context>(entered_contexts_.last()); 593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 595f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid HandleScopeImplementer::EnterMicrotaskContext(Handle<Context> context) { 596f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DCHECK(!microtask_context_); 597f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch microtask_context_ = *context; 598f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch entered_context_count_during_microtasks_ = entered_contexts_.length(); 599f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 600f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 601f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid HandleScopeImplementer::LeaveMicrotaskContext() { 602f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DCHECK(microtask_context_); 603f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch microtask_context_ = nullptr; 604f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch entered_context_count_during_microtasks_ = 0; 605f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 606f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 607f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochHandle<Context> HandleScopeImplementer::MicrotaskContext() { 608f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (microtask_context_) return Handle<Context>(microtask_context_); 609f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return Handle<Context>::null(); 610f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// If there's a spare block, use it for growing the current scope. 613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinternal::Object** HandleScopeImplementer::GetSpareOrNewBlock() { 614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block internal::Object** block = (spare_ != NULL) ? 615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_ : 616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block NewArray<internal::Object*>(kHandleBlockSize); 617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_ = NULL; 618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return block; 619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6225913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reckvoid HandleScopeImplementer::DeleteExtensions(internal::Object** prev_limit) { 6235913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck while (!blocks_.is_empty()) { 6245913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck internal::Object** block_start = blocks_.last(); 6255913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck internal::Object** block_limit = block_start + kHandleBlockSize; 626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // SealHandleScope may make the prev_limit to point inside the block. 628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (block_start <= prev_limit && prev_limit <= block_limit) { 629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef ENABLE_HANDLE_ZAPPING 630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::HandleScope::ZapRange(prev_limit, block_limit); 631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6345913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck 6355913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck blocks_.RemoveLast(); 636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef ENABLE_HANDLE_ZAPPING 637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch internal::HandleScope::ZapRange(block_start, block_limit); 638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 6395913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck if (spare_ != NULL) { 6405913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck DeleteArray(spare_); 6415913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck } 6425913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck spare_ = block_start; 6435913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck } 644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((blocks_.is_empty() && prev_limit == NULL) || 6455913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck (!blocks_.is_empty() && prev_limit != NULL)); 646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 648b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Interceptor functions called from generated inline caches to notify 650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// CPU profiler that external callbacks are invoked. 651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid InvokeAccessorGetterCallback( 652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::Local<v8::Name> property, 653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const v8::PropertyCallbackInfo<v8::Value>& info, 654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::AccessorNameGetterCallback getter); 655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid InvokeFunctionCallback(const v8::FunctionCallbackInfo<v8::Value>& info, 657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::FunctionCallback callback); 658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 659b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass Testing { 660b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 661b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static v8::Testing::StressType stress_type() { return stress_type_; } 662b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static void set_stress_type(v8::Testing::StressType stress_type) { 663b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stress_type_ = stress_type; 664b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 665b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 666b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 667b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static v8::Testing::StressType stress_type_; 668b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 669b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // V8_API_H_ 674