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