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