Index: src/api.cc |
diff --git a/src/api.cc b/src/api.cc |
index daf72e8efa7dc0f8d19af4907c2b8d74a60c3e4f..5fdc10eb2eb619198b58eea5c476a49e012a7d24 100644 |
--- a/src/api.cc |
+++ b/src/api.cc |
@@ -2627,108 +2627,160 @@ bool Value::IsSetIterator() const { |
} |
-Local<String> Value::ToString(Isolate* v8_isolate) const { |
- i::Handle<i::Object> obj = Utils::OpenHandle(this); |
- i::Handle<i::Object> str; |
- if (obj->IsString()) { |
- str = obj; |
- } else { |
- i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
- LOG_API(isolate, "ToString"); |
- ENTER_V8(isolate); |
- EXCEPTION_PREAMBLE(isolate); |
- has_pending_exception = !i::Execution::ToString( |
- isolate, obj).ToHandle(&str); |
- EXCEPTION_BAILOUT_CHECK(isolate, Local<String>()); |
- } |
- return ToApiHandle<String>(str); |
+#define CONTEXT_SCOPE_GET_ISOLATE(context, function_name) \ |
+ v8::Context::Scope context_scope(context); \ |
+ auto isolate = reinterpret_cast<i::Isolate*>(context->GetIsolate()); \ |
+ LOG_API(isolate, function_name); \ |
+ ENTER_V8(isolate); |
+ |
+ |
+#define RETURN_TO_LOCAL_UNCHECKED(maybe_local, T) \ |
+ do { \ |
+ Local<T> result; \ |
+ bool ignored = maybe_local.ToLocal(&result); \ |
+ USE(ignored); \ |
+ return result; \ |
+ } while (false); |
+ |
+ |
+MaybeLocal<String> Value::ToString(Local<Context> context) const { |
+ auto obj = Utils::OpenHandle(this); |
+ if (obj->IsString()) return ToApiHandle<String>(obj); |
+ CONTEXT_SCOPE_GET_ISOLATE(context, "ToString"); |
+ EXCEPTION_PREAMBLE(isolate); |
+ Local<String> result; |
+ has_pending_exception = |
+ !ToLocal<String>(i::Execution::ToString(isolate, obj), &result); |
+ EXCEPTION_BAILOUT_CHECK(isolate, result); |
+ return result; |
} |
-Local<String> Value::ToDetailString(Isolate* v8_isolate) const { |
- i::Handle<i::Object> obj = Utils::OpenHandle(this); |
- i::Handle<i::Object> str; |
- if (obj->IsString()) { |
- str = obj; |
- } else { |
- i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
- LOG_API(isolate, "ToDetailString"); |
- ENTER_V8(isolate); |
- EXCEPTION_PREAMBLE(isolate); |
- has_pending_exception = !i::Execution::ToDetailString( |
- isolate, obj).ToHandle(&str); |
- EXCEPTION_BAILOUT_CHECK(isolate, Local<String>()); |
- } |
- return ToApiHandle<String>(str); |
+Local<String> Value::ToString(Isolate* isolate) const { |
+ RETURN_TO_LOCAL_UNCHECKED(ToString(isolate->GetCurrentContext()), String); |
} |
-Local<v8::Object> Value::ToObject(Isolate* v8_isolate) const { |
- i::Handle<i::Object> obj = Utils::OpenHandle(this); |
- i::Handle<i::Object> val; |
- if (obj->IsJSObject()) { |
- val = obj; |
- } else { |
- i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
- LOG_API(isolate, "ToObject"); |
- ENTER_V8(isolate); |
- EXCEPTION_PREAMBLE(isolate); |
- has_pending_exception = !i::Execution::ToObject( |
- isolate, obj).ToHandle(&val); |
- EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Object>()); |
- } |
- return ToApiHandle<Object>(val); |
+MaybeLocal<String> Value::ToDetailString(Local<Context> context) const { |
+ auto obj = Utils::OpenHandle(this); |
+ if (obj->IsString()) return ToApiHandle<String>(obj); |
+ CONTEXT_SCOPE_GET_ISOLATE(context, "ToDetailString"); |
+ EXCEPTION_PREAMBLE(isolate); |
+ Local<String> result; |
+ has_pending_exception = |
+ !ToLocal<String>(i::Execution::ToDetailString(isolate, obj), &result); |
+ EXCEPTION_BAILOUT_CHECK(isolate, result); |
+ return result; |
+} |
+ |
+ |
+Local<String> Value::ToDetailString(Isolate* isolate) const { |
+ RETURN_TO_LOCAL_UNCHECKED(ToDetailString(isolate->GetCurrentContext()), |
+ String); |
+} |
+ |
+ |
+MaybeLocal<Object> Value::ToObject(Local<Context> context) const { |
+ auto obj = Utils::OpenHandle(this); |
+ if (obj->IsJSObject()) return ToApiHandle<Object>(obj); |
+ CONTEXT_SCOPE_GET_ISOLATE(context, "ToObject"); |
+ EXCEPTION_PREAMBLE(isolate); |
+ Local<Object> result; |
+ has_pending_exception = |
+ !ToLocal<Object>(i::Execution::ToObject(isolate, obj), &result); |
+ EXCEPTION_BAILOUT_CHECK(isolate, result); |
+ return result; |
+} |
+ |
+ |
+Local<v8::Object> Value::ToObject(Isolate* isolate) const { |
+ RETURN_TO_LOCAL_UNCHECKED(ToObject(isolate->GetCurrentContext()), Object); |
+} |
+ |
+ |
+MaybeLocal<Boolean> Value::ToBoolean(Local<Context> context) const { |
+ auto obj = Utils::OpenHandle(this); |
+ if (obj->IsBoolean()) return ToApiHandle<Boolean>(obj); |
+ auto isolate = reinterpret_cast<i::Isolate*>(context->GetIsolate()); |
+ auto val = isolate->factory()->ToBoolean(obj->BooleanValue()); |
+ return ToApiHandle<Boolean>(val); |
} |
Local<Boolean> Value::ToBoolean(Isolate* v8_isolate) const { |
- i::Handle<i::Object> obj = Utils::OpenHandle(this); |
- if (obj->IsBoolean()) { |
- return ToApiHandle<Boolean>(obj); |
- } else { |
- i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
- LOG_API(isolate, "ToBoolean"); |
- ENTER_V8(isolate); |
- i::Handle<i::Object> val = |
- isolate->factory()->ToBoolean(obj->BooleanValue()); |
- return ToApiHandle<Boolean>(val); |
- } |
+ return ToBoolean(v8_isolate->GetCurrentContext()).ToLocalChecked(); |
} |
-Local<Number> Value::ToNumber(Isolate* v8_isolate) const { |
- i::Handle<i::Object> obj = Utils::OpenHandle(this); |
- i::Handle<i::Object> num; |
- if (obj->IsNumber()) { |
- num = obj; |
- } else { |
- i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
- LOG_API(isolate, "ToNumber"); |
- ENTER_V8(isolate); |
- EXCEPTION_PREAMBLE(isolate); |
- has_pending_exception = !i::Execution::ToNumber( |
- isolate, obj).ToHandle(&num); |
- EXCEPTION_BAILOUT_CHECK(isolate, Local<Number>()); |
- } |
- return ToApiHandle<Number>(num); |
+MaybeLocal<Number> Value::ToNumber(Local<Context> context) const { |
+ auto obj = Utils::OpenHandle(this); |
+ if (obj->IsNumber()) return ToApiHandle<Number>(obj); |
+ CONTEXT_SCOPE_GET_ISOLATE(context, "ToNumber"); |
+ EXCEPTION_PREAMBLE(isolate); |
+ Local<Number> result; |
+ has_pending_exception = |
+ !ToLocal<Number>(i::Execution::ToNumber(isolate, obj), &result); |
+ EXCEPTION_BAILOUT_CHECK(isolate, result); |
+ return result; |
} |
-Local<Integer> Value::ToInteger(Isolate* v8_isolate) const { |
- i::Handle<i::Object> obj = Utils::OpenHandle(this); |
- i::Handle<i::Object> num; |
- if (obj->IsSmi()) { |
- num = obj; |
- } else { |
- i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
- LOG_API(isolate, "ToInteger"); |
- ENTER_V8(isolate); |
- EXCEPTION_PREAMBLE(isolate); |
- has_pending_exception = !i::Execution::ToInteger( |
- isolate, obj).ToHandle(&num); |
- EXCEPTION_BAILOUT_CHECK(isolate, Local<Integer>()); |
- } |
- return ToApiHandle<Integer>(num); |
+Local<Number> Value::ToNumber(Isolate* isolate) const { |
+ RETURN_TO_LOCAL_UNCHECKED(ToNumber(isolate->GetCurrentContext()), Number); |
+} |
+ |
+ |
+MaybeLocal<Integer> Value::ToInteger(Local<Context> context) const { |
+ auto obj = Utils::OpenHandle(this); |
+ if (obj->IsSmi()) return ToApiHandle<Integer>(obj); |
+ CONTEXT_SCOPE_GET_ISOLATE(context, "ToInteger"); |
+ EXCEPTION_PREAMBLE(isolate); |
+ Local<Integer> result; |
+ has_pending_exception = |
+ !ToLocal<Integer>(i::Execution::ToInteger(isolate, obj), &result); |
+ EXCEPTION_BAILOUT_CHECK(isolate, result); |
+ return result; |
+} |
+ |
+ |
+Local<Integer> Value::ToInteger(Isolate* isolate) const { |
+ RETURN_TO_LOCAL_UNCHECKED(ToInteger(isolate->GetCurrentContext()), Integer); |
+} |
+ |
+ |
+MaybeLocal<Int32> Value::ToInt32(Local<Context> context) const { |
+ auto obj = Utils::OpenHandle(this); |
+ if (obj->IsSmi()) return ToApiHandle<Int32>(obj); |
+ CONTEXT_SCOPE_GET_ISOLATE(context, "ToInt32"); |
+ EXCEPTION_PREAMBLE(isolate); |
+ Local<Int32> result; |
+ has_pending_exception = |
+ !ToLocal<Int32>(i::Execution::ToInt32(isolate, obj), &result); |
+ EXCEPTION_BAILOUT_CHECK(isolate, result); |
+ return result; |
+} |
+ |
+ |
+Local<Int32> Value::ToInt32(Isolate* isolate) const { |
+ RETURN_TO_LOCAL_UNCHECKED(ToInt32(isolate->GetCurrentContext()), Int32); |
+} |
+ |
+ |
+MaybeLocal<Uint32> Value::ToUint32(Local<Context> context) const { |
+ auto obj = Utils::OpenHandle(this); |
+ if (obj->IsSmi()) return ToApiHandle<Uint32>(obj); |
+ CONTEXT_SCOPE_GET_ISOLATE(context, "ToUInt32"); |
+ EXCEPTION_PREAMBLE(isolate); |
+ Local<Uint32> result; |
+ has_pending_exception = |
+ !ToLocal<Uint32>(i::Execution::ToUint32(isolate, obj), &result); |
+ EXCEPTION_BAILOUT_CHECK(isolate, result); |
+ return result; |
+} |
+ |
+ |
+Local<Uint32> Value::ToUint32(Isolate* isolate) const { |
+ RETURN_TO_LOCAL_UNCHECKED(ToUint32(isolate->GetCurrentContext()), Uint32); |
} |
@@ -2982,41 +3034,6 @@ int64_t Value::IntegerValue() const { |
} |
-Local<Int32> Value::ToInt32(Isolate* v8_isolate) const { |
- i::Handle<i::Object> obj = Utils::OpenHandle(this); |
- i::Handle<i::Object> num; |
- if (obj->IsSmi()) { |
- num = obj; |
- } else { |
- i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
- LOG_API(isolate, "ToInt32"); |
- ENTER_V8(isolate); |
- EXCEPTION_PREAMBLE(isolate); |
- has_pending_exception = !i::Execution::ToInt32(isolate, obj).ToHandle(&num); |
- EXCEPTION_BAILOUT_CHECK(isolate, Local<Int32>()); |
- } |
- return ToApiHandle<Int32>(num); |
-} |
- |
- |
-Local<Uint32> Value::ToUint32(Isolate* v8_isolate) const { |
- i::Handle<i::Object> obj = Utils::OpenHandle(this); |
- i::Handle<i::Object> num; |
- if (obj->IsSmi()) { |
- num = obj; |
- } else { |
- i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
- LOG_API(isolate, "ToUInt32"); |
- ENTER_V8(isolate); |
- EXCEPTION_PREAMBLE(isolate); |
- has_pending_exception = !i::Execution::ToUint32( |
- isolate, obj).ToHandle(&num); |
- EXCEPTION_BAILOUT_CHECK(isolate, Local<Uint32>()); |
- } |
- return ToApiHandle<Uint32>(num); |
-} |
- |
- |
Local<Uint32> Value::ToArrayIndex() const { |
i::Handle<i::Object> obj = Utils::OpenHandle(this); |
if (obj->IsSmi()) { |