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