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