Index: fpdfsdk/src/javascript/JS_Value.cpp |
diff --git a/fpdfsdk/src/javascript/JS_Value.cpp b/fpdfsdk/src/javascript/JS_Value.cpp |
index bd00adcf4966333b3dc1fd89543af48f81683fac..cfa565e4d4e04fc209ebcd65ffa5d8f703fef924 100644 |
--- a/fpdfsdk/src/javascript/JS_Value.cpp |
+++ b/fpdfsdk/src/javascript/JS_Value.cpp |
@@ -19,8 +19,6 @@ static double GetNan() { |
return *(double*)g_nan; |
} |
-/* ---------------------------- CJS_Value ---------------------------- */ |
- |
CJS_Value::CJS_Value(CJS_Runtime* pRuntime) |
: m_eType(VT_unknown), m_pJSRuntime(pRuntime) { |
} |
@@ -98,9 +96,6 @@ void CJS_Value::Detach() { |
m_eType = VT_unknown; |
} |
-/* ---------------------------------------------------------------------------------------- |
- */ |
- |
int CJS_Value::ToInt() const { |
return FXJS_ToInt32(m_pJSRuntime->GetIsolate(), m_pValue); |
} |
@@ -146,8 +141,26 @@ v8::Local<v8::Array> CJS_Value::ToV8Array() const { |
return v8::Local<v8::Array>(); |
} |
-/* ---------------------------------------------------------------------------------------- |
- */ |
+void CJS_Value::MaybeCoerceToNumber() { |
+ bool bAllowNaN = false; |
+ if (m_eType == VT_string) { |
+ CFX_ByteString bstr = ToCFXByteString(); |
+ if (bstr.GetLength() == 0) |
+ return; |
+ if (bstr == "NaN") |
+ bAllowNaN = true; |
+ } |
+ v8::TryCatch(m_pJSRuntime->GetIsolate()); |
+ v8::MaybeLocal<v8::Number> maybeNum = |
+ m_pValue->ToNumber(m_pJSRuntime->GetIsolate()->GetCurrentContext()); |
+ if (maybeNum.IsEmpty()) |
+ return; |
+ v8::Local<v8::Number> num = maybeNum.ToLocalChecked(); |
+ if (std::isnan(num->Value()) && !bAllowNaN) |
+ return; |
+ m_pValue = num; |
+ m_eType = VT_number; |
+} |
void CJS_Value::operator=(int iValue) { |
m_pValue = FXJS_NewNumber(m_pJSRuntime->GetIsolate(), iValue); |
@@ -217,9 +230,6 @@ void CJS_Value::operator=(CJS_Value value) { |
m_pJSRuntime = value.m_pJSRuntime; |
} |
-/* ---------------------------------------------------------------------------------------- |
- */ |
- |
CJS_Value::Type CJS_Value::GetType() const { |
if (m_pValue.IsEmpty()) |
return VT_unknown; |