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 "../../include/javascript/IJavaScript.h" | 7 #include "../../include/javascript/IJavaScript.h" |
8 #include "../../include/javascript/JS_Context.h" | 8 #include "../../include/javascript/JS_Context.h" |
9 #include "../../include/javascript/JS_Define.h" | 9 #include "../../include/javascript/JS_Define.h" |
10 #include "../../include/javascript/JS_EventHandler.h" | 10 #include "../../include/javascript/JS_EventHandler.h" |
(...skipping 21 matching lines...) Expand all Loading... |
32 struct CHash<ACC, N> { | 32 struct CHash<ACC, N> { |
33 static const unsigned value = (ACC * 1313LLU + N) & 0xFFFFFFFF; | 33 static const unsigned value = (ACC * 1313LLU + N) & 0xFFFFFFFF; |
34 }; | 34 }; |
35 | 35 |
36 template <unsigned ACC, wchar_t N, wchar_t... Ns> | 36 template <unsigned ACC, wchar_t N, wchar_t... Ns> |
37 struct CHash<ACC, N, Ns...> { | 37 struct CHash<ACC, N, Ns...> { |
38 static const unsigned value = CHash<CHash<ACC, N>::value, Ns...>::value; | 38 static const unsigned value = CHash<CHash<ACC, N>::value, Ns...>::value; |
39 }; | 39 }; |
40 | 40 |
41 extern const unsigned int JSCONST_nStringHash = | 41 extern const unsigned int JSCONST_nStringHash = |
42 CHash<'s','t','r','i','n','g'>::value; | 42 CHash<'s', 't', 'r', 'i', 'n', 'g'>::value; |
43 extern const unsigned int JSCONST_nNumberHash = | 43 extern const unsigned int JSCONST_nNumberHash = |
44 CHash<'n','u','m','b','e','r'>::value; | 44 CHash<'n', 'u', 'm', 'b', 'e', 'r'>::value; |
45 extern const unsigned int JSCONST_nBoolHash = | 45 extern const unsigned int JSCONST_nBoolHash = |
46 CHash<'b','o','o','l','e','a','n'>::value; | 46 CHash<'b', 'o', 'o', 'l', 'e', 'a', 'n'>::value; |
47 extern const unsigned int JSCONST_nDateHash = | 47 extern const unsigned int JSCONST_nDateHash = CHash<'d', 'a', 't', 'e'>::value; |
48 CHash<'d','a','t','e'>::value; | |
49 extern const unsigned int JSCONST_nObjectHash = | 48 extern const unsigned int JSCONST_nObjectHash = |
50 CHash<'o','b','j','e','c','t'>::value; | 49 CHash<'o', 'b', 'j', 'e', 'c', 't'>::value; |
51 extern const unsigned int JSCONST_nFXobjHash = | 50 extern const unsigned int JSCONST_nFXobjHash = |
52 CHash<'f','x','o','b','j'>::value; | 51 CHash<'f', 'x', 'o', 'b', 'j'>::value; |
53 extern const unsigned int JSCONST_nNullHash = | 52 extern const unsigned int JSCONST_nNullHash = CHash<'n', 'u', 'l', 'l'>::value; |
54 CHash<'n','u','l','l'>::value; | |
55 extern const unsigned int JSCONST_nUndefHash = | 53 extern const unsigned int JSCONST_nUndefHash = |
56 CHash<'u','n','d','e','f','i','n','e','d'>::value; | 54 CHash<'u', 'n', 'd', 'e', 'f', 'i', 'n', 'e', 'd'>::value; |
57 | 55 |
58 #ifdef _DEBUG | 56 #ifdef _DEBUG |
59 class HashVerify | 57 class HashVerify { |
60 { | 58 public: |
61 public: | |
62 HashVerify(); | 59 HashVerify(); |
63 } g_hashVerify; | 60 } g_hashVerify; |
64 | 61 |
65 HashVerify::HashVerify() | 62 HashVerify::HashVerify() { |
66 { | |
67 ASSERT(JSCONST_nStringHash == | 63 ASSERT(JSCONST_nStringHash == |
68 JS_CalcHash(VALUE_NAME_STRING,wcslen(VALUE_NAME_STRING))); | 64 JS_CalcHash(VALUE_NAME_STRING, wcslen(VALUE_NAME_STRING))); |
69 ASSERT(JSCONST_nNumberHash == | 65 ASSERT(JSCONST_nNumberHash == |
70 JS_CalcHash(VALUE_NAME_NUMBER,wcslen(VALUE_NAME_NUMBER))); | 66 JS_CalcHash(VALUE_NAME_NUMBER, wcslen(VALUE_NAME_NUMBER))); |
71 ASSERT(JSCONST_nBoolHash == | 67 ASSERT(JSCONST_nBoolHash == |
72 JS_CalcHash(VALUE_NAME_BOOLEAN,wcslen(VALUE_NAME_BOOLEAN))); | 68 JS_CalcHash(VALUE_NAME_BOOLEAN, wcslen(VALUE_NAME_BOOLEAN))); |
73 ASSERT(JSCONST_nDateHash == | 69 ASSERT(JSCONST_nDateHash == |
74 JS_CalcHash(VALUE_NAME_DATE,wcslen(VALUE_NAME_DATE))); | 70 JS_CalcHash(VALUE_NAME_DATE, wcslen(VALUE_NAME_DATE))); |
75 ASSERT(JSCONST_nObjectHash == | 71 ASSERT(JSCONST_nObjectHash == |
76 JS_CalcHash(VALUE_NAME_OBJECT,wcslen(VALUE_NAME_OBJECT))); | 72 JS_CalcHash(VALUE_NAME_OBJECT, wcslen(VALUE_NAME_OBJECT))); |
77 ASSERT(JSCONST_nFXobjHash == | 73 ASSERT(JSCONST_nFXobjHash == |
78 JS_CalcHash(VALUE_NAME_FXOBJ,wcslen(VALUE_NAME_FXOBJ))); | 74 JS_CalcHash(VALUE_NAME_FXOBJ, wcslen(VALUE_NAME_FXOBJ))); |
79 ASSERT(JSCONST_nNullHash == | 75 ASSERT(JSCONST_nNullHash == |
80 JS_CalcHash(VALUE_NAME_NULL,wcslen(VALUE_NAME_NULL))); | 76 JS_CalcHash(VALUE_NAME_NULL, wcslen(VALUE_NAME_NULL))); |
81 ASSERT(JSCONST_nUndefHash == | 77 ASSERT(JSCONST_nUndefHash == |
82 JS_CalcHash(VALUE_NAME_UNDEFINED,wcslen(VALUE_NAME_UNDEFINED))); | 78 JS_CalcHash(VALUE_NAME_UNDEFINED, wcslen(VALUE_NAME_UNDEFINED))); |
83 } | 79 } |
84 #endif | 80 #endif |
85 | 81 |
86 | |
87 BEGIN_JS_STATIC_CONST(CJS_Global) | 82 BEGIN_JS_STATIC_CONST(CJS_Global) |
88 END_JS_STATIC_CONST() | 83 END_JS_STATIC_CONST() |
89 | 84 |
90 BEGIN_JS_STATIC_PROP(CJS_Global) | 85 BEGIN_JS_STATIC_PROP(CJS_Global) |
91 END_JS_STATIC_PROP() | 86 END_JS_STATIC_PROP() |
92 | 87 |
93 BEGIN_JS_STATIC_METHOD(CJS_Global) | 88 BEGIN_JS_STATIC_METHOD(CJS_Global) |
94 JS_STATIC_METHOD_ENTRY(setPersistent) | 89 JS_STATIC_METHOD_ENTRY(setPersistent) |
95 END_JS_STATIC_METHOD() | 90 END_JS_STATIC_METHOD() |
96 | 91 |
97 IMPLEMENT_SPECIAL_JS_CLASS(CJS_Global, global_alternate, global); | 92 IMPLEMENT_SPECIAL_JS_CLASS(CJS_Global, global_alternate, global); |
98 | 93 |
99 FX_BOOL CJS_Global::InitInstance(IFXJS_Context* cc) | 94 FX_BOOL CJS_Global::InitInstance(IFXJS_Context* cc) { |
100 { | 95 CJS_Context* pContext = (CJS_Context*)cc; |
101 CJS_Context* pContext = (CJS_Context*)cc; | 96 ASSERT(pContext != NULL); |
102 ASSERT(pContext != NULL); | 97 |
103 | 98 global_alternate* pGlobal = (global_alternate*)GetEmbedObject(); |
104 global_alternate* pGlobal = (global_alternate*)GetEmbedObject(); | 99 ASSERT(pGlobal != NULL); |
105 ASSERT(pGlobal != NULL); | 100 |
106 | 101 pGlobal->Initial(pContext->GetReaderApp()); |
107 pGlobal->Initial(pContext->GetReaderApp()); | 102 |
108 | 103 return TRUE; |
| 104 }; |
| 105 |
| 106 global_alternate::global_alternate(CJS_Object* pJSObject) |
| 107 : CJS_EmbedObj(pJSObject), m_pApp(NULL) {} |
| 108 |
| 109 global_alternate::~global_alternate(void) { |
| 110 DestroyGlobalPersisitentVariables(); |
| 111 m_pApp->GetRuntimeFactory()->ReleaseGlobalData(); |
| 112 } |
| 113 |
| 114 void global_alternate::Initial(CPDFDoc_Environment* pApp) { |
| 115 m_pApp = pApp; |
| 116 m_pGlobalData = pApp->GetRuntimeFactory()->NewGlobalData(pApp); |
| 117 UpdateGlobalPersistentVariables(); |
| 118 } |
| 119 |
| 120 FX_BOOL global_alternate::QueryProperty(const FX_WCHAR* propname) { |
| 121 return CFX_WideString(propname) != L"setPersistent"; |
| 122 } |
| 123 |
| 124 FX_BOOL global_alternate::DelProperty(IFXJS_Context* cc, |
| 125 const FX_WCHAR* propname, |
| 126 CFX_WideString& sError) { |
| 127 js_global_data* pData = NULL; |
| 128 CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname); |
| 129 |
| 130 if (m_mapGlobal.Lookup(sPropName, (void*&)pData)) { |
| 131 pData->bDeleted = TRUE; |
109 return TRUE; | 132 return TRUE; |
110 }; | 133 } |
111 | 134 |
112 global_alternate::global_alternate(CJS_Object* pJSObject) | 135 return FALSE; |
113 : CJS_EmbedObj(pJSObject), | 136 } |
114 m_pApp(NULL) | 137 |
115 { | 138 FX_BOOL global_alternate::DoProperty(IFXJS_Context* cc, |
116 } | 139 const FX_WCHAR* propname, |
117 | 140 CJS_PropValue& vp, |
118 global_alternate::~global_alternate(void) | 141 CFX_WideString& sError) { |
119 { | 142 if (vp.IsSetting()) { |
120 DestroyGlobalPersisitentVariables(); | 143 CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname); |
121 m_pApp->GetRuntimeFactory()->ReleaseGlobalData(); | 144 switch (vp.GetType()) { |
122 } | 145 case VT_number: { |
123 | 146 double dData; |
124 void global_alternate::Initial(CPDFDoc_Environment* pApp) | 147 vp >> dData; |
125 { | 148 return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_NUMBER, dData, |
126 m_pApp = pApp; | 149 false, "", v8::Local<v8::Object>(), FALSE); |
127 m_pGlobalData = pApp->GetRuntimeFactory()->NewGlobalData(pApp); | 150 } |
128 UpdateGlobalPersistentVariables(); | 151 case VT_boolean: { |
129 } | 152 bool bData; |
130 | 153 vp >> bData; |
131 FX_BOOL global_alternate::QueryProperty(const FX_WCHAR* propname) | 154 return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_BOOLEAN, 0, |
132 { | 155 bData, "", v8::Local<v8::Object>(), FALSE); |
133 return CFX_WideString(propname) != L"setPersistent"; | 156 } |
134 } | 157 case VT_string: { |
135 | 158 CFX_ByteString sData; |
136 FX_BOOL global_alternate::DelProperty(IFXJS_Context* cc, const FX_WCHAR* propnam
e, CFX_WideString& sError) | 159 vp >> sData; |
137 { | 160 return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_STRING, 0, |
| 161 false, sData, v8::Local<v8::Object>(), FALSE); |
| 162 } |
| 163 case VT_object: { |
| 164 JSObject pData; |
| 165 vp >> pData; |
| 166 return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_OBJECT, 0, |
| 167 false, "", pData, FALSE); |
| 168 } |
| 169 case VT_null: { |
| 170 return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_NULL, 0, false, |
| 171 "", v8::Local<v8::Object>(), FALSE); |
| 172 } |
| 173 case VT_undefined: { |
| 174 DelProperty(cc, propname, sError); |
| 175 return TRUE; |
| 176 } |
| 177 default: |
| 178 break; |
| 179 } |
| 180 } else { |
| 181 void* pVoid = nullptr; |
| 182 if (!m_mapGlobal.Lookup(CFX_ByteString::FromUnicode(propname), pVoid)) { |
| 183 vp.SetNull(); |
| 184 return TRUE; |
| 185 } |
| 186 if (!pVoid) { |
| 187 vp.SetNull(); |
| 188 return TRUE; |
| 189 } |
| 190 js_global_data* pData = (js_global_data*)pVoid; |
| 191 if (pData->bDeleted) |
| 192 return TRUE; |
| 193 |
| 194 switch (pData->nType) { |
| 195 case JS_GLOBALDATA_TYPE_NUMBER: |
| 196 vp << pData->dData; |
| 197 return TRUE; |
| 198 case JS_GLOBALDATA_TYPE_BOOLEAN: |
| 199 vp << pData->bData; |
| 200 return TRUE; |
| 201 case JS_GLOBALDATA_TYPE_STRING: |
| 202 vp << pData->sData; |
| 203 return TRUE; |
| 204 case JS_GLOBALDATA_TYPE_OBJECT: { |
| 205 v8::Local<v8::Object> obj = |
| 206 v8::Local<v8::Object>::New(vp.GetIsolate(), pData->pData); |
| 207 vp << obj; |
| 208 return TRUE; |
| 209 } |
| 210 case JS_GLOBALDATA_TYPE_NULL: |
| 211 vp.SetNull(); |
| 212 return TRUE; |
| 213 default: |
| 214 break; |
| 215 } |
| 216 } |
| 217 return FALSE; |
| 218 } |
| 219 |
| 220 FX_BOOL global_alternate::setPersistent(IFXJS_Context* cc, |
| 221 const CJS_Parameters& params, |
| 222 CJS_Value& vRet, |
| 223 CFX_WideString& sError) { |
| 224 CJS_Context* pContext = static_cast<CJS_Context*>(cc); |
| 225 if (params.size() != 2) { |
| 226 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); |
| 227 return FALSE; |
| 228 } |
| 229 |
| 230 CFX_ByteString sName = params[0].ToCFXByteString(); |
| 231 |
| 232 js_global_data* pData = NULL; |
| 233 if (m_mapGlobal.Lookup(sName, (void*&)pData)) { |
| 234 if (pData && !pData->bDeleted) { |
| 235 pData->bPersistent = params[1].ToBool(); |
| 236 return TRUE; |
| 237 } |
| 238 } |
| 239 |
| 240 sError = JSGetStringFromID(pContext, IDS_STRING_JSNOGLOBAL); |
| 241 return FALSE; |
| 242 } |
| 243 |
| 244 void global_alternate::UpdateGlobalPersistentVariables() { |
| 245 ASSERT(m_pGlobalData != NULL); |
| 246 |
| 247 for (int i = 0, sz = m_pGlobalData->GetSize(); i < sz; i++) { |
| 248 CJS_GlobalData_Element* pData = m_pGlobalData->GetAt(i); |
| 249 ASSERT(pData != NULL); |
| 250 |
| 251 switch (pData->data.nType) { |
| 252 case JS_GLOBALDATA_TYPE_NUMBER: |
| 253 SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_NUMBER, |
| 254 pData->data.dData, false, "", |
| 255 v8::Local<v8::Object>(), pData->bPersistent == 1); |
| 256 JS_PutObjectNumber(NULL, (JSFXObject)(*m_pJSObject), |
| 257 pData->data.sKey.UTF8Decode().c_str(), |
| 258 pData->data.dData); |
| 259 break; |
| 260 case JS_GLOBALDATA_TYPE_BOOLEAN: |
| 261 SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_BOOLEAN, 0, |
| 262 (bool)(pData->data.bData == 1), "", |
| 263 v8::Local<v8::Object>(), pData->bPersistent == 1); |
| 264 JS_PutObjectBoolean(NULL, (JSFXObject)(*m_pJSObject), |
| 265 pData->data.sKey.UTF8Decode().c_str(), |
| 266 (bool)(pData->data.bData == 1)); |
| 267 break; |
| 268 case JS_GLOBALDATA_TYPE_STRING: |
| 269 SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_STRING, 0, |
| 270 false, pData->data.sData, v8::Local<v8::Object>(), |
| 271 pData->bPersistent == 1); |
| 272 JS_PutObjectString(NULL, (JSFXObject)(*m_pJSObject), |
| 273 pData->data.sKey.UTF8Decode().c_str(), |
| 274 pData->data.sData.UTF8Decode().c_str()); |
| 275 break; |
| 276 case JS_GLOBALDATA_TYPE_OBJECT: { |
| 277 IJS_Runtime* pRuntime = JS_GetRuntime((JSFXObject)(*m_pJSObject)); |
| 278 v8::Local<v8::Object> pObj = JS_NewFxDynamicObj(pRuntime, NULL, -1); |
| 279 |
| 280 PutObjectProperty(pObj, &pData->data); |
| 281 |
| 282 SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_OBJECT, 0, |
| 283 false, "", (JSObject)pObj, pData->bPersistent == 1); |
| 284 JS_PutObjectObject(NULL, (JSFXObject)(*m_pJSObject), |
| 285 pData->data.sKey.UTF8Decode().c_str(), |
| 286 (JSObject)pObj); |
| 287 } break; |
| 288 case JS_GLOBALDATA_TYPE_NULL: |
| 289 SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_NULL, 0, false, |
| 290 "", v8::Local<v8::Object>(), |
| 291 pData->bPersistent == 1); |
| 292 JS_PutObjectNull(NULL, (JSFXObject)(*m_pJSObject), |
| 293 pData->data.sKey.UTF8Decode().c_str()); |
| 294 break; |
| 295 } |
| 296 } |
| 297 } |
| 298 |
| 299 void global_alternate::CommitGlobalPersisitentVariables() { |
| 300 ASSERT(m_pGlobalData != NULL); |
| 301 |
| 302 FX_POSITION pos = m_mapGlobal.GetStartPosition(); |
| 303 while (pos) { |
| 304 CFX_ByteString name; |
138 js_global_data* pData = NULL; | 305 js_global_data* pData = NULL; |
139 CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname); | 306 m_mapGlobal.GetNextAssoc(pos, name, (void*&)pData); |
140 | 307 |
141 if (m_mapGlobal.Lookup(sPropName, (void*&)pData)) | 308 if (pData) { |
142 { | 309 if (pData->bDeleted) { |
143 pData->bDeleted = TRUE; | 310 m_pGlobalData->DeleteGlobalVariable(name); |
144 return TRUE; | 311 } else { |
145 } | 312 switch (pData->nType) { |
146 | 313 case JS_GLOBALDATA_TYPE_NUMBER: |
147 return FALSE; | 314 m_pGlobalData->SetGlobalVariableNumber(name, pData->dData); |
148 } | 315 m_pGlobalData->SetGlobalVariablePersistent(name, |
149 | 316 pData->bPersistent); |
150 FX_BOOL global_alternate::DoProperty(IFXJS_Context* cc, const FX_WCHAR* propname
, CJS_PropValue& vp, CFX_WideString& sError) | 317 break; |
151 { | 318 case JS_GLOBALDATA_TYPE_BOOLEAN: |
152 if (vp.IsSetting()) | 319 m_pGlobalData->SetGlobalVariableBoolean(name, pData->bData); |
153 { | 320 m_pGlobalData->SetGlobalVariablePersistent(name, |
154 CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname); | 321 pData->bPersistent); |
155 switch (vp.GetType()) | 322 break; |
156 { | 323 case JS_GLOBALDATA_TYPE_STRING: |
157 case VT_number: | 324 m_pGlobalData->SetGlobalVariableString(name, pData->sData); |
| 325 m_pGlobalData->SetGlobalVariablePersistent(name, |
| 326 pData->bPersistent); |
| 327 break; |
| 328 case JS_GLOBALDATA_TYPE_OBJECT: |
| 329 // if (pData->pData) |
158 { | 330 { |
159 double dData; | 331 CJS_GlobalVariableArray array; |
160 vp >> dData; | 332 v8::Local<v8::Object> obj = v8::Local<v8::Object>::New( |
161 return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_NUMBER,
dData, false, "", v8::Local<v8::Object>(), FALSE); | 333 GetJSObject()->GetIsolate(), pData->pData); |
| 334 ObjectToArray(obj, array); |
| 335 m_pGlobalData->SetGlobalVariableObject(name, array); |
| 336 m_pGlobalData->SetGlobalVariablePersistent(name, |
| 337 pData->bPersistent); |
162 } | 338 } |
163 case VT_boolean: | 339 break; |
164 { | 340 case JS_GLOBALDATA_TYPE_NULL: |
165 bool bData; | 341 m_pGlobalData->SetGlobalVariableNull(name); |
166 vp >> bData; | 342 m_pGlobalData->SetGlobalVariablePersistent(name, |
167 return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_BOOLEAN,
0, bData, "", v8::Local<v8::Object>(), FALSE); | 343 pData->bPersistent); |
168 } | |
169 case VT_string: | |
170 { | |
171 CFX_ByteString sData; | |
172 vp >> sData; | |
173 return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_STRING,
0, false, sData, v8::Local<v8::Object>(), FALSE); | |
174 } | |
175 case VT_object: | |
176 { | |
177 JSObject pData; | |
178 vp >> pData; | |
179 return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_OBJECT,
0, false, "", pData, FALSE); | |
180 } | |
181 case VT_null: | |
182 { | |
183 return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_NULL, 0,
false, "", v8::Local<v8::Object>(), FALSE); | |
184 } | |
185 case VT_undefined: | |
186 { | |
187 DelProperty(cc, propname, sError); | |
188 return TRUE; | |
189 } | |
190 default: | |
191 break; | 344 break; |
192 } | 345 } |
193 } | 346 } |
194 else | 347 } |
195 { | 348 } |
196 void* pVoid = nullptr; | 349 } |
197 if (!m_mapGlobal.Lookup(CFX_ByteString::FromUnicode(propname), pVoid)) | 350 |
198 { | 351 void global_alternate::ObjectToArray(v8::Local<v8::Object> pObj, |
199 vp.SetNull(); | 352 CJS_GlobalVariableArray& array) { |
200 return TRUE; | 353 v8::Local<v8::Context> context = pObj->CreationContext(); |
201 } | 354 v8::Isolate* isolate = context->GetIsolate(); |
202 if (!pVoid) | 355 v8::Local<v8::Array> pKeyList = JS_GetObjectElementNames(isolate, pObj); |
203 { | 356 int nObjElements = pKeyList->Length(); |
204 vp.SetNull(); | 357 |
205 return TRUE; | 358 for (int i = 0; i < nObjElements; i++) { |
206 } | 359 CFX_WideString ws = |
207 js_global_data* pData = (js_global_data*)pVoid; | 360 JS_ToString(isolate, JS_GetArrayElement(isolate, pKeyList, i)); |
208 if (pData->bDeleted) | 361 CFX_ByteString sKey = ws.UTF8Encode(); |
209 return TRUE; | 362 |
210 | 363 v8::Local<v8::Value> v = JS_GetObjectElement(isolate, pObj, ws.c_str()); |
211 switch (pData->nType) | 364 FXJSVALUETYPE vt = GET_VALUE_TYPE(v); |
212 { | 365 switch (vt) { |
213 case JS_GLOBALDATA_TYPE_NUMBER: | 366 case VT_number: { |
214 vp << pData->dData; | 367 CJS_KeyValue* pObjElement = new CJS_KeyValue; |
215 return TRUE; | 368 pObjElement->nType = JS_GLOBALDATA_TYPE_NUMBER; |
216 case JS_GLOBALDATA_TYPE_BOOLEAN: | 369 pObjElement->sKey = sKey; |
217 vp << pData->bData; | 370 pObjElement->dData = JS_ToNumber(isolate, v); |
218 return TRUE; | 371 array.Add(pObjElement); |
219 case JS_GLOBALDATA_TYPE_STRING: | 372 } break; |
220 vp << pData->sData; | 373 case VT_boolean: { |
221 return TRUE; | 374 CJS_KeyValue* pObjElement = new CJS_KeyValue; |
222 case JS_GLOBALDATA_TYPE_OBJECT: | 375 pObjElement->nType = JS_GLOBALDATA_TYPE_BOOLEAN; |
223 { | 376 pObjElement->sKey = sKey; |
224 v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(vp.Ge
tIsolate(),pData->pData); | 377 pObjElement->dData = JS_ToBoolean(isolate, v); |
225 vp << obj; | 378 array.Add(pObjElement); |
226 return TRUE; | 379 } break; |
227 } | 380 case VT_string: { |
228 case JS_GLOBALDATA_TYPE_NULL: | 381 CFX_ByteString sValue = |
229 vp.SetNull(); | 382 CJS_Value(isolate, v, VT_string).ToCFXByteString(); |
230 return TRUE; | 383 CJS_KeyValue* pObjElement = new CJS_KeyValue; |
231 default: | 384 pObjElement->nType = JS_GLOBALDATA_TYPE_STRING; |
232 break; | 385 pObjElement->sKey = sKey; |
233 } | 386 pObjElement->sData = sValue; |
234 } | 387 array.Add(pObjElement); |
| 388 } break; |
| 389 case VT_object: { |
| 390 CJS_KeyValue* pObjElement = new CJS_KeyValue; |
| 391 pObjElement->nType = JS_GLOBALDATA_TYPE_OBJECT; |
| 392 pObjElement->sKey = sKey; |
| 393 ObjectToArray(JS_ToObject(isolate, v), pObjElement->objData); |
| 394 array.Add(pObjElement); |
| 395 } break; |
| 396 case VT_null: { |
| 397 CJS_KeyValue* pObjElement = new CJS_KeyValue; |
| 398 pObjElement->nType = JS_GLOBALDATA_TYPE_NULL; |
| 399 pObjElement->sKey = sKey; |
| 400 array.Add(pObjElement); |
| 401 } break; |
| 402 default: |
| 403 break; |
| 404 } |
| 405 } |
| 406 } |
| 407 |
| 408 void global_alternate::PutObjectProperty(v8::Local<v8::Object> pObj, |
| 409 CJS_KeyValue* pData) { |
| 410 ASSERT(pData != NULL); |
| 411 |
| 412 for (int i = 0, sz = pData->objData.Count(); i < sz; i++) { |
| 413 CJS_KeyValue* pObjData = pData->objData.GetAt(i); |
| 414 ASSERT(pObjData != NULL); |
| 415 |
| 416 switch (pObjData->nType) { |
| 417 case JS_GLOBALDATA_TYPE_NUMBER: |
| 418 JS_PutObjectNumber(NULL, (JSObject)pObj, |
| 419 pObjData->sKey.UTF8Decode().c_str(), |
| 420 pObjData->dData); |
| 421 break; |
| 422 case JS_GLOBALDATA_TYPE_BOOLEAN: |
| 423 JS_PutObjectBoolean(NULL, (JSObject)pObj, |
| 424 pObjData->sKey.UTF8Decode().c_str(), |
| 425 (bool)(pObjData->bData == 1)); |
| 426 break; |
| 427 case JS_GLOBALDATA_TYPE_STRING: |
| 428 JS_PutObjectString(NULL, (JSObject)pObj, |
| 429 pObjData->sKey.UTF8Decode().c_str(), |
| 430 pObjData->sData.UTF8Decode().c_str()); |
| 431 break; |
| 432 case JS_GLOBALDATA_TYPE_OBJECT: { |
| 433 IJS_Runtime* pRuntime = JS_GetRuntime((JSFXObject)(*m_pJSObject)); |
| 434 v8::Local<v8::Object> pNewObj = JS_NewFxDynamicObj(pRuntime, NULL, -1); |
| 435 PutObjectProperty(pNewObj, pObjData); |
| 436 JS_PutObjectObject(NULL, (JSObject)pObj, |
| 437 pObjData->sKey.UTF8Decode().c_str(), |
| 438 (JSObject)pNewObj); |
| 439 } break; |
| 440 case JS_GLOBALDATA_TYPE_NULL: |
| 441 JS_PutObjectNull(NULL, (JSObject)pObj, |
| 442 pObjData->sKey.UTF8Decode().c_str()); |
| 443 break; |
| 444 } |
| 445 } |
| 446 } |
| 447 |
| 448 void global_alternate::DestroyGlobalPersisitentVariables() { |
| 449 FX_POSITION pos = m_mapGlobal.GetStartPosition(); |
| 450 while (pos) { |
| 451 CFX_ByteString name; |
| 452 js_global_data* pData = NULL; |
| 453 m_mapGlobal.GetNextAssoc(pos, name, (void*&)pData); |
| 454 delete pData; |
| 455 } |
| 456 |
| 457 m_mapGlobal.RemoveAll(); |
| 458 } |
| 459 |
| 460 FX_BOOL global_alternate::SetGlobalVariables(const FX_CHAR* propname, |
| 461 int nType, |
| 462 double dData, |
| 463 bool bData, |
| 464 const CFX_ByteString& sData, |
| 465 JSObject pData, |
| 466 bool bDefaultPersistent) { |
| 467 if (propname == NULL) |
235 return FALSE; | 468 return FALSE; |
236 } | 469 |
237 | 470 js_global_data* pTemp = NULL; |
238 FX_BOOL global_alternate::setPersistent(IFXJS_Context* cc, const CJS_Parameters&
params, CJS_Value& vRet, CFX_WideString& sError) | 471 m_mapGlobal.Lookup(propname, (void*&)pTemp); |
239 { | 472 |
240 CJS_Context* pContext = static_cast<CJS_Context*>(cc); | 473 if (pTemp) { |
241 if (params.size() != 2) | 474 if (pTemp->bDeleted || pTemp->nType != nType) { |
242 { | 475 pTemp->dData = 0; |
243 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); | 476 pTemp->bData = 0; |
| 477 pTemp->sData = ""; |
| 478 pTemp->nType = nType; |
| 479 } |
| 480 |
| 481 pTemp->bDeleted = FALSE; |
| 482 |
| 483 switch (nType) { |
| 484 case JS_GLOBALDATA_TYPE_NUMBER: { |
| 485 pTemp->dData = dData; |
| 486 } break; |
| 487 case JS_GLOBALDATA_TYPE_BOOLEAN: { |
| 488 pTemp->bData = bData; |
| 489 } break; |
| 490 case JS_GLOBALDATA_TYPE_STRING: { |
| 491 pTemp->sData = sData; |
| 492 } break; |
| 493 case JS_GLOBALDATA_TYPE_OBJECT: { |
| 494 pTemp->pData.Reset(JS_GetRuntime(pData), pData); |
| 495 } break; |
| 496 case JS_GLOBALDATA_TYPE_NULL: |
| 497 break; |
| 498 default: |
244 return FALSE; | 499 return FALSE; |
245 } | 500 } |
246 | 501 |
247 CFX_ByteString sName = params[0].ToCFXByteString(); | 502 return TRUE; |
248 | 503 } |
249 js_global_data* pData = NULL; | 504 |
250 if (m_mapGlobal.Lookup(sName, (void*&)pData)) | 505 js_global_data* pNewData = NULL; |
251 { | 506 |
252 if (pData && !pData->bDeleted) | 507 switch (nType) { |
253 { | 508 case JS_GLOBALDATA_TYPE_NUMBER: { |
254 pData->bPersistent = params[1].ToBool(); | 509 pNewData = new js_global_data; |
255 return TRUE; | 510 pNewData->nType = JS_GLOBALDATA_TYPE_NUMBER; |
256 } | 511 pNewData->dData = dData; |
257 } | 512 pNewData->bPersistent = bDefaultPersistent; |
258 | 513 } break; |
259 sError = JSGetStringFromID(pContext, IDS_STRING_JSNOGLOBAL); | 514 case JS_GLOBALDATA_TYPE_BOOLEAN: { |
260 return FALSE; | 515 pNewData = new js_global_data; |
261 } | 516 pNewData->nType = JS_GLOBALDATA_TYPE_BOOLEAN; |
262 | 517 pNewData->bData = bData; |
263 void global_alternate::UpdateGlobalPersistentVariables() | 518 pNewData->bPersistent = bDefaultPersistent; |
264 { | 519 } break; |
265 ASSERT(m_pGlobalData != NULL); | 520 case JS_GLOBALDATA_TYPE_STRING: { |
266 | 521 pNewData = new js_global_data; |
267 for (int i=0,sz=m_pGlobalData->GetSize(); i<sz; i++) | 522 pNewData->nType = JS_GLOBALDATA_TYPE_STRING; |
268 { | 523 pNewData->sData = sData; |
269 CJS_GlobalData_Element* pData = m_pGlobalData->GetAt(i); | 524 pNewData->bPersistent = bDefaultPersistent; |
270 ASSERT(pData != NULL); | 525 } break; |
271 | 526 case JS_GLOBALDATA_TYPE_OBJECT: { |
272 switch (pData->data.nType) | 527 pNewData = new js_global_data; |
273 { | 528 pNewData->nType = JS_GLOBALDATA_TYPE_OBJECT; |
274 case JS_GLOBALDATA_TYPE_NUMBER: | 529 pNewData->pData.Reset(JS_GetRuntime(pData), pData); |
275 SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_NUMBER, pDat
a->data.dData, false, "", v8::Local<v8::Object>(), pData->bPersistent == 1); | 530 pNewData->bPersistent = bDefaultPersistent; |
276 JS_PutObjectNumber(NULL,(JSFXObject)(*m_pJSObject), | 531 } break; |
277 pData->data.sKey.UTF8Decode().c_str(), pData->dat
a.dData); | 532 case JS_GLOBALDATA_TYPE_NULL: { |
278 break; | 533 pNewData = new js_global_data; |
279 case JS_GLOBALDATA_TYPE_BOOLEAN: | 534 pNewData->nType = JS_GLOBALDATA_TYPE_NULL; |
280 SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_BOOLEAN, 0,
(bool)(pData->data.bData == 1), "", v8::Local<v8::Object>(), pData->bPersistent
== 1); | 535 pNewData->bPersistent = bDefaultPersistent; |
281 JS_PutObjectBoolean(NULL,(JSFXObject)(*m_pJSObject), | 536 } break; |
282 pData->data.sKey.UTF8Decode().c_str(), (bool)(pD
ata->data.bData == 1)); | |
283 break; | |
284 case JS_GLOBALDATA_TYPE_STRING: | |
285 SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_STRING, 0, f
alse, pData->data.sData, v8::Local<v8::Object>(), pData->bPersistent == 1); | |
286 JS_PutObjectString(NULL, (JSFXObject)(*m_pJSObject), | |
287 pData->data.sKey.UTF8Decode().c_str(), | |
288 pData->data.sData.UTF8Decode().c_str()); | |
289 break; | |
290 case JS_GLOBALDATA_TYPE_OBJECT: | |
291 { | |
292 IJS_Runtime* pRuntime = JS_GetRuntime((JSFXObject)(*m_pJSObject)
); | |
293 v8::Local<v8::Object> pObj = JS_NewFxDynamicObj(pRuntime, NULL,
-1); | |
294 | |
295 PutObjectProperty(pObj, &pData->data); | |
296 | |
297 SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_OBJECT,
0, false, "", | |
298 (JSObject)pObj, pData->bPersistent == 1); | |
299 JS_PutObjectObject(NULL,(JSFXObject)(*m_pJSObject), | |
300 pData->data.sKey.UTF8Decode().c_str(), (JSObj
ect)pObj); | |
301 } | |
302 break; | |
303 case JS_GLOBALDATA_TYPE_NULL: | |
304 SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_NULL, 0, fal
se, "", v8::Local<v8::Object>(), pData->bPersistent == 1); | |
305 JS_PutObjectNull(NULL,(JSFXObject)(*m_pJSObject), | |
306 pData->data.sKey.UTF8Decode().c_str()); | |
307 break; | |
308 } | |
309 } | |
310 } | |
311 | |
312 void global_alternate::CommitGlobalPersisitentVariables() | |
313 { | |
314 ASSERT(m_pGlobalData != NULL); | |
315 | |
316 FX_POSITION pos = m_mapGlobal.GetStartPosition(); | |
317 while (pos) | |
318 { | |
319 CFX_ByteString name; | |
320 js_global_data* pData = NULL; | |
321 m_mapGlobal.GetNextAssoc(pos, name, (void*&)pData); | |
322 | |
323 if (pData) | |
324 { | |
325 if (pData->bDeleted) | |
326 { | |
327 m_pGlobalData->DeleteGlobalVariable(name); | |
328 } | |
329 else | |
330 { | |
331 switch (pData->nType) | |
332 { | |
333 case JS_GLOBALDATA_TYPE_NUMBER: | |
334 m_pGlobalData->SetGlobalVariableNumber(name, pData->dData); | |
335 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPer
sistent); | |
336 break; | |
337 case JS_GLOBALDATA_TYPE_BOOLEAN: | |
338 m_pGlobalData->SetGlobalVariableBoolean(name, pData->bData); | |
339 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPer
sistent); | |
340 break; | |
341 case JS_GLOBALDATA_TYPE_STRING: | |
342 m_pGlobalData->SetGlobalVariableString(name, pData->sData); | |
343 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPer
sistent); | |
344 break; | |
345 case JS_GLOBALDATA_TYPE_OBJECT: | |
346 //if (pData->pData) | |
347 { | |
348 CJS_GlobalVariableArray array; | |
349 v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(G
etJSObject()->GetIsolate(),pData->pData); | |
350 ObjectToArray(obj, array); | |
351 m_pGlobalData->SetGlobalVariableObject(name, array); | |
352 m_pGlobalData->SetGlobalVariablePersistent(name, pData->
bPersistent); | |
353 } | |
354 break; | |
355 case JS_GLOBALDATA_TYPE_NULL: | |
356 m_pGlobalData->SetGlobalVariableNull(name); | |
357 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPer
sistent); | |
358 break; | |
359 } | |
360 } | |
361 } | |
362 } | |
363 } | |
364 | |
365 void global_alternate::ObjectToArray(v8::Local<v8::Object> pObj, CJS_GlobalVaria
bleArray& array) | |
366 { | |
367 v8::Local<v8::Context> context = pObj->CreationContext(); | |
368 v8::Isolate* isolate = context->GetIsolate(); | |
369 v8::Local<v8::Array> pKeyList = JS_GetObjectElementNames(isolate, pObj); | |
370 int nObjElements = pKeyList->Length(); | |
371 | |
372 for (int i=0; i<nObjElements; i++) | |
373 { | |
374 | |
375 CFX_WideString ws = JS_ToString(isolate, JS_GetArrayElement(isolate, pKe
yList, i)); | |
376 CFX_ByteString sKey = ws.UTF8Encode(); | |
377 | |
378 v8::Local<v8::Value> v = JS_GetObjectElement(isolate, pObj, ws.c_str()); | |
379 FXJSVALUETYPE vt = GET_VALUE_TYPE(v); | |
380 switch (vt) | |
381 { | |
382 case VT_number: | |
383 { | |
384 CJS_KeyValue* pObjElement = new CJS_KeyValue; | |
385 pObjElement->nType = JS_GLOBALDATA_TYPE_NUMBER; | |
386 pObjElement->sKey = sKey; | |
387 pObjElement->dData = JS_ToNumber(isolate, v); | |
388 array.Add(pObjElement); | |
389 } | |
390 break; | |
391 case VT_boolean: | |
392 { | |
393 CJS_KeyValue* pObjElement = new CJS_KeyValue; | |
394 pObjElement->nType = JS_GLOBALDATA_TYPE_BOOLEAN; | |
395 pObjElement->sKey = sKey; | |
396 pObjElement->dData = JS_ToBoolean(isolate, v); | |
397 array.Add(pObjElement); | |
398 } | |
399 break; | |
400 case VT_string: | |
401 { | |
402 CFX_ByteString sValue = CJS_Value(isolate, v, VT_string).ToCFXBy
teString(); | |
403 CJS_KeyValue* pObjElement = new CJS_KeyValue; | |
404 pObjElement->nType = JS_GLOBALDATA_TYPE_STRING; | |
405 pObjElement->sKey = sKey; | |
406 pObjElement->sData = sValue; | |
407 array.Add(pObjElement); | |
408 } | |
409 break; | |
410 case VT_object: | |
411 { | |
412 CJS_KeyValue* pObjElement = new CJS_KeyValue; | |
413 pObjElement->nType = JS_GLOBALDATA_TYPE_OBJECT; | |
414 pObjElement->sKey = sKey; | |
415 ObjectToArray(JS_ToObject(isolate, v), pObjElement->objData); | |
416 array.Add(pObjElement); | |
417 } | |
418 break; | |
419 case VT_null: | |
420 { | |
421 CJS_KeyValue* pObjElement = new CJS_KeyValue; | |
422 pObjElement->nType = JS_GLOBALDATA_TYPE_NULL; | |
423 pObjElement->sKey = sKey; | |
424 array.Add(pObjElement); | |
425 } | |
426 break; | |
427 default: | |
428 break; | |
429 } | |
430 } | |
431 } | |
432 | |
433 void global_alternate::PutObjectProperty(v8::Local<v8::Object> pObj, CJS_KeyValu
e* pData) | |
434 { | |
435 ASSERT(pData != NULL); | |
436 | |
437 for (int i=0,sz=pData->objData.Count(); i<sz; i++) | |
438 { | |
439 CJS_KeyValue* pObjData = pData->objData.GetAt(i); | |
440 ASSERT(pObjData != NULL); | |
441 | |
442 switch (pObjData->nType) | |
443 { | |
444 case JS_GLOBALDATA_TYPE_NUMBER: | |
445 JS_PutObjectNumber(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode().
c_str(), pObjData->dData); | |
446 break; | |
447 case JS_GLOBALDATA_TYPE_BOOLEAN: | |
448 JS_PutObjectBoolean(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode()
.c_str(), (bool)(pObjData->bData == 1)); | |
449 break; | |
450 case JS_GLOBALDATA_TYPE_STRING: | |
451 JS_PutObjectString(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode().
c_str(), pObjData->sData.UTF8Decode().c_str()); | |
452 break; | |
453 case JS_GLOBALDATA_TYPE_OBJECT: | |
454 { | |
455 IJS_Runtime* pRuntime = JS_GetRuntime((JSFXObject)(*m_pJSObject)
); | |
456 v8::Local<v8::Object> pNewObj = JS_NewFxDynamicObj(pRuntime, NUL
L, -1); | |
457 PutObjectProperty(pNewObj, pObjData); | |
458 JS_PutObjectObject(NULL, (JSObject)pObj, pObjData->sKey.UTF8Deco
de().c_str(), (JSObject)pNewObj); | |
459 } | |
460 break; | |
461 case JS_GLOBALDATA_TYPE_NULL: | |
462 JS_PutObjectNull(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode().c_
str()); | |
463 break; | |
464 } | |
465 } | |
466 } | |
467 | |
468 void global_alternate::DestroyGlobalPersisitentVariables() | |
469 { | |
470 FX_POSITION pos = m_mapGlobal.GetStartPosition(); | |
471 while (pos) | |
472 { | |
473 CFX_ByteString name; | |
474 js_global_data* pData = NULL; | |
475 m_mapGlobal.GetNextAssoc(pos, name, (void*&)pData); | |
476 delete pData; | |
477 } | |
478 | |
479 m_mapGlobal.RemoveAll(); | |
480 } | |
481 | |
482 | |
483 FX_BOOL global_alternate::SetGlobalVariables(const FX_CHAR* propname, int nType, | |
484 double dData, bool bData, const CFX_ByteString& sData, JSObject
pData, bool bDefaultPersistent) | |
485 { | |
486 if (propname == NULL) return FALSE; | |
487 | |
488 js_global_data* pTemp = NULL; | |
489 m_mapGlobal.Lookup(propname, (void*&)pTemp); | |
490 | |
491 if (pTemp) | |
492 { | |
493 if (pTemp->bDeleted || pTemp->nType != nType) | |
494 { | |
495 pTemp->dData = 0; | |
496 pTemp->bData = 0; | |
497 pTemp->sData = ""; | |
498 pTemp->nType = nType; | |
499 } | |
500 | |
501 pTemp->bDeleted = FALSE; | |
502 | |
503 switch (nType) | |
504 { | |
505 case JS_GLOBALDATA_TYPE_NUMBER: | |
506 { | |
507 pTemp->dData = dData; | |
508 } | |
509 break; | |
510 case JS_GLOBALDATA_TYPE_BOOLEAN: | |
511 { | |
512 pTemp->bData = bData; | |
513 } | |
514 break; | |
515 case JS_GLOBALDATA_TYPE_STRING: | |
516 { | |
517 pTemp->sData = sData; | |
518 } | |
519 break; | |
520 case JS_GLOBALDATA_TYPE_OBJECT: | |
521 { | |
522 pTemp->pData.Reset(JS_GetRuntime(pData), pData); | |
523 } | |
524 break; | |
525 case JS_GLOBALDATA_TYPE_NULL: | |
526 break; | |
527 default: | |
528 return FALSE; | |
529 } | |
530 | |
531 return TRUE; | |
532 } | |
533 | |
534 js_global_data* pNewData = NULL; | |
535 | |
536 switch (nType) | |
537 { | |
538 case JS_GLOBALDATA_TYPE_NUMBER: | |
539 { | |
540 pNewData = new js_global_data; | |
541 pNewData->nType = JS_GLOBALDATA_TYPE_NUMBER; | |
542 pNewData->dData = dData; | |
543 pNewData->bPersistent = bDefaultPersistent; | |
544 } | |
545 break; | |
546 case JS_GLOBALDATA_TYPE_BOOLEAN: | |
547 { | |
548 pNewData = new js_global_data; | |
549 pNewData->nType = JS_GLOBALDATA_TYPE_BOOLEAN; | |
550 pNewData->bData = bData; | |
551 pNewData->bPersistent = bDefaultPersistent; | |
552 } | |
553 break; | |
554 case JS_GLOBALDATA_TYPE_STRING: | |
555 { | |
556 pNewData = new js_global_data; | |
557 pNewData->nType = JS_GLOBALDATA_TYPE_STRING; | |
558 pNewData->sData = sData; | |
559 pNewData->bPersistent = bDefaultPersistent; | |
560 } | |
561 break; | |
562 case JS_GLOBALDATA_TYPE_OBJECT: | |
563 { | |
564 pNewData = new js_global_data; | |
565 pNewData->nType = JS_GLOBALDATA_TYPE_OBJECT; | |
566 pNewData->pData.Reset(JS_GetRuntime(pData), pData); | |
567 pNewData->bPersistent = bDefaultPersistent; | |
568 } | |
569 break; | |
570 case JS_GLOBALDATA_TYPE_NULL: | |
571 { | |
572 pNewData = new js_global_data; | |
573 pNewData->nType = JS_GLOBALDATA_TYPE_NULL; | |
574 pNewData->bPersistent = bDefaultPersistent; | |
575 } | |
576 break; | |
577 default: | 537 default: |
578 return FALSE; | 538 return FALSE; |
579 } | 539 } |
580 | 540 |
581 m_mapGlobal.SetAt(propname, (void*)pNewData); | 541 m_mapGlobal.SetAt(propname, (void*)pNewData); |
582 | 542 |
583 return TRUE; | 543 return TRUE; |
584 } | 544 } |
585 | 545 |
586 FXJSVALUETYPE GET_VALUE_TYPE(v8::Local<v8::Value> p) | 546 FXJSVALUETYPE GET_VALUE_TYPE(v8::Local<v8::Value> p) { |
587 { | |
588 const unsigned int nHash = JS_CalcHash(JS_GetTypeof(p)); | 547 const unsigned int nHash = JS_CalcHash(JS_GetTypeof(p)); |
589 | 548 |
590 if (nHash == JSCONST_nUndefHash) | 549 if (nHash == JSCONST_nUndefHash) |
591 return VT_undefined; | 550 return VT_undefined; |
592 if (nHash == JSCONST_nNullHash) | 551 if (nHash == JSCONST_nNullHash) |
593 return VT_null; | 552 return VT_null; |
594 if (nHash == JSCONST_nStringHash) | 553 if (nHash == JSCONST_nStringHash) |
595 return VT_string; | 554 return VT_string; |
596 if (nHash == JSCONST_nNumberHash) | 555 if (nHash == JSCONST_nNumberHash) |
597 return VT_number; | 556 return VT_number; |
598 if (nHash == JSCONST_nBoolHash) | 557 if (nHash == JSCONST_nBoolHash) |
599 return VT_boolean; | 558 return VT_boolean; |
600 if (nHash == JSCONST_nDateHash) | 559 if (nHash == JSCONST_nDateHash) |
601 return VT_date; | 560 return VT_date; |
602 if (nHash == JSCONST_nObjectHash) | 561 if (nHash == JSCONST_nObjectHash) |
603 return VT_object; | 562 return VT_object; |
604 if (nHash == JSCONST_nFXobjHash) | 563 if (nHash == JSCONST_nFXobjHash) |
605 return VT_fxobject; | 564 return VT_fxobject; |
606 | 565 |
607 return VT_unknown; | 566 return VT_unknown; |
608 } | 567 } |
OLD | NEW |