| Index: src/api.cc
|
| ===================================================================
|
| --- src/api.cc (revision 2749)
|
| +++ src/api.cc (working copy)
|
| @@ -100,8 +100,10 @@
|
|
|
|
|
| static FatalErrorCallback exception_behavior = NULL;
|
| +int i::Internals::kJSObjectType = JS_OBJECT_TYPE;
|
| +int i::Internals::kFirstNonstringType = FIRST_NONSTRING_TYPE;
|
| +int i::Internals::kProxyType = PROXY_TYPE;
|
|
|
| -
|
| static void DefaultFatalErrorHandler(const char* location,
|
| const char* message) {
|
| ENTER_V8;
|
| @@ -223,7 +225,8 @@
|
|
|
|
|
| #ifdef DEBUG
|
| -void ImplementationUtilities::ZapHandleRange(void** begin, void** end) {
|
| +void ImplementationUtilities::ZapHandleRange(i::Object** begin,
|
| + i::Object** end) {
|
| i::HandleScope::ZapRange(begin, end);
|
| }
|
| #endif
|
| @@ -349,49 +352,47 @@
|
| }
|
|
|
|
|
| -void** V8::GlobalizeReference(void** obj) {
|
| +i::Object** V8::GlobalizeReference(i::Object** obj) {
|
| if (IsDeadCheck("V8::Persistent::New")) return NULL;
|
| LOG_API("Persistent::New");
|
| i::Handle<i::Object> result =
|
| - i::GlobalHandles::Create(*reinterpret_cast<i::Object**>(obj));
|
| - return reinterpret_cast<void**>(result.location());
|
| + i::GlobalHandles::Create(*obj);
|
| + return result.location();
|
| }
|
|
|
|
|
| -void V8::MakeWeak(void** object, void* parameters,
|
| +void V8::MakeWeak(i::Object** object, void* parameters,
|
| WeakReferenceCallback callback) {
|
| LOG_API("MakeWeak");
|
| - i::GlobalHandles::MakeWeak(reinterpret_cast<i::Object**>(object), parameters,
|
| - callback);
|
| + i::GlobalHandles::MakeWeak(object, parameters, callback);
|
| }
|
|
|
|
|
| -void V8::ClearWeak(void** obj) {
|
| +void V8::ClearWeak(i::Object** obj) {
|
| LOG_API("ClearWeak");
|
| - i::GlobalHandles::ClearWeakness(reinterpret_cast<i::Object**>(obj));
|
| + i::GlobalHandles::ClearWeakness(obj);
|
| }
|
|
|
|
|
| -bool V8::IsGlobalNearDeath(void** obj) {
|
| +bool V8::IsGlobalNearDeath(i::Object** obj) {
|
| LOG_API("IsGlobalNearDeath");
|
| if (!i::V8::IsRunning()) return false;
|
| - return i::GlobalHandles::IsNearDeath(reinterpret_cast<i::Object**>(obj));
|
| + return i::GlobalHandles::IsNearDeath(obj);
|
| }
|
|
|
|
|
| -bool V8::IsGlobalWeak(void** obj) {
|
| +bool V8::IsGlobalWeak(i::Object** obj) {
|
| LOG_API("IsGlobalWeak");
|
| if (!i::V8::IsRunning()) return false;
|
| - return i::GlobalHandles::IsWeak(reinterpret_cast<i::Object**>(obj));
|
| + return i::GlobalHandles::IsWeak(obj);
|
| }
|
|
|
|
|
| -void V8::DisposeGlobal(void** obj) {
|
| +void V8::DisposeGlobal(i::Object** obj) {
|
| LOG_API("DisposeGlobal");
|
| if (!i::V8::IsRunning()) return;
|
| - i::Object** ptr = reinterpret_cast<i::Object**>(obj);
|
| - if ((*ptr)->IsGlobalContext()) i::Heap::NotifyContextDisposed();
|
| - i::GlobalHandles::Destroy(ptr);
|
| + if ((*obj)->IsGlobalContext()) i::Heap::NotifyContextDisposed();
|
| + i::GlobalHandles::Destroy(obj);
|
| }
|
|
|
| // --- H a n d l e s ---
|
| @@ -415,9 +416,8 @@
|
| }
|
|
|
|
|
| -void** v8::HandleScope::CreateHandle(void* value) {
|
| - return reinterpret_cast<void**>(
|
| - i::HandleScope::CreateHandle(reinterpret_cast<i::Object*>(value)));
|
| +i::Object** v8::HandleScope::CreateHandle(i::Object* value) {
|
| + return i::HandleScope::CreateHandle(value);
|
| }
|
|
|
|
|
| @@ -481,7 +481,7 @@
|
| }
|
|
|
|
|
| -void** v8::HandleScope::RawClose(void** value) {
|
| +i::Object** v8::HandleScope::RawClose(i::Object** value) {
|
| if (!ApiCheck(!is_closed_,
|
| "v8::HandleScope::Close()",
|
| "Local scope has already been closed")) {
|
| @@ -490,13 +490,13 @@
|
| LOG_API("CloseHandleScope");
|
|
|
| // Read the result before popping the handle block.
|
| - i::Object* result = reinterpret_cast<i::Object*>(*value);
|
| + i::Object* result = *value;
|
| is_closed_ = true;
|
| i::HandleScope::Leave(&previous_);
|
|
|
| // Allocate a new handle on the previous handle block.
|
| i::Handle<i::Object> handle(result);
|
| - return reinterpret_cast<void**>(handle.location());
|
| + return handle.location();
|
| }
|
|
|
|
|
| @@ -1459,9 +1459,11 @@
|
| }
|
|
|
|
|
| -bool Value::IsString() const {
|
| +bool Value::FullIsString() const {
|
| if (IsDeadCheck("v8::Value::IsString()")) return false;
|
| - return Utils::OpenHandle(this)->IsString();
|
| + bool result = Utils::OpenHandle(this)->IsString();
|
| + ASSERT_EQ(result, QuickIsString());
|
| + return result;
|
| }
|
|
|
|
|
| @@ -1613,83 +1615,75 @@
|
| }
|
|
|
|
|
| -External* External::Cast(v8::Value* that) {
|
| - if (IsDeadCheck("v8::External::Cast()")) return 0;
|
| +void External::CheckCast(v8::Value* that) {
|
| + if (IsDeadCheck("v8::External::Cast()")) return;
|
| i::Handle<i::Object> obj = Utils::OpenHandle(that);
|
| ApiCheck(obj->IsProxy(),
|
| "v8::External::Cast()",
|
| "Could not convert to external");
|
| - return static_cast<External*>(that);
|
| }
|
|
|
|
|
| -v8::Object* v8::Object::Cast(Value* that) {
|
| - if (IsDeadCheck("v8::Object::Cast()")) return 0;
|
| +void v8::Object::CheckCast(Value* that) {
|
| + if (IsDeadCheck("v8::Object::Cast()")) return;
|
| i::Handle<i::Object> obj = Utils::OpenHandle(that);
|
| ApiCheck(obj->IsJSObject(),
|
| "v8::Object::Cast()",
|
| "Could not convert to object");
|
| - return static_cast<v8::Object*>(that);
|
| }
|
|
|
|
|
| -v8::Function* v8::Function::Cast(Value* that) {
|
| - if (IsDeadCheck("v8::Function::Cast()")) return 0;
|
| +void v8::Function::CheckCast(Value* that) {
|
| + if (IsDeadCheck("v8::Function::Cast()")) return;
|
| i::Handle<i::Object> obj = Utils::OpenHandle(that);
|
| ApiCheck(obj->IsJSFunction(),
|
| "v8::Function::Cast()",
|
| "Could not convert to function");
|
| - return static_cast<v8::Function*>(that);
|
| }
|
|
|
|
|
| -v8::String* v8::String::Cast(v8::Value* that) {
|
| - if (IsDeadCheck("v8::String::Cast()")) return 0;
|
| +void v8::String::CheckCast(v8::Value* that) {
|
| + if (IsDeadCheck("v8::String::Cast()")) return;
|
| i::Handle<i::Object> obj = Utils::OpenHandle(that);
|
| ApiCheck(obj->IsString(),
|
| "v8::String::Cast()",
|
| "Could not convert to string");
|
| - return static_cast<v8::String*>(that);
|
| }
|
|
|
|
|
| -v8::Number* v8::Number::Cast(v8::Value* that) {
|
| - if (IsDeadCheck("v8::Number::Cast()")) return 0;
|
| +void v8::Number::CheckCast(v8::Value* that) {
|
| + if (IsDeadCheck("v8::Number::Cast()")) return;
|
| i::Handle<i::Object> obj = Utils::OpenHandle(that);
|
| ApiCheck(obj->IsNumber(),
|
| "v8::Number::Cast()",
|
| "Could not convert to number");
|
| - return static_cast<v8::Number*>(that);
|
| }
|
|
|
|
|
| -v8::Integer* v8::Integer::Cast(v8::Value* that) {
|
| - if (IsDeadCheck("v8::Integer::Cast()")) return 0;
|
| +void v8::Integer::CheckCast(v8::Value* that) {
|
| + if (IsDeadCheck("v8::Integer::Cast()")) return;
|
| i::Handle<i::Object> obj = Utils::OpenHandle(that);
|
| ApiCheck(obj->IsNumber(),
|
| "v8::Integer::Cast()",
|
| "Could not convert to number");
|
| - return static_cast<v8::Integer*>(that);
|
| }
|
|
|
|
|
| -v8::Array* v8::Array::Cast(Value* that) {
|
| - if (IsDeadCheck("v8::Array::Cast()")) return 0;
|
| +void v8::Array::CheckCast(Value* that) {
|
| + if (IsDeadCheck("v8::Array::Cast()")) return;
|
| i::Handle<i::Object> obj = Utils::OpenHandle(that);
|
| ApiCheck(obj->IsJSArray(),
|
| "v8::Array::Cast()",
|
| "Could not convert to array");
|
| - return static_cast<v8::Array*>(that);
|
| }
|
|
|
|
|
| -v8::Date* v8::Date::Cast(v8::Value* that) {
|
| - if (IsDeadCheck("v8::Date::Cast()")) return 0;
|
| +void v8::Date::CheckCast(v8::Value* that) {
|
| + if (IsDeadCheck("v8::Date::Cast()")) return;
|
| i::Handle<i::Object> obj = Utils::OpenHandle(that);
|
| ApiCheck(obj->HasSpecificClassOf(i::Heap::Date_symbol()),
|
| "v8::Date::Cast()",
|
| "Could not convert to date");
|
| - return static_cast<v8::Date*>(that);
|
| }
|
|
|
|
|
| @@ -2450,16 +2444,17 @@
|
| }
|
|
|
|
|
| -v8::String::ExternalStringResource*
|
| -v8::String::GetExternalStringResource() const {
|
| - EnsureInitialized("v8::String::GetExternalStringResource()");
|
| +void v8::String::VerifyExternalStringResource(
|
| + v8::String::ExternalStringResource* value) const {
|
| i::Handle<i::String> str = Utils::OpenHandle(this);
|
| + v8::String::ExternalStringResource* expected;
|
| if (i::StringShape(*str).IsExternalTwoByte()) {
|
| void* resource = i::Handle<i::ExternalTwoByteString>::cast(str)->resource();
|
| - return reinterpret_cast<ExternalStringResource*>(resource);
|
| + expected = reinterpret_cast<ExternalStringResource*>(resource);
|
| } else {
|
| - return NULL;
|
| + expected = NULL;
|
| }
|
| + CHECK_EQ(expected, value);
|
| }
|
|
|
|
|
| @@ -2519,7 +2514,7 @@
|
| }
|
|
|
|
|
| -Local<Value> v8::Object::GetInternalField(int index) {
|
| +Local<Value> v8::Object::CheckedGetInternalField(int index) {
|
| if (IsDeadCheck("v8::Object::GetInternalField()")) return Local<Value>();
|
| i::Handle<i::JSObject> obj = Utils::OpenHandle(this);
|
| if (!ApiCheck(index < obj->GetInternalFieldCount(),
|
| @@ -2528,7 +2523,12 @@
|
| return Local<Value>();
|
| }
|
| i::Handle<i::Object> value(obj->GetInternalField(index));
|
| - return Utils::ToLocal(value);
|
| + Local<Value> result = Utils::ToLocal(value);
|
| +#ifdef DEBUG
|
| + Local<Value> unchecked = UncheckedGetInternalField(index);
|
| + ASSERT(unchecked.IsEmpty() || (unchecked == result));
|
| +#endif
|
| + return result;
|
| }
|
|
|
|
|
| @@ -2546,41 +2546,8 @@
|
| }
|
|
|
|
|
| -void* v8::Object::GetPointerFromInternalField(int index) {
|
| - i::Handle<i::JSObject> obj = Utils::OpenHandle(this);
|
| - i::Object* pointer = obj->GetInternalField(index);
|
| - if (pointer->IsSmi()) {
|
| - // Fast case, aligned native pointer.
|
| - return pointer;
|
| - }
|
| -
|
| - // Read from uninitialized field.
|
| - if (!pointer->IsProxy()) {
|
| - // Play safe even if it's something unexpected.
|
| - ASSERT(pointer->IsUndefined());
|
| - return NULL;
|
| - }
|
| -
|
| - // Unaligned native pointer.
|
| - return reinterpret_cast<void*>(i::Proxy::cast(pointer)->proxy());
|
| -}
|
| -
|
| -
|
| void v8::Object::SetPointerInInternalField(int index, void* value) {
|
| - i::Handle<i::JSObject> obj = Utils::OpenHandle(this);
|
| - i::Object* as_object = reinterpret_cast<i::Object*>(value);
|
| - if (as_object->IsSmi()) {
|
| - // Aligned pointer, store as is.
|
| - obj->SetInternalField(index, as_object);
|
| - } else {
|
| - // Currently internal fields are used by DOM wrappers which only
|
| - // get garbage collected by the mark-sweep collector, so we
|
| - // pretenure the proxy.
|
| - HandleScope scope;
|
| - i::Handle<i::Proxy> proxy =
|
| - i::Factory::NewProxy(reinterpret_cast<i::Address>(value), i::TENURED);
|
| - if (!proxy.is_null()) obj->SetInternalField(index, *proxy);
|
| - }
|
| + SetInternalField(index, External::Wrap(value));
|
| }
|
|
|
|
|
| @@ -2836,9 +2803,7 @@
|
|
|
|
|
| static const intptr_t kAlignedPointerMask = 3;
|
| -static const int kAlignedPointerShift = 2;
|
|
|
| -
|
| Local<Value> v8::External::Wrap(void* data) {
|
| STATIC_ASSERT(sizeof(data) == sizeof(i::Address));
|
| LOG_API("External::Wrap");
|
| @@ -2847,7 +2812,7 @@
|
| if ((reinterpret_cast<intptr_t>(data) & kAlignedPointerMask) == 0) {
|
| uintptr_t data_ptr = reinterpret_cast<uintptr_t>(data);
|
| intptr_t data_value =
|
| - static_cast<intptr_t>(data_ptr >> kAlignedPointerShift);
|
| + static_cast<intptr_t>(data_ptr >> i::Internals::kAlignedPointerShift);
|
| STATIC_ASSERT(sizeof(data_ptr) == sizeof(data_value));
|
| if (i::Smi::IsIntptrValid(data_value)) {
|
| i::Handle<i::Object> obj(i::Smi::FromIntptr(data_value));
|
| @@ -2858,16 +2823,22 @@
|
| }
|
|
|
|
|
| -void* v8::External::Unwrap(v8::Handle<v8::Value> value) {
|
| +void* v8::External::FullUnwrap(v8::Handle<v8::Value> wrapper) {
|
| if (IsDeadCheck("v8::External::Unwrap()")) return 0;
|
| - i::Handle<i::Object> obj = Utils::OpenHandle(*value);
|
| + i::Handle<i::Object> obj = Utils::OpenHandle(*wrapper);
|
| + void* result;
|
| if (obj->IsSmi()) {
|
| // The external value was an aligned pointer.
|
| - uintptr_t result = static_cast<uintptr_t>(
|
| - i::Smi::cast(*obj)->value()) << kAlignedPointerShift;
|
| - return reinterpret_cast<void*>(result);
|
| + uintptr_t value = static_cast<uintptr_t>(
|
| + i::Smi::cast(*obj)->value()) << i::Internals::kAlignedPointerShift;
|
| + result = reinterpret_cast<void*>(value);
|
| + } else if (obj->IsProxy()) {
|
| + result = ExternalValueImpl(obj);
|
| + } else {
|
| + result = NULL;
|
| }
|
| - return ExternalValueImpl(obj);
|
| + ASSERT_EQ(result, QuickUnwrap(wrapper));
|
| + return result;
|
| }
|
|
|
|
|
| @@ -3729,19 +3700,17 @@
|
|
|
| void HandleScopeImplementer::Iterate(
|
| ObjectVisitor* v,
|
| - List<void**>* blocks,
|
| + List<i::Object**>* blocks,
|
| v8::ImplementationUtilities::HandleScopeData* handle_data) {
|
| // Iterate over all handles in the blocks except for the last.
|
| for (int i = blocks->length() - 2; i >= 0; --i) {
|
| - Object** block =
|
| - reinterpret_cast<Object**>(blocks->at(i));
|
| + Object** block = blocks->at(i);
|
| v->VisitPointers(block, &block[kHandleBlockSize]);
|
| }
|
|
|
| // Iterate over live handles in the last block (if any).
|
| if (!blocks->is_empty()) {
|
| - v->VisitPointers(reinterpret_cast<Object**>(blocks->last()),
|
| - reinterpret_cast<Object**>(handle_data->next));
|
| + v->VisitPointers(blocks->last(), handle_data->next);
|
| }
|
| }
|
|
|
| @@ -3756,7 +3725,7 @@
|
| char* HandleScopeImplementer::Iterate(ObjectVisitor* v, char* storage) {
|
| HandleScopeImplementer* thread_local =
|
| reinterpret_cast<HandleScopeImplementer*>(storage);
|
| - List<void**>* blocks_of_archived_thread = thread_local->Blocks();
|
| + List<internal::Object**>* blocks_of_archived_thread = thread_local->Blocks();
|
| v8::ImplementationUtilities::HandleScopeData* handle_data_of_archived_thread =
|
| &thread_local->handle_scope_data_;
|
| Iterate(v, blocks_of_archived_thread, handle_data_of_archived_thread);
|
|
|