summaryrefslogtreecommitdiff
path: root/src/3rdparty/v8/src/api.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/v8/src/api.h')
-rw-r--r--src/3rdparty/v8/src/api.h594
1 files changed, 0 insertions, 594 deletions
diff --git a/src/3rdparty/v8/src/api.h b/src/3rdparty/v8/src/api.h
deleted file mode 100644
index ca2240b..0000000
--- a/src/3rdparty/v8/src/api.h
+++ /dev/null
@@ -1,594 +0,0 @@
-// Copyright 2012 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following
-// disclaimer in the documentation and/or other materials provided
-// with the distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived
-// from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef V8_API_H_
-#define V8_API_H_
-
-#include "v8.h"
-
-#include "../include/v8-testing.h"
-#include "apiutils.h"
-#include "contexts.h"
-#include "factory.h"
-#include "isolate.h"
-#include "list-inl.h"
-
-namespace v8 {
-
-// Constants used in the implementation of the API. The most natural thing
-// would usually be to place these with the classes that use them, but
-// we want to keep them out of v8.h because it is an externally
-// visible file.
-class Consts {
- public:
- enum TemplateType {
- FUNCTION_TEMPLATE = 0,
- OBJECT_TEMPLATE = 1
- };
-};
-
-
-// Utilities for working with neander-objects, primitive
-// env-independent JSObjects used by the api.
-class NeanderObject {
- public:
- explicit NeanderObject(int size);
- explicit inline NeanderObject(v8::internal::Handle<v8::internal::Object> obj);
- explicit inline NeanderObject(v8::internal::Object* obj);
- inline v8::internal::Object* get(int index);
- inline void set(int index, v8::internal::Object* value);
- inline v8::internal::Handle<v8::internal::JSObject> value() { return value_; }
- int size();
- private:
- v8::internal::Handle<v8::internal::JSObject> value_;
-};
-
-
-// Utilities for working with neander-arrays, a simple extensible
-// array abstraction built on neander-objects.
-class NeanderArray {
- public:
- NeanderArray();
- explicit inline NeanderArray(v8::internal::Handle<v8::internal::Object> obj);
- inline v8::internal::Handle<v8::internal::JSObject> value() {
- return obj_.value();
- }
-
- void add(v8::internal::Handle<v8::internal::Object> value);
-
- int length();
-
- v8::internal::Object* get(int index);
- // Change the value at an index to undefined value. If the index is
- // out of bounds, the request is ignored. Returns the old value.
- void set(int index, v8::internal::Object* value);
- private:
- NeanderObject obj_;
-};
-
-
-NeanderObject::NeanderObject(v8::internal::Handle<v8::internal::Object> obj)
- : value_(v8::internal::Handle<v8::internal::JSObject>::cast(obj)) { }
-
-
-NeanderObject::NeanderObject(v8::internal::Object* obj)
- : value_(v8::internal::Handle<v8::internal::JSObject>(
- v8::internal::JSObject::cast(obj))) { }
-
-
-NeanderArray::NeanderArray(v8::internal::Handle<v8::internal::Object> obj)
- : obj_(obj) { }
-
-
-v8::internal::Object* NeanderObject::get(int offset) {
- ASSERT(value()->HasFastObjectElements());
- return v8::internal::FixedArray::cast(value()->elements())->get(offset);
-}
-
-
-void NeanderObject::set(int offset, v8::internal::Object* value) {
- ASSERT(value_->HasFastObjectElements());
- v8::internal::FixedArray::cast(value_->elements())->set(offset, value);
-}
-
-
-template <typename T> inline T ToCData(v8::internal::Object* obj) {
- STATIC_ASSERT(sizeof(T) == sizeof(v8::internal::Address));
- return reinterpret_cast<T>(
- reinterpret_cast<intptr_t>(
- v8::internal::Foreign::cast(obj)->foreign_address()));
-}
-
-
-template <typename T>
-inline v8::internal::Handle<v8::internal::Object> FromCData(T obj) {
- STATIC_ASSERT(sizeof(T) == sizeof(v8::internal::Address));
- return FACTORY->NewForeign(
- reinterpret_cast<v8::internal::Address>(reinterpret_cast<intptr_t>(obj)));
-}
-
-
-class ApiFunction {
- public:
- explicit ApiFunction(v8::internal::Address addr) : addr_(addr) { }
- v8::internal::Address address() { return addr_; }
- private:
- v8::internal::Address addr_;
-};
-
-
-
-class RegisteredExtension {
- public:
- explicit RegisteredExtension(Extension* extension);
- static void Register(RegisteredExtension* that);
- static void UnregisterAll();
- Extension* extension() { return extension_; }
- RegisteredExtension* next() { return next_; }
- RegisteredExtension* next_auto() { return next_auto_; }
- static RegisteredExtension* first_extension() { return first_extension_; }
- private:
- Extension* extension_;
- RegisteredExtension* next_;
- RegisteredExtension* next_auto_;
- static RegisteredExtension* first_extension_;
-};
-
-
-#define OPEN_HANDLE_LIST(V) \
- V(Template, TemplateInfo) \
- V(FunctionTemplate, FunctionTemplateInfo) \
- V(ObjectTemplate, ObjectTemplateInfo) \
- V(Signature, SignatureInfo) \
- V(AccessorSignature, FunctionTemplateInfo) \
- V(TypeSwitch, TypeSwitchInfo) \
- V(Data, Object) \
- V(RegExp, JSRegExp) \
- V(Object, JSObject) \
- V(Array, JSArray) \
- V(String, String) \
- V(Script, Object) \
- V(Function, JSFunction) \
- V(Message, JSObject) \
- V(Context, Context) \
- V(External, Foreign) \
- V(StackTrace, JSArray) \
- V(StackFrame, JSObject)
-
-
-class Utils {
- public:
- static bool ReportApiFailure(const char* location, const char* message);
-
- static Local<FunctionTemplate> ToFunctionTemplate(NeanderObject obj);
- static Local<ObjectTemplate> ToObjectTemplate(NeanderObject obj);
-
- static inline Local<Context> ToLocal(
- v8::internal::Handle<v8::internal::Context> obj);
- static inline Local<Value> ToLocal(
- v8::internal::Handle<v8::internal::Object> obj);
- static inline Local<Function> ToLocal(
- v8::internal::Handle<v8::internal::JSFunction> obj);
- static inline Local<String> ToLocal(
- v8::internal::Handle<v8::internal::String> obj);
- static inline Local<RegExp> ToLocal(
- v8::internal::Handle<v8::internal::JSRegExp> obj);
- static inline Local<Object> ToLocal(
- v8::internal::Handle<v8::internal::JSObject> obj);
- static inline Local<Array> ToLocal(
- v8::internal::Handle<v8::internal::JSArray> obj);
- static inline Local<Message> MessageToLocal(
- v8::internal::Handle<v8::internal::Object> obj);
- static inline Local<StackTrace> StackTraceToLocal(
- v8::internal::Handle<v8::internal::JSArray> obj);
- static inline Local<StackFrame> StackFrameToLocal(
- v8::internal::Handle<v8::internal::JSObject> obj);
- static inline Local<Number> NumberToLocal(
- v8::internal::Handle<v8::internal::Object> obj);
- static inline Local<Integer> IntegerToLocal(
- v8::internal::Handle<v8::internal::Object> obj);
- static inline Local<Uint32> Uint32ToLocal(
- v8::internal::Handle<v8::internal::Object> obj);
- static inline Local<FunctionTemplate> ToLocal(
- v8::internal::Handle<v8::internal::FunctionTemplateInfo> obj);
- static inline Local<ObjectTemplate> ToLocal(
- v8::internal::Handle<v8::internal::ObjectTemplateInfo> obj);
- static inline Local<Signature> ToLocal(
- v8::internal::Handle<v8::internal::SignatureInfo> obj);
- static inline Local<AccessorSignature> AccessorSignatureToLocal(
- v8::internal::Handle<v8::internal::FunctionTemplateInfo> obj);
- static inline Local<TypeSwitch> ToLocal(
- v8::internal::Handle<v8::internal::TypeSwitchInfo> obj);
- static inline Local<External> ExternalToLocal(
- v8::internal::Handle<v8::internal::JSObject> obj);
-
-#define DECLARE_OPEN_HANDLE(From, To) \
- static inline v8::internal::Handle<v8::internal::To> \
- OpenHandle(const From* that, bool allow_empty_handle = false);
-
-OPEN_HANDLE_LIST(DECLARE_OPEN_HANDLE)
-
-#undef DECLARE_OPEN_HANDLE
-};
-
-
-template <class T>
-inline T* ToApi(v8::internal::Handle<v8::internal::Object> obj) {
- return reinterpret_cast<T*>(obj.location());
-}
-
-
-template <class T>
-v8::internal::Handle<T> v8::internal::Handle<T>::EscapeFrom(
- v8::HandleScope* scope) {
- v8::internal::Handle<T> handle;
- if (!is_null()) {
- handle = *this;
- }
- return Utils::OpenHandle(*scope->Close(Utils::ToLocal(handle)), true);
-}
-
-
-// Implementations of ToLocal
-
-#define MAKE_TO_LOCAL(Name, From, To) \
- Local<v8::To> Utils::Name(v8::internal::Handle<v8::internal::From> obj) { \
- ASSERT(obj.is_null() || !obj->IsTheHole()); \
- return Local<To>(reinterpret_cast<To*>(obj.location())); \
- }
-
-MAKE_TO_LOCAL(ToLocal, Context, Context)
-MAKE_TO_LOCAL(ToLocal, Object, Value)
-MAKE_TO_LOCAL(ToLocal, JSFunction, Function)
-MAKE_TO_LOCAL(ToLocal, String, String)
-MAKE_TO_LOCAL(ToLocal, JSRegExp, RegExp)
-MAKE_TO_LOCAL(ToLocal, JSObject, Object)
-MAKE_TO_LOCAL(ToLocal, JSArray, Array)
-MAKE_TO_LOCAL(ToLocal, FunctionTemplateInfo, FunctionTemplate)
-MAKE_TO_LOCAL(ToLocal, ObjectTemplateInfo, ObjectTemplate)
-MAKE_TO_LOCAL(ToLocal, SignatureInfo, Signature)
-MAKE_TO_LOCAL(AccessorSignatureToLocal, FunctionTemplateInfo, AccessorSignature)
-MAKE_TO_LOCAL(ToLocal, TypeSwitchInfo, TypeSwitch)
-MAKE_TO_LOCAL(MessageToLocal, Object, Message)
-MAKE_TO_LOCAL(StackTraceToLocal, JSArray, StackTrace)
-MAKE_TO_LOCAL(StackFrameToLocal, JSObject, StackFrame)
-MAKE_TO_LOCAL(NumberToLocal, Object, Number)
-MAKE_TO_LOCAL(IntegerToLocal, Object, Integer)
-MAKE_TO_LOCAL(Uint32ToLocal, Object, Uint32)
-MAKE_TO_LOCAL(ExternalToLocal, JSObject, External)
-
-#undef MAKE_TO_LOCAL
-
-
-// Implementations of OpenHandle
-
-#define MAKE_OPEN_HANDLE(From, To) \
- v8::internal::Handle<v8::internal::To> Utils::OpenHandle( \
- const v8::From* that, bool allow_empty_handle) { \
- EXTRA_CHECK(allow_empty_handle || that != NULL); \
- return v8::internal::Handle<v8::internal::To>( \
- reinterpret_cast<v8::internal::To**>(const_cast<v8::From*>(that))); \
- }
-
-OPEN_HANDLE_LIST(MAKE_OPEN_HANDLE)
-
-#undef MAKE_OPEN_HANDLE
-#undef OPEN_HANDLE_LIST
-
-
-namespace internal {
-
-// Tracks string usage to help make better decisions when
-// externalizing strings.
-//
-// Implementation note: internally this class only tracks fresh
-// strings and keeps a single use counter for them.
-class StringTracker {
- public:
- // Records that the given string's characters were copied to some
- // external buffer. If this happens often we should honor
- // externalization requests for the string.
- void RecordWrite(Handle<String> string) {
- Address address = reinterpret_cast<Address>(*string);
- Address top = isolate_->heap()->NewSpaceTop();
- if (IsFreshString(address, top)) {
- IncrementUseCount(top);
- }
- }
-
- // Estimates freshness and use frequency of the given string based
- // on how close it is to the new space top and the recorded usage
- // history.
- inline bool IsFreshUnusedString(Handle<String> string) {
- Address address = reinterpret_cast<Address>(*string);
- Address top = isolate_->heap()->NewSpaceTop();
- return IsFreshString(address, top) && IsUseCountLow(top);
- }
-
- private:
- StringTracker() : use_count_(0), last_top_(NULL), isolate_(NULL) { }
-
- static inline bool IsFreshString(Address string, Address top) {
- return top - kFreshnessLimit <= string && string <= top;
- }
-
- inline bool IsUseCountLow(Address top) {
- if (last_top_ != top) return true;
- return use_count_ < kUseLimit;
- }
-
- inline void IncrementUseCount(Address top) {
- if (last_top_ != top) {
- use_count_ = 0;
- last_top_ = top;
- }
- ++use_count_;
- }
-
- // Single use counter shared by all fresh strings.
- int use_count_;
-
- // Last new space top when the use count above was valid.
- Address last_top_;
-
- Isolate* isolate_;
-
- // How close to the new space top a fresh string has to be.
- static const int kFreshnessLimit = 1024;
-
- // The number of uses required to consider a string useful.
- static const int kUseLimit = 32;
-
- friend class Isolate;
-
- DISALLOW_COPY_AND_ASSIGN(StringTracker);
-};
-
-
-class DeferredHandles {
- public:
- ~DeferredHandles();
-
- private:
- DeferredHandles(Object** first_block_limit, Isolate* isolate)
- : next_(NULL),
- previous_(NULL),
- first_block_limit_(first_block_limit),
- isolate_(isolate) {
- isolate->LinkDeferredHandles(this);
- }
-
- void Iterate(ObjectVisitor* v);
-
- List<Object**> blocks_;
- DeferredHandles* next_;
- DeferredHandles* previous_;
- Object** first_block_limit_;
- Isolate* isolate_;
-
- friend class HandleScopeImplementer;
- friend class Isolate;
-};
-
-
-// This class is here in order to be able to declare it a friend of
-// HandleScope. Moving these methods to be members of HandleScope would be
-// neat in some ways, but it would expose internal implementation details in
-// our public header file, which is undesirable.
-//
-// An isolate has a single instance of this class to hold the current thread's
-// data. In multithreaded V8 programs this data is copied in and out of storage
-// so that the currently executing thread always has its own copy of this
-// data.
-class HandleScopeImplementer {
- public:
- explicit HandleScopeImplementer(Isolate* isolate)
- : isolate_(isolate),
- blocks_(0),
- entered_contexts_(0),
- saved_contexts_(0),
- spare_(NULL),
- call_depth_(0),
- last_handle_before_deferred_block_(NULL) { }
-
- ~HandleScopeImplementer() {
- DeleteArray(spare_);
- }
-
- // Threading support for handle data.
- static int ArchiveSpacePerThread();
- char* RestoreThread(char* from);
- char* ArchiveThread(char* to);
- void FreeThreadResources();
-
- // Garbage collection support.
- void Iterate(v8::internal::ObjectVisitor* v);
- static char* Iterate(v8::internal::ObjectVisitor* v, char* data);
-
-
- inline internal::Object** GetSpareOrNewBlock();
- inline void DeleteExtensions(internal::Object** prev_limit);
-
- inline void IncrementCallDepth() {call_depth_++;}
- inline void DecrementCallDepth() {call_depth_--;}
- inline bool CallDepthIsZero() { return call_depth_ == 0; }
-
- inline void EnterContext(Handle<Object> context);
- inline bool LeaveLastContext();
-
- // Returns the last entered context or an empty handle if no
- // contexts have been entered.
- inline Handle<Object> LastEnteredContext();
-
- inline void SaveContext(Context* context);
- inline Context* RestoreContext();
- inline bool HasSavedContexts();
-
- inline List<internal::Object**>* blocks() { return &blocks_; }
- Isolate* isolate() const { return isolate_; }
-
- void ReturnBlock(Object** block) {
- ASSERT(block != NULL);
- if (spare_ != NULL) DeleteArray(spare_);
- spare_ = block;
- }
-
- private:
- void ResetAfterArchive() {
- blocks_.Initialize(0);
- entered_contexts_.Initialize(0);
- saved_contexts_.Initialize(0);
- spare_ = NULL;
- last_handle_before_deferred_block_ = NULL;
- call_depth_ = 0;
- }
-
- void Free() {
- ASSERT(blocks_.length() == 0);
- ASSERT(entered_contexts_.length() == 0);
- ASSERT(saved_contexts_.length() == 0);
- blocks_.Free();
- entered_contexts_.Free();
- saved_contexts_.Free();
- if (spare_ != NULL) {
- DeleteArray(spare_);
- spare_ = NULL;
- }
- ASSERT(call_depth_ == 0);
- }
-
- void BeginDeferredScope();
- DeferredHandles* Detach(Object** prev_limit);
-
- Isolate* isolate_;
- List<internal::Object**> blocks_;
- // Used as a stack to keep track of entered contexts.
- List<Handle<Object> > entered_contexts_;
- // Used as a stack to keep track of saved contexts.
- List<Context*> saved_contexts_;
- Object** spare_;
- int call_depth_;
- Object** last_handle_before_deferred_block_;
- // This is only used for threading support.
- v8::ImplementationUtilities::HandleScopeData handle_scope_data_;
-
- void IterateThis(ObjectVisitor* v);
- char* RestoreThreadHelper(char* from);
- char* ArchiveThreadHelper(char* to);
-
- friend class DeferredHandles;
- friend class DeferredHandleScope;
-
- DISALLOW_COPY_AND_ASSIGN(HandleScopeImplementer);
-};
-
-
-const int kHandleBlockSize = v8::internal::KB - 2; // fit in one page
-
-
-void HandleScopeImplementer::SaveContext(Context* context) {
- saved_contexts_.Add(context);
-}
-
-
-Context* HandleScopeImplementer::RestoreContext() {
- return saved_contexts_.RemoveLast();
-}
-
-
-bool HandleScopeImplementer::HasSavedContexts() {
- return !saved_contexts_.is_empty();
-}
-
-
-void HandleScopeImplementer::EnterContext(Handle<Object> context) {
- entered_contexts_.Add(context);
-}
-
-
-bool HandleScopeImplementer::LeaveLastContext() {
- if (entered_contexts_.is_empty()) return false;
- entered_contexts_.RemoveLast();
- return true;
-}
-
-
-Handle<Object> HandleScopeImplementer::LastEnteredContext() {
- if (entered_contexts_.is_empty()) return Handle<Object>::null();
- return entered_contexts_.last();
-}
-
-
-// If there's a spare block, use it for growing the current scope.
-internal::Object** HandleScopeImplementer::GetSpareOrNewBlock() {
- internal::Object** block = (spare_ != NULL) ?
- spare_ :
- NewArray<internal::Object*>(kHandleBlockSize);
- spare_ = NULL;
- return block;
-}
-
-
-void HandleScopeImplementer::DeleteExtensions(internal::Object** prev_limit) {
- while (!blocks_.is_empty()) {
- internal::Object** block_start = blocks_.last();
- internal::Object** block_limit = block_start + kHandleBlockSize;
-#ifdef DEBUG
- // NoHandleAllocation may make the prev_limit to point inside the block.
- if (block_start <= prev_limit && prev_limit <= block_limit) break;
-#else
- if (prev_limit == block_limit) break;
-#endif
-
- blocks_.RemoveLast();
-#ifdef DEBUG
- v8::ImplementationUtilities::ZapHandleRange(block_start, block_limit);
-#endif
- if (spare_ != NULL) {
- DeleteArray(spare_);
- }
- spare_ = block_start;
- }
- ASSERT((blocks_.is_empty() && prev_limit == NULL) ||
- (!blocks_.is_empty() && prev_limit != NULL));
-}
-
-
-class Testing {
- public:
- static v8::Testing::StressType stress_type() { return stress_type_; }
- static void set_stress_type(v8::Testing::StressType stress_type) {
- stress_type_ = stress_type;
- }
-
- private:
- static v8::Testing::StressType stress_type_;
-};
-
-} } // namespace v8::internal
-
-#endif // V8_API_H_