From: yangguo@chromium.org Date: Mon, 14 Apr 2014 09:19:09 +0000 (+0000) Subject: Handlify Object::ToObject. X-Git-Tag: upstream/4.7.83~9654 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b44598b387c941e9a2ba661f8e9881a5402a85a3;p=platform%2Fupstream%2Fv8.git Handlify Object::ToObject. R=bmeurer@chromium.org, mvstanton@chromium.org Review URL: https://codereview.chromium.org/235943007 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20711 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/api.cc b/src/api.cc index bce5f67..bdc0c4f 100644 --- a/src/api.cc +++ b/src/api.cc @@ -5579,7 +5579,8 @@ Local v8::NumberObject::New(Isolate* isolate, double value) { LOG_API(i_isolate, "NumberObject::New"); ENTER_V8(i_isolate); i::Handle number = i_isolate->factory()->NewNumber(value); - i::Handle obj = i_isolate->factory()->ToObject(number); + i::Handle obj = + i::Object::ToObject(i_isolate, number).ToHandleChecked(); return Utils::ToLocal(obj); } @@ -5602,7 +5603,8 @@ Local v8::BooleanObject::New(bool value) { ? isolate->heap()->true_value() : isolate->heap()->false_value(), isolate); - i::Handle obj = isolate->factory()->ToObject(boolean); + i::Handle obj = + i::Object::ToObject(isolate, boolean).ToHandleChecked(); return Utils::ToLocal(obj); } @@ -5621,8 +5623,8 @@ Local v8::StringObject::New(Handle value) { EnsureInitializedForIsolate(isolate, "v8::StringObject::New()"); LOG_API(isolate, "StringObject::New"); ENTER_V8(isolate); - i::Handle obj = - isolate->factory()->ToObject(Utils::OpenHandle(*value)); + i::Handle obj = i::Object::ToObject( + isolate, Utils::OpenHandle(*value)).ToHandleChecked(); return Utils::ToLocal(obj); } @@ -5642,8 +5644,8 @@ Local v8::SymbolObject::New(Isolate* isolate, Handle value) { EnsureInitializedForIsolate(i_isolate, "v8::SymbolObject::New()"); LOG_API(i_isolate, "SymbolObject::New"); ENTER_V8(i_isolate); - i::Handle obj = - i_isolate->factory()->ToObject(Utils::OpenHandle(*value)); + i::Handle obj = i::Object::ToObject( + i_isolate, Utils::OpenHandle(*value)).ToHandleChecked(); return Utils::ToLocal(obj); } diff --git a/src/factory.cc b/src/factory.cc index fc49e32..4ec47e5 100644 --- a/src/factory.cc +++ b/src/factory.cc @@ -1670,17 +1670,6 @@ Handle Factory::NewFunctionWithoutPrototype( } -Handle Factory::ToObject(Handle object) { - CALL_HEAP_FUNCTION(isolate(), object->ToObject(isolate()), Object); -} - - -Handle Factory::ToObject(Handle object, - Handle native_context) { - CALL_HEAP_FUNCTION(isolate(), object->ToObject(*native_context), Object); -} - - #ifdef ENABLE_DEBUGGER_SUPPORT Handle Factory::NewDebugInfo(Handle shared) { // Get the original code of the function. diff --git a/src/factory.h b/src/factory.h index ae861ba..51096ee 100644 --- a/src/factory.h +++ b/src/factory.h @@ -423,10 +423,6 @@ class Factory V8_FINAL { Handle CopyCode(Handle code, Vector reloc_info); - Handle ToObject(Handle object); - Handle ToObject(Handle object, - Handle native_context); - // Interface for creating error objects. Handle NewError(const char* maker, const char* message, diff --git a/src/json-stringifier.h b/src/json-stringifier.h index bbc80f2..c4f6b1f 100644 --- a/src/json-stringifier.h +++ b/src/json-stringifier.h @@ -264,7 +264,7 @@ BasicJsonStringifier::BasicJsonStringifier(Isolate* isolate) overflowed_(false) { factory_ = isolate_->factory(); accumulator_store_ = Handle::cast( - factory_->ToObject(factory_->empty_string())); + Object::ToObject(isolate, factory_->empty_string()).ToHandleChecked()); part_length_ = kInitialPartLength; current_part_ = factory_->NewRawOneByteString(part_length_).ToHandleChecked(); tojson_string_ = factory_->toJSON_string(); diff --git a/src/objects-inl.h b/src/objects-inl.h index ed66dc6..b0c8d17 100644 --- a/src/objects-inl.h +++ b/src/objects-inl.h @@ -1076,6 +1076,13 @@ MaybeObject* Object::ToSmi() { } +MaybeHandle Object::ToObject(Isolate* isolate, + Handle object) { + return ToObject( + isolate, object, handle(isolate->context()->native_context(), isolate)); +} + + bool Object::HasSpecificClassOf(String* name) { return this->IsJSObject() && (JSObject::cast(this)->class_name() == name); } diff --git a/src/objects.cc b/src/objects.cc index 37bb4f5..4061f61 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -60,56 +60,28 @@ namespace v8 { namespace internal { - -MUST_USE_RESULT static MaybeObject* CreateJSValue(JSFunction* constructor, - Object* value) { - Object* result; - { MaybeObject* maybe_result = - constructor->GetHeap()->AllocateJSObject(constructor); - if (!maybe_result->ToObject(&result)) return maybe_result; +MaybeHandle Object::ToObject(Isolate* isolate, + Handle object, + Handle native_context) { + if (object->IsJSReceiver()) return Handle::cast(object); + Handle constructor; + if (object->IsNumber()) { + constructor = handle(native_context->number_function(), isolate); + } else if (object->IsBoolean()) { + constructor = handle(native_context->boolean_function(), isolate); + } else if (object->IsString()) { + constructor = handle(native_context->string_function(), isolate); + } else if (object->IsSymbol()) { + constructor = handle(native_context->symbol_function(), isolate); + } else { + return MaybeHandle(); } - JSValue::cast(result)->set_value(value); + Handle result = isolate->factory()->NewJSObject(constructor); + Handle::cast(result)->set_value(*object); return result; } -MaybeObject* Object::ToObject(Context* native_context) { - if (IsNumber()) { - return CreateJSValue(native_context->number_function(), this); - } else if (IsBoolean()) { - return CreateJSValue(native_context->boolean_function(), this); - } else if (IsString()) { - return CreateJSValue(native_context->string_function(), this); - } else if (IsSymbol()) { - return CreateJSValue(native_context->symbol_function(), this); - } - ASSERT(IsJSObject()); - return this; -} - - -MaybeObject* Object::ToObject(Isolate* isolate) { - if (IsJSReceiver()) { - return this; - } else if (IsNumber()) { - Context* native_context = isolate->context()->native_context(); - return CreateJSValue(native_context->number_function(), this); - } else if (IsBoolean()) { - Context* native_context = isolate->context()->native_context(); - return CreateJSValue(native_context->boolean_function(), this); - } else if (IsString()) { - Context* native_context = isolate->context()->native_context(); - return CreateJSValue(native_context->string_function(), this); - } else if (IsSymbol()) { - Context* native_context = isolate->context()->native_context(); - return CreateJSValue(native_context->symbol_function(), this); - } - - // Throw a type error. - return Failure::InternalError(); -} - - bool Object::BooleanValue() { if (IsBoolean()) return IsTrue(); if (IsSmi()) return Smi::cast(this)->value() != 0; diff --git a/src/objects.h b/src/objects.h index 1f656bc..7624809 100644 --- a/src/objects.h +++ b/src/objects.h @@ -1523,7 +1523,11 @@ class Object : public MaybeObject { // Convert to a JSObject if needed. // native_context is used when creating wrapper object. - MUST_USE_RESULT MaybeObject* ToObject(Context* native_context); + static inline MaybeHandle ToObject(Isolate* isolate, + Handle object); + static MaybeHandle ToObject(Isolate* isolate, + Handle object, + Handle context); // Converts this to a Smi if possible. // Failure is returned otherwise. diff --git a/src/runtime.cc b/src/runtime.cc index 4f34085..7ce8b79 100644 --- a/src/runtime.cc +++ b/src/runtime.cc @@ -655,9 +655,10 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateGlobalPrivateSymbol) { RUNTIME_FUNCTION(MaybeObject*, Runtime_NewSymbolWrapper) { + HandleScope scope(isolate); ASSERT(args.length() == 1); - CONVERT_ARG_CHECKED(Symbol, symbol, 0); - return symbol->ToObject(isolate); + CONVERT_ARG_HANDLE_CHECKED(Symbol, symbol, 0); + return *Object::ToObject(isolate, symbol).ToHandleChecked(); } @@ -6849,10 +6850,10 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StringToArray) { RUNTIME_FUNCTION(MaybeObject*, Runtime_NewStringWrapper) { - SealHandleScope shs(isolate); + HandleScope scope(isolate); ASSERT(args.length() == 1); - CONVERT_ARG_CHECKED(String, value, 0); - return value->ToObject(isolate); + CONVERT_ARG_HANDLE_CHECKED(String, value, 0); + return *Object::ToObject(isolate, value).ToHandleChecked(); } @@ -8952,16 +8953,16 @@ RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_PushWithContext) { if (args[0]->IsJSReceiver()) { extension_object = args.at(0); } else { - // Convert the object to a proper JavaScript object. - Handle object = isolate->factory()->ToObject(args.at(0)); - if (object.is_null()) { + // Try to convert the object to a proper JavaScript object. + MaybeHandle maybe_object = + Object::ToObject(isolate, args.at(0)); + if (!maybe_object.ToHandle(&extension_object)) { Handle handle = args.at(0); Handle result = isolate->factory()->NewTypeError("with_expression", HandleVector(&handle, 1)); return isolate->Throw(*result); } - extension_object = Handle::cast(object); } Handle function; @@ -11366,7 +11367,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFrameDetails) { ASSERT(!receiver->IsNull()); Context* context = Context::cast(it.frame()->context()); Handle native_context(Context::cast(context->native_context())); - receiver = isolate->factory()->ToObject(receiver, native_context); + receiver = Object::ToObject( + isolate, receiver, native_context).ToHandleChecked(); } } details->set(kFrameDetailsReceiverIndex, *receiver);