OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "JS_Value.h" | 7 #include "JS_Value.h" |
8 | 8 |
9 #include <time.h> | 9 #include <time.h> |
10 #include <cmath> | 10 #include <cmath> |
11 #include <limits> | 11 #include <limits> |
12 | 12 |
13 #include "Document.h" | 13 #include "Document.h" |
14 #include "JS_Define.h" | 14 #include "JS_Define.h" |
15 #include "JS_Object.h" | 15 #include "JS_Object.h" |
16 | 16 |
17 static const FX_DWORD g_nan[2] = {0, 0x7FF80000}; | 17 static const FX_DWORD g_nan[2] = {0, 0x7FF80000}; |
18 static double GetNan() { | 18 static double GetNan() { |
19 return *(double*)g_nan; | 19 return *(double*)g_nan; |
20 } | 20 } |
21 | 21 |
22 /* ---------------------------- CJS_Value ---------------------------- */ | |
23 | |
24 CJS_Value::CJS_Value(CJS_Runtime* pRuntime) | 22 CJS_Value::CJS_Value(CJS_Runtime* pRuntime) |
25 : m_eType(VT_unknown), m_pJSRuntime(pRuntime) { | 23 : m_eType(VT_unknown), m_pJSRuntime(pRuntime) { |
26 } | 24 } |
27 | 25 |
28 CJS_Value::CJS_Value(CJS_Runtime* pRuntime, v8::Local<v8::Value> pValue, Type t) | 26 CJS_Value::CJS_Value(CJS_Runtime* pRuntime, v8::Local<v8::Value> pValue, Type t) |
29 : m_eType(t), m_pValue(pValue), m_pJSRuntime(pRuntime) { | 27 : m_eType(t), m_pValue(pValue), m_pJSRuntime(pRuntime) { |
30 } | 28 } |
31 | 29 |
32 CJS_Value::CJS_Value(CJS_Runtime* pRuntime, const int& iValue) | 30 CJS_Value::CJS_Value(CJS_Runtime* pRuntime, const int& iValue) |
33 : m_pJSRuntime(pRuntime) { | 31 : m_pJSRuntime(pRuntime) { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 void CJS_Value::Attach(CJS_Value* pValue) { | 89 void CJS_Value::Attach(CJS_Value* pValue) { |
92 if (pValue) | 90 if (pValue) |
93 Attach(pValue->ToV8Value(), pValue->GetType()); | 91 Attach(pValue->ToV8Value(), pValue->GetType()); |
94 } | 92 } |
95 | 93 |
96 void CJS_Value::Detach() { | 94 void CJS_Value::Detach() { |
97 m_pValue = v8::Local<v8::Value>(); | 95 m_pValue = v8::Local<v8::Value>(); |
98 m_eType = VT_unknown; | 96 m_eType = VT_unknown; |
99 } | 97 } |
100 | 98 |
101 /* -----------------------------------------------------------------------------
----------- | |
102 */ | |
103 | |
104 int CJS_Value::ToInt() const { | 99 int CJS_Value::ToInt() const { |
105 return FXJS_ToInt32(m_pJSRuntime->GetIsolate(), m_pValue); | 100 return FXJS_ToInt32(m_pJSRuntime->GetIsolate(), m_pValue); |
106 } | 101 } |
107 | 102 |
108 bool CJS_Value::ToBool() const { | 103 bool CJS_Value::ToBool() const { |
109 return FXJS_ToBoolean(m_pJSRuntime->GetIsolate(), m_pValue); | 104 return FXJS_ToBoolean(m_pJSRuntime->GetIsolate(), m_pValue); |
110 } | 105 } |
111 | 106 |
112 double CJS_Value::ToDouble() const { | 107 double CJS_Value::ToDouble() const { |
113 return FXJS_ToNumber(m_pJSRuntime->GetIsolate(), m_pValue); | 108 return FXJS_ToNumber(m_pJSRuntime->GetIsolate(), m_pValue); |
(...skipping 25 matching lines...) Expand all Loading... |
139 return m_pValue; | 134 return m_pValue; |
140 } | 135 } |
141 | 136 |
142 v8::Local<v8::Array> CJS_Value::ToV8Array() const { | 137 v8::Local<v8::Array> CJS_Value::ToV8Array() const { |
143 if (IsArrayObject()) | 138 if (IsArrayObject()) |
144 return v8::Local<v8::Array>::Cast( | 139 return v8::Local<v8::Array>::Cast( |
145 FXJS_ToObject(m_pJSRuntime->GetIsolate(), m_pValue)); | 140 FXJS_ToObject(m_pJSRuntime->GetIsolate(), m_pValue)); |
146 return v8::Local<v8::Array>(); | 141 return v8::Local<v8::Array>(); |
147 } | 142 } |
148 | 143 |
149 /* -----------------------------------------------------------------------------
----------- | 144 void CJS_Value::MaybeCoerceToNumber() { |
150 */ | 145 bool bAllowNaN = false; |
| 146 if (m_eType == VT_string) { |
| 147 CFX_ByteString bstr = ToCFXByteString(); |
| 148 if (bstr.GetLength() == 0) |
| 149 return; |
| 150 if (bstr == "NaN") |
| 151 bAllowNaN = true; |
| 152 } |
| 153 v8::TryCatch(m_pJSRuntime->GetIsolate()); |
| 154 v8::MaybeLocal<v8::Number> maybeNum = |
| 155 m_pValue->ToNumber(m_pJSRuntime->GetIsolate()->GetCurrentContext()); |
| 156 if (maybeNum.IsEmpty()) |
| 157 return; |
| 158 v8::Local<v8::Number> num = maybeNum.ToLocalChecked(); |
| 159 if (std::isnan(num->Value()) && !bAllowNaN) |
| 160 return; |
| 161 m_pValue = num; |
| 162 m_eType = VT_number; |
| 163 } |
151 | 164 |
152 void CJS_Value::operator=(int iValue) { | 165 void CJS_Value::operator=(int iValue) { |
153 m_pValue = FXJS_NewNumber(m_pJSRuntime->GetIsolate(), iValue); | 166 m_pValue = FXJS_NewNumber(m_pJSRuntime->GetIsolate(), iValue); |
154 m_eType = VT_number; | 167 m_eType = VT_number; |
155 } | 168 } |
156 | 169 |
157 void CJS_Value::operator=(bool bValue) { | 170 void CJS_Value::operator=(bool bValue) { |
158 m_pValue = FXJS_NewBoolean(m_pJSRuntime->GetIsolate(), bValue); | 171 m_pValue = FXJS_NewBoolean(m_pJSRuntime->GetIsolate(), bValue); |
159 m_eType = VT_boolean; | 172 m_eType = VT_boolean; |
160 } | 173 } |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 m_pValue = FXJS_NewDate(m_pJSRuntime->GetIsolate(), (double)date); | 223 m_pValue = FXJS_NewDate(m_pJSRuntime->GetIsolate(), (double)date); |
211 m_eType = VT_date; | 224 m_eType = VT_date; |
212 } | 225 } |
213 | 226 |
214 void CJS_Value::operator=(CJS_Value value) { | 227 void CJS_Value::operator=(CJS_Value value) { |
215 m_pValue = value.ToV8Value(); | 228 m_pValue = value.ToV8Value(); |
216 m_eType = value.m_eType; | 229 m_eType = value.m_eType; |
217 m_pJSRuntime = value.m_pJSRuntime; | 230 m_pJSRuntime = value.m_pJSRuntime; |
218 } | 231 } |
219 | 232 |
220 /* -----------------------------------------------------------------------------
----------- | |
221 */ | |
222 | |
223 CJS_Value::Type CJS_Value::GetType() const { | 233 CJS_Value::Type CJS_Value::GetType() const { |
224 if (m_pValue.IsEmpty()) | 234 if (m_pValue.IsEmpty()) |
225 return VT_unknown; | 235 return VT_unknown; |
226 if (m_pValue->IsString()) | 236 if (m_pValue->IsString()) |
227 return VT_string; | 237 return VT_string; |
228 if (m_pValue->IsNumber()) | 238 if (m_pValue->IsNumber()) |
229 return VT_number; | 239 return VT_number; |
230 if (m_pValue->IsBoolean()) | 240 if (m_pValue->IsBoolean()) |
231 return VT_boolean; | 241 return VT_boolean; |
232 if (m_pValue->IsDate()) | 242 if (m_pValue->IsDate()) |
(...skipping 629 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
862 return day * 86400000 + time; | 872 return day * 86400000 + time; |
863 } | 873 } |
864 | 874 |
865 bool JS_PortIsNan(double d) { | 875 bool JS_PortIsNan(double d) { |
866 return d != d; | 876 return d != d; |
867 } | 877 } |
868 | 878 |
869 double JS_LocalTime(double d) { | 879 double JS_LocalTime(double d) { |
870 return JS_GetDateTime() + _getDaylightSavingTA(d); | 880 return JS_GetDateTime() + _getDaylightSavingTA(d); |
871 } | 881 } |
OLD | NEW |