Index: src/api.cc |
diff --git a/src/api.cc b/src/api.cc |
index 5fdc10eb2eb619198b58eea5c476a49e012a7d24..89b576819ceeedf5f776f5d78e6183b6c510b160 100644 |
--- a/src/api.cc |
+++ b/src/api.cc |
@@ -2643,6 +2643,12 @@ bool Value::IsSetIterator() const { |
} while (false); |
+static Local<Context> ContextFromHeapObject(i::Handle<i::Object> obj) { |
+ return reinterpret_cast<v8::Isolate*>(i::HeapObject::cast(*obj)->GetIsolate()) |
+ ->GetCurrentContext(); |
+} |
+ |
+ |
MaybeLocal<String> Value::ToString(Local<Context> context) const { |
auto obj = Utils::OpenHandle(this); |
if (obj->IsString()) return ToApiHandle<String>(obj); |
@@ -2989,51 +2995,115 @@ void v8::RegExp::CheckCast(v8::Value* that) { |
} |
+Maybe<bool> Value::BooleanValue(Local<Context> context) const { |
+ return maybe(Utils::OpenHandle(this)->BooleanValue()); |
+} |
+ |
+ |
bool Value::BooleanValue() const { |
return Utils::OpenHandle(this)->BooleanValue(); |
} |
+Maybe<double> Value::NumberValue(Local<Context> context) const { |
+ auto obj = Utils::OpenHandle(this); |
+ if (obj->IsNumber()) return maybe(obj->Number()); |
+ CONTEXT_SCOPE_GET_ISOLATE(context, "NumberValue"); |
+ EXCEPTION_PREAMBLE(isolate); |
+ i::Handle<i::Object> num; |
+ has_pending_exception = !i::Execution::ToNumber(isolate, obj).ToHandle(&num); |
+ EXCEPTION_BAILOUT_CHECK(isolate, Maybe<double>()); |
+ return maybe(num->Number()); |
+} |
+ |
+ |
double Value::NumberValue() const { |
- i::Handle<i::Object> obj = Utils::OpenHandle(this); |
+ auto obj = Utils::OpenHandle(this); |
+ if (obj->IsNumber()) return obj->Number(); |
+ return NumberValue(ContextFromHeapObject(obj)) |
+ .From(std::numeric_limits<double>::quiet_NaN()); |
+} |
+ |
+ |
+Maybe<int64_t> Value::IntegerValue(Local<Context> context) const { |
+ auto obj = Utils::OpenHandle(this); |
i::Handle<i::Object> num; |
if (obj->IsNumber()) { |
num = obj; |
} else { |
- i::Isolate* isolate = i::HeapObject::cast(*obj)->GetIsolate(); |
- LOG_API(isolate, "NumberValue"); |
- ENTER_V8(isolate); |
+ CONTEXT_SCOPE_GET_ISOLATE(context, "IntegerValue"); |
EXCEPTION_PREAMBLE(isolate); |
- has_pending_exception = !i::Execution::ToNumber( |
- isolate, obj).ToHandle(&num); |
- EXCEPTION_BAILOUT_CHECK(isolate, std::numeric_limits<double>::quiet_NaN()); |
+ has_pending_exception = |
+ !i::Execution::ToInteger(isolate, obj).ToHandle(&num); |
+ EXCEPTION_BAILOUT_CHECK(isolate, Maybe<int64_t>()); |
+ } |
+ if (num->IsSmi()) { |
+ return maybe(static_cast<int64_t>(i::Smi::cast(*num)->value())); |
+ } else { |
+ return maybe(static_cast<int64_t>(num->Number())); |
} |
- return num->Number(); |
} |
int64_t Value::IntegerValue() const { |
- i::Handle<i::Object> obj = Utils::OpenHandle(this); |
- i::Handle<i::Object> num; |
+ auto obj = Utils::OpenHandle(this); |
if (obj->IsNumber()) { |
- num = obj; |
+ if (obj->IsSmi()) { |
+ return i::Smi::cast(*obj)->value(); |
+ } else { |
+ return static_cast<int64_t>(obj->Number()); |
+ } |
+ } |
+ return IntegerValue(ContextFromHeapObject(obj)).From(0); |
+} |
+ |
+ |
+Maybe<int32_t> Value::Int32Value(Local<Context> context) const { |
+ auto obj = Utils::OpenHandle(this); |
+ if (obj->IsNumber()) return maybe(NumberToInt32(*obj)); |
+ CONTEXT_SCOPE_GET_ISOLATE(context, "Int32Value"); |
+ EXCEPTION_PREAMBLE(isolate); |
+ i::Handle<i::Object> num; |
+ has_pending_exception = !i::Execution::ToInt32(isolate, obj).ToHandle(&num); |
+ EXCEPTION_BAILOUT_CHECK(isolate, Maybe<int32_t>()); |
+ if (num->IsSmi()) { |
+ return maybe(i::Smi::cast(*num)->value()); |
} else { |
- i::Isolate* isolate = i::HeapObject::cast(*obj)->GetIsolate(); |
- LOG_API(isolate, "IntegerValue"); |
- ENTER_V8(isolate); |
- EXCEPTION_PREAMBLE(isolate); |
- has_pending_exception = !i::Execution::ToInteger( |
- isolate, obj).ToHandle(&num); |
- EXCEPTION_BAILOUT_CHECK(isolate, 0); |
+ return maybe(static_cast<int32_t>(num->Number())); |
} |
+} |
+ |
+ |
+int32_t Value::Int32Value() const { |
+ auto obj = Utils::OpenHandle(this); |
+ if (obj->IsNumber()) return NumberToInt32(*obj); |
+ return Int32Value(ContextFromHeapObject(obj)).From(0); |
+} |
+ |
+ |
+Maybe<uint32_t> Value::Uint32Value(Local<Context> context) const { |
+ auto obj = Utils::OpenHandle(this); |
+ if (obj->IsNumber()) return maybe(NumberToUint32(*obj)); |
+ CONTEXT_SCOPE_GET_ISOLATE(context, "Uint32Value"); |
+ EXCEPTION_PREAMBLE(isolate); |
+ i::Handle<i::Object> num; |
+ has_pending_exception = !i::Execution::ToUint32(isolate, obj).ToHandle(&num); |
+ EXCEPTION_BAILOUT_CHECK(isolate, Maybe<uint32_t>()); |
if (num->IsSmi()) { |
- return i::Smi::cast(*num)->value(); |
+ return maybe(static_cast<uint32_t>(i::Smi::cast(*num)->value())); |
} else { |
- return static_cast<int64_t>(num->Number()); |
+ return maybe(static_cast<uint32_t>(num->Number())); |
} |
} |
+uint32_t Value::Uint32Value() const { |
+ auto obj = Utils::OpenHandle(this); |
+ if (obj->IsNumber()) return NumberToUint32(*obj); |
+ return Uint32Value(ContextFromHeapObject(obj)).From(0); |
+} |
+ |
+ |
Local<Uint32> Value::ToArrayIndex() const { |
i::Handle<i::Object> obj = Utils::OpenHandle(this); |
if (obj->IsSmi()) { |
@@ -3063,27 +3133,6 @@ Local<Uint32> Value::ToArrayIndex() const { |
} |
-int32_t Value::Int32Value() const { |
- i::Handle<i::Object> obj = Utils::OpenHandle(this); |
- if (obj->IsNumber()) { |
- return NumberToInt32(*obj); |
- } else { |
- i::Isolate* isolate = i::HeapObject::cast(*obj)->GetIsolate(); |
- LOG_API(isolate, "Int32Value (slow)"); |
- ENTER_V8(isolate); |
- EXCEPTION_PREAMBLE(isolate); |
- i::Handle<i::Object> num; |
- has_pending_exception = !i::Execution::ToInt32(isolate, obj).ToHandle(&num); |
- EXCEPTION_BAILOUT_CHECK(isolate, 0); |
- if (num->IsSmi()) { |
- return i::Smi::cast(*num)->value(); |
- } else { |
- return static_cast<int32_t>(num->Number()); |
- } |
- } |
-} |
- |
- |
bool Value::Equals(Handle<Value> that) const { |
i::Handle<i::Object> obj = Utils::OpenHandle(this, true); |
i::Handle<i::Object> other = Utils::OpenHandle(*that); |
@@ -3164,28 +3213,6 @@ bool Value::SameValue(Handle<Value> that) const { |
} |
-uint32_t Value::Uint32Value() const { |
- i::Handle<i::Object> obj = Utils::OpenHandle(this); |
- if (obj->IsNumber()) { |
- return NumberToUint32(*obj); |
- } else { |
- i::Isolate* isolate = i::HeapObject::cast(*obj)->GetIsolate(); |
- LOG_API(isolate, "Uint32Value"); |
- ENTER_V8(isolate); |
- EXCEPTION_PREAMBLE(isolate); |
- i::Handle<i::Object> num; |
- has_pending_exception = !i::Execution::ToUint32( |
- isolate, obj).ToHandle(&num); |
- EXCEPTION_BAILOUT_CHECK(isolate, 0); |
- if (num->IsSmi()) { |
- return i::Smi::cast(*num)->value(); |
- } else { |
- return static_cast<uint32_t>(num->Number()); |
- } |
- } |
-} |
- |
- |
bool v8::Object::Set(v8::Handle<Value> key, v8::Handle<Value> value) { |
i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
ON_BAILOUT(isolate, "v8::Object::Set()", return false); |