api.h revision 6ded16be15dd865a9b21ea304d5273c8be299c87
1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2008 the V8 project authors. All rights reserved. 2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without 3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met: 5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions of source code must retain the above copyright 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// notice, this list of conditions and the following disclaimer. 8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions in binary form must reproduce the above 9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// copyright notice, this list of conditions and the following 10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// disclaimer in the documentation and/or other materials provided 11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// with the distribution. 12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Neither the name of Google Inc. nor the names of its 13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// contributors may be used to endorse or promote products derived 14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// from this software without specific prior written permission. 15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifndef V8_API_H_ 29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_API_H_ 30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "apiutils.h" 32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "factory.h" 33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Constants used in the implementation of the API. The most natural thing 37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// would usually be to place these with the classes that use them, but 38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// we want to keep them out of v8.h because it is an externally 39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// visible file. 40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Consts { 41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block enum TemplateType { 43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block FUNCTION_TEMPLATE = 0, 44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OBJECT_TEMPLATE = 1 45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Utilities for working with neander-objects, primitive 50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// env-independent JSObjects used by the api. 51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass NeanderObject { 52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block explicit NeanderObject(int size); 54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline NeanderObject(v8::internal::Handle<v8::internal::Object> obj); 55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline NeanderObject(v8::internal::Object* obj); 56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline v8::internal::Object* get(int index); 57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set(int index, v8::internal::Object* value); 58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline v8::internal::Handle<v8::internal::JSObject> value() { return value_; } 59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int size(); 60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::JSObject> value_; 62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Utilities for working with neander-arrays, a simple extensible 66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// array abstraction built on neander-objects. 67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass NeanderArray { 68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block NeanderArray(); 70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline NeanderArray(v8::internal::Handle<v8::internal::Object> obj); 71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline v8::internal::Handle<v8::internal::JSObject> value() { 72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return obj_.value(); 73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void add(v8::internal::Handle<v8::internal::Object> value); 76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int length(); 78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Object* get(int index); 80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Change the value at an index to undefined value. If the index is 81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // out of bounds, the request is ignored. Returns the old value. 82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void set(int index, v8::internal::Object* value); 83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block NeanderObject obj_; 85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockNeanderObject::NeanderObject(v8::internal::Handle<v8::internal::Object> obj) 89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : value_(v8::internal::Handle<v8::internal::JSObject>::cast(obj)) { } 90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockNeanderObject::NeanderObject(v8::internal::Object* obj) 93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : value_(v8::internal::Handle<v8::internal::JSObject>( 94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::JSObject::cast(obj))) { } 95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockNeanderArray::NeanderArray(v8::internal::Handle<v8::internal::Object> obj) 98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : obj_(obj) { } 99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockv8::internal::Object* NeanderObject::get(int offset) { 102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(value()->HasFastElements()); 103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return v8::internal::FixedArray::cast(value()->elements())->get(offset); 104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid NeanderObject::set(int offset, v8::internal::Object* value) { 108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(value_->HasFastElements()); 109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::FixedArray::cast(value_->elements())->set(offset, value); 110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <typename T> static inline T ToCData(v8::internal::Object* obj) { 114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block STATIC_ASSERT(sizeof(T) == sizeof(v8::internal::Address)); 115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<T>( 116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block reinterpret_cast<intptr_t>(v8::internal::Proxy::cast(obj)->proxy())); 117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <typename T> 121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic inline v8::internal::Handle<v8::internal::Object> FromCData(T obj) { 122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block STATIC_ASSERT(sizeof(T) == sizeof(v8::internal::Address)); 123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return v8::internal::Factory::NewProxy( 124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block reinterpret_cast<v8::internal::Address>(reinterpret_cast<intptr_t>(obj))); 125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 128d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockclass ApiFunction { 129d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block public: 130d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block explicit ApiFunction(v8::internal::Address addr) : addr_(addr) { } 131d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block v8::internal::Address address() { return addr_; } 132d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block private: 133d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block v8::internal::Address addr_; 134d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block}; 135d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 136d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockv8::Arguments::Arguments(v8::Local<v8::Value> data, 138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::Local<v8::Object> holder, 139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::Local<v8::Function> callee, 140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_construct_call, 141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void** values, int length) 142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : data_(data), holder_(holder), callee_(callee), 143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block is_construct_call_(is_construct_call), 144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block values_(values), length_(length) { } 145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockenum ExtensionTraversalState { 148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block UNVISITED, VISITED, INSTALLED 149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass RegisteredExtension { 153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block explicit RegisteredExtension(Extension* extension); 155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void Register(RegisteredExtension* that); 156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Extension* extension() { return extension_; } 157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegisteredExtension* next() { return next_; } 158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegisteredExtension* next_auto() { return next_auto_; } 159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ExtensionTraversalState state() { return state_; } 160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void set_state(ExtensionTraversalState value) { state_ = value; } 161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static RegisteredExtension* first_extension() { return first_extension_; } 162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Extension* extension_; 164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegisteredExtension* next_; 165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegisteredExtension* next_auto_; 166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ExtensionTraversalState state_; 167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static RegisteredExtension* first_extension_; 168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static RegisteredExtension* first_auto_extension_; 169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Utils { 173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool ReportApiFailure(const char* location, const char* message); 175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Local<FunctionTemplate> ToFunctionTemplate(NeanderObject obj); 177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Local<ObjectTemplate> ToObjectTemplate(NeanderObject obj); 178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Context> ToLocal( 180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::Context> obj); 181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Value> ToLocal( 182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::Object> obj); 183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Function> ToLocal( 184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::JSFunction> obj); 185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<String> ToLocal( 186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::String> obj); 187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Object> ToLocal( 188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::JSObject> obj); 189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Array> ToLocal( 190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::JSArray> obj); 191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<External> ToLocal( 192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::Proxy> obj); 193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Message> MessageToLocal( 194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::Object> obj); 195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Number> NumberToLocal( 196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::Object> obj); 197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Integer> IntegerToLocal( 198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::Object> obj); 199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Uint32> Uint32ToLocal( 200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::Object> obj); 201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<FunctionTemplate> ToLocal( 202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::FunctionTemplateInfo> obj); 203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<ObjectTemplate> ToLocal( 204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::ObjectTemplateInfo> obj); 205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Signature> ToLocal( 206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::SignatureInfo> obj); 207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<TypeSwitch> ToLocal( 208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::TypeSwitchInfo> obj); 209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::TemplateInfo> 211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const Template* that); 212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::FunctionTemplateInfo> 213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const FunctionTemplate* that); 214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::ObjectTemplateInfo> 215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const ObjectTemplate* that); 216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::Object> 217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const Data* data); 218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::JSObject> 219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const v8::Object* data); 220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::JSArray> 221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const v8::Array* data); 222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::String> 223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const String* data); 2246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static inline v8::internal::Handle<v8::internal::Object> 225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const Script* data); 226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::JSFunction> 227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const Function* data); 228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::JSObject> 229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const Message* message); 230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::Context> 231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const v8::Context* context); 232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::SignatureInfo> 233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const v8::Signature* sig); 234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::TypeSwitchInfo> 235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const v8::TypeSwitch* that); 236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::Proxy> 237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const v8::External* that); 238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <class T> 242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic inline T* ToApi(v8::internal::Handle<v8::internal::Object> obj) { 243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<T*>(obj.location()); 244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <class T> 248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockv8::internal::Handle<T> v8::internal::Handle<T>::EscapeFrom( 249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::HandleScope* scope) { 2506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block v8::internal::Handle<T> handle; 2516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (!is_null()) { 2526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block handle = *this; 2536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 2546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return Utils::OpenHandle(*scope->Close(Utils::ToLocal(handle))); 255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementations of ToLocal 259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define MAKE_TO_LOCAL(Name, From, To) \ 261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Local<v8::To> Utils::Name(v8::internal::Handle<v8::internal::From> obj) { \ 2626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT(obj.is_null() || !obj->IsTheHole()); \ 263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Local<To>(reinterpret_cast<To*>(obj.location())); \ 264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, Context, Context) 267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, Object, Value) 268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, JSFunction, Function) 269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, String, String) 270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, JSObject, Object) 271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, JSArray, Array) 272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, Proxy, External) 273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, FunctionTemplateInfo, FunctionTemplate) 274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, ObjectTemplateInfo, ObjectTemplate) 275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, SignatureInfo, Signature) 276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, TypeSwitchInfo, TypeSwitch) 277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(MessageToLocal, Object, Message) 278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(NumberToLocal, Object, Number) 279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(IntegerToLocal, Object, Integer) 280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(Uint32ToLocal, Object, Uint32) 281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef MAKE_TO_LOCAL 283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementations of OpenHandle 286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define MAKE_OPEN_HANDLE(From, To) \ 288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::To> Utils::OpenHandle(\ 289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const v8::From* that) { \ 290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return v8::internal::Handle<v8::internal::To>( \ 291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block reinterpret_cast<v8::internal::To**>(const_cast<v8::From*>(that))); \ 292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(Template, TemplateInfo) 295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(FunctionTemplate, FunctionTemplateInfo) 296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(ObjectTemplate, ObjectTemplateInfo) 297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(Signature, SignatureInfo) 298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(TypeSwitch, TypeSwitchInfo) 299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(Data, Object) 300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(Object, JSObject) 301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(Array, JSArray) 302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(String, String) 3036ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockMAKE_OPEN_HANDLE(Script, Object) 304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(Function, JSFunction) 305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(Message, JSObject) 306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(Context, Context) 307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(External, Proxy) 308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef MAKE_OPEN_HANDLE 310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// This class is here in order to be able to declare it a friend of 315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// HandleScope. Moving these methods to be members of HandleScope would be 316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// neat in some ways, but it would expose external implementation details in 317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// our public header file, which is undesirable. 318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// There is a singleton instance of this class to hold the per-thread data. 320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// For multithreaded V8 programs this data is copied in and out of storage 321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// so that the currently executing thread always has its own copy of this 322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// data. 323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass HandleScopeImplementer { 324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block HandleScopeImplementer() 327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : blocks_(0), 328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block entered_contexts_(0), 329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block saved_contexts_(0), 330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_(NULL), 331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ignore_out_of_memory_(false), 332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block call_depth_(0) { } 333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static HandleScopeImplementer* instance(); 335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Threading support for handle data. 337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int ArchiveSpacePerThread(); 338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static char* RestoreThread(char* from); 339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static char* ArchiveThread(char* to); 340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void FreeThreadResources(); 341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Garbage collection support. 343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void Iterate(v8::internal::ObjectVisitor* v); 344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static char* Iterate(v8::internal::ObjectVisitor* v, char* data); 345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline internal::Object** GetSpareOrNewBlock(); 348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void DeleteExtensions(int extensions); 349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void IncrementCallDepth() {call_depth_++;} 351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void DecrementCallDepth() {call_depth_--;} 352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool CallDepthIsZero() { return call_depth_ == 0; } 353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void EnterContext(Handle<Object> context); 355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool LeaveLastContext(); 356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the last entered context or an empty handle if no 358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // contexts have been entered. 359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Handle<Object> LastEnteredContext(); 360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void SaveContext(Context* context); 362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Context* RestoreContext(); 363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool HasSavedContexts(); 364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline List<internal::Object**>* blocks() { return &blocks_; } 366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool ignore_out_of_memory() { return ignore_out_of_memory_; } 367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_ignore_out_of_memory(bool value) { 368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ignore_out_of_memory_ = value; 369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void ResetAfterArchive() { 373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block blocks_.Initialize(0); 374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block entered_contexts_.Initialize(0); 375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block saved_contexts_.Initialize(0); 376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_ = NULL; 377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ignore_out_of_memory_ = false; 378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block call_depth_ = 0; 379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Free() { 382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(blocks_.length() == 0); 383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(entered_contexts_.length() == 0); 384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(saved_contexts_.length() == 0); 385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block blocks_.Free(); 386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block entered_contexts_.Free(); 387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block saved_contexts_.Free(); 388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (spare_ != NULL) { 389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DeleteArray(spare_); 390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_ = NULL; 391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(call_depth_ == 0); 393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block List<internal::Object**> blocks_; 396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Used as a stack to keep track of entered contexts. 397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block List<Handle<Object> > entered_contexts_; 398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Used as a stack to keep track of saved contexts. 399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block List<Context*> saved_contexts_; 400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object** spare_; 401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool ignore_out_of_memory_; 402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int call_depth_; 403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // This is only used for threading support. 404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::ImplementationUtilities::HandleScopeData handle_scope_data_; 405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void IterateThis(ObjectVisitor* v); 407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block char* RestoreThreadHelper(char* from); 408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block char* ArchiveThreadHelper(char* to); 409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_COPY_AND_ASSIGN(HandleScopeImplementer); 411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic const int kHandleBlockSize = v8::internal::KB - 2; // fit in one page 415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HandleScopeImplementer::SaveContext(Context* context) { 418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block saved_contexts_.Add(context); 419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockContext* HandleScopeImplementer::RestoreContext() { 423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return saved_contexts_.RemoveLast(); 424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool HandleScopeImplementer::HasSavedContexts() { 428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return !saved_contexts_.is_empty(); 429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HandleScopeImplementer::EnterContext(Handle<Object> context) { 433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block entered_contexts_.Add(context); 434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool HandleScopeImplementer::LeaveLastContext() { 438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (entered_contexts_.is_empty()) return false; 439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block entered_contexts_.RemoveLast(); 440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return true; 441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Object> HandleScopeImplementer::LastEnteredContext() { 445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (entered_contexts_.is_empty()) return Handle<Object>::null(); 446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return entered_contexts_.last(); 447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// If there's a spare block, use it for growing the current scope. 451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinternal::Object** HandleScopeImplementer::GetSpareOrNewBlock() { 452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block internal::Object** block = (spare_ != NULL) ? 453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_ : 454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block NewArray<internal::Object*>(kHandleBlockSize); 455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_ = NULL; 456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return block; 457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HandleScopeImplementer::DeleteExtensions(int extensions) { 461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (spare_ != NULL) { 462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DeleteArray(spare_); 463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_ = NULL; 464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (int i = extensions; i > 1; --i) { 466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block internal::Object** block = blocks_.RemoveLast(); 467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG 468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::ImplementationUtilities::ZapHandleRange(block, 469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block &block[kHandleBlockSize]); 470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DeleteArray(block); 472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_ = blocks_.RemoveLast(); 474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG 475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::ImplementationUtilities::ZapHandleRange( 476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_, 477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block &spare_[kHandleBlockSize]); 478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} } // namespace v8::internal 482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // V8_API_H_ 484