diff options
Diffstat (limited to 'deps/v8/src/api.cc')
-rw-r--r-- | deps/v8/src/api.cc | 877 |
1 files changed, 292 insertions, 585 deletions
diff --git a/deps/v8/src/api.cc b/deps/v8/src/api.cc index 71a8f4a6cf..8a73877eed 100644 --- a/deps/v8/src/api.cc +++ b/deps/v8/src/api.cc @@ -77,8 +77,7 @@ namespace v8 { #define ON_BAILOUT(isolate, location, code) \ - if (IsDeadCheck(isolate, location) || \ - IsExecutionTerminatingCheck(isolate)) { \ + if (IsExecutionTerminatingCheck(isolate)) { \ code; \ UNREACHABLE(); \ } @@ -253,13 +252,6 @@ static inline bool ApiCheck(bool condition, } -static bool ReportV8Dead(const char* location) { - FatalErrorCallback callback = GetFatalErrorHandler(); - callback(location, "V8 is no longer usable"); - return true; -} - - static bool ReportEmptyHandle(const char* location) { FatalErrorCallback callback = GetFatalErrorHandler(); callback(location, "Reading from empty handle"); @@ -267,24 +259,6 @@ static bool ReportEmptyHandle(const char* location) { } -/** - * IsDeadCheck checks that the vm is usable. If, for instance, the vm has been - * out of memory at some point this check will fail. It should be called on - * entry to all methods that touch anything in the heap, except destructors - * which you sometimes can't avoid calling after the vm has crashed. Functions - * that call EnsureInitialized or ON_BAILOUT don't have to also call - * IsDeadCheck. ON_BAILOUT has the advantage over EnsureInitialized that you - * can arrange to return if the VM is dead. This is needed to ensure that no VM - * heap allocations are attempted on a dead VM. EnsureInitialized has the - * advantage over ON_BAILOUT that it actually initializes the VM if this has not - * yet been done. - */ -static inline bool IsDeadCheck(i::Isolate* isolate, const char* location) { - return !isolate->IsInitialized() - && isolate->IsDead() ? ReportV8Dead(location) : false; -} - - static inline bool IsExecutionTerminatingCheck(i::Isolate* isolate) { if (!isolate->IsInitialized()) return false; if (isolate->has_scheduled_exception()) { @@ -321,7 +295,6 @@ static bool InitializeHelper(i::Isolate* isolate) { static inline bool EnsureInitializedForIsolate(i::Isolate* isolate, const char* location) { - if (IsDeadCheck(isolate, location)) return false; if (isolate != NULL) { if (isolate->IsInitialized()) return true; } @@ -500,19 +473,7 @@ void V8::SetFlagsFromCommandLine(int* argc, char** argv, bool remove_flags) { v8::Handle<Value> ThrowException(v8::Handle<v8::Value> value) { - i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::ThrowException()")) { - return v8::Handle<Value>(); - } - ENTER_V8(isolate); - // If we're passed an empty handle, we throw an undefined exception - // to deal more gracefully with out of memory situations. - if (value.IsEmpty()) { - isolate->ScheduleThrow(isolate->heap()->undefined_value()); - } else { - isolate->ScheduleThrow(*Utils::OpenHandle(*value)); - } - return v8::Undefined(); + return v8::Isolate::GetCurrent()->ThrowException(value); } @@ -602,8 +563,7 @@ ResourceConstraints::ResourceConstraints() : max_young_space_size_(0), max_old_space_size_(0), max_executable_size_(0), - stack_limit_(NULL), - is_memory_constrained_() { } + stack_limit_(NULL) { } bool SetResourceConstraints(ResourceConstraints* constraints) { @@ -614,7 +574,8 @@ bool SetResourceConstraints(ResourceConstraints* constraints) { int max_executable_size = constraints->max_executable_size(); if (young_space_size != 0 || old_gen_size != 0 || max_executable_size != 0) { // After initialization it's too late to change Heap constraints. - ASSERT(!isolate->IsInitialized()); + // TODO(rmcilroy): fix this assert. + // ASSERT(!isolate->IsInitialized()); bool result = isolate->heap()->ConfigureHeap(young_space_size / 2, old_gen_size, max_executable_size); @@ -624,16 +585,11 @@ bool SetResourceConstraints(ResourceConstraints* constraints) { uintptr_t limit = reinterpret_cast<uintptr_t>(constraints->stack_limit()); isolate->stack_guard()->SetStackLimit(limit); } - if (constraints->is_memory_constrained().has_value) { - isolate->set_is_memory_constrained( - constraints->is_memory_constrained().value); - } return true; } i::Object** V8::GlobalizeReference(i::Isolate* isolate, i::Object** obj) { - if (IsDeadCheck(isolate, "V8::Persistent::New")) return NULL; LOG_API(isolate, "Persistent::New"); i::Handle<i::Object> result = isolate->global_handles()->Create(*obj); #ifdef DEBUG @@ -728,50 +684,58 @@ int HandleScope::NumberOfHandles() { } -i::Object** HandleScope::CreateHandle(i::Object* value) { - return i::HandleScope::CreateHandle(i::Isolate::Current(), value); +i::Object** HandleScope::CreateHandle(i::Isolate* isolate, i::Object* value) { + return i::HandleScope::CreateHandle(isolate, value); +} + + +i::Object** HandleScope::CreateHandle(i::HeapObject* heap_object, + i::Object* value) { + ASSERT(heap_object->IsHeapObject()); + return i::HandleScope::CreateHandle(heap_object->GetIsolate(), value); } -i::Object** HandleScope::CreateHandle(i::Isolate* isolate, i::Object* value) { - ASSERT(isolate == i::Isolate::Current()); - return i::HandleScope::CreateHandle(isolate, value); +EscapableHandleScope::EscapableHandleScope(Isolate* v8_isolate) { + i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); + escape_slot_ = CreateHandle(isolate, isolate->heap()->the_hole_value()); + Initialize(v8_isolate); } -i::Object** HandleScope::CreateHandle(i::HeapObject* value) { - ASSERT(value->IsHeapObject()); - return reinterpret_cast<i::Object**>( - i::HandleScope::CreateHandle(value->GetIsolate(), value)); +i::Object** EscapableHandleScope::Escape(i::Object** escape_value) { + ApiCheck(*escape_slot_ == isolate_->heap()->the_hole_value(), + "EscapeableHandleScope::Escape", + "Escape value set twice"); + if (escape_value == NULL) { + *escape_slot_ = isolate_->heap()->undefined_value(); + return NULL; + } + *escape_slot_ = *escape_value; + return escape_slot_; } void Context::Enter() { i::Handle<i::Context> env = Utils::OpenHandle(this); i::Isolate* isolate = env->GetIsolate(); - if (IsDeadCheck(isolate, "v8::Context::Enter()")) return; ENTER_V8(isolate); - isolate->handle_scope_implementer()->EnterContext(env); - isolate->handle_scope_implementer()->SaveContext(isolate->context()); isolate->set_context(*env); } void Context::Exit() { - // Exit is essentially a static function and doesn't use the - // receiver, so we have to get the current isolate from the thread - // local. + // TODO(dcarney): fix this once chrome is fixed. i::Isolate* isolate = i::Isolate::Current(); - if (!isolate->IsInitialized()) return; - - if (!ApiCheck(isolate->handle_scope_implementer()->LeaveLastContext(), + i::Handle<i::Context> context = i::Handle<i::Context>::null(); + ENTER_V8(isolate); + if (!ApiCheck(isolate->handle_scope_implementer()->LeaveContext(context), "v8::Context::Exit()", "Cannot exit non-entered context")) { return; } - // Content of 'last_context' could be NULL. i::Context* last_context = isolate->handle_scope_implementer()->RestoreContext(); @@ -797,7 +761,7 @@ static i::Handle<i::FixedArray> EmbedderDataFor(Context* context, bool can_grow, const char* location) { i::Handle<i::Context> env = Utils::OpenHandle(context); - bool ok = !IsDeadCheck(env->GetIsolate(), location) && + bool ok = ApiCheck(env->IsNativeContext(), location, "Not a native context") && ApiCheck(index >= 0, location, "Negative index"); if (!ok) return i::Handle<i::FixedArray>(); @@ -974,7 +938,6 @@ void Template::Set(v8::Handle<String> name, v8::Handle<Data> value, v8::PropertyAttribute attribute) { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Template::Set()")) return; ENTER_V8(isolate); i::HandleScope scope(isolate); const int kSize = 3; @@ -993,7 +956,6 @@ void Template::SetAccessorProperty( v8::PropertyAttribute attribute, v8::AccessControl access_control) { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::Template::SetAccessor()")) return; ENTER_V8(isolate); ASSERT(!name.IsEmpty()); ASSERT(!getter.IsEmpty() || !setter.IsEmpty()); @@ -1019,9 +981,6 @@ static void InitializeFunctionTemplate( Local<ObjectTemplate> FunctionTemplate::PrototypeTemplate() { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::FunctionTemplate::PrototypeTemplate()")) { - return Local<ObjectTemplate>(); - } ENTER_V8(isolate); i::Handle<i::Object> result(Utils::OpenHandle(this)->prototype_template(), isolate); @@ -1035,7 +994,6 @@ Local<ObjectTemplate> FunctionTemplate::PrototypeTemplate() { void FunctionTemplate::Inherit(v8::Handle<FunctionTemplate> value) { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::FunctionTemplate::Inherit()")) return; ENTER_V8(isolate); Utils::OpenHandle(this)->set_parent_template(*Utils::OpenHandle(*value)); } @@ -1061,7 +1019,9 @@ static Local<FunctionTemplate> FunctionTemplateNew( } obj->set_serial_number(i::Smi::FromInt(next_serial_number)); if (callback != 0) { - if (data.IsEmpty()) data = v8::Undefined(); + if (data.IsEmpty()) { + data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); + } Utils::ToLocal(obj)->SetCallHandler(callback, data); } obj->set_length(length); @@ -1278,7 +1238,6 @@ int TypeSwitch::match(v8::Handle<Value> value) { void FunctionTemplate::SetCallHandler(FunctionCallback callback, v8::Handle<Value> data) { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::FunctionTemplate::SetCallHandler()")) return; ENTER_V8(isolate); i::HandleScope scope(isolate); i::Handle<i::Struct> struct_obj = @@ -1286,7 +1245,9 @@ void FunctionTemplate::SetCallHandler(FunctionCallback callback, i::Handle<i::CallHandlerInfo> obj = i::Handle<i::CallHandlerInfo>::cast(struct_obj); SET_FIELD_WRAPPED(obj, set_callback, callback); - if (data.IsEmpty()) data = v8::Undefined(); + if (data.IsEmpty()) { + data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); + } obj->set_data(*Utils::OpenHandle(*data)); Utils::OpenHandle(this)->set_call_code(*obj); } @@ -1324,7 +1285,9 @@ static i::Handle<i::AccessorInfo> MakeAccessorInfo( isolate->factory()->NewExecutableAccessorInfo(); SET_FIELD_WRAPPED(obj, set_getter, getter); SET_FIELD_WRAPPED(obj, set_setter, setter); - if (data.IsEmpty()) data = v8::Undefined(); + if (data.IsEmpty()) { + data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); + } obj->set_data(*Utils::OpenHandle(*data)); return SetAccessorInfoProperties(obj, name, settings, attributes, signature); } @@ -1349,8 +1312,7 @@ static i::Handle<i::AccessorInfo> MakeAccessorInfo( Local<ObjectTemplate> FunctionTemplate::InstanceTemplate() { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::FunctionTemplate::InstanceTemplate()") - || EmptyCheck("v8::FunctionTemplate::InstanceTemplate()", this)) + if (EmptyCheck("v8::FunctionTemplate::InstanceTemplate()", this)) return Local<ObjectTemplate>(); ENTER_V8(isolate); i::Handle<i::FunctionTemplateInfo> handle = Utils::OpenHandle(this); @@ -1367,7 +1329,6 @@ Local<ObjectTemplate> FunctionTemplate::InstanceTemplate() { void FunctionTemplate::SetLength(int length) { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::FunctionTemplate::SetLength()")) return; ENTER_V8(isolate); Utils::OpenHandle(this)->set_length(length); } @@ -1375,7 +1336,6 @@ void FunctionTemplate::SetLength(int length) { void FunctionTemplate::SetClassName(Handle<String> name) { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::FunctionTemplate::SetClassName()")) return; ENTER_V8(isolate); Utils::OpenHandle(this)->set_class_name(*Utils::OpenHandle(*name)); } @@ -1383,9 +1343,6 @@ void FunctionTemplate::SetClassName(Handle<String> name) { void FunctionTemplate::SetHiddenPrototype(bool value) { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::FunctionTemplate::SetHiddenPrototype()")) { - return; - } ENTER_V8(isolate); Utils::OpenHandle(this)->set_hidden_prototype(value); } @@ -1393,9 +1350,6 @@ void FunctionTemplate::SetHiddenPrototype(bool value) { void FunctionTemplate::ReadOnlyPrototype() { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::FunctionTemplate::ReadOnlyPrototype()")) { - return; - } ENTER_V8(isolate); Utils::OpenHandle(this)->set_read_only_prototype(true); } @@ -1403,9 +1357,6 @@ void FunctionTemplate::ReadOnlyPrototype() { void FunctionTemplate::RemovePrototype() { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::FunctionTemplate::RemovePrototype()")) { - return; - } ENTER_V8(isolate); Utils::OpenHandle(this)->set_remove_prototype(true); } @@ -1422,9 +1373,6 @@ Local<ObjectTemplate> ObjectTemplate::New() { Local<ObjectTemplate> ObjectTemplate::New( v8::Handle<FunctionTemplate> constructor) { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::ObjectTemplate::New()")) { - return Local<ObjectTemplate>(); - } EnsureInitializedForIsolate(isolate, "v8::ObjectTemplate::New()"); LOG_API(isolate, "ObjectTemplate::New"); ENTER_V8(isolate); @@ -1495,7 +1443,6 @@ static bool TemplateSetAccessor( PropertyAttribute attribute, v8::Local<AccessorSignature> signature) { i::Isolate* isolate = Utils::OpenHandle(template_obj)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::ObjectTemplate::SetAccessor()")) return false; ENTER_V8(isolate); i::HandleScope scope(isolate); i::Handle<i::AccessorInfo> obj = MakeAccessorInfo( @@ -1551,9 +1498,6 @@ void ObjectTemplate::SetNamedPropertyHandler( NamedPropertyEnumeratorCallback enumerator, Handle<Value> data) { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::ObjectTemplate::SetNamedPropertyHandler()")) { - return; - } ENTER_V8(isolate); i::HandleScope scope(isolate); EnsureConstructor(this); @@ -1571,7 +1515,9 @@ void ObjectTemplate::SetNamedPropertyHandler( if (remover != 0) SET_FIELD_WRAPPED(obj, set_deleter, remover); if (enumerator != 0) SET_FIELD_WRAPPED(obj, set_enumerator, enumerator); - if (data.IsEmpty()) data = v8::Undefined(); + if (data.IsEmpty()) { + data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); + } obj->set_data(*Utils::OpenHandle(*data)); cons->set_named_property_handler(*obj); } @@ -1579,7 +1525,6 @@ void ObjectTemplate::SetNamedPropertyHandler( void ObjectTemplate::MarkAsUndetectable() { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::ObjectTemplate::MarkAsUndetectable()")) return; ENTER_V8(isolate); i::HandleScope scope(isolate); EnsureConstructor(this); @@ -1596,9 +1541,6 @@ void ObjectTemplate::SetAccessCheckCallbacks( Handle<Value> data, bool turned_on_by_default) { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::ObjectTemplate::SetAccessCheckCallbacks()")) { - return; - } ENTER_V8(isolate); i::HandleScope scope(isolate); EnsureConstructor(this); @@ -1611,7 +1553,9 @@ void ObjectTemplate::SetAccessCheckCallbacks( SET_FIELD_WRAPPED(info, set_named_callback, named_callback); SET_FIELD_WRAPPED(info, set_indexed_callback, indexed_callback); - if (data.IsEmpty()) data = v8::Undefined(); + if (data.IsEmpty()) { + data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); + } info->set_data(*Utils::OpenHandle(*data)); i::FunctionTemplateInfo* constructor = @@ -1630,9 +1574,6 @@ void ObjectTemplate::SetIndexedPropertyHandler( IndexedPropertyEnumeratorCallback enumerator, Handle<Value> data) { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::ObjectTemplate::SetIndexedPropertyHandler()")) { - return; - } ENTER_V8(isolate); i::HandleScope scope(isolate); EnsureConstructor(this); @@ -1650,7 +1591,9 @@ void ObjectTemplate::SetIndexedPropertyHandler( if (remover != 0) SET_FIELD_WRAPPED(obj, set_deleter, remover); if (enumerator != 0) SET_FIELD_WRAPPED(obj, set_enumerator, enumerator); - if (data.IsEmpty()) data = v8::Undefined(); + if (data.IsEmpty()) { + data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); + } obj->set_data(*Utils::OpenHandle(*data)); cons->set_indexed_property_handler(*obj); } @@ -1659,10 +1602,6 @@ void ObjectTemplate::SetIndexedPropertyHandler( void ObjectTemplate::SetCallAsFunctionHandler(FunctionCallback callback, Handle<Value> data) { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, - "v8::ObjectTemplate::SetCallAsFunctionHandler()")) { - return; - } ENTER_V8(isolate); i::HandleScope scope(isolate); EnsureConstructor(this); @@ -1674,26 +1613,21 @@ void ObjectTemplate::SetCallAsFunctionHandler(FunctionCallback callback, i::Handle<i::CallHandlerInfo> obj = i::Handle<i::CallHandlerInfo>::cast(struct_obj); SET_FIELD_WRAPPED(obj, set_callback, callback); - if (data.IsEmpty()) data = v8::Undefined(); + if (data.IsEmpty()) { + data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); + } obj->set_data(*Utils::OpenHandle(*data)); cons->set_instance_call_handler(*obj); } int ObjectTemplate::InternalFieldCount() { - if (IsDeadCheck(Utils::OpenHandle(this)->GetIsolate(), - "v8::ObjectTemplate::InternalFieldCount()")) { - return 0; - } return i::Smi::cast(Utils::OpenHandle(this)->internal_field_count())->value(); } void ObjectTemplate::SetInternalFieldCount(int value) { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::ObjectTemplate::SetInternalFieldCount()")) { - return; - } if (!ApiCheck(i::Smi::IsValid(value), "v8::ObjectTemplate::SetInternalFieldCount()", "Invalid internal field count")) { @@ -1713,10 +1647,13 @@ void ObjectTemplate::SetInternalFieldCount(int value) { // --- S c r i p t D a t a --- -ScriptData* ScriptData::PreCompile(const char* input, int length) { +ScriptData* ScriptData::PreCompile(v8::Isolate* isolate, + const char* input, + int length) { i::Utf8ToUtf16CharacterStream stream( reinterpret_cast<const unsigned char*>(input), length); - return i::PreParserApi::PreParse(i::Isolate::Current(), &stream); + return i::PreParserApi::PreParse( + reinterpret_cast<i::Isolate*>(isolate), &stream); } @@ -1763,13 +1700,13 @@ Local<Script> Script::New(v8::Handle<String> source, v8::ScriptOrigin* origin, v8::ScriptData* pre_data, v8::Handle<String> script_data) { - i::Isolate* isolate = i::Isolate::Current(); + i::Handle<i::String> str = Utils::OpenHandle(*source); + i::Isolate* isolate = str->GetIsolate(); ON_BAILOUT(isolate, "v8::Script::New()", return Local<Script>()); LOG_API(isolate, "Script::New"); ENTER_V8(isolate); i::SharedFunctionInfo* raw_result = NULL; { i::HandleScope scope(isolate); - i::Handle<i::String> str = Utils::OpenHandle(*source); i::Handle<i::Object> name_obj; int line_offset = 0; int column_offset = 0; @@ -1786,8 +1723,9 @@ Local<Script> Script::New(v8::Handle<String> source, static_cast<int>(origin->ResourceColumnOffset()->Value()); } if (!origin->ResourceIsSharedCrossOrigin().IsEmpty()) { + v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); is_shared_cross_origin = - origin->ResourceIsSharedCrossOrigin() == v8::True(); + origin->ResourceIsSharedCrossOrigin() == v8::True(v8_isolate); } } EXCEPTION_PREAMBLE(isolate); @@ -1831,7 +1769,8 @@ Local<Script> Script::Compile(v8::Handle<String> source, v8::ScriptOrigin* origin, v8::ScriptData* pre_data, v8::Handle<String> script_data) { - i::Isolate* isolate = i::Isolate::Current(); + i::Handle<i::String> str = Utils::OpenHandle(*source); + i::Isolate* isolate = str->GetIsolate(); ON_BAILOUT(isolate, "v8::Script::Compile()", return Local<Script>()); LOG_API(isolate, "Script::Compile"); ENTER_V8(isolate); @@ -1858,7 +1797,11 @@ Local<Script> Script::Compile(v8::Handle<String> source, Local<Value> Script::Run() { - i::Isolate* isolate = i::Isolate::Current(); + // If execution is terminating, Compile(script)->Run() requires this check. + if (this == NULL) return Local<Value>(); + i::Handle<i::HeapObject> obj = + i::Handle<i::HeapObject>::cast(Utils::OpenHandle(this)); + i::Isolate* isolate = obj->GetIsolate(); ON_BAILOUT(isolate, "v8::Script::Run()", return Local<Value>()); LOG_API(isolate, "Script::Run"); ENTER_V8(isolate); @@ -1867,7 +1810,6 @@ Local<Value> Script::Run() { i::Object* raw_result = NULL; { i::HandleScope scope(isolate); - i::Handle<i::Object> obj = Utils::OpenHandle(this); i::Handle<i::JSFunction> fun; if (obj->IsSharedFunctionInfo()) { i::Handle<i::SharedFunctionInfo> @@ -1905,7 +1847,9 @@ static i::Handle<i::SharedFunctionInfo> OpenScript(Script* script) { Local<Value> Script::Id() { - i::Isolate* isolate = i::Isolate::Current(); + i::Handle<i::HeapObject> obj = + i::Handle<i::HeapObject>::cast(Utils::OpenHandle(this)); + i::Isolate* isolate = obj->GetIsolate(); ON_BAILOUT(isolate, "v8::Script::Id()", return Local<Value>()); LOG_API(isolate, "Script::Id"); i::Object* raw_id = NULL; @@ -1922,7 +1866,9 @@ Local<Value> Script::Id() { int Script::GetId() { - i::Isolate* isolate = i::Isolate::Current(); + i::Handle<i::HeapObject> obj = + i::Handle<i::HeapObject>::cast(Utils::OpenHandle(this)); + i::Isolate* isolate = obj->GetIsolate(); ON_BAILOUT(isolate, "v8::Script::Id()", return -1); LOG_API(isolate, "Script::Id"); { @@ -1935,10 +1881,11 @@ int Script::GetId() { int Script::GetLineNumber(int code_pos) { - i::Isolate* isolate = i::Isolate::Current(); + i::Handle<i::HeapObject> obj = + i::Handle<i::HeapObject>::cast(Utils::OpenHandle(this)); + i::Isolate* isolate = obj->GetIsolate(); ON_BAILOUT(isolate, "v8::Script::GetLineNumber()", return -1); LOG_API(isolate, "Script::GetLineNumber"); - i::Handle<i::Object> obj = Utils::OpenHandle(this); if (obj->IsScript()) { i::Handle<i::Script> script = i::Handle<i::Script>(i::Script::cast(*obj)); return i::GetScriptLineNumber(script, code_pos); @@ -1949,10 +1896,11 @@ int Script::GetLineNumber(int code_pos) { Handle<Value> Script::GetScriptName() { - i::Isolate* isolate = i::Isolate::Current(); + i::Handle<i::HeapObject> obj = + i::Handle<i::HeapObject>::cast(Utils::OpenHandle(this)); + i::Isolate* isolate = obj->GetIsolate(); ON_BAILOUT(isolate, "v8::Script::GetName()", return Handle<String>()); LOG_API(isolate, "Script::GetName"); - i::Handle<i::Object> obj = Utils::OpenHandle(this); if (obj->IsScript()) { i::Object* name = i::Script::cast(*obj)->name(); return Utils::ToLocal(i::Handle<i::Object>(name, isolate)); @@ -1963,7 +1911,9 @@ Handle<Value> Script::GetScriptName() { void Script::SetData(v8::Handle<String> data) { - i::Isolate* isolate = i::Isolate::Current(); + i::Handle<i::HeapObject> obj = + i::Handle<i::HeapObject>::cast(Utils::OpenHandle(this)); + i::Isolate* isolate = obj->GetIsolate(); ON_BAILOUT(isolate, "v8::Script::SetData()", return); LOG_API(isolate, "Script::SetData"); { @@ -1995,8 +1945,9 @@ v8::TryCatch::TryCatch() v8::TryCatch::~TryCatch() { ASSERT(isolate_ == i::Isolate::Current()); if (rethrow_) { - v8::HandleScope scope(reinterpret_cast<Isolate*>(isolate_)); - v8::Local<v8::Value> exc = v8::Local<v8::Value>::New(Exception()); + v8::Isolate* isolate = reinterpret_cast<Isolate*>(isolate_); + v8::HandleScope scope(isolate); + v8::Local<v8::Value> exc = v8::Local<v8::Value>::New(isolate, Exception()); if (HasCaught() && capture_message_) { // If an exception was caught and rethrow_ is indicated, the saved // message, script, and location need to be restored to Isolate TLS @@ -2006,7 +1957,7 @@ v8::TryCatch::~TryCatch() { isolate_->RestorePendingMessageFromTryCatch(this); } isolate_->UnregisterTryCatchHandler(this); - v8::ThrowException(exc); + reinterpret_cast<Isolate*>(isolate_)->ThrowException(exc); ASSERT(!isolate_->thread_local_top()->rethrowing_message_); } else { isolate_->UnregisterTryCatchHandler(this); @@ -2032,7 +1983,7 @@ bool v8::TryCatch::HasTerminated() const { v8::Handle<v8::Value> v8::TryCatch::ReThrow() { if (!HasCaught()) return v8::Local<v8::Value>(); rethrow_ = true; - return v8::Undefined(); + return v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate_)); } @@ -2056,7 +2007,7 @@ v8::Local<Value> v8::TryCatch::StackTrace() const { i::HandleScope scope(isolate_); i::Handle<i::JSObject> obj(i::JSObject::cast(raw_obj), isolate_); i::Handle<i::String> name = isolate_->factory()->stack_string(); - if (!obj->HasProperty(*name)) return v8::Local<Value>(); + if (!i::JSReceiver::HasProperty(obj, name)) return v8::Local<Value>(); i::Handle<i::Object> value = i::GetProperty(isolate_, obj, name); if (value.is_null()) return v8::Local<Value>(); return v8::Utils::ToLocal(scope.CloseAndEscape(value)); @@ -2116,9 +2067,6 @@ Local<String> Message::Get() const { v8::Handle<Value> Message::GetScriptResourceName() const { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::Message::GetScriptResourceName()")) { - return Local<String>(); - } ENTER_V8(isolate); HandleScope scope(reinterpret_cast<Isolate*>(isolate)); i::Handle<i::JSMessageObject> message = @@ -2135,9 +2083,6 @@ v8::Handle<Value> Message::GetScriptResourceName() const { v8::Handle<Value> Message::GetScriptData() const { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::Message::GetScriptResourceData()")) { - return Local<Value>(); - } ENTER_V8(isolate); HandleScope scope(reinterpret_cast<Isolate*>(isolate)); i::Handle<i::JSMessageObject> message = @@ -2153,9 +2098,6 @@ v8::Handle<Value> Message::GetScriptData() const { v8::Handle<v8::StackTrace> Message::GetStackTrace() const { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::Message::GetStackTrace()")) { - return Local<v8::StackTrace>(); - } ENTER_V8(isolate); HandleScope scope(reinterpret_cast<Isolate*>(isolate)); i::Handle<i::JSMessageObject> message = @@ -2215,7 +2157,6 @@ int Message::GetLineNumber() const { int Message::GetStartPosition() const { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::Message::GetStartPosition()")) return 0; ENTER_V8(isolate); i::HandleScope scope(isolate); i::Handle<i::JSMessageObject> message = @@ -2226,7 +2167,6 @@ int Message::GetStartPosition() const { int Message::GetEndPosition() const { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::Message::GetEndPosition()")) return 0; ENTER_V8(isolate); i::HandleScope scope(isolate); i::Handle<i::JSMessageObject> message = @@ -2237,9 +2177,6 @@ int Message::GetEndPosition() const { int Message::GetStartColumn() const { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::Message::GetStartColumn()")) { - return kNoColumnInfo; - } ENTER_V8(isolate); i::HandleScope scope(isolate); i::Handle<i::JSObject> data_obj = Utils::OpenHandle(this); @@ -2255,7 +2192,6 @@ int Message::GetStartColumn() const { int Message::GetEndColumn() const { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::Message::GetEndColumn()")) return kNoColumnInfo; ENTER_V8(isolate); i::HandleScope scope(isolate); i::Handle<i::JSObject> data_obj = Utils::OpenHandle(this); @@ -2275,7 +2211,6 @@ int Message::GetEndColumn() const { bool Message::IsSharedCrossOrigin() const { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::Message::IsSharedCrossOrigin()")) return 0; ENTER_V8(isolate); i::HandleScope scope(isolate); i::Handle<i::JSMessageObject> message = @@ -2307,7 +2242,6 @@ Local<String> Message::GetSourceLine() const { void Message::PrintCurrentStackTrace(FILE* out) { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Message::PrintCurrentStackTrace()")) return; ENTER_V8(isolate); isolate->PrintCurrentStackTrace(out); } @@ -2317,9 +2251,6 @@ void Message::PrintCurrentStackTrace(FILE* out) { Local<StackFrame> StackTrace::GetFrame(uint32_t index) const { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::StackTrace::GetFrame()")) { - return Local<StackFrame>(); - } ENTER_V8(isolate); HandleScope scope(reinterpret_cast<Isolate*>(isolate)); i::Handle<i::JSArray> self = Utils::OpenHandle(this); @@ -2331,7 +2262,6 @@ Local<StackFrame> StackTrace::GetFrame(uint32_t index) const { int StackTrace::GetFrameCount() const { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::StackTrace::GetFrameCount()")) return -1; ENTER_V8(isolate); return i::Smi::cast(Utils::OpenHandle(this)->length())->value(); } @@ -2339,7 +2269,6 @@ int StackTrace::GetFrameCount() const { Local<Array> StackTrace::AsArray() { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::StackTrace::AsArray()")) Local<Array>(); ENTER_V8(isolate); return Utils::ToLocal(Utils::OpenHandle(this)); } @@ -2348,9 +2277,6 @@ Local<Array> StackTrace::AsArray() { Local<StackTrace> StackTrace::CurrentStackTrace(int frame_limit, StackTraceOptions options) { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::StackTrace::CurrentStackTrace()")) { - Local<StackTrace>(); - } ENTER_V8(isolate); i::Handle<i::JSArray> stackTrace = isolate->CaptureCurrentStackTrace(frame_limit, options); @@ -2362,9 +2288,6 @@ Local<StackTrace> StackTrace::CurrentStackTrace(int frame_limit, int StackFrame::GetLineNumber() const { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::StackFrame::GetLineNumber()")) { - return Message::kNoLineNumberInfo; - } ENTER_V8(isolate); i::HandleScope scope(isolate); i::Handle<i::JSObject> self = Utils::OpenHandle(this); @@ -2378,9 +2301,6 @@ int StackFrame::GetLineNumber() const { int StackFrame::GetColumn() const { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::StackFrame::GetColumn()")) { - return Message::kNoColumnInfo; - } ENTER_V8(isolate); i::HandleScope scope(isolate); i::Handle<i::JSObject> self = Utils::OpenHandle(this); @@ -2394,9 +2314,6 @@ int StackFrame::GetColumn() const { int StackFrame::GetScriptId() const { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::StackFrame::GetScriptId()")) { - return Message::kNoScriptIdInfo; - } ENTER_V8(isolate); i::HandleScope scope(isolate); i::Handle<i::JSObject> self = Utils::OpenHandle(this); @@ -2410,9 +2327,6 @@ int StackFrame::GetScriptId() const { Local<String> StackFrame::GetScriptName() const { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::StackFrame::GetScriptName()")) { - return Local<String>(); - } ENTER_V8(isolate); HandleScope scope(reinterpret_cast<Isolate*>(isolate)); i::Handle<i::JSObject> self = Utils::OpenHandle(this); @@ -2426,9 +2340,6 @@ Local<String> StackFrame::GetScriptName() const { Local<String> StackFrame::GetScriptNameOrSourceURL() const { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::StackFrame::GetScriptNameOrSourceURL()")) { - return Local<String>(); - } ENTER_V8(isolate); HandleScope scope(reinterpret_cast<Isolate*>(isolate)); i::Handle<i::JSObject> self = Utils::OpenHandle(this); @@ -2442,9 +2353,6 @@ Local<String> StackFrame::GetScriptNameOrSourceURL() const { Local<String> StackFrame::GetFunctionName() const { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::StackFrame::GetFunctionName()")) { - return Local<String>(); - } ENTER_V8(isolate); HandleScope scope(reinterpret_cast<Isolate*>(isolate)); i::Handle<i::JSObject> self = Utils::OpenHandle(this); @@ -2458,7 +2366,6 @@ Local<String> StackFrame::GetFunctionName() const { bool StackFrame::IsEval() const { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::StackFrame::IsEval()")) return false; ENTER_V8(isolate); i::HandleScope scope(isolate); i::Handle<i::JSObject> self = Utils::OpenHandle(this); @@ -2469,7 +2376,6 @@ bool StackFrame::IsEval() const { bool StackFrame::IsConstructor() const { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::StackFrame::IsConstructor()")) return false; ENTER_V8(isolate); i::HandleScope scope(isolate); i::Handle<i::JSObject> self = Utils::OpenHandle(this); @@ -2504,9 +2410,6 @@ Local<Value> JSON::Parse(Local<String> json_string) { // --- D a t a --- bool Value::FullIsUndefined() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsUndefined()")) { - return false; - } bool result = Utils::OpenHandle(this)->IsUndefined(); ASSERT_EQ(result, QuickIsUndefined()); return result; @@ -2514,7 +2417,6 @@ bool Value::FullIsUndefined() const { bool Value::FullIsNull() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsNull()")) return false; bool result = Utils::OpenHandle(this)->IsNull(); ASSERT_EQ(result, QuickIsNull()); return result; @@ -2522,27 +2424,21 @@ bool Value::FullIsNull() const { bool Value::IsTrue() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsTrue()")) return false; return Utils::OpenHandle(this)->IsTrue(); } bool Value::IsFalse() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsFalse()")) return false; return Utils::OpenHandle(this)->IsFalse(); } bool Value::IsFunction() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsFunction()")) { - return false; - } return Utils::OpenHandle(this)->IsJSFunction(); } bool Value::FullIsString() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsString()")) return false; bool result = Utils::OpenHandle(this)->IsString(); ASSERT_EQ(result, QuickIsString()); return result; @@ -2550,20 +2446,16 @@ bool Value::FullIsString() const { bool Value::IsSymbol() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsSymbol()")) return false; return Utils::OpenHandle(this)->IsSymbol(); } bool Value::IsArray() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsArray()")) return false; return Utils::OpenHandle(this)->IsJSArray(); } bool Value::IsArrayBuffer() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsArrayBuffer()")) - return false; return Utils::OpenHandle(this)->IsJSArrayBuffer(); } @@ -2574,8 +2466,6 @@ bool Value::IsArrayBufferView() const { bool Value::IsTypedArray() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsArrayBuffer()")) - return false; return Utils::OpenHandle(this)->IsJSTypedArray(); } @@ -2594,8 +2484,6 @@ F(Uint8ClampedArray, kExternalPixelArray) #define VALUE_IS_TYPED_ARRAY(TypedArray, type_const) \ bool Value::Is##TypedArray() const { \ - if (IsDeadCheck(i::Isolate::Current(), "v8::Value::Is" #TypedArray "()")) \ - return false; \ i::Handle<i::Object> obj = Utils::OpenHandle(this); \ if (!obj->IsJSTypedArray()) return false; \ return i::JSTypedArray::cast(*obj)->type() == type_const; \ @@ -2612,35 +2500,26 @@ bool Value::IsDataView() const { bool Value::IsObject() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsObject()")) return false; return Utils::OpenHandle(this)->IsJSObject(); } bool Value::IsNumber() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsNumber()")) return false; return Utils::OpenHandle(this)->IsNumber(); } bool Value::IsBoolean() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsBoolean()")) { - return false; - } return Utils::OpenHandle(this)->IsBoolean(); } bool Value::IsExternal() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsExternal()")) { - return false; - } return Utils::OpenHandle(this)->IsExternal(); } bool Value::IsInt32() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsInt32()")) return false; i::Handle<i::Object> obj = Utils::OpenHandle(this); if (obj->IsSmi()) return true; if (obj->IsNumber()) { @@ -2657,7 +2536,6 @@ bool Value::IsInt32() const { bool Value::IsUint32() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsUint32()")) return false; i::Handle<i::Object> obj = Utils::OpenHandle(this); if (obj->IsSmi()) return i::Smi::cast(*obj)->value() >= 0; if (obj->IsNumber()) { @@ -2675,7 +2553,6 @@ bool Value::IsUint32() const { bool Value::IsDate() const { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Value::IsDate()")) return false; i::Handle<i::Object> obj = Utils::OpenHandle(this); return obj->HasSpecificClassOf(isolate->heap()->Date_string()); } @@ -2683,7 +2560,6 @@ bool Value::IsDate() const { bool Value::IsStringObject() const { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Value::IsStringObject()")) return false; i::Handle<i::Object> obj = Utils::OpenHandle(this); return obj->HasSpecificClassOf(isolate->heap()->String_string()); } @@ -2693,7 +2569,6 @@ bool Value::IsSymbolObject() const { // TODO(svenpanne): these and other test functions should be written such // that they do not use Isolate::Current(). i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Value::IsSymbolObject()")) return false; i::Handle<i::Object> obj = Utils::OpenHandle(this); return obj->HasSpecificClassOf(isolate->heap()->Symbol_string()); } @@ -2701,7 +2576,6 @@ bool Value::IsSymbolObject() const { bool Value::IsNumberObject() const { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Value::IsNumberObject()")) return false; i::Handle<i::Object> obj = Utils::OpenHandle(this); return obj->HasSpecificClassOf(isolate->heap()->Number_string()); } @@ -2729,7 +2603,6 @@ static bool CheckConstructor(i::Isolate* isolate, bool Value::IsNativeError() const { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Value::IsNativeError()")) return false; i::Handle<i::Object> obj = Utils::OpenHandle(this); if (obj->IsJSObject()) { i::Handle<i::JSObject> js_obj(i::JSObject::cast(*obj)); @@ -2748,14 +2621,12 @@ bool Value::IsNativeError() const { bool Value::IsBooleanObject() const { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Value::IsBooleanObject()")) return false; i::Handle<i::Object> obj = Utils::OpenHandle(this); return obj->HasSpecificClassOf(isolate->heap()->Boolean_string()); } bool Value::IsRegExp() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsRegExp()")) return false; i::Handle<i::Object> obj = Utils::OpenHandle(this); return obj->IsJSRegExp(); } @@ -2768,9 +2639,6 @@ Local<String> Value::ToString() const { str = obj; } else { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Value::ToString()")) { - return Local<String>(); - } LOG_API(isolate, "ToString"); ENTER_V8(isolate); EXCEPTION_PREAMBLE(isolate); @@ -2788,9 +2656,6 @@ Local<String> Value::ToDetailString() const { str = obj; } else { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Value::ToDetailString()")) { - return Local<String>(); - } LOG_API(isolate, "ToDetailString"); ENTER_V8(isolate); EXCEPTION_PREAMBLE(isolate); @@ -2808,9 +2673,6 @@ Local<v8::Object> Value::ToObject() const { val = obj; } else { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Value::ToObject()")) { - return Local<v8::Object>(); - } LOG_API(isolate, "ToObject"); ENTER_V8(isolate); EXCEPTION_PREAMBLE(isolate); @@ -2827,9 +2689,6 @@ Local<Boolean> Value::ToBoolean() const { return ToApiHandle<Boolean>(obj); } else { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Value::ToBoolean()")) { - return Local<Boolean>(); - } LOG_API(isolate, "ToBoolean"); ENTER_V8(isolate); i::Handle<i::Object> val = @@ -2846,9 +2705,6 @@ Local<Number> Value::ToNumber() const { num = obj; } else { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Value::ToNumber()")) { - return Local<Number>(); - } LOG_API(isolate, "ToNumber"); ENTER_V8(isolate); EXCEPTION_PREAMBLE(isolate); @@ -2866,7 +2722,6 @@ Local<Integer> Value::ToInteger() const { num = obj; } else { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Value::ToInteger()")) return Local<Integer>(); LOG_API(isolate, "ToInteger"); ENTER_V8(isolate); EXCEPTION_PREAMBLE(isolate); @@ -2886,7 +2741,6 @@ void i::Internals::CheckInitializedImpl(v8::Isolate* external_isolate) { void External::CheckCast(v8::Value* that) { - if (IsDeadCheck(i::Isolate::Current(), "v8::External::Cast()")) return; ApiCheck(Utils::OpenHandle(that)->IsExternal(), "v8::External::Cast()", "Could not convert to external"); @@ -2894,7 +2748,6 @@ void External::CheckCast(v8::Value* that) { void v8::Object::CheckCast(Value* that) { - if (IsDeadCheck(i::Isolate::Current(), "v8::Object::Cast()")) return; i::Handle<i::Object> obj = Utils::OpenHandle(that); ApiCheck(obj->IsJSObject(), "v8::Object::Cast()", @@ -2903,7 +2756,6 @@ void v8::Object::CheckCast(Value* that) { void v8::Function::CheckCast(Value* that) { - if (IsDeadCheck(i::Isolate::Current(), "v8::Function::Cast()")) return; i::Handle<i::Object> obj = Utils::OpenHandle(that); ApiCheck(obj->IsJSFunction(), "v8::Function::Cast()", @@ -2912,7 +2764,6 @@ void v8::Function::CheckCast(Value* that) { void v8::String::CheckCast(v8::Value* that) { - if (IsDeadCheck(i::Isolate::Current(), "v8::String::Cast()")) return; i::Handle<i::Object> obj = Utils::OpenHandle(that); ApiCheck(obj->IsString(), "v8::String::Cast()", @@ -2921,7 +2772,6 @@ void v8::String::CheckCast(v8::Value* that) { void v8::Symbol::CheckCast(v8::Value* that) { - if (IsDeadCheck(i::Isolate::Current(), "v8::Symbol::Cast()")) return; i::Handle<i::Object> obj = Utils::OpenHandle(that); ApiCheck(obj->IsSymbol(), "v8::Symbol::Cast()", @@ -2930,7 +2780,6 @@ void v8::Symbol::CheckCast(v8::Value* that) { void v8::Number::CheckCast(v8::Value* that) { - if (IsDeadCheck(i::Isolate::Current(), "v8::Number::Cast()")) return; i::Handle<i::Object> obj = Utils::OpenHandle(that); ApiCheck(obj->IsNumber(), "v8::Number::Cast()", @@ -2939,7 +2788,6 @@ void v8::Number::CheckCast(v8::Value* that) { void v8::Integer::CheckCast(v8::Value* that) { - if (IsDeadCheck(i::Isolate::Current(), "v8::Integer::Cast()")) return; i::Handle<i::Object> obj = Utils::OpenHandle(that); ApiCheck(obj->IsNumber(), "v8::Integer::Cast()", @@ -2948,7 +2796,6 @@ void v8::Integer::CheckCast(v8::Value* that) { void v8::Array::CheckCast(Value* that) { - if (IsDeadCheck(i::Isolate::Current(), "v8::Array::Cast()")) return; i::Handle<i::Object> obj = Utils::OpenHandle(that); ApiCheck(obj->IsJSArray(), "v8::Array::Cast()", @@ -2957,7 +2804,6 @@ void v8::Array::CheckCast(Value* that) { void v8::ArrayBuffer::CheckCast(Value* that) { - if (IsDeadCheck(i::Isolate::Current(), "v8::ArrayBuffer::Cast()")) return; i::Handle<i::Object> obj = Utils::OpenHandle(that); ApiCheck(obj->IsJSArrayBuffer(), "v8::ArrayBuffer::Cast()", @@ -2974,7 +2820,6 @@ void v8::ArrayBufferView::CheckCast(Value* that) { void v8::TypedArray::CheckCast(Value* that) { - if (IsDeadCheck(i::Isolate::Current(), "v8::TypedArray::Cast()")) return; i::Handle<i::Object> obj = Utils::OpenHandle(that); ApiCheck(obj->IsJSTypedArray(), "v8::TypedArray::Cast()", @@ -2984,8 +2829,6 @@ void v8::TypedArray::CheckCast(Value* that) { #define CHECK_TYPED_ARRAY_CAST(ApiClass, typeConst) \ void v8::ApiClass::CheckCast(Value* that) { \ - if (IsDeadCheck(i::Isolate::Current(), "v8::" #ApiClass "::Cast()")) \ - return; \ i::Handle<i::Object> obj = Utils::OpenHandle(that); \ ApiCheck(obj->IsJSTypedArray() && \ i::JSTypedArray::cast(*obj)->type() == typeConst, \ @@ -3009,7 +2852,6 @@ void v8::DataView::CheckCast(Value* that) { void v8::Date::CheckCast(v8::Value* that) { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Date::Cast()")) return; i::Handle<i::Object> obj = Utils::OpenHandle(that); ApiCheck(obj->HasSpecificClassOf(isolate->heap()->Date_string()), "v8::Date::Cast()", @@ -3019,7 +2861,6 @@ void v8::Date::CheckCast(v8::Value* that) { void v8::StringObject::CheckCast(v8::Value* that) { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::StringObject::Cast()")) return; i::Handle<i::Object> obj = Utils::OpenHandle(that); ApiCheck(obj->HasSpecificClassOf(isolate->heap()->String_string()), "v8::StringObject::Cast()", @@ -3029,7 +2870,6 @@ void v8::StringObject::CheckCast(v8::Value* that) { void v8::SymbolObject::CheckCast(v8::Value* that) { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::SymbolObject::Cast()")) return; i::Handle<i::Object> obj = Utils::OpenHandle(that); ApiCheck(obj->HasSpecificClassOf(isolate->heap()->Symbol_string()), "v8::SymbolObject::Cast()", @@ -3039,7 +2879,6 @@ void v8::SymbolObject::CheckCast(v8::Value* that) { void v8::NumberObject::CheckCast(v8::Value* that) { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::NumberObject::Cast()")) return; i::Handle<i::Object> obj = Utils::OpenHandle(that); ApiCheck(obj->HasSpecificClassOf(isolate->heap()->Number_string()), "v8::NumberObject::Cast()", @@ -3049,7 +2888,6 @@ void v8::NumberObject::CheckCast(v8::Value* that) { void v8::BooleanObject::CheckCast(v8::Value* that) { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::BooleanObject::Cast()")) return; i::Handle<i::Object> obj = Utils::OpenHandle(that); ApiCheck(obj->HasSpecificClassOf(isolate->heap()->Boolean_string()), "v8::BooleanObject::Cast()", @@ -3058,7 +2896,6 @@ void v8::BooleanObject::CheckCast(v8::Value* that) { void v8::RegExp::CheckCast(v8::Value* that) { - if (IsDeadCheck(i::Isolate::Current(), "v8::RegExp::Cast()")) return; i::Handle<i::Object> obj = Utils::OpenHandle(that); ApiCheck(obj->IsJSRegExp(), "v8::RegExp::Cast()", @@ -3078,9 +2915,6 @@ double Value::NumberValue() const { num = obj; } else { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Value::NumberValue()")) { - return i::OS::nan_value(); - } LOG_API(isolate, "NumberValue"); ENTER_V8(isolate); EXCEPTION_PREAMBLE(isolate); @@ -3098,7 +2932,6 @@ int64_t Value::IntegerValue() const { num = obj; } else { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Value::IntegerValue()")) return 0; LOG_API(isolate, "IntegerValue"); ENTER_V8(isolate); EXCEPTION_PREAMBLE(isolate); @@ -3120,7 +2953,6 @@ Local<Int32> Value::ToInt32() const { num = obj; } else { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Value::ToInt32()")) return Local<Int32>(); LOG_API(isolate, "ToInt32"); ENTER_V8(isolate); EXCEPTION_PREAMBLE(isolate); @@ -3138,7 +2970,6 @@ Local<Uint32> Value::ToUint32() const { num = obj; } else { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Value::ToUint32()")) return Local<Uint32>(); LOG_API(isolate, "ToUInt32"); ENTER_V8(isolate); EXCEPTION_PREAMBLE(isolate); @@ -3156,7 +2987,6 @@ Local<Uint32> Value::ToArrayIndex() const { return Local<Uint32>(); } i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Value::ToArrayIndex()")) return Local<Uint32>(); LOG_API(isolate, "ToArrayIndex"); ENTER_V8(isolate); EXCEPTION_PREAMBLE(isolate); @@ -3184,7 +3014,6 @@ int32_t Value::Int32Value() const { return i::Smi::cast(*obj)->value(); } else { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Value::Int32Value()")) return 0; LOG_API(isolate, "Int32Value (slow)"); ENTER_V8(isolate); EXCEPTION_PREAMBLE(isolate); @@ -3202,9 +3031,8 @@ int32_t Value::Int32Value() const { bool Value::Equals(Handle<Value> that) const { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Value::Equals()") - || EmptyCheck("v8::Value::Equals()", this) - || EmptyCheck("v8::Value::Equals()", that)) { + if (EmptyCheck("v8::Value::Equals()", this) || + EmptyCheck("v8::Value::Equals()", that)) { return false; } LOG_API(isolate, "Equals"); @@ -3229,9 +3057,8 @@ bool Value::Equals(Handle<Value> that) const { bool Value::StrictEquals(Handle<Value> that) const { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Value::StrictEquals()") - || EmptyCheck("v8::Value::StrictEquals()", this) - || EmptyCheck("v8::Value::StrictEquals()", that)) { + if (EmptyCheck("v8::Value::StrictEquals()", this) || + EmptyCheck("v8::Value::StrictEquals()", that)) { return false; } LOG_API(isolate, "StrictEquals"); @@ -3259,13 +3086,25 @@ bool Value::StrictEquals(Handle<Value> that) const { } +bool Value::SameValue(Handle<Value> that) const { + i::Isolate* isolate = i::Isolate::Current(); + if (EmptyCheck("v8::Value::SameValue()", this) || + EmptyCheck("v8::Value::SameValue()", that)) { + return false; + } + LOG_API(isolate, "SameValue"); + i::Handle<i::Object> obj = Utils::OpenHandle(this); + i::Handle<i::Object> other = Utils::OpenHandle(*that); + return obj->SameValue(*other); +} + + uint32_t Value::Uint32Value() const { i::Handle<i::Object> obj = Utils::OpenHandle(this); if (obj->IsSmi()) { return i::Smi::cast(*obj)->value(); } else { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Value::Uint32Value()")) return 0; LOG_API(isolate, "Uint32Value"); ENTER_V8(isolate); EXCEPTION_PREAMBLE(isolate); @@ -3625,7 +3464,7 @@ bool v8::Object::Has(uint32_t index) { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); ON_BAILOUT(isolate, "v8::Object::HasProperty()", return false); i::Handle<i::JSObject> self = Utils::OpenHandle(this); - return self->HasElement(index); + return i::JSReceiver::HasElement(self, index); } @@ -3679,8 +3518,8 @@ bool v8::Object::HasOwnProperty(Handle<String> key) { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); ON_BAILOUT(isolate, "v8::Object::HasOwnProperty()", return false); - return Utils::OpenHandle(this)->HasLocalProperty( - *Utils::OpenHandle(*key)); + return i::JSReceiver::HasLocalProperty( + Utils::OpenHandle(this), Utils::OpenHandle(*key)); } @@ -3688,9 +3527,8 @@ bool v8::Object::HasRealNamedProperty(Handle<String> key) { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); ON_BAILOUT(isolate, "v8::Object::HasRealNamedProperty()", return false); - return Utils::OpenHandle(this)->HasRealNamedProperty( - isolate, - *Utils::OpenHandle(*key)); + return i::JSObject::HasRealNamedProperty(Utils::OpenHandle(this), + Utils::OpenHandle(*key)); } @@ -3698,7 +3536,7 @@ bool v8::Object::HasRealIndexedProperty(uint32_t index) { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); ON_BAILOUT(isolate, "v8::Object::HasRealIndexedProperty()", return false); - return Utils::OpenHandle(this)->HasRealElementProperty(isolate, index); + return i::JSObject::HasRealElementProperty(Utils::OpenHandle(this), index); } @@ -3708,9 +3546,8 @@ bool v8::Object::HasRealNamedCallbackProperty(Handle<String> key) { "v8::Object::HasRealNamedCallbackProperty()", return false); ENTER_V8(isolate); - return Utils::OpenHandle(this)->HasRealNamedCallbackProperty( - isolate, - *Utils::OpenHandle(*key)); + return i::JSObject::HasRealNamedCallbackProperty(Utils::OpenHandle(this), + Utils::OpenHandle(*key)); } @@ -3813,7 +3650,7 @@ Local<v8::Object> v8::Object::Clone() { ENTER_V8(isolate); i::Handle<i::JSObject> self = Utils::OpenHandle(this); EXCEPTION_PREAMBLE(isolate); - i::Handle<i::JSObject> result = i::Copy(self); + i::Handle<i::JSObject> result = i::JSObject::Copy(self); has_pending_exception = result.is_null(); EXCEPTION_BAILOUT_CHECK(isolate, Local<Object>()); return Utils::ToLocal(result); @@ -4113,7 +3950,7 @@ bool v8::Object::IsCallable() { } -Local<v8::Value> Object::CallAsFunction(v8::Handle<v8::Object> recv, +Local<v8::Value> Object::CallAsFunction(v8::Handle<v8::Value> recv, int argc, v8::Handle<v8::Value> argv[]) { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); @@ -4141,7 +3978,7 @@ Local<v8::Value> Object::CallAsFunction(v8::Handle<v8::Object> recv, } EXCEPTION_PREAMBLE(isolate); i::Handle<i::Object> returned = i::Execution::Call( - isolate, fun, recv_obj, argc, args, &has_pending_exception); + isolate, fun, recv_obj, argc, args, &has_pending_exception, true); EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<Value>()); return Utils::ToLocal(scope.CloseAndEscape(returned)); } @@ -4225,7 +4062,7 @@ Local<v8::Object> Function::NewInstance(int argc, } -Local<v8::Value> Function::Call(v8::Handle<v8::Object> recv, int argc, +Local<v8::Value> Function::Call(v8::Handle<v8::Value> recv, int argc, v8::Handle<v8::Value> argv[]) { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); ON_BAILOUT(isolate, "v8::Function::Call()", return Local<v8::Value>()); @@ -4242,7 +4079,7 @@ Local<v8::Value> Function::Call(v8::Handle<v8::Object> recv, int argc, i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv); EXCEPTION_PREAMBLE(isolate); i::Handle<i::Object> returned = i::Execution::Call( - isolate, fun, recv_obj, argc, args, &has_pending_exception); + isolate, fun, recv_obj, argc, args, &has_pending_exception, true); EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<Object>()); raw_result = *returned; } @@ -4274,6 +4111,29 @@ Handle<Value> Function::GetInferredName() const { } +Handle<Value> Function::GetDisplayName() const { + i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); + ON_BAILOUT(isolate, "v8::Function::GetDisplayName()", + return ToApiHandle<Primitive>( + isolate->factory()->undefined_value())); + ENTER_V8(isolate); + i::Handle<i::JSFunction> func = Utils::OpenHandle(this); + i::Handle<i::String> property_name = + isolate->factory()->InternalizeOneByteString( + STATIC_ASCII_VECTOR("displayName")); + i::LookupResult lookup(isolate); + func->LookupRealNamedProperty(*property_name, &lookup); + if (lookup.IsFound()) { + i::Object* value = lookup.GetLazyValue(); + if (value && value->IsString()) { + i::String* name = i::String::cast(value); + if (name->length() > 0) return Utils::ToLocal(i::Handle<i::String>(name)); + } + } + return ToApiHandle<Primitive>(isolate->factory()->undefined_value()); +} + + ScriptOrigin Function::GetScriptOrigin() const { i::Handle<i::JSFunction> func = Utils::OpenHandle(this); if (func->shared()->script()->IsScript()) { @@ -4312,12 +4172,20 @@ int Function::GetScriptColumnNumber() const { } +bool Function::IsBuiltin() const { + i::Handle<i::JSFunction> func = Utils::OpenHandle(this); + return func->IsBuiltin(); +} + + Handle<Value> Function::GetScriptId() const { i::Handle<i::JSFunction> func = Utils::OpenHandle(this); - if (!func->shared()->script()->IsScript()) - return v8::Undefined(); + i::Isolate* isolate = func->GetIsolate(); + if (!func->shared()->script()->IsScript()) { + return v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); + } i::Handle<i::Script> script(i::Script::cast(func->shared()->script())); - return Utils::ToLocal(i::Handle<i::Object>(script->id(), func->GetIsolate())); + return Utils::ToLocal(i::Handle<i::Object>(script->id(), isolate)); } @@ -4331,16 +4199,12 @@ int Function::ScriptId() const { int String::Length() const { i::Handle<i::String> str = Utils::OpenHandle(this); - if (IsDeadCheck(str->GetIsolate(), "v8::String::Length()")) return 0; return str->length(); } bool String::IsOneByte() const { i::Handle<i::String> str = Utils::OpenHandle(this); - if (IsDeadCheck(str->GetIsolate(), "v8::String::IsOneByte()")) { - return false; - } return str->HasOnlyOneByteChars(); } @@ -4456,10 +4320,6 @@ class ContainsOnlyOneByteHelper { bool String::ContainsOnlyOneByte() const { i::Handle<i::String> str = Utils::OpenHandle(this); - if (IsDeadCheck(str->GetIsolate(), - "v8::String::ContainsOnlyOneByte()")) { - return false; - } if (str->HasOnlyOneByteChars()) return true; ContainsOnlyOneByteHelper helper; return helper.Check(*str); @@ -4663,7 +4523,6 @@ static int Utf8Length(i::String* str, i::Isolate* isolate) { int String::Utf8Length() const { i::Handle<i::String> str = Utils::OpenHandle(this); i::Isolate* isolate = str->GetIsolate(); - if (IsDeadCheck(isolate, "v8::String::Utf8Length()")) return 0; return v8::Utf8Length(*str, isolate); } @@ -4849,7 +4708,6 @@ int String::WriteUtf8(char* buffer, int* nchars_ref, int options) const { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::String::WriteUtf8()")) return 0; LOG_API(isolate, "String::WriteUtf8"); ENTER_V8(isolate); i::Handle<i::String> str = Utils::OpenHandle(this); @@ -4894,40 +4752,6 @@ int String::WriteUtf8(char* buffer, } -int String::WriteAscii(char* buffer, - int start, - int length, - int options) const { - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::String::WriteAscii()")) return 0; - LOG_API(isolate, "String::WriteAscii"); - ENTER_V8(isolate); - ASSERT(start >= 0 && length >= -1); - i::Handle<i::String> str = Utils::OpenHandle(this); - isolate->string_tracker()->RecordWrite(str); - if (options & HINT_MANY_WRITES_EXPECTED) { - FlattenString(str); // Flatten the string for efficiency. - } - - int end = length; - if ((length == -1) || (length > str->length() - start)) { - end = str->length() - start; - } - if (end < 0) return 0; - i::StringCharacterStream write_stream(*str, isolate->write_iterator(), start); - int i; - for (i = 0; i < end; i++) { - char c = static_cast<char>(write_stream.GetNext()); - if (c == '\0' && !(options & PRESERVE_ASCII_NULL)) c = ' '; - buffer[i] = c; - } - if (!(options & NO_NULL_TERMINATION) && (length == -1 || i < length)) { - buffer[i] = '\0'; - } - return i; -} - - template<typename CharType> static inline int WriteHelper(const String* string, CharType* buffer, @@ -4935,7 +4759,6 @@ static inline int WriteHelper(const String* string, int length, int options) { i::Isolate* isolate = Utils::OpenHandle(string)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::String::Write()")) return 0; LOG_API(isolate, "String::Write"); ENTER_V8(isolate); ASSERT(start >= 0 && length >= -1); @@ -4977,9 +4800,6 @@ int String::Write(uint16_t* buffer, bool v8::String::IsExternal() const { i::Handle<i::String> str = Utils::OpenHandle(this); - if (IsDeadCheck(str->GetIsolate(), "v8::String::IsExternal()")) { - return false; - } EnsureInitializedForIsolate(str->GetIsolate(), "v8::String::IsExternal()"); return i::StringShape(*str).IsExternalTwoByte(); } @@ -4987,9 +4807,6 @@ bool v8::String::IsExternal() const { bool v8::String::IsExternalAscii() const { i::Handle<i::String> str = Utils::OpenHandle(this); - if (IsDeadCheck(str->GetIsolate(), "v8::String::IsExternalAscii()")) { - return false; - } return i::StringShape(*str).IsExternalAscii(); } @@ -5035,10 +4852,6 @@ void v8::String::VerifyExternalStringResourceBase( const v8::String::ExternalAsciiStringResource* v8::String::GetExternalAsciiStringResource() const { i::Handle<i::String> str = Utils::OpenHandle(this); - if (IsDeadCheck(str->GetIsolate(), - "v8::String::GetExternalAsciiStringResource()")) { - return NULL; - } if (i::StringShape(*str).IsExternalAscii()) { const void* resource = i::Handle<i::ExternalAsciiString>::cast(str)->resource(); @@ -5050,8 +4863,6 @@ const v8::String::ExternalAsciiStringResource* Local<Value> Symbol::Name() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Symbol::Name()")) - return Local<Value>(); i::Handle<i::Symbol> sym = Utils::OpenHandle(this); i::Handle<i::Object> name(sym->name(), sym->GetIsolate()); return Utils::ToLocal(name); @@ -5059,21 +4870,18 @@ Local<Value> Symbol::Name() const { double Number::Value() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Number::Value()")) return 0; i::Handle<i::Object> obj = Utils::OpenHandle(this); return obj->Number(); } bool Boolean::Value() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Boolean::Value()")) return false; i::Handle<i::Object> obj = Utils::OpenHandle(this); return obj->IsTrue(); } int64_t Integer::Value() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Integer::Value()")) return 0; i::Handle<i::Object> obj = Utils::OpenHandle(this); if (obj->IsSmi()) { return i::Smi::cast(*obj)->value(); @@ -5084,7 +4892,6 @@ int64_t Integer::Value() const { int32_t Int32::Value() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Int32::Value()")) return 0; i::Handle<i::Object> obj = Utils::OpenHandle(this); if (obj->IsSmi()) { return i::Smi::cast(*obj)->value(); @@ -5095,7 +4902,6 @@ int32_t Int32::Value() const { uint32_t Uint32::Value() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Uint32::Value()")) return 0; i::Handle<i::Object> obj = Utils::OpenHandle(this); if (obj->IsSmi()) { return i::Smi::cast(*obj)->value(); @@ -5107,9 +4913,6 @@ uint32_t Uint32::Value() const { int v8::Object::InternalFieldCount() { i::Handle<i::JSObject> obj = Utils::OpenHandle(this); - if (IsDeadCheck(obj->GetIsolate(), "v8::Object::InternalFieldCount()")) { - return 0; - } return obj->GetInternalFieldCount(); } @@ -5117,10 +4920,9 @@ int v8::Object::InternalFieldCount() { static bool InternalFieldOK(i::Handle<i::JSObject> obj, int index, const char* location) { - return !IsDeadCheck(obj->GetIsolate(), location) && - ApiCheck(index < obj->GetInternalFieldCount(), - location, - "Internal field out of bounds"); + return ApiCheck(index < obj->GetInternalFieldCount(), + location, + "Internal field out of bounds"); } @@ -5191,11 +4993,6 @@ void v8::V8::SetReturnAddressLocationResolver( } -bool v8::V8::SetFunctionEntryHook(FunctionEntryHook entry_hook) { - return SetFunctionEntryHook(Isolate::GetCurrent(), entry_hook); -} - - bool v8::V8::SetFunctionEntryHook(Isolate* ext_isolate, FunctionEntryHook entry_hook) { ASSERT(ext_isolate != NULL); @@ -5256,25 +5053,8 @@ HeapStatistics::HeapStatistics(): total_heap_size_(0), heap_size_limit_(0) { } -void v8::V8::GetHeapStatistics(HeapStatistics* heap_statistics) { - i::Isolate* isolate = i::Isolate::UncheckedCurrent(); - if (isolate == NULL || !isolate->IsInitialized()) { - // Isolate is unitialized thus heap is not configured yet. - heap_statistics->total_heap_size_ = 0; - heap_statistics->total_heap_size_executable_ = 0; - heap_statistics->total_physical_size_ = 0; - heap_statistics->used_heap_size_ = 0; - heap_statistics->heap_size_limit_ = 0; - return; - } - Isolate* ext_isolate = reinterpret_cast<Isolate*>(isolate); - return ext_isolate->GetHeapStatistics(heap_statistics); -} - - void v8::V8::VisitExternalResources(ExternalResourceVisitor* visitor) { i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::V8::VisitExternalResources"); isolate->heap()->VisitExternalResources(visitor); } @@ -5298,8 +5078,6 @@ class VisitorAdapter : public i::ObjectVisitor { void v8::V8::VisitHandlesWithClassIds(PersistentHandleVisitor* visitor) { i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::V8::VisitHandlesWithClassId"); - i::DisallowHeapAllocation no_allocation; VisitorAdapter visitor_adapter(visitor); @@ -5311,8 +5089,6 @@ void v8::V8::VisitHandlesForPartialDependence( Isolate* exported_isolate, PersistentHandleVisitor* visitor) { i::Isolate* isolate = reinterpret_cast<i::Isolate*>(exported_isolate); ASSERT(isolate == i::Isolate::Current()); - IsDeadCheck(isolate, "v8::V8::VisitHandlesForPartialDependence"); - i::DisallowHeapAllocation no_allocation; VisitorAdapter visitor_adapter(visitor); @@ -5423,7 +5199,6 @@ Local<Context> v8::Context::New( v8::ExtensionConfiguration* extensions, v8::Handle<ObjectTemplate> global_template, v8::Handle<Value> global_object) { - i::Isolate::EnsureDefaultIsolate(); i::Isolate* isolate = reinterpret_cast<i::Isolate*>(external_isolate); EnsureInitializedForIsolate(isolate, "v8::Context::New()"); LOG_API(isolate, "Context::New"); @@ -5438,9 +5213,6 @@ Local<Context> v8::Context::New( void v8::Context::SetSecurityToken(Handle<Value> token) { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Context::SetSecurityToken()")) { - return; - } ENTER_V8(isolate); i::Handle<i::Context> env = Utils::OpenHandle(this); i::Handle<i::Object> token_handle = Utils::OpenHandle(*token); @@ -5450,10 +5222,6 @@ void v8::Context::SetSecurityToken(Handle<Value> token) { void v8::Context::UseDefaultSecurityToken() { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, - "v8::Context::UseDefaultSecurityToken()")) { - return; - } ENTER_V8(isolate); i::Handle<i::Context> env = Utils::OpenHandle(this); env->set_security_token(env->global_object()); @@ -5462,9 +5230,6 @@ void v8::Context::UseDefaultSecurityToken() { Handle<Value> v8::Context::GetSecurityToken() { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Context::GetSecurityToken()")) { - return Handle<Value>(); - } i::Handle<i::Context> env = Utils::OpenHandle(this); i::Object* security_token = env->security_token(); i::Handle<i::Object> token_handle(security_token, isolate); @@ -5494,67 +5259,42 @@ v8::Local<v8::Context> Context::GetEntered() { if (!EnsureInitializedForIsolate(isolate, "v8::Context::GetEntered()")) { return Local<Context>(); } - i::Handle<i::Object> last = - isolate->handle_scope_implementer()->LastEnteredContext(); - if (last.is_null()) return Local<Context>(); - i::Handle<i::Context> context = i::Handle<i::Context>::cast(last); - return Utils::ToLocal(context); + return reinterpret_cast<Isolate*>(isolate)->GetEnteredContext(); } v8::Local<v8::Context> Context::GetCurrent() { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Context::GetCurrent()")) { - return Local<Context>(); - } return reinterpret_cast<Isolate*>(isolate)->GetCurrentContext(); } v8::Local<v8::Context> Context::GetCalling() { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Context::GetCalling()")) { - return Local<Context>(); - } - i::Handle<i::Object> calling = - isolate->GetCallingNativeContext(); - if (calling.is_null()) return Local<Context>(); - i::Handle<i::Context> context = i::Handle<i::Context>::cast(calling); - return Utils::ToLocal(context); + return reinterpret_cast<Isolate*>(isolate)->GetCallingContext(); } v8::Local<v8::Object> Context::Global() { - i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Context::Global()")) { - return Local<v8::Object>(); - } - i::Object** ctx = reinterpret_cast<i::Object**>(this); - i::Handle<i::Context> context = - i::Handle<i::Context>::cast(i::Handle<i::Object>(ctx)); + i::Handle<i::Context> context = Utils::OpenHandle(this); + i::Isolate* isolate = context->GetIsolate(); i::Handle<i::Object> global(context->global_proxy(), isolate); return Utils::ToLocal(i::Handle<i::JSObject>::cast(global)); } void Context::DetachGlobal() { - i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Context::DetachGlobal()")) return; + i::Handle<i::Context> context = Utils::OpenHandle(this); + i::Isolate* isolate = context->GetIsolate(); ENTER_V8(isolate); - i::Object** ctx = reinterpret_cast<i::Object**>(this); - i::Handle<i::Context> context = - i::Handle<i::Context>::cast(i::Handle<i::Object>(ctx)); isolate->bootstrapper()->DetachGlobal(context); } void Context::ReattachGlobal(Handle<Object> global_object) { - i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Context::ReattachGlobal()")) return; + i::Handle<i::Context> context = Utils::OpenHandle(this); + i::Isolate* isolate = context->GetIsolate(); ENTER_V8(isolate); - i::Object** ctx = reinterpret_cast<i::Object**>(this); - i::Handle<i::Context> context = - i::Handle<i::Context>::cast(i::Handle<i::Object>(ctx)); i::Handle<i::JSGlobalProxy> global_proxy = i::Handle<i::JSGlobalProxy>::cast(Utils::OpenHandle(*global_object)); isolate->bootstrapper()->ReattachGlobal(context, global_proxy); @@ -5562,44 +5302,23 @@ void Context::ReattachGlobal(Handle<Object> global_object) { void Context::AllowCodeGenerationFromStrings(bool allow) { - i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Context::AllowCodeGenerationFromStrings()")) { - return; - } + i::Handle<i::Context> context = Utils::OpenHandle(this); + i::Isolate* isolate = context->GetIsolate(); ENTER_V8(isolate); - i::Object** ctx = reinterpret_cast<i::Object**>(this); - i::Handle<i::Context> context = - i::Handle<i::Context>::cast(i::Handle<i::Object>(ctx)); context->set_allow_code_gen_from_strings( allow ? isolate->heap()->true_value() : isolate->heap()->false_value()); } bool Context::IsCodeGenerationFromStringsAllowed() { - i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, - "v8::Context::IsCodeGenerationFromStringsAllowed()")) { - return false; - } - ENTER_V8(isolate); - i::Object** ctx = reinterpret_cast<i::Object**>(this); - i::Handle<i::Context> context = - i::Handle<i::Context>::cast(i::Handle<i::Object>(ctx)); + i::Handle<i::Context> context = Utils::OpenHandle(this); return !context->allow_code_gen_from_strings()->IsFalse(); } void Context::SetErrorMessageForCodeGenerationFromStrings( Handle<String> error) { - i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, - "v8::Context::SetErrorMessageForCodeGenerationFromStrings()")) { - return; - } - ENTER_V8(isolate); - i::Object** ctx = reinterpret_cast<i::Object**>(this); - i::Handle<i::Context> context = - i::Handle<i::Context>::cast(i::Handle<i::Object>(ctx)); + i::Handle<i::Context> context = Utils::OpenHandle(this); i::Handle<i::String> error_handle = Utils::OpenHandle(*error); context->set_error_message_for_code_gen_from_strings(*error_handle); } @@ -5655,7 +5374,6 @@ Local<External> v8::External::New(void* value) { void* External::Value() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::External::Value()")) return NULL; return ExternalValue(*Utils::OpenHandle(this)); } @@ -5848,7 +5566,6 @@ Local<String> v8::String::NewExternal( bool v8::String::MakeExternal(v8::String::ExternalStringResource* resource) { i::Handle<i::String> obj = Utils::OpenHandle(this); i::Isolate* isolate = obj->GetIsolate(); - if (IsDeadCheck(isolate, "v8::String::MakeExternal()")) return false; if (i::StringShape(*obj).IsExternalTwoByte()) { return false; // Already an external string. } @@ -5899,7 +5616,6 @@ bool v8::String::MakeExternal( v8::String::ExternalAsciiStringResource* resource) { i::Handle<i::String> obj = Utils::OpenHandle(this); i::Isolate* isolate = obj->GetIsolate(); - if (IsDeadCheck(isolate, "v8::String::MakeExternal()")) return false; if (i::StringShape(*obj).IsExternalTwoByte()) { return false; // Already an external string. } @@ -5937,7 +5653,12 @@ bool v8::String::CanMakeExternal() { if (!internal::FLAG_clever_optimizations) return false; i::Handle<i::String> obj = Utils::OpenHandle(this); i::Isolate* isolate = obj->GetIsolate(); - if (IsDeadCheck(isolate, "v8::String::CanMakeExternal()")) return false; + + // TODO(yangguo): Externalizing sliced/cons strings allocates. + // This rule can be removed when all code that can + // trigger an access check is handlified and therefore GC safe. + if (isolate->heap()->old_pointer_space()->Contains(*obj)) return false; + if (isolate->string_tracker()->IsFreshUnusedString(obj)) return false; int size = obj->Size(); // Byte size of the original string. if (size < i::ExternalString::kShortSize) return false; @@ -5970,7 +5691,6 @@ Local<v8::Value> v8::NumberObject::New(double value) { double v8::NumberObject::ValueOf() const { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::NumberObject::NumberValue()")) return 0; LOG_API(isolate, "NumberObject::NumberValue"); i::Handle<i::Object> obj = Utils::OpenHandle(this); i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj); @@ -5994,7 +5714,6 @@ Local<v8::Value> v8::BooleanObject::New(bool value) { bool v8::BooleanObject::ValueOf() const { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::BooleanObject::BooleanValue()")) return 0; LOG_API(isolate, "BooleanObject::BooleanValue"); i::Handle<i::Object> obj = Utils::OpenHandle(this); i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj); @@ -6015,9 +5734,6 @@ Local<v8::Value> v8::StringObject::New(Handle<String> value) { Local<v8::String> v8::StringObject::ValueOf() const { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::StringObject::StringValue()")) { - return Local<v8::String>(); - } LOG_API(isolate, "StringObject::StringValue"); i::Handle<i::Object> obj = Utils::OpenHandle(this); i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj); @@ -6039,8 +5755,6 @@ Local<v8::Value> v8::SymbolObject::New(Isolate* isolate, Handle<Symbol> value) { Local<v8::Symbol> v8::SymbolObject::ValueOf() const { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::SymbolObject::SymbolValue()")) - return Local<v8::Symbol>(); LOG_API(isolate, "SymbolObject::SymbolValue"); i::Handle<i::Object> obj = Utils::OpenHandle(this); i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj); @@ -6068,7 +5782,6 @@ Local<v8::Value> v8::Date::New(double time) { double v8::Date::ValueOf() const { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Date::NumberValue()")) return 0; LOG_API(isolate, "Date::NumberValue"); i::Handle<i::Object> obj = Utils::OpenHandle(this); i::Handle<i::JSDate> jsdate = i::Handle<i::JSDate>::cast(obj); @@ -6142,10 +5855,6 @@ Local<v8::RegExp> v8::RegExp::New(Handle<String> pattern, Local<v8::String> v8::RegExp::GetSource() const { - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::RegExp::GetSource()")) { - return Local<v8::String>(); - } i::Handle<i::JSRegExp> obj = Utils::OpenHandle(this); return Utils::ToLocal(i::Handle<i::String>(obj->Pattern())); } @@ -6162,9 +5871,6 @@ REGEXP_FLAG_ASSERT_EQ(kMultiline, MULTILINE); #undef REGEXP_FLAG_ASSERT_EQ v8::RegExp::Flags v8::RegExp::GetFlags() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::RegExp::GetFlags()")) { - return v8::RegExp::kNone; - } i::Handle<i::JSRegExp> obj = Utils::OpenHandle(this); return static_cast<RegExp::Flags>(obj->GetFlags().value()); } @@ -6185,8 +5891,6 @@ Local<v8::Array> v8::Array::New(int length) { uint32_t v8::Array::Length() const { - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::Array::Length()")) return 0; i::Handle<i::JSArray> obj = Utils::OpenHandle(this); i::Object* length = obj->length(); if (length->IsSmi()) { @@ -6212,7 +5916,7 @@ Local<Object> Array::CloneElementAt(uint32_t index) { i::Handle<i::JSObject> paragon_handle(i::JSObject::cast(paragon)); EXCEPTION_PREAMBLE(isolate); ENTER_V8(isolate); - i::Handle<i::JSObject> result = i::Copy(paragon_handle); + i::Handle<i::JSObject> result = i::JSObject::Copy(paragon_handle); has_pending_exception = result.is_null(); EXCEPTION_BAILOUT_CHECK(isolate, Local<Object>()); return Utils::ToLocal(result); @@ -6264,8 +5968,6 @@ void v8::ArrayBuffer::Neuter() { size_t v8::ArrayBuffer::ByteLength() const { - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::ArrayBuffer::ByteLength()")) return 0; i::Handle<i::JSArrayBuffer> obj = Utils::OpenHandle(this); return static_cast<size_t>(obj->byte_length()->Number()); } @@ -6315,18 +6017,7 @@ size_t v8::ArrayBufferView::ByteLength() { } -void* v8::ArrayBufferView::BaseAddress() { - i::Handle<i::JSArrayBufferView> obj = Utils::OpenHandle(this); - i::Handle<i::JSArrayBuffer> buffer(i::JSArrayBuffer::cast(obj->buffer())); - void* buffer_data = buffer->backing_store(); - size_t byte_offset = static_cast<size_t>(obj->byte_offset()->Number()); - return static_cast<uint8_t*>(buffer_data) + byte_offset; -} - - size_t v8::TypedArray::Length() { - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::TypedArray::Length()")) return 0; i::Handle<i::JSTypedArray> obj = Utils::OpenHandle(this); return static_cast<size_t>(obj->length()->Number()); } @@ -6584,14 +6275,12 @@ void V8::SetCaptureStackTraceForUncaughtExceptions( void V8::SetCounterFunction(CounterLookupCallback callback) { i::Isolate* isolate = EnterIsolateIfNeeded(); - if (IsDeadCheck(isolate, "v8::V8::SetCounterFunction()")) return; isolate->stats_table()->SetCounterFunction(callback); } void V8::SetCreateHistogramFunction(CreateHistogramCallback callback) { i::Isolate* isolate = EnterIsolateIfNeeded(); - if (IsDeadCheck(isolate, "v8::V8::SetCreateHistogramFunction()")) return; isolate->stats_table()->SetCreateHistogramFunction(callback); isolate->InitializeLoggingAndCounters(); isolate->counters()->ResetHistograms(); @@ -6600,7 +6289,6 @@ void V8::SetCreateHistogramFunction(CreateHistogramCallback callback) { void V8::SetAddHistogramSampleFunction(AddHistogramSampleCallback callback) { i::Isolate* isolate = EnterIsolateIfNeeded(); - if (IsDeadCheck(isolate, "v8::V8::SetAddHistogramSampleFunction()")) return; isolate->stats_table()-> SetAddHistogramSampleFunction(callback); } @@ -6608,9 +6296,6 @@ void V8::SetAddHistogramSampleFunction(AddHistogramSampleCallback callback) { void V8::SetFailedAccessCheckCallbackFunction( FailedAccessCheckCallback callback) { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::V8::SetFailedAccessCheckCallbackFunction()")) { - return; - } isolate->SetFailedAccessCheckCallback(callback); } @@ -6624,8 +6309,7 @@ intptr_t Isolate::AdjustAmountOfExternalAllocatedMemory( intptr_t V8::AdjustAmountOfExternalAllocatedMemory(intptr_t change_in_bytes) { i::Isolate* isolate = i::Isolate::UncheckedCurrent(); - if (isolate == NULL || !isolate->IsInitialized() || - IsDeadCheck(isolate, "v8::V8::AdjustAmountOfExternalAllocatedMemory()")) { + if (isolate == NULL || !isolate->IsInitialized()) { return 0; } Isolate* isolate_ext = reinterpret_cast<Isolate*>(isolate); @@ -6647,9 +6331,15 @@ CpuProfiler* Isolate::GetCpuProfiler() { } +bool Isolate::InContext() { + i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); + return isolate->context() != NULL; +} + + v8::Local<v8::Context> Isolate::GetCurrentContext() { - i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(this); - i::Context* context = internal_isolate->context(); + i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); + i::Context* context = isolate->context(); if (context == NULL) return Local<Context>(); i::Context* native_context = context->global_object()->native_context(); if (native_context == NULL) return Local<Context>(); @@ -6657,73 +6347,119 @@ v8::Local<v8::Context> Isolate::GetCurrentContext() { } -void Isolate::SetObjectGroupId(const Persistent<Value>& object, - UniqueId id) { +v8::Local<v8::Context> Isolate::GetCallingContext() { + i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); + i::Handle<i::Object> calling = isolate->GetCallingNativeContext(); + if (calling.is_null()) return Local<Context>(); + return Utils::ToLocal(i::Handle<i::Context>::cast(calling)); +} + + +v8::Local<v8::Context> Isolate::GetEnteredContext() { + i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); + i::Handle<i::Object> last = + isolate->handle_scope_implementer()->LastEnteredContext(); + if (last.is_null()) return Local<Context>(); + return Utils::ToLocal(i::Handle<i::Context>::cast(last)); +} + + +v8::Local<Value> Isolate::ThrowException(v8::Local<v8::Value> value) { + i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); + ENTER_V8(isolate); + // If we're passed an empty handle, we throw an undefined exception + // to deal more gracefully with out of memory situations. + if (value.IsEmpty()) { + isolate->ScheduleThrow(isolate->heap()->undefined_value()); + } else { + isolate->ScheduleThrow(*Utils::OpenHandle(*value)); + } + return v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); +} + + +void Isolate::SetObjectGroupId(internal::Object** object, UniqueId id) { i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(this); internal_isolate->global_handles()->SetObjectGroupId( - Utils::OpenPersistent(object).location(), + v8::internal::Handle<v8::internal::Object>(object).location(), id); } -void Isolate::SetReferenceFromGroup(UniqueId id, - const Persistent<Value>& object) { +void Isolate::SetReferenceFromGroup(UniqueId id, internal::Object** object) { i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(this); internal_isolate->global_handles()->SetReferenceFromGroup( id, - Utils::OpenPersistent(object).location()); + v8::internal::Handle<v8::internal::Object>(object).location()); } -void Isolate::SetReference(const Persistent<Object>& parent, - const Persistent<Value>& child) { +void Isolate::SetReference(internal::Object** parent, + internal::Object** child) { i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(this); - i::Object** parent_location = Utils::OpenPersistent(parent).location(); + i::Object** parent_location = + v8::internal::Handle<v8::internal::Object>(parent).location(); internal_isolate->global_handles()->SetReference( reinterpret_cast<i::HeapObject**>(parent_location), - Utils::OpenPersistent(child).location()); + v8::internal::Handle<v8::internal::Object>(child).location()); } -void V8::SetGlobalGCPrologueCallback(GCCallback callback) { - i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::V8::SetGlobalGCPrologueCallback()")) return; - isolate->heap()->SetGlobalGCPrologueCallback(callback); +void Isolate::AddGCPrologueCallback(GCPrologueCallback callback, + GCType gc_type) { + i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); + isolate->heap()->AddGCPrologueCallback(callback, gc_type); } -void V8::SetGlobalGCEpilogueCallback(GCCallback callback) { - i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::V8::SetGlobalGCEpilogueCallback()")) return; - isolate->heap()->SetGlobalGCEpilogueCallback(callback); +void Isolate::RemoveGCPrologueCallback(GCPrologueCallback callback) { + i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); + isolate->heap()->RemoveGCPrologueCallback(callback); +} + + +void Isolate::AddGCEpilogueCallback(GCEpilogueCallback callback, + GCType gc_type) { + i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); + isolate->heap()->AddGCEpilogueCallback(callback, gc_type); +} + + +void Isolate::RemoveGCEpilogueCallback(GCEpilogueCallback callback) { + i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); + isolate->heap()->RemoveGCEpilogueCallback(callback); } void V8::AddGCPrologueCallback(GCPrologueCallback callback, GCType gc_type) { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::V8::AddGCPrologueCallback()")) return; - isolate->heap()->AddGCPrologueCallback(callback, gc_type); + isolate->heap()->AddGCPrologueCallback( + reinterpret_cast<v8::Isolate::GCPrologueCallback>(callback), + gc_type, + false); } void V8::RemoveGCPrologueCallback(GCPrologueCallback callback) { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::V8::RemoveGCPrologueCallback()")) return; - isolate->heap()->RemoveGCPrologueCallback(callback); + isolate->heap()->RemoveGCPrologueCallback( + reinterpret_cast<v8::Isolate::GCPrologueCallback>(callback)); } void V8::AddGCEpilogueCallback(GCEpilogueCallback callback, GCType gc_type) { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::V8::AddGCEpilogueCallback()")) return; - isolate->heap()->AddGCEpilogueCallback(callback, gc_type); + isolate->heap()->AddGCEpilogueCallback( + reinterpret_cast<v8::Isolate::GCEpilogueCallback>(callback), + gc_type, + false); } void V8::RemoveGCEpilogueCallback(GCEpilogueCallback callback) { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::V8::RemoveGCEpilogueCallback()")) return; - isolate->heap()->RemoveGCEpilogueCallback(callback); + isolate->heap()->RemoveGCEpilogueCallback( + reinterpret_cast<v8::Isolate::GCEpilogueCallback>(callback)); } @@ -6731,7 +6467,6 @@ void V8::AddMemoryAllocationCallback(MemoryAllocationCallback callback, ObjectSpace space, AllocationAction action) { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::V8::AddMemoryAllocationCallback()")) return; isolate->memory_allocator()->AddMemoryAllocationCallback( callback, space, action); } @@ -6739,7 +6474,6 @@ void V8::AddMemoryAllocationCallback(MemoryAllocationCallback callback, void V8::RemoveMemoryAllocationCallback(MemoryAllocationCallback callback) { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::V8::RemoveMemoryAllocationCallback()")) return; isolate->memory_allocator()->RemoveMemoryAllocationCallback( callback); } @@ -6747,17 +6481,11 @@ void V8::RemoveMemoryAllocationCallback(MemoryAllocationCallback callback) { void V8::AddCallCompletedCallback(CallCompletedCallback callback) { if (callback == NULL) return; - i::Isolate::EnsureDefaultIsolate(); - i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::V8::AddLeaveScriptCallback()")) return; i::V8::AddCallCompletedCallback(callback); } void V8::RemoveCallCompletedCallback(CallCompletedCallback callback) { - i::Isolate::EnsureDefaultIsolate(); - i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::V8::RemoveLeaveScriptCallback()")) return; i::V8::RemoveCallCompletedCallback(callback); } @@ -6843,7 +6571,6 @@ void Isolate::GetHeapStatistics(HeapStatistics* heap_statistics) { String::Utf8Value::Utf8Value(v8::Handle<v8::Value> obj) : str_(NULL), length_(0) { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::String::Utf8Value::Utf8Value()")) return; if (obj.IsEmpty()) return; ENTER_V8(isolate); i::HandleScope scope(isolate); @@ -6865,7 +6592,6 @@ String::Utf8Value::~Utf8Value() { String::AsciiValue::AsciiValue(v8::Handle<v8::Value> obj) : str_(NULL), length_(0) { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::String::AsciiValue::AsciiValue()")) return; if (obj.IsEmpty()) return; ENTER_V8(isolate); i::HandleScope scope(isolate); @@ -6887,7 +6613,6 @@ String::AsciiValue::~AsciiValue() { String::Value::Value(v8::Handle<v8::Value> obj) : str_(NULL), length_(0) { i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::String::Value::Value()")) return; if (obj.IsEmpty()) return; ENTER_V8(isolate); i::HandleScope scope(isolate); @@ -7062,6 +6787,16 @@ void Debug::SetMessageHandler2(v8::Debug::MessageHandler2 handler) { } +void Debug::SendCommand(Isolate* isolate, + const uint16_t* command, + int length, + ClientData* client_data) { + i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); + internal_isolate->debugger()->ProcessCommand( + i::Vector<const uint16_t>(command, length), client_data); +} + + void Debug::SendCommand(const uint16_t* command, int length, ClientData* client_data, Isolate* isolate) { @@ -7187,7 +6922,6 @@ void Debug::SetLiveEditEnabled(bool enable, Isolate* isolate) { Handle<String> CpuProfileNode::GetFunctionName() const { i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::CpuProfileNode::GetFunctionName"); const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); const i::CodeEntry* entry = node->entry(); if (!entry->has_name_prefix()) { @@ -7210,7 +6944,6 @@ int CpuProfileNode::GetScriptId() const { Handle<String> CpuProfileNode::GetScriptResourceName() const { i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::CpuProfileNode::GetScriptResourceName"); const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); return ToApiHandle<String>(isolate->factory()->InternalizeUtf8String( node->entry()->resource_name())); @@ -7222,16 +6955,15 @@ int CpuProfileNode::GetLineNumber() const { } -const char* CpuProfileNode::GetBailoutReason() const { - const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); - return node->entry()->bailout_reason(); +int CpuProfileNode::GetColumnNumber() const { + return reinterpret_cast<const i::ProfileNode*>(this)-> + entry()->column_number(); } -double CpuProfileNode::GetSelfSamplesCount() const { - i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::CpuProfileNode::GetSelfSamplesCount"); - return reinterpret_cast<const i::ProfileNode*>(this)->self_ticks(); +const char* CpuProfileNode::GetBailoutReason() const { + const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); + return node->entry()->bailout_reason(); } @@ -7264,7 +6996,6 @@ const CpuProfileNode* CpuProfileNode::GetChild(int index) const { void CpuProfile::Delete() { i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::CpuProfile::Delete"); i::CpuProfiler* profiler = isolate->cpu_profiler(); ASSERT(profiler != NULL); profiler->DeleteProfile(reinterpret_cast<i::CpuProfile*>(this)); @@ -7282,7 +7013,6 @@ unsigned CpuProfile::GetUid() const { Handle<String> CpuProfile::GetTitle() const { i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::CpuProfile::GetTitle"); const i::CpuProfile* profile = reinterpret_cast<const i::CpuProfile*>(this); return ToApiHandle<String>(isolate->factory()->InternalizeUtf8String( profile->title())); @@ -7374,15 +7104,12 @@ static i::HeapGraphEdge* ToInternal(const HeapGraphEdge* edge) { HeapGraphEdge::Type HeapGraphEdge::GetType() const { - i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::HeapGraphEdge::GetType"); return static_cast<HeapGraphEdge::Type>(ToInternal(this)->type()); } Handle<Value> HeapGraphEdge::GetName() const { i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::HeapGraphEdge::GetName"); i::HeapGraphEdge* edge = ToInternal(this); switch (edge->type()) { case i::HeapGraphEdge::kContextVariable: @@ -7398,21 +7125,17 @@ Handle<Value> HeapGraphEdge::GetName() const { isolate->factory()->NewNumberFromInt(edge->index())); default: UNREACHABLE(); } - return v8::Undefined(); + return v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); } const HeapGraphNode* HeapGraphEdge::GetFromNode() const { - i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::HeapGraphEdge::GetFromNode"); const i::HeapEntry* from = ToInternal(this)->from(); return reinterpret_cast<const HeapGraphNode*>(from); } const HeapGraphNode* HeapGraphEdge::GetToNode() const { - i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::HeapGraphEdge::GetToNode"); const i::HeapEntry* to = ToInternal(this)->to(); return reinterpret_cast<const HeapGraphNode*>(to); } @@ -7425,44 +7148,33 @@ static i::HeapEntry* ToInternal(const HeapGraphNode* entry) { HeapGraphNode::Type HeapGraphNode::GetType() const { - i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::HeapGraphNode::GetType"); return static_cast<HeapGraphNode::Type>(ToInternal(this)->type()); } Handle<String> HeapGraphNode::GetName() const { i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::HeapGraphNode::GetName"); return ToApiHandle<String>( isolate->factory()->InternalizeUtf8String(ToInternal(this)->name())); } SnapshotObjectId HeapGraphNode::GetId() const { - i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::HeapGraphNode::GetId"); return ToInternal(this)->id(); } int HeapGraphNode::GetSelfSize() const { - i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::HeapGraphNode::GetSelfSize"); return ToInternal(this)->self_size(); } int HeapGraphNode::GetChildrenCount() const { - i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::HeapSnapshot::GetChildrenCount"); return ToInternal(this)->children().length(); } const HeapGraphEdge* HeapGraphNode::GetChild(int index) const { - i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::HeapSnapshot::GetChild"); return reinterpret_cast<const HeapGraphEdge*>( ToInternal(this)->children()[index]); } @@ -7470,7 +7182,6 @@ const HeapGraphEdge* HeapGraphNode::GetChild(int index) const { v8::Handle<v8::Value> HeapGraphNode::GetHeapValue() const { i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::HeapGraphNode::GetHeapValue"); i::Handle<i::HeapObject> object = ToInternal(this)->GetHeapObject(); return !object.is_null() ? ToApiHandle<Value>(object) : @@ -7486,7 +7197,6 @@ static i::HeapSnapshot* ToInternal(const HeapSnapshot* snapshot) { void HeapSnapshot::Delete() { i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::HeapSnapshot::Delete"); if (isolate->heap_profiler()->GetSnapshotsCount() > 1) { ToInternal(this)->Delete(); } else { @@ -7497,61 +7207,46 @@ void HeapSnapshot::Delete() { unsigned HeapSnapshot::GetUid() const { - i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::HeapSnapshot::GetUid"); return ToInternal(this)->uid(); } Handle<String> HeapSnapshot::GetTitle() const { i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::HeapSnapshot::GetTitle"); return ToApiHandle<String>( isolate->factory()->InternalizeUtf8String(ToInternal(this)->title())); } const HeapGraphNode* HeapSnapshot::GetRoot() const { - i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::HeapSnapshot::GetHead"); return reinterpret_cast<const HeapGraphNode*>(ToInternal(this)->root()); } const HeapGraphNode* HeapSnapshot::GetNodeById(SnapshotObjectId id) const { - i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::HeapSnapshot::GetNodeById"); return reinterpret_cast<const HeapGraphNode*>( ToInternal(this)->GetEntryById(id)); } int HeapSnapshot::GetNodesCount() const { - i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::HeapSnapshot::GetNodesCount"); return ToInternal(this)->entries().length(); } const HeapGraphNode* HeapSnapshot::GetNode(int index) const { - i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::HeapSnapshot::GetNode"); return reinterpret_cast<const HeapGraphNode*>( &ToInternal(this)->entries().at(index)); } SnapshotObjectId HeapSnapshot::GetMaxSnapshotJSObjectId() const { - i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::HeapSnapshot::GetMaxSnapshotJSObjectId"); return ToInternal(this)->max_snapshot_js_object_id(); } void HeapSnapshot::Serialize(OutputStream* stream, HeapSnapshot::SerializationFormat format) const { - i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::HeapSnapshot::Serialize"); ApiCheck(format == kJSON, "v8::HeapSnapshot::Serialize", "Unknown serialization format"); @@ -7632,6 +7327,16 @@ void HeapProfiler::SetRetainedObjectInfo(UniqueId id, } +void HeapProfiler::StartRecordingHeapAllocations() { + reinterpret_cast<i::HeapProfiler*>(this)->StartHeapAllocationsRecording(); +} + + +void HeapProfiler::StopRecordingHeapAllocations() { + reinterpret_cast<i::HeapProfiler*>(this)->StopHeapAllocationsRecording(); +} + + v8::Testing::StressType internal::Testing::stress_type_ = v8::Testing::kStressTypeOpt; @@ -7762,9 +7467,11 @@ void HandleScopeImplementer::IterateThis(ObjectVisitor* v) { v->VisitPointers(blocks()->last(), handle_scope_data_.next); } - if (!saved_contexts_.is_empty()) { - Object** start = reinterpret_cast<Object**>(&saved_contexts_.first()); - v->VisitPointers(start, start + saved_contexts_.length()); + List<Context*>* context_lists[2] = { &saved_contexts_, &entered_contexts_}; + for (unsigned i = 0; i < ARRAY_SIZE(context_lists); i++) { + if (context_lists[i]->is_empty()) continue; + Object** start = reinterpret_cast<Object**>(&context_lists[i]->first()); + v->VisitPointers(start, start + context_lists[i]->length()); } } @@ -7823,7 +7530,7 @@ DeferredHandles::~DeferredHandles() { isolate_->UnlinkDeferredHandles(this); for (int i = 0; i < blocks_.length(); i++) { -#ifdef ENABLE_EXTRA_CHECKS +#ifdef ENABLE_HANDLE_ZAPPING HandleScope::ZapRange(blocks_[i], &blocks_[i][kHandleBlockSize]); #endif isolate_->handle_scope_implementer()->ReturnBlock(blocks_[i]); |