1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file.
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _JS_DEFINE_H_
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define _JS_DEFINE_H_
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef v8::Value			JSValue;
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef v8::Handle<v8::Object>	JSObject;
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef v8::Handle<v8::Object>	JSFXObject;
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef unsigned		JSBool;
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct JSConstSpec
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	const wchar_t* pName;
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	double number;
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	const wchar_t* string;
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_BYTE t; //0:double 1:str
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct JSPropertySpec
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	const wchar_t* pName;
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::AccessorGetterCallback pPropGet;
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::AccessorSetterCallback pPropPut;
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct JSMethodSpec
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	const wchar_t* pName;
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::FunctionCallback pMethodCall;
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	unsigned nParamNum;
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef CFX_WideString	JS_ErrorString;
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define JS_TRUE			(unsigned)1
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define JS_FALSE		(unsigned)0
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define CJS_PointsArray		CFX_ArrayTemplate<float>
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define CJS_IntArray		CFX_ArrayTemplate<int>
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ====================================== PUBLIC DEFINE SPEC ============================================== */
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef __GNUC__
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define JS_WIDESTRING(widestring) L#widestring
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define JS_WIDESTRING(widestring) L""#widestring
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define OBJ_PROP_PARAMS			IFXJS_Context* cc, CJS_PropValue& vp, JS_ErrorString& sError
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define OBJ_METHOD_PARAMS		IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, JS_ErrorString& sError
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define BEGIN_JS_STATIC_CONST(js_class_name) JSConstSpec js_class_name::JS_Class_Consts[] = {
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define JS_STATIC_CONST_ENTRY_NUMBER(const_name, pValue) {JS_WIDESTRING(const_name), pValue, L"", 0},
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define JS_STATIC_CONST_ENTRY_STRING(const_name, pValue) {JS_WIDESTRING(const_name), 0, JS_WIDESTRING(pValue), 1},
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define END_JS_STATIC_CONST() {0, 0, 0, 0}};
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define BEGIN_JS_STATIC_PROP(js_class_name) JSPropertySpec js_class_name::JS_Class_Properties[] = {
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define JS_STATIC_PROP_ENTRY(prop_name) {JS_WIDESTRING(prop_name), get_##prop_name##_static, set_##prop_name##_static},
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define END_JS_STATIC_PROP() {0, 0, 0}};
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define BEGIN_JS_STATIC_METHOD(js_class_name) JSMethodSpec js_class_name::JS_Class_Methods[] = {
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define JS_STATIC_METHOD_ENTRY(method_name, nargs) {JS_WIDESTRING(method_name), method_name##_static, nargs},
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define END_JS_STATIC_METHOD() {0, 0, 0}};
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define MEMLEAKCHECK_1() ((void)0)
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define MEMLEAKCHECK_2(main_name, sub_name) ((void)0)
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef _DEBUG
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define MEMLEAKCHECK_1() \
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	_CrtMemState state1;\
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	_CrtMemCheckpoint(&state1);
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define MEMLEAKCHECK_2(main_name,sub_name) \
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	_CrtMemState state2;\
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	_CrtMemCheckpoint(&state2);\
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	_CrtMemState diff;\
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	_CrtMemDifference(&diff,&state1,&state2);\
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (diff.lSizes[_NORMAL_BLOCK] > 0)\
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		TRACE("Detected normal block memory leaks in JS Module! [%s.%s]\n",#main_name,#sub_name);\
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		_CrtMemDumpStatistics(&diff);\
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	#define MEMLEAKCHECK_1() ((void)0)
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	#define MEMLEAKCHECK_2(main_name,sub_name) ((void)0)
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ======================================== PROP CALLBACK ============================================ */
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define JS_STATIC_PROP_GET(prop_name, class_name)\
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static void get_##prop_name##_static(JS_PROPGET_ARGS)\
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = info.GetIsolate();\
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Context> context = isolate->GetCurrentContext();\
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Value> v = context->GetEmbedderData(1);\
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(!v.IsEmpty());\
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(v.IsEmpty()) return;\
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IFXJS_Context* cc = pRuntime->GetCurrentContext();\
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_PropValue value(isolate);\
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	value.StartGetting();\
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(pJSObj != NULL);\
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	class_name* pObj = (class_name*)pJSObj->GetEmbedObject();\
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(pObj != NULL);\
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	JS_ErrorString sError;\
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_BOOL bRet = FALSE;\
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	try\
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		MEMLEAKCHECK_1();\
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		bRet = pObj->prop_name(cc, value, sError);\
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		MEMLEAKCHECK_2(class_name, prop_name);\
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	catch (...)\
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CFX_ByteString cbName;\
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		cbName.Format("%s.%s", #class_name, #prop_name);\
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		JS_Error(NULL,CFX_WideString::FromLocal(cbName), L"Unknown error is catched!");\
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (bRet)\
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		info.GetReturnValue().Set((v8::Handle<v8::Value>)value);\
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else\
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_ByteString cbName;\
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		cbName.Format("%s.%s", #class_name, #prop_name);\
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define JS_STATIC_PROP_SET(prop_name, class_name)\
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static void set_##prop_name##_static(JS_PROPPUT_ARGS)\
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = info.GetIsolate();\
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Context> context = isolate->GetCurrentContext();\
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Value> v = context->GetEmbedderData(1);\
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(!v.IsEmpty());\
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(v.IsEmpty()) return;\
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IFXJS_Context* cc = pRuntime->GetCurrentContext();\
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_PropValue propValue(CJS_Value(isolate,value,VT_unknown));\
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	propValue.StartSetting();\
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(pJSObj != NULL);\
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	class_name* pObj = (class_name*)pJSObj->GetEmbedObject();\
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(pObj != NULL);\
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	JS_ErrorString sError;\
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_BOOL bRet = FALSE;\
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	try\
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		MEMLEAKCHECK_1();\
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		bRet = pObj->prop_name(cc, propValue, sError);\
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		MEMLEAKCHECK_2(class_name, prop_name);\
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	catch (...)\
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CFX_ByteString cbName;\
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		cbName.Format("%s.%s", #class_name, #prop_name);\
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		JS_Error(NULL,CFX_WideString::FromLocal(cbName), L"Unknown error is catched!");\
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (bRet)\
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else\
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CFX_ByteString cbName;\
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		cbName.Format("%s.%s", #class_name, #prop_name);\
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define JS_STATIC_PROP(prop_name, class_name)\
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovJS_STATIC_PROP_GET(prop_name, class_name);\
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovJS_STATIC_PROP_SET(prop_name, class_name)
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ========================================= METHOD CALLBACK =========================================== */
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define JS_STATIC_METHOD(method_name, class_name)\
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static void method_name##_static(JS_METHOD_ARGS)\
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = info.GetIsolate();\
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Context> context = isolate->GetCurrentContext();\
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Value> v = context->GetEmbedderData(1);\
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(!v.IsEmpty());\
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(v.IsEmpty()) return;\
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IFXJS_Context* cc = pRuntime->GetCurrentContext();\
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_Parameters parameters;\
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	for (unsigned int i = 0; i<(unsigned int)info.Length(); i++)\
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {\
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));\
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_Value valueRes(isolate);\
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_Object* pJSObj = (CJS_Object *)JS_GetPrivate(isolate,info.Holder());\
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(pJSObj != NULL);\
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	class_name* pObj = (class_name*)pJSObj->GetEmbedObject();\
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(pObj != NULL);\
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	JS_ErrorString sError;\
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_BOOL bRet = FALSE;\
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	try\
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		MEMLEAKCHECK_1();\
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		bRet = pObj->method_name(cc, parameters, valueRes, sError);\
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		MEMLEAKCHECK_2(class_name, method_name);\
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	catch (...)\
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CFX_ByteString cbName;\
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		cbName.Format("%s.%s", #class_name, #method_name);\
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		JS_Error(NULL, CFX_WideString::FromLocal(cbName), L"Unknown error is catched!");\
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (bRet)\
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		info.GetReturnValue().Set(valueRes.ToJSValue());\
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else\
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CFX_ByteString cbName;\
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		cbName.Format("%s.%s", #class_name, #method_name);\
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		JS_Error(NULL, CFX_WideString::FromLocal(cbName), sError);\
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ===================================== JS CLASS =============================================== */
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define DECLARE_JS_CLASS(js_class_name) \
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static JSBool JSConstructor(IFXJS_Context* cc, JSFXObject obj,JSFXObject global);\
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static JSBool JSDestructor(JSFXObject obj);\
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static int Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType);\
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static void GetConsts(JSConstSpec*& pConsts, int& nSize);\
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static void GetProperties(JSPropertySpec*& pProperties, int& nSize);\
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static void GetMethods(JSMethodSpec*& pMethods, int& nSize);\
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static JSConstSpec JS_Class_Consts[];\
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static JSPropertySpec JS_Class_Properties[];\
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static JSMethodSpec	JS_Class_Methods[];\
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static const wchar_t* m_pClassName
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define IMPLEMENT_JS_CLASS_RICH(js_class_name, class_alternate, class_name) \
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst wchar_t* js_class_name::m_pClassName = JS_WIDESTRING(class_name);\
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovJSBool js_class_name::JSConstructor(IFXJS_Context* cc, JSFXObject obj, JSFXObject global)\
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_Object* pObj = FX_NEW js_class_name(obj);\
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pObj->SetEmbedObject(FX_NEW class_alternate(pObj));\
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	JS_SetPrivate(NULL,obj,(void*)pObj); \
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pObj->InitInstance(cc);\
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return JS_TRUE;\
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}\
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov\
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovJSBool js_class_name::JSDestructor(JSFXObject obj) \
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	js_class_name* pObj = (js_class_name*)JS_GetPrivate(NULL,obj);\
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(pObj != NULL);\
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pObj->ExitInstance();\
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	delete pObj;\
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return JS_TRUE;\
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}\
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov\
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint js_class_name::Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType)\
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	int nObjDefnID = JS_DefineObj(pRuntime, js_class_name::m_pClassName, eObjType, JSConstructor, JSDestructor, 0);\
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (nObjDefnID >= 0)\
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		for (int j=0, szj=sizeof(JS_Class_Properties)/sizeof(JSPropertySpec)-1; j<szj; j++)\
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{\
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (JS_DefineObjProperty(pRuntime, nObjDefnID, JS_Class_Properties[j].pName, JS_Class_Properties[j].pPropGet, JS_Class_Properties[j].pPropPut) < 0) return -1;\
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}\
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		for (int k=0, szk=sizeof(JS_Class_Methods)/sizeof(JSMethodSpec)-1; k<szk; k++)\
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{\
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (JS_DefineObjMethod(pRuntime, nObjDefnID,JS_Class_Methods[k].pName, JS_Class_Methods[k].pMethodCall, JS_Class_Methods[k].nParamNum) < 0) return -1;\
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}\
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return nObjDefnID;\
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return -1;\
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}\
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid js_class_name::GetConsts(JSConstSpec*& pConsts, int& nSize)\
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pConsts = JS_Class_Consts;\
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	nSize = sizeof(JS_Class_Consts) / sizeof(JSConstSpec) - 1;\
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}\
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid js_class_name::GetProperties(JSPropertySpec*& pProperties, int& nSize)\
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pProperties = JS_Class_Properties;\
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	nSize = sizeof(JS_Class_Properties) / sizeof(JSPropertySpec) - 1;\
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}\
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid js_class_name::GetMethods(JSMethodSpec*& pMethods, int& nSize)\
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pMethods = JS_Class_Methods;\
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	nSize = sizeof(JS_Class_Methods) / sizeof(JSMethodSpec) - 1;\
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define IMPLEMENT_JS_CLASS(js_class_name, class_name) IMPLEMENT_JS_CLASS_RICH(js_class_name, class_name, class_name)
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ======================================== CONST CLASS ============================================ */
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define DECLARE_JS_CLASS_CONST() \
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static int Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType);\
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static void GetConsts(JSConstSpec*& pConsts, int& nSize);\
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static JSConstSpec JS_Class_Consts[];\
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static const wchar_t* m_pClassName
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define IMPLEMENT_JS_CLASS_CONST(js_class_name, class_name) \
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst wchar_t* js_class_name::m_pClassName = JS_WIDESTRING(class_name);\
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint js_class_name::Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType)\
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	int nObjDefnID = JS_DefineObj(pRuntime, js_class_name::m_pClassName, eObjType, NULL, NULL, 0);\
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (nObjDefnID >=0)\
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		for (int i=0, sz=sizeof(JS_Class_Consts)/sizeof(JSConstSpec)-1; i<sz; i++)\
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{\
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (JS_Class_Consts[i].t == 0)\
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			{\
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				if (JS_DefineObjConst(pRuntime, nObjDefnID, JS_Class_Consts[i].pName, JS_NewNumber(pRuntime,JS_Class_Consts[i].number)) < 0) return -1;\
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}\
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			else\
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			{\
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (JS_DefineObjConst(pRuntime, nObjDefnID, JS_Class_Consts[i].pName, JS_NewString(pRuntime,JS_Class_Consts[i].string)) < 0) return -1;\
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}\
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}\
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return nObjDefnID;\
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return -1;\
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}\
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid js_class_name::GetConsts(JSConstSpec*& pConsts, int& nSize)\
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pConsts = JS_Class_Consts;\
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	nSize = sizeof(JS_Class_Consts)/sizeof(JSConstSpec)-1;\
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ===================================== SPECIAL JS CLASS =============================================== */
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define DECLARE_SPECIAL_JS_CLASS(js_class_name) \
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static JSBool JSConstructor(IFXJS_Context* cc, JSFXObject obj, JSFXObject global);\
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static JSBool JSDestructor(JSFXObject obj);\
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static void GetConsts(JSConstSpec*& pConsts, int& nSize);\
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static void GetProperties(JSPropertySpec*& pProperties, int& nSize);\
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static void GetMethods(JSMethodSpec*& pMethods, int& nSize);\
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static JSConstSpec JS_Class_Consts[];\
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static JSPropertySpec JS_Class_Properties[];\
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static JSMethodSpec	JS_Class_Methods[];\
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static int Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType);\
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static const wchar_t* m_pClassName;\
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static void queryprop_##js_class_name##_static(JS_PROPQUERY_ARGS);\
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static void getprop_##js_class_name##_static(JS_NAMED_PROPGET_ARGS);\
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static void putprop_##js_class_name##_static(JS_NAMED_PROPPUT_ARGS);\
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static void delprop_##js_class_name##_static(JS_PROPDEL_ARGS)
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define IMPLEMENT_SPECIAL_JS_CLASS(js_class_name, class_alternate, class_name) \
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst wchar_t * js_class_name::m_pClassName = JS_WIDESTRING(class_name);\
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	void js_class_name::queryprop_##js_class_name##_static(JS_PROPQUERY_ARGS)\
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = info.GetIsolate();\
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::String::Utf8Value utf8_value(property);\
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_value.length());\
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(pJSObj != NULL);\
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(pObj != NULL);\
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_BOOL bRet = FALSE;\
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	try\
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		MEMLEAKCHECK_1();\
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		bRet = pObj->QueryProperty((FX_LPCWSTR)propname);\
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		MEMLEAKCHECK_2(class_name, (FX_LPCWSTR)prop_name);\
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	catch (...)\
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (bRet)\
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		info.GetReturnValue().Set(0x004);\
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else\
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		info.GetReturnValue().Set(0);\
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return ;\
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}\
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	void js_class_name::getprop_##js_class_name##_static(JS_NAMED_PROPGET_ARGS)\
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = info.GetIsolate();\
402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Context> context = isolate->GetCurrentContext();\
403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Value> v = context->GetEmbedderData(1);\
404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(!v.IsEmpty());\
405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(v.IsEmpty()) return;\
406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\
407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IFXJS_Context* cc = pRuntime->GetCurrentContext();\
409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::String::Utf8Value utf8_value(property);\
410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_value.length());\
411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_PropValue value(isolate);\
412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	value.StartGetting();\
413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(pJSObj != NULL);\
415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\
416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(pObj != NULL);\
417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	JS_ErrorString sError;\
418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_BOOL bRet = FALSE;\
419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	try\
420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		MEMLEAKCHECK_1();\
422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		bRet = pObj->DoProperty(cc, (FX_LPCWSTR)propname, value, sError);\
423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		MEMLEAKCHECK_2(class_name, L"GetProperty");\
424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	catch (...)\
426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CFX_ByteString cbName;\
428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		cbName.Format("%s.%s", #class_name, L"GetProperty");\
429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		JS_Error(NULL,CFX_WideString::FromLocal(cbName), L"Unknown error is catched!");\
430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (bRet)\
433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		info.GetReturnValue().Set((v8::Handle<v8::Value>)value);\
435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else\
438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CFX_ByteString cbName;\
440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		cbName.Format("%s.%s", #class_name, L"GetProperty");\
441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\
442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	JS_Error(NULL,L"GetProperty", L"Embeded object not found!");\
445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return ;\
446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}\
447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	void js_class_name::putprop_##js_class_name##_static(JS_NAMED_PROPPUT_ARGS)\
448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = info.GetIsolate();\
450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Context> context = isolate->GetCurrentContext();\
451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Value> v = context->GetEmbedderData(1);\
452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(!v.IsEmpty());\
453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(v.IsEmpty()) return;\
454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\
455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IFXJS_Context* cc = pRuntime->GetCurrentContext();\
457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::String::Utf8Value utf8_value(property);\
458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_value.length());\
459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_PropValue PropValue(CJS_Value(isolate,value,VT_unknown));\
460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	PropValue.StartSetting();\
461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!pJSObj) return;\
463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\
464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(pObj != NULL);\
465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	JS_ErrorString sError;\
466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_BOOL bRet = FALSE;\
467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	try\
468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		MEMLEAKCHECK_1();\
470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		bRet = pObj->DoProperty(cc, (FX_LPCWSTR)propname, PropValue, sError);\
471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		MEMLEAKCHECK_2(class_name,L"PutProperty");\
472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	catch (...)\
474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CFX_ByteString cbName;\
476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		cbName.Format("%s.%s", #class_name, "PutProperty");\
477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		JS_Error(NULL,CFX_WideString::FromLocal(cbName), L"Unknown error is catched!");\
478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (bRet)\
481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else\
485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CFX_ByteString cbName;\
487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		cbName.Format("%s.%s", #class_name, "PutProperty");\
488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\
489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	JS_Error(NULL,L"PutProperty", L"Embeded object not found!");\
492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return ;\
493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}\
494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	void js_class_name::delprop_##js_class_name##_static(JS_PROPDEL_ARGS)\
495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = info.GetIsolate();\
497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Context> context = isolate->GetCurrentContext();\
498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Value> v = context->GetEmbedderData(1);\
499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(!v.IsEmpty());\
500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(v.IsEmpty()) return;\
501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\
502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IFXJS_Context* cc = pRuntime->GetCurrentContext();\
504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::String::Utf8Value utf8_value(property);\
505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_value.length());\
506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(pJSObj != NULL);\
508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\
509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(pObj != NULL);\
510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	JS_ErrorString sError;\
511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_BOOL bRet = FALSE;\
512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	try\
513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		MEMLEAKCHECK_1();\
515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		bRet = pObj->DelProperty(cc, (FX_LPCWSTR)propname, sError);\
516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		MEMLEAKCHECK_2(class_name,L"DelProperty");\
517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	catch (...)\
519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CFX_ByteString cbName;\
521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		cbName.Format("%s.%s", #class_name, "DelProperty");\
522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (bRet)\
525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else\
529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CFX_ByteString cbName;\
531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		cbName.Format("%s.%s", #class_name, "DelProperty");\
532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return ;\
535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}\
536ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovJSBool js_class_name::JSConstructor(IFXJS_Context* cc, JSFXObject  obj,JSFXObject  global)\
537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_Object* pObj = FX_NEW js_class_name(obj);\
539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pObj->SetEmbedObject(FX_NEW class_alternate(pObj));\
540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	JS_SetPrivate(NULL,obj, (void*)pObj); \
541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pObj->InitInstance(cc);\
542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return JS_TRUE;\
543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}\
544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov\
545ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovJSBool js_class_name::JSDestructor(JSFXObject obj) \
546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	js_class_name* pObj = (js_class_name*)JS_GetPrivate(NULL,obj);\
548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(pObj != NULL);\
549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pObj->ExitInstance();\
550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	delete pObj;\
551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return JS_TRUE;\
552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}\
553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov\
554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint js_class_name::Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType)\
555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov\
557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	int nObjDefnID = JS_DefineObj(pRuntime, js_class_name::m_pClassName, eObjType, JSConstructor, JSDestructor, 0);\
558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov\
559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (nObjDefnID >= 0)\
560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		for (int j=0, szj=sizeof(JS_Class_Properties)/sizeof(JSPropertySpec)-1; j<szj; j++)\
562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{\
563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (JS_DefineObjProperty(pRuntime, nObjDefnID, JS_Class_Properties[j].pName, JS_Class_Properties[j].pPropGet,JS_Class_Properties[j].pPropPut)<0)return -1;\
564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}\
565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov\
566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		for (int k=0, szk=sizeof(JS_Class_Methods)/sizeof(JSMethodSpec)-1; k<szk; k++)\
567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{\
568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (JS_DefineObjMethod(pRuntime, nObjDefnID,JS_Class_Methods[k].pName,JS_Class_Methods[k].pMethodCall,JS_Class_Methods[k].nParamNum)<0)return -1;\
569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}\
570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (JS_DefineObjAllProperties(pRuntime, nObjDefnID, js_class_name::queryprop_##js_class_name##_static, js_class_name::getprop_##js_class_name##_static,js_class_name::putprop_##js_class_name##_static,js_class_name::delprop_##js_class_name##_static)<0) return -1;\
571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov\
572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return nObjDefnID;\
573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov\
575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return -1;\
576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}\
577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid js_class_name::GetConsts(JSConstSpec*& pConsts, int& nSize)\
578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pConsts = JS_Class_Consts;\
580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	nSize = sizeof(JS_Class_Consts)/sizeof(JSConstSpec)-1;\
581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}\
582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid js_class_name::GetProperties(JSPropertySpec*& pProperties, int& nSize)\
583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pProperties = JS_Class_Properties;\
585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	nSize = sizeof(JS_Class_Properties)/sizeof(JSPropertySpec)-1;\
586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}\
587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid js_class_name::GetMethods(JSMethodSpec*& pMethods, int& nSize)\
588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pMethods = JS_Class_Methods;\
590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	nSize = sizeof(JS_Class_Methods)/sizeof(JSMethodSpec)-1;\
591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define JS_SPECIAL_STATIC_METHOD(method_name, class_alternate, class_name)\
594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static void method_name##_static(JS_METHOD_ARGS)\
595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = info.GetIsolate();\
597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Context> context = isolate->GetCurrentContext();\
598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Value> v = context->GetEmbedderData(1);\
599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(!v.IsEmpty());\
600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(v.IsEmpty()) return;\
601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\
602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IFXJS_Context* cc = pRuntime->GetCurrentContext();\
604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_Parameters parameters;\
605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	for (unsigned int i = 0; i<(unsigned int)info.Length(); i++)\
606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));\
608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_Value valueRes(isolate);\
610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_Object* pJSObj = (CJS_Object *)JS_GetPrivate(isolate, info.Holder());\
611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(pJSObj != NULL);\
612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\
613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(pObj != NULL);\
614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	JS_ErrorString sError;\
615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_BOOL bRet = FALSE;\
616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	try\
617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		MEMLEAKCHECK_1();\
619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		bRet = pObj->method_name(cc, parameters, valueRes, sError);\
620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		MEMLEAKCHECK_2(class_name, method_name);\
621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	catch (...)\
623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CFX_ByteString cbName;\
625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		cbName.Format("%s.%s", #class_name, #method_name);\
626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		JS_Error(NULL, CFX_WideString::FromLocal(cbName), L"Unknown error is catched!");\
627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (bRet)\
630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		info.GetReturnValue().Set(valueRes.ToJSValue());\
632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else\
635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CFX_ByteString cbName;\
637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		cbName.Format("%s.%s", #class_name, #method_name);\
638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		JS_Error(NULL, CFX_WideString::FromLocal(cbName), sError);\
639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	JS_Error(NULL,  JS_WIDESTRING(method_name), L"Embeded object not found!");\
642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return ;\
643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ======================================== GLOBAL METHODS ============================================ */
646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define JS_STATIC_GLOBAL_FUN(fun_name) \
647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void fun_name##_static(JS_METHOD_ARGS)\
648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = info.GetIsolate();\
650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Context> context = isolate->GetCurrentContext();\
651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Value> v = context->GetEmbedderData(1);\
652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(!v.IsEmpty());\
653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(v.IsEmpty()) return;\
654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\
655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IFXJS_Context* cc = pRuntime->GetCurrentContext();\
657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_Parameters parameters;\
658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	for (unsigned int i = 0; i<(unsigned int)info.Length(); i++)\
659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));\
661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_Value valueRes(isolate);\
663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	JS_ErrorString sError;\
664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!fun_name(cc, parameters, valueRes, sError))\
665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		JS_Error(NULL, JS_WIDESTRING(fun_name), sError);\
667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return ;\
668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	info.GetReturnValue().Set(valueRes.ToJSValue());\
670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return ;\
671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define JS_STATIC_DECLARE_GLOBAL_FUN() \
674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic JSMethodSpec	global_methods[]; \
675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic int Init(IJS_Runtime* pRuntime)
676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define BEGIN_JS_STATIC_GLOBAL_FUN(js_class_name) \
678ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovJSMethodSpec js_class_name::global_methods[] = {
679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define JS_STATIC_GLOBAL_FUN_ENTRY(method_name,nargs) JS_STATIC_METHOD_ENTRY(method_name,nargs)
681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define END_JS_STATIC_GLOBAL_FUN() END_JS_STATIC_METHOD()
683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define IMPLEMENT_JS_STATIC_GLOBAL_FUN(js_class_name) \
685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint js_class_name::Init(IJS_Runtime* pRuntime)\
686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{\
687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	for (int i=0, sz=sizeof(js_class_name::global_methods)/sizeof(JSMethodSpec)-1; i<sz; i++)\
688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{\
689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (JS_DefineGlobalMethod(pRuntime,\
690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				js_class_name::global_methods[i].pName,\
691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				js_class_name::global_methods[i].pMethodCall,\
692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				js_class_name::global_methods[i].nParamNum\
693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				) < 0\
694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			)return -1;\
695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}\
696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return 0;\
697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ======================================== GLOBAL CONSTS ============================================ */
700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define DEFINE_GLOBAL_CONST(pRuntime, const_name , const_value)\
701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovif (JS_DefineGlobalConst(pRuntime,JS_WIDESTRING(const_name),JS_NewString(pRuntime,JS_WIDESTRING(const_value)))) return -1
702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ======================================== GLOBAL ARRAYS ============================================ */
704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define DEFINE_GLOBAL_ARRAY(pRuntime)\
706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint size = sizeof(ArrayContent) / sizeof(FX_LPCWSTR);\
707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov\
708ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCJS_Array array(pRuntime);\
709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovfor (int i=0; i<size; i++) array.SetElement(i,CJS_Value(pRuntime,(FX_LPCWSTR)ArrayContent[i]));\
710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov\
711ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCJS_PropValue prop(pRuntime);\
712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprop << array;\
713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovif (JS_DefineGlobalConst(pRuntime, (const wchar_t*)ArrayName, prop.ToJSValue()) < 0)\
714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return -1
715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ============================================================ */
717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define VALUE_NAME_STRING		L"string"
719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define VALUE_NAME_NUMBER		L"number"
720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define VALUE_NAME_BOOLEAN		L"boolean"
721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define VALUE_NAME_DATE			L"date"
722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define VALUE_NAME_OBJECT		L"object"
723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define VALUE_NAME_FXOBJ		L"fxobj"
724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define VALUE_NAME_NULL			L"null"
725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define VALUE_NAME_UNDEFINED	L"undefined"
726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define CLASSNAME_ARRAY			L"Array"
728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define CLASSNAME_DATE			L"Date"
729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define CLASSNAME_STRING		L"v8::String"
730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst unsigned int JSCONST_nStringHash = JS_CalcHash(VALUE_NAME_STRING,wcslen(VALUE_NAME_STRING));
732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst unsigned int JSCONST_nNumberHash = JS_CalcHash(VALUE_NAME_NUMBER,wcslen(VALUE_NAME_NUMBER));
733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst unsigned int JSCONST_nBoolHash = JS_CalcHash(VALUE_NAME_BOOLEAN,wcslen(VALUE_NAME_BOOLEAN));
734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst unsigned int JSCONST_nDateHash = JS_CalcHash(VALUE_NAME_DATE,wcslen(VALUE_NAME_DATE));
735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst unsigned int JSCONST_nObjectHash = JS_CalcHash(VALUE_NAME_OBJECT,wcslen(VALUE_NAME_OBJECT));
736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst unsigned int JSCONST_nFXobjHash = JS_CalcHash(VALUE_NAME_FXOBJ,wcslen(VALUE_NAME_FXOBJ));
737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst unsigned int JSCONST_nNullHash = JS_CalcHash(VALUE_NAME_NULL,wcslen(VALUE_NAME_NULL));
738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst unsigned int JSCONST_nUndefHash = JS_CalcHash(VALUE_NAME_UNDEFINED,wcslen(VALUE_NAME_UNDEFINED));
739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic FXJSVALUETYPE GET_VALUE_TYPE(v8::Handle<v8::Value> p)
741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		const unsigned int nHash = JS_CalcHash(JS_GetTypeof(p));
744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (nHash == JSCONST_nUndefHash)
746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return VT_undefined;
747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		else if (nHash == JSCONST_nNullHash)
748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return VT_null;
749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		else if (nHash == JSCONST_nStringHash)
750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return VT_string;
751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		else if (nHash == JSCONST_nNumberHash)
752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return VT_number;
753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		else if (nHash == JSCONST_nBoolHash)
754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return VT_boolean;
755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		else if (nHash == JSCONST_nDateHash)
756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return VT_date;
757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		else if (nHash == JSCONST_nObjectHash)
758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return VT_object;
759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		else if (nHash == JSCONST_nFXobjHash)
760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return VT_fxobject;
761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		/*
763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		const char * sType = p->getTypeof()->toDchars();
764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (strcmp(sType,VALUE_NAME_STRING) == 0)
765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return VT_string;
766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		else if (strcmp(sType,VALUE_NAME_NUMBER) == 0)
767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return VT_number;
768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		else if (strcmp(sType,VALUE_NAME_BOOLEAN) == 0)
769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return VT_boolean;
770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		else if (strcmp(sType,VALUE_NAME_DATE) == 0)
771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return VT_date;
772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		else if (strcmp(sType,VALUE_NAME_OBJECT) == 0)
773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return VT_object;
774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		else if (strcmp(sType,VALUE_NAME_FXOBJ) == 0)
775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return VT_object;
776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		else if (strcmp(sType,VALUE_NAME_NULL) == 0)
777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return VT_null;
778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		else if (strcmp(sType,VALUE_NAME_UNDEFINED) == 0)
779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return VT_undefined;
780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			*/
781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return VT_unknown;
783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif //_JS_DEFINE_H_
786