api.h revision a7e24c173cf37484693b9abb38e494fa7bd7baeb
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 128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockv8::Arguments::Arguments(v8::Local<v8::Value> data, 129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::Local<v8::Object> holder, 130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::Local<v8::Function> callee, 131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_construct_call, 132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void** values, int length) 133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : data_(data), holder_(holder), callee_(callee), 134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block is_construct_call_(is_construct_call), 135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block values_(values), length_(length) { } 136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockenum ExtensionTraversalState { 139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block UNVISITED, VISITED, INSTALLED 140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass RegisteredExtension { 144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block explicit RegisteredExtension(Extension* extension); 146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void Register(RegisteredExtension* that); 147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Extension* extension() { return extension_; } 148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegisteredExtension* next() { return next_; } 149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegisteredExtension* next_auto() { return next_auto_; } 150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ExtensionTraversalState state() { return state_; } 151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void set_state(ExtensionTraversalState value) { state_ = value; } 152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static RegisteredExtension* first_extension() { return first_extension_; } 153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Extension* extension_; 155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegisteredExtension* next_; 156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RegisteredExtension* next_auto_; 157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ExtensionTraversalState state_; 158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static RegisteredExtension* first_extension_; 159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static RegisteredExtension* first_auto_extension_; 160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Utils { 164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool ReportApiFailure(const char* location, const char* message); 166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Local<FunctionTemplate> ToFunctionTemplate(NeanderObject obj); 168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Local<ObjectTemplate> ToObjectTemplate(NeanderObject obj); 169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Context> ToLocal( 171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::Context> obj); 172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Value> ToLocal( 173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::Object> obj); 174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Function> ToLocal( 175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::JSFunction> obj); 176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<String> ToLocal( 177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::String> obj); 178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Object> ToLocal( 179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::JSObject> obj); 180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Array> ToLocal( 181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::JSArray> obj); 182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<External> ToLocal( 183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::Proxy> obj); 184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Message> MessageToLocal( 185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::Object> obj); 186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Number> NumberToLocal( 187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::Object> obj); 188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Integer> IntegerToLocal( 189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::Object> obj); 190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Uint32> Uint32ToLocal( 191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::Object> obj); 192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<FunctionTemplate> ToLocal( 193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::FunctionTemplateInfo> obj); 194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<ObjectTemplate> ToLocal( 195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::ObjectTemplateInfo> obj); 196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<Signature> ToLocal( 197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::SignatureInfo> obj); 198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Local<TypeSwitch> ToLocal( 199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::TypeSwitchInfo> obj); 200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::TemplateInfo> 202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const Template* that); 203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::FunctionTemplateInfo> 204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const FunctionTemplate* that); 205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::ObjectTemplateInfo> 206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const ObjectTemplate* that); 207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::Object> 208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const Data* data); 209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::JSObject> 210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const v8::Object* data); 211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::JSArray> 212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const v8::Array* data); 213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::String> 214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const String* data); 215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::JSFunction> 216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const Script* data); 217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::JSFunction> 218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const Function* data); 219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::JSObject> 220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const Message* message); 221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::Context> 222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const v8::Context* context); 223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::SignatureInfo> 224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const v8::Signature* sig); 225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::TypeSwitchInfo> 226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const v8::TypeSwitch* that); 227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline v8::internal::Handle<v8::internal::Proxy> 228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OpenHandle(const v8::External* that); 229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <class T> 233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic inline T* ToApi(v8::internal::Handle<v8::internal::Object> obj) { 234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<T*>(obj.location()); 235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <class T> 239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockv8::internal::Handle<T> v8::internal::Handle<T>::EscapeFrom( 240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::HandleScope* scope) { 241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Utils::OpenHandle(*scope->Close(Utils::ToLocal(*this))); 242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementations of ToLocal 246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define MAKE_TO_LOCAL(Name, From, To) \ 248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Local<v8::To> Utils::Name(v8::internal::Handle<v8::internal::From> obj) { \ 249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!obj->IsTheHole()); \ 250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Local<To>(reinterpret_cast<To*>(obj.location())); \ 251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, Context, Context) 254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, Object, Value) 255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, JSFunction, Function) 256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, String, String) 257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, JSObject, Object) 258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, JSArray, Array) 259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, Proxy, External) 260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, FunctionTemplateInfo, FunctionTemplate) 261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, ObjectTemplateInfo, ObjectTemplate) 262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, SignatureInfo, Signature) 263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(ToLocal, TypeSwitchInfo, TypeSwitch) 264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(MessageToLocal, Object, Message) 265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(NumberToLocal, Object, Number) 266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(IntegerToLocal, Object, Integer) 267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_TO_LOCAL(Uint32ToLocal, Object, Uint32) 268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef MAKE_TO_LOCAL 270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementations of OpenHandle 273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define MAKE_OPEN_HANDLE(From, To) \ 275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::internal::Handle<v8::internal::To> Utils::OpenHandle(\ 276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const v8::From* that) { \ 277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return v8::internal::Handle<v8::internal::To>( \ 278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block reinterpret_cast<v8::internal::To**>(const_cast<v8::From*>(that))); \ 279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(Template, TemplateInfo) 282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(FunctionTemplate, FunctionTemplateInfo) 283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(ObjectTemplate, ObjectTemplateInfo) 284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(Signature, SignatureInfo) 285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(TypeSwitch, TypeSwitchInfo) 286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(Data, Object) 287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(Object, JSObject) 288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(Array, JSArray) 289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(String, String) 290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(Script, JSFunction) 291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(Function, JSFunction) 292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(Message, JSObject) 293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(Context, Context) 294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMAKE_OPEN_HANDLE(External, Proxy) 295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef MAKE_OPEN_HANDLE 297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// This class is here in order to be able to declare it a friend of 302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// HandleScope. Moving these methods to be members of HandleScope would be 303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// neat in some ways, but it would expose external implementation details in 304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// our public header file, which is undesirable. 305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// There is a singleton instance of this class to hold the per-thread data. 307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// For multithreaded V8 programs this data is copied in and out of storage 308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// so that the currently executing thread always has its own copy of this 309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// data. 310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass HandleScopeImplementer { 311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block HandleScopeImplementer() 314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : blocks_(0), 315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block entered_contexts_(0), 316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block saved_contexts_(0), 317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_(NULL), 318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ignore_out_of_memory_(false), 319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block call_depth_(0) { } 320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static HandleScopeImplementer* instance(); 322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Threading support for handle data. 324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int ArchiveSpacePerThread(); 325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static char* RestoreThread(char* from); 326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static char* ArchiveThread(char* to); 327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void FreeThreadResources(); 328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Garbage collection support. 330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void Iterate(v8::internal::ObjectVisitor* v); 331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static char* Iterate(v8::internal::ObjectVisitor* v, char* data); 332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline internal::Object** GetSpareOrNewBlock(); 335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void DeleteExtensions(int extensions); 336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void IncrementCallDepth() {call_depth_++;} 338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void DecrementCallDepth() {call_depth_--;} 339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool CallDepthIsZero() { return call_depth_ == 0; } 340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void EnterContext(Handle<Object> context); 342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool LeaveLastContext(); 343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the last entered context or an empty handle if no 345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // contexts have been entered. 346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Handle<Object> LastEnteredContext(); 347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void SaveContext(Context* context); 349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Context* RestoreContext(); 350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool HasSavedContexts(); 351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline List<internal::Object**>* blocks() { return &blocks_; } 353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool ignore_out_of_memory() { return ignore_out_of_memory_; } 354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_ignore_out_of_memory(bool value) { 355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ignore_out_of_memory_ = value; 356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void ResetAfterArchive() { 360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block blocks_.Initialize(0); 361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block entered_contexts_.Initialize(0); 362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block saved_contexts_.Initialize(0); 363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_ = NULL; 364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ignore_out_of_memory_ = false; 365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block call_depth_ = 0; 366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Free() { 369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(blocks_.length() == 0); 370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(entered_contexts_.length() == 0); 371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(saved_contexts_.length() == 0); 372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block blocks_.Free(); 373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block entered_contexts_.Free(); 374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block saved_contexts_.Free(); 375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (spare_ != NULL) { 376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DeleteArray(spare_); 377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_ = NULL; 378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(call_depth_ == 0); 380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block List<internal::Object**> blocks_; 383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Used as a stack to keep track of entered contexts. 384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block List<Handle<Object> > entered_contexts_; 385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Used as a stack to keep track of saved contexts. 386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block List<Context*> saved_contexts_; 387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object** spare_; 388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool ignore_out_of_memory_; 389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int call_depth_; 390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // This is only used for threading support. 391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::ImplementationUtilities::HandleScopeData handle_scope_data_; 392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void IterateThis(ObjectVisitor* v); 394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block char* RestoreThreadHelper(char* from); 395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block char* ArchiveThreadHelper(char* to); 396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_COPY_AND_ASSIGN(HandleScopeImplementer); 398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic const int kHandleBlockSize = v8::internal::KB - 2; // fit in one page 402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HandleScopeImplementer::SaveContext(Context* context) { 405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block saved_contexts_.Add(context); 406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockContext* HandleScopeImplementer::RestoreContext() { 410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return saved_contexts_.RemoveLast(); 411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool HandleScopeImplementer::HasSavedContexts() { 415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return !saved_contexts_.is_empty(); 416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HandleScopeImplementer::EnterContext(Handle<Object> context) { 420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block entered_contexts_.Add(context); 421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool HandleScopeImplementer::LeaveLastContext() { 425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (entered_contexts_.is_empty()) return false; 426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block entered_contexts_.RemoveLast(); 427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return true; 428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Object> HandleScopeImplementer::LastEnteredContext() { 432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (entered_contexts_.is_empty()) return Handle<Object>::null(); 433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return entered_contexts_.last(); 434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// If there's a spare block, use it for growing the current scope. 438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinternal::Object** HandleScopeImplementer::GetSpareOrNewBlock() { 439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block internal::Object** block = (spare_ != NULL) ? 440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_ : 441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block NewArray<internal::Object*>(kHandleBlockSize); 442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_ = NULL; 443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return block; 444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HandleScopeImplementer::DeleteExtensions(int extensions) { 448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (spare_ != NULL) { 449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DeleteArray(spare_); 450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_ = NULL; 451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (int i = extensions; i > 1; --i) { 453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block internal::Object** block = blocks_.RemoveLast(); 454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG 455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::ImplementationUtilities::ZapHandleRange(block, 456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block &block[kHandleBlockSize]); 457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DeleteArray(block); 459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_ = blocks_.RemoveLast(); 461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG 462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v8::ImplementationUtilities::ZapHandleRange( 463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_, 464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block &spare_[kHandleBlockSize]); 465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} } // namespace v8::internal 469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // V8_API_H_ 471