Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: fpdfsdk/include/javascript/JS_Define.h

Issue 932223002: Merge to XFA: Replace ugly JS_Define macros with templates. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@xfa
Patch Set: Address Bruce's comments. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #ifndef _JS_DEFINE_H_ 7 #ifndef _JS_DEFINE_H_
8 #define _JS_DEFINE_H_ 8 #define _JS_DEFINE_H_
9 9
10 typedef v8::Value JSValue; 10 typedef v8::Value JSValue;
11 typedef v8::Handle<v8::Object> JSObject; 11 typedef v8::Handle<v8::Object> JSObject;
12 typedef v8::Handle<v8::Object> JSFXObject; 12 typedef v8::Handle<v8::Object> JSFXObject;
13 typedef unsigned JSBool; 13 typedef unsigned JSBool;
14 14
15 #include "JS_Object.h"
16 #include "JS_Value.h"
17
15 struct JSConstSpec 18 struct JSConstSpec
16 { 19 {
17 const wchar_t* pName; 20 const wchar_t* pName;
18 double number; 21 double number;
19 const wchar_t* string; 22 const wchar_t* string;
20 FX_BYTE t; //0:double 1:str 23 FX_BYTE t; //0:double 1:str
21 }; 24 };
22 25
23 struct JSPropertySpec 26 struct JSPropertySpec
24 { 27 {
(...skipping 26 matching lines...) Expand all
51 #define JS_STATIC_CONST_ENTRY_STRING(const_name, pValue) {JS_WIDESTRING(const_na me), 0, JS_WIDESTRING(pValue), 1}, 54 #define JS_STATIC_CONST_ENTRY_STRING(const_name, pValue) {JS_WIDESTRING(const_na me), 0, JS_WIDESTRING(pValue), 1},
52 #define END_JS_STATIC_CONST() {0, 0, 0, 0}}; 55 #define END_JS_STATIC_CONST() {0, 0, 0, 0}};
53 56
54 #define BEGIN_JS_STATIC_PROP(js_class_name) JSPropertySpec js_class_name::JS_Cla ss_Properties[] = { 57 #define BEGIN_JS_STATIC_PROP(js_class_name) JSPropertySpec js_class_name::JS_Cla ss_Properties[] = {
55 #define JS_STATIC_PROP_ENTRY(prop_name) {JS_WIDESTRING(prop_name), get_##prop_na me##_static, set_##prop_name##_static}, 58 #define JS_STATIC_PROP_ENTRY(prop_name) {JS_WIDESTRING(prop_name), get_##prop_na me##_static, set_##prop_name##_static},
56 #define END_JS_STATIC_PROP() {0, 0, 0}}; 59 #define END_JS_STATIC_PROP() {0, 0, 0}};
57 60
58 #define BEGIN_JS_STATIC_METHOD(js_class_name) JSMethodSpec js_class_name::JS_Cla ss_Methods[] = { 61 #define BEGIN_JS_STATIC_METHOD(js_class_name) JSMethodSpec js_class_name::JS_Cla ss_Methods[] = {
59 #define JS_STATIC_METHOD_ENTRY(method_name, nargs) {JS_WIDESTRING(method_name), method_name##_static, nargs}, 62 #define JS_STATIC_METHOD_ENTRY(method_name, nargs) {JS_WIDESTRING(method_name), method_name##_static, nargs},
60 #define END_JS_STATIC_METHOD() {0, 0, 0}}; 63 #define END_JS_STATIC_METHOD() {0, 0, 0}};
61 #define MEMLEAKCHECK_1() ((void)0)
62 #define MEMLEAKCHECK_2(main_name, sub_name) ((void)0)
63
64
65 /*
66 #ifdef _DEBUG
67 #define MEMLEAKCHECK_1() \
68 _CrtMemState state1;\
69 _CrtMemCheckpoint(&state1);
70
71 #define MEMLEAKCHECK_2(main_name,sub_name) \
72 _CrtMemState state2;\
73 _CrtMemCheckpoint(&state2);\
74 _CrtMemState diff;\
75 _CrtMemDifference(&diff,&state1,&state2);\
76 if (diff.lSizes[_NORMAL_BLOCK] > 0)\
77 {\
78 TRACE("Detected normal block memory leaks in JS Module! [%s.%s]\ n",#main_name,#sub_name);\
79 _CrtMemDumpStatistics(&diff);\
80 }
81 #else
82 #define MEMLEAKCHECK_1() ((void)0)
83 #define MEMLEAKCHECK_2(main_name,sub_name) ((void)0)
84 #endif
85 */
86 64
87 /* ======================================== PROP CALLBACK ====================== ====================== */ 65 /* ======================================== PROP CALLBACK ====================== ====================== */
88 66
89 #define JS_STATIC_PROP_GET(prop_name, class_name)\ 67 template <class C, FX_BOOL (C::*M)(IFXJS_Context*, CJS_PropValue&, JS_ErrorStrin g&)>
90 static void get_##prop_name##_static(v8::Local<v8::String> property, \ 68 void JSPropGetter(const char* prop_name_string,
91 const v8::PropertyCallbackInfo<v8::Value> & info) \ 69 const char* class_name_string,
92 {\ 70 v8::Local<v8::String> property,
93 » v8::Isolate* isolate = info.GetIsolate();\ 71 const v8::PropertyCallbackInfo<v8::Value>& info) {
94 » v8::Local<v8::Context> context = isolate->GetCurrentContext();\ 72 v8::Isolate* isolate = info.GetIsolate();
95 » IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)isolate->GetData(2);\ 73 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)isolate->GetData(2);
96 » if (pRuntime == NULL) return;\ 74 IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext();
97 » IFXJS_Context* cc = pRuntime->GetCurrentContext();\ 75 CJS_PropValue value(isolate);
98 » CJS_PropValue value(isolate);\ 76 value.StartGetting();
99 » value.StartGetting();\ 77 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());
100 » CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\ 78 C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject());
101 » ASSERT(pJSObj != NULL);\ 79 JS_ErrorString sError;
102 » class_name* pObj = (class_name*)pJSObj->GetEmbedObject();\ 80 if (!(pObj->*M)(pRuntimeContext, value, sError)) {
103 » ASSERT(pObj != NULL);\ 81 CFX_ByteString cbName;
104 » JS_ErrorString sError;\ 82 cbName.Format("%s.%s", class_name_string, prop_name_string);
105 » FX_BOOL bRet = FALSE;\ 83 JS_Error(NULL, CFX_WideString::FromLocal(cbName), sError);
106 » MEMLEAKCHECK_1();\ 84 return;
107 » bRet = pObj->prop_name(cc, value, sError);\ 85 }
108 » MEMLEAKCHECK_2(class_name, prop_name);\ 86 info.GetReturnValue().Set((v8::Handle<v8::Value>)value);
109 » if (bRet)\
110 » {\
111 » » info.GetReturnValue().Set((v8::Handle<v8::Value>)value);\
112 » » return ;\
113 » }\
114 » else\
115 » {\
116 » CFX_ByteString cbName;\
117 » » cbName.Format("%s.%s", #class_name, #prop_name);\
118 » » JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\
119 » » return ;\
120 » }\
121 } 87 }
122 88
123 #define JS_STATIC_PROP_SET(prop_name, class_name)\ 89 template <class C, FX_BOOL (C::*M)(IFXJS_Context*, CJS_PropValue&, JS_ErrorStrin g&)>
124 static void set_##prop_name##_static(v8::Local<v8::String> property, \ 90 void JSPropSetter(const char* prop_name_string,
125 v8::Local<v8::Value> value, \ 91 const char* class_name_string,
126 const v8::PropertyCallbackInfo<void>& inf o) \ 92 v8::Local<v8::String> property,
127 {\ 93 v8::Local<v8::Value> value,
128 » v8::Isolate* isolate = info.GetIsolate();\ 94 const v8::PropertyCallbackInfo<void>& info) {
129 » v8::Local<v8::Context> context = isolate->GetCurrentContext();\ 95 v8::Isolate* isolate = info.GetIsolate();
130 » IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)isolate->GetData(2);\ 96 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)isolate->GetData(2);
131 » if (pRuntime == NULL) return;\ 97 IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext();
132 » IFXJS_Context* cc = pRuntime->GetCurrentContext();\ 98 CJS_PropValue propValue(CJS_Value(isolate, value, VT_unknown));
133 » CJS_PropValue propValue(CJS_Value(isolate,value,VT_unknown));\ 99 propValue.StartSetting();
134 » propValue.StartSetting();\ 100 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());
135 » CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\ 101 C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject());
136 » ASSERT(pJSObj != NULL);\ 102 JS_ErrorString sError;
137 » class_name* pObj = (class_name*)pJSObj->GetEmbedObject();\ 103 if (!(pObj->*M)(pRuntimeContext, propValue, sError)) {
138 » ASSERT(pObj != NULL);\ 104 CFX_ByteString cbName;
139 » JS_ErrorString sError;\ 105 cbName.Format("%s.%s", class_name_string, prop_name_string);
140 » FX_BOOL bRet = FALSE;\ 106 JS_Error(NULL, CFX_WideString::FromLocal(cbName), sError);
141 » MEMLEAKCHECK_1();\ 107 }
142 » bRet = pObj->prop_name(cc, propValue, sError);\
143 » MEMLEAKCHECK_2(class_name, prop_name);\
144 » if (bRet)\
145 » {\
146 » » return ;\
147 » }\
148 » else\
149 » {\
150 » » CFX_ByteString cbName;\
151 » » cbName.Format("%s.%s", #class_name, #prop_name);\
152 » » JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\
153 » » return ;\
154 » }\
155 } 108 }
156 109
157 #define JS_STATIC_PROP(prop_name, class_name)\ 110 #define JS_STATIC_PROP(prop_name, class_name) \
158 JS_STATIC_PROP_GET(prop_name, class_name);\ 111 static void get_##prop_name##_static( \
159 JS_STATIC_PROP_SET(prop_name, class_name) 112 v8::Local<v8::String> property, \
113 const v8::PropertyCallbackInfo<v8::Value>& info) { \
114 JSPropGetter<class_name, &class_name::prop_name>( \
115 #prop_name, #class_name, property, info); \
116 } \
117 static void set_##prop_name##_static( \
118 v8::Local<v8::String> property, \
119 v8::Local<v8::Value> value, \
120 const v8::PropertyCallbackInfo<void>& info) { \
121 JSPropSetter<class_name, &class_name::prop_name>( \
122 #prop_name, #class_name, property, value, info); \
123 }
160 124
161 /* ========================================= METHOD CALLBACK =================== ======================== */ 125 /* ========================================= METHOD CALLBACK =================== ======================== */
162 126
163 #define JS_STATIC_METHOD(method_name, class_name)\ 127 template <class C, FX_BOOL (C::*M)(IFXJS_Context*, const CJS_Parameters&, CJS_Va lue&, JS_ErrorString&)>
164 static void method_name##_static(const v8::FunctionCallbackInfo<v8::Value>& in fo) \ 128 void JSMethod(const char* method_name_string,
165 {\ 129 const char* class_name_string,
166 » v8::Isolate* isolate = info.GetIsolate();\ 130 const v8::FunctionCallbackInfo<v8::Value>& info) {
167 » v8::Local<v8::Context> context = isolate->GetCurrentContext();\ 131 v8::Isolate* isolate = info.GetIsolate();
168 » IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)isolate->GetData(2);\ 132 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)isolate->GetData(2);
169 » if (pRuntime == NULL) return;\ 133 IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext();
170 » IFXJS_Context* cc = pRuntime->GetCurrentContext();\ 134 CJS_Parameters parameters;
171 » CJS_Parameters parameters;\ 135 for (unsigned int i = 0; i<(unsigned int)info.Length(); i++) {
172 » for (unsigned int i = 0; i<(unsigned int)info.Length(); i++)\ 136 parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));
173 {\ 137 }
174 » » parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));\ 138 CJS_Value valueRes(isolate);
175 » }\ 139 CJS_Object* pJSObj = (CJS_Object *)JS_GetPrivate(isolate,info.Holder());
176 » CJS_Value valueRes(isolate);\ 140 C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject());
177 » CJS_Object* pJSObj = (CJS_Object *)JS_GetPrivate(isolate,info.Holder()); \ 141 JS_ErrorString sError;
178 » ASSERT(pJSObj != NULL);\ 142 if (!(pObj->*M)(pRuntimeContext, parameters, valueRes, sError)) {
179 » class_name* pObj = (class_name*)pJSObj->GetEmbedObject();\ 143 CFX_ByteString cbName;
180 » ASSERT(pObj != NULL);\ 144 cbName.Format("%s.%s", class_name_string, method_name_string);
181 » JS_ErrorString sError;\ 145 JS_Error(NULL, CFX_WideString::FromLocal(cbName), sError);
182 » FX_BOOL bRet = FALSE;\ 146 return;
183 » MEMLEAKCHECK_1();\ 147 }
184 » bRet = pObj->method_name(cc, parameters, valueRes, sError);\ 148 info.GetReturnValue().Set(valueRes.ToJSValue());
185 » MEMLEAKCHECK_2(class_name, method_name);\
186 » if (bRet)\
187 » {\
188 » » info.GetReturnValue().Set(valueRes.ToJSValue());\
189 » » return ;\
190 » }\
191 » else\
192 » {\
193 » » CFX_ByteString cbName;\
194 » » cbName.Format("%s.%s", #class_name, #method_name);\
195 » » JS_Error(NULL, CFX_WideString::FromLocal(cbName), sError);\
196 » » return ;\
197 » }\
198 } 149 }
199 150
151 #define JS_STATIC_METHOD(method_name, class_name) \
152 static void method_name##_static( \
153 const v8::FunctionCallbackInfo<v8::Value>& info) { \
154 JSMethod<class_name, &class_name::method_name>( \
155 #class_name, #method_name, info); \
156 }
157
158 #define JS_SPECIAL_STATIC_METHOD(method_name, class_alternate, class_name) \
159 static void method_name##_static( \
160 const v8::FunctionCallbackInfo<v8::Value>& info) { \
161 JSMethod<class_alternate, &class_alternate::method_name>( \
162 #class_name, #method_name, info); \
163 }
164
200 /* ===================================== JS CLASS ============================== ================= */ 165 /* ===================================== JS CLASS ============================== ================= */
201 166
202 #define DECLARE_JS_CLASS(js_class_name) \ 167 #define DECLARE_JS_CLASS(js_class_name) \
203 static JSBool JSConstructor(IFXJS_Context* cc, JSFXObject obj,JSFXObject global);\ 168 static JSBool JSConstructor(IFXJS_Context* cc, JSFXObject obj,JSFXObject global);\
204 static JSBool JSDestructor(JSFXObject obj);\ 169 static JSBool JSDestructor(JSFXObject obj);\
205 static int Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType);\ 170 static int Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType);\
206 static void GetConsts(JSConstSpec*& pConsts, int& nSize);\ 171 static void GetConsts(JSConstSpec*& pConsts, int& nSize);\
207 static void GetProperties(JSPropertySpec*& pProperties, int& nSize);\ 172 static void GetProperties(JSPropertySpec*& pProperties, int& nSize);\
208 static void GetMethods(JSMethodSpec*& pMethods, int& nSize);\ 173 static void GetMethods(JSMethodSpec*& pMethods, int& nSize);\
209 static JSConstSpec JS_Class_Consts[];\ 174 static JSConstSpec JS_Class_Consts[];\
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 void js_class_name::queryprop_##js_class_name##_static(JS_PROPQUERY_ARGS )\ 290 void js_class_name::queryprop_##js_class_name##_static(JS_PROPQUERY_ARGS )\
326 {\ 291 {\
327 v8::Isolate* isolate = info.GetIsolate();\ 292 v8::Isolate* isolate = info.GetIsolate();\
328 v8::String::Utf8Value utf8_value(property);\ 293 v8::String::Utf8Value utf8_value(property);\
329 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\ 294 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\
330 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\ 295 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
331 ASSERT(pJSObj != NULL);\ 296 ASSERT(pJSObj != NULL);\
332 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\ 297 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\
333 ASSERT(pObj != NULL);\ 298 ASSERT(pObj != NULL);\
334 FX_BOOL bRet = FALSE;\ 299 FX_BOOL bRet = FALSE;\
335 MEMLEAKCHECK_1();\
336 bRet = pObj->QueryProperty(propname.c_str());\ 300 bRet = pObj->QueryProperty(propname.c_str());\
337 MEMLEAKCHECK_2(class_name, prop_name.c_str());\
338 if (bRet)\ 301 if (bRet)\
339 {\ 302 {\
340 info.GetReturnValue().Set(0x004);\ 303 info.GetReturnValue().Set(0x004);\
341 return ;\ 304 return ;\
342 }\ 305 }\
343 else\ 306 else\
344 {\ 307 {\
345 info.GetReturnValue().Set(0);\ 308 info.GetReturnValue().Set(0);\
346 return ;\ 309 return ;\
347 }\ 310 }\
348 return ;\ 311 return ;\
349 }\ 312 }\
350 void js_class_name::getprop_##js_class_name##_static(JS_NAMED_PROPGET_AR GS)\ 313 void js_class_name::getprop_##js_class_name##_static(JS_NAMED_PROPGET_AR GS)\
351 {\ 314 {\
352 v8::Isolate* isolate = info.GetIsolate();\ 315 v8::Isolate* isolate = info.GetIsolate();\
353 v8::Local<v8::Context> context = isolate->GetCurrentContext();\ 316 v8::Local<v8::Context> context = isolate->GetCurrentContext();\
354 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)isolate->GetData(2);\ 317 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)isolate->GetData(2);\
355 if (pRuntime == NULL) return;\ 318 if (pRuntime == NULL) return;\
356 IFXJS_Context* cc = pRuntime->GetCurrentContext();\ 319 IFXJS_Context* cc = pRuntime->GetCurrentContext();\
357 v8::String::Utf8Value utf8_value(property);\ 320 v8::String::Utf8Value utf8_value(property);\
358 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\ 321 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\
359 CJS_PropValue value(isolate);\ 322 CJS_PropValue value(isolate);\
360 value.StartGetting();\ 323 value.StartGetting();\
361 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\ 324 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
362 ASSERT(pJSObj != NULL);\ 325 ASSERT(pJSObj != NULL);\
363 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\ 326 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\
364 ASSERT(pObj != NULL);\ 327 ASSERT(pObj != NULL);\
365 JS_ErrorString sError;\ 328 JS_ErrorString sError;\
366 FX_BOOL bRet = FALSE;\ 329 FX_BOOL bRet = FALSE;\
367 MEMLEAKCHECK_1();\
368 bRet = pObj->DoProperty(cc, propname.c_str(), value, sError);\ 330 bRet = pObj->DoProperty(cc, propname.c_str(), value, sError);\
369 MEMLEAKCHECK_2(class_name, L"GetProperty");\
370 if (bRet)\ 331 if (bRet)\
371 {\ 332 {\
372 info.GetReturnValue().Set((v8::Handle<v8::Value>)value);\ 333 info.GetReturnValue().Set((v8::Handle<v8::Value>)value);\
373 return ;\ 334 return ;\
374 }\ 335 }\
375 else\ 336 else\
376 {\ 337 {\
377 CFX_ByteString cbName;\ 338 CFX_ByteString cbName;\
378 cbName.Format("%s.%s", #class_name, L"GetProperty");\ 339 cbName.Format("%s.%s", #class_name, L"GetProperty");\
379 JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\ 340 JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\
(...skipping 12 matching lines...) Expand all
392 v8::String::Utf8Value utf8_value(property);\ 353 v8::String::Utf8Value utf8_value(property);\
393 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\ 354 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\
394 CJS_PropValue PropValue(CJS_Value(isolate,value,VT_unknown));\ 355 CJS_PropValue PropValue(CJS_Value(isolate,value,VT_unknown));\
395 PropValue.StartSetting();\ 356 PropValue.StartSetting();\
396 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\ 357 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
397 if(!pJSObj) return;\ 358 if(!pJSObj) return;\
398 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\ 359 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\
399 ASSERT(pObj != NULL);\ 360 ASSERT(pObj != NULL);\
400 JS_ErrorString sError;\ 361 JS_ErrorString sError;\
401 FX_BOOL bRet = FALSE;\ 362 FX_BOOL bRet = FALSE;\
402 MEMLEAKCHECK_1();\
403 bRet = pObj->DoProperty(cc, propname.c_str(), PropValue, sError);\ 363 bRet = pObj->DoProperty(cc, propname.c_str(), PropValue, sError);\
404 MEMLEAKCHECK_2(class_name,L"PutProperty");\
405 if (bRet)\ 364 if (bRet)\
406 {\ 365 {\
407 return ;\ 366 return ;\
408 }\ 367 }\
409 else\ 368 else\
410 {\ 369 {\
411 CFX_ByteString cbName;\ 370 CFX_ByteString cbName;\
412 cbName.Format("%s.%s", #class_name, "PutProperty");\ 371 cbName.Format("%s.%s", #class_name, "PutProperty");\
413 JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\ 372 JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\
414 return ;\ 373 return ;\
415 }\ 374 }\
416 JS_Error(NULL,L"PutProperty", L"Embeded object not found!");\ 375 JS_Error(NULL,L"PutProperty", L"Embeded object not found!");\
417 return ;\ 376 return ;\
418 }\ 377 }\
419 void js_class_name::delprop_##js_class_name##_static(JS_PROPDEL_ARGS)\ 378 void js_class_name::delprop_##js_class_name##_static(JS_PROPDEL_ARGS)\
420 {\ 379 {\
421 v8::Isolate* isolate = info.GetIsolate();\ 380 v8::Isolate* isolate = info.GetIsolate();\
422 v8::Local<v8::Context> context = isolate->GetCurrentContext();\ 381 v8::Local<v8::Context> context = isolate->GetCurrentContext();\
423 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)isolate->GetData(2);\ 382 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)isolate->GetData(2);\
424 if (pRuntime == NULL) return;\ 383 if (pRuntime == NULL) return;\
425 IFXJS_Context* cc = pRuntime->GetCurrentContext();\ 384 IFXJS_Context* cc = pRuntime->GetCurrentContext();\
426 v8::String::Utf8Value utf8_value(property);\ 385 v8::String::Utf8Value utf8_value(property);\
427 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\ 386 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\
428 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\ 387 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
429 ASSERT(pJSObj != NULL);\ 388 ASSERT(pJSObj != NULL);\
430 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\ 389 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\
431 ASSERT(pObj != NULL);\ 390 ASSERT(pObj != NULL);\
432 JS_ErrorString sError;\ 391 JS_ErrorString sError;\
433 FX_BOOL bRet = FALSE;\ 392 FX_BOOL bRet = FALSE;\
434 MEMLEAKCHECK_1();\
435 bRet = pObj->DelProperty(cc, propname.c_str(), sError);\ 393 bRet = pObj->DelProperty(cc, propname.c_str(), sError);\
436 MEMLEAKCHECK_2(class_name,L"DelProperty");\
437 if (bRet)\ 394 if (bRet)\
438 {\ 395 {\
439 return ;\ 396 return ;\
440 }\ 397 }\
441 else\ 398 else\
442 {\ 399 {\
443 CFX_ByteString cbName;\ 400 CFX_ByteString cbName;\
444 cbName.Format("%s.%s", #class_name, "DelProperty");\ 401 cbName.Format("%s.%s", #class_name, "DelProperty");\
445 return ;\ 402 return ;\
446 }\ 403 }\
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 {\ 453 {\
497 pProperties = JS_Class_Properties;\ 454 pProperties = JS_Class_Properties;\
498 nSize = sizeof(JS_Class_Properties)/sizeof(JSPropertySpec)-1;\ 455 nSize = sizeof(JS_Class_Properties)/sizeof(JSPropertySpec)-1;\
499 }\ 456 }\
500 void js_class_name::GetMethods(JSMethodSpec*& pMethods, int& nSize)\ 457 void js_class_name::GetMethods(JSMethodSpec*& pMethods, int& nSize)\
501 {\ 458 {\
502 pMethods = JS_Class_Methods;\ 459 pMethods = JS_Class_Methods;\
503 nSize = sizeof(JS_Class_Methods)/sizeof(JSMethodSpec)-1;\ 460 nSize = sizeof(JS_Class_Methods)/sizeof(JSMethodSpec)-1;\
504 } 461 }
505 462
506 #define JS_SPECIAL_STATIC_METHOD(method_name, class_alternate, class_name)\ 463 /* ======================================== GLOBAL METHODS ===================== ======================= */
507 » static void method_name##_static(const v8::FunctionCallbackInfo<v8::Valu e>& info)\ 464
508 {\ 465 template <FX_BOOL (*F)(IFXJS_Context*, const CJS_Parameters&, CJS_Value&, JS_Err orString&)>
509 » v8::Isolate* isolate = info.GetIsolate();\ 466 void JSGlobalFunc(const char *func_name_string,
510 » v8::Local<v8::Context> context = isolate->GetCurrentContext();\ 467 const v8::FunctionCallbackInfo<v8::Value>& info) {
511 » IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)isolate->GetData(2);\ 468 v8::Isolate* isolate = info.GetIsolate();
512 » if (pRuntime == NULL) return;\ 469 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)isolate->GetData(2);
513 » IFXJS_Context* cc = pRuntime->GetCurrentContext();\ 470 IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext();
514 » CJS_Parameters parameters;\ 471 CJS_Parameters parameters;
515 » for (unsigned int i = 0; i<(unsigned int)info.Length(); i++)\ 472 for (unsigned int i = 0; i<(unsigned int)info.Length(); i++) {
516 » {\ 473 parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));
517 » parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));\ 474 }
518 » }\ 475 CJS_Value valueRes(isolate);
519 » CJS_Value valueRes(isolate);\ 476 JS_ErrorString sError;
520 » CJS_Object* pJSObj = (CJS_Object *)JS_GetPrivate(isolate, info.Holder()) ;\ 477 if (!(*F)(pRuntimeContext, parameters, valueRes, sError))
521 » ASSERT(pJSObj != NULL);\ 478 {
522 » class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\ 479 JS_Error(NULL, JS_WIDESTRING(fun_name), sError);
523 » ASSERT(pObj != NULL);\ 480 return;
524 » JS_ErrorString sError;\ 481 }
525 » FX_BOOL bRet = FALSE;\ 482 info.GetReturnValue().Set(valueRes.ToJSValue());
526 » MEMLEAKCHECK_1();\
527 » bRet = pObj->method_name(cc, parameters, valueRes, sError);\
528 » MEMLEAKCHECK_2(class_name, method_name);\
529 » if (bRet)\
530 » {\
531 » » info.GetReturnValue().Set(valueRes.ToJSValue());\
532 » » return ;\
533 » }\
534 » else\
535 » {\
536 » » CFX_ByteString cbName;\
537 » » cbName.Format("%s.%s", #class_name, #method_name);\
538 » » JS_Error(NULL, CFX_WideString::FromLocal(cbName), sError);\
539 » » return ;\
540 » }\
541 » JS_Error(NULL, JS_WIDESTRING(method_name), L"Embeded object not found!" );\
542 return ;\
543 } 483 }
544 484
545 /* ======================================== GLOBAL METHODS ===================== ======================= */
546 #define JS_STATIC_GLOBAL_FUN(fun_name) \ 485 #define JS_STATIC_GLOBAL_FUN(fun_name) \
547 static void fun_name##_static(const v8::FunctionCallbackInfo<v8::Value>& info)\ 486 static void fun_name##_static(const v8::FunctionCallbackInfo<v8::Value>& info) { \
548 {\ 487 JSGlobalFunc<fun_name>(#fun_name, info); \
549 » v8::Isolate* isolate = info.GetIsolate();\ 488 }
550 » v8::Local<v8::Context> context = isolate->GetCurrentContext();\
551 » IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)isolate->GetData(2);\
552 » if (pRuntime == NULL) return;\
553 » IFXJS_Context* cc = pRuntime->GetCurrentContext();\
554 » CJS_Parameters parameters;\
555 » for (unsigned int i = 0; i<(unsigned int)info.Length(); i++)\
556 » {\
557 » parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));\
558 » }\
559 » CJS_Value valueRes(isolate);\
560 » JS_ErrorString sError;\
561 » if (!fun_name(cc, parameters, valueRes, sError))\
562 » {\
563 » » JS_Error(NULL, JS_WIDESTRING(fun_name), sError);\
564 » » return ;\
565 » }\
566 » info.GetReturnValue().Set(valueRes.ToJSValue());\
567 » return ;\
568 }
569 489
570 #define JS_STATIC_DECLARE_GLOBAL_FUN() \ 490 #define JS_STATIC_DECLARE_GLOBAL_FUN() \
571 static JSMethodSpec global_methods[]; \ 491 static JSMethodSpec global_methods[]; \
572 static int Init(IJS_Runtime* pRuntime) 492 static int Init(IJS_Runtime* pRuntime)
573 493
574 #define BEGIN_JS_STATIC_GLOBAL_FUN(js_class_name) \ 494 #define BEGIN_JS_STATIC_GLOBAL_FUN(js_class_name) \
575 JSMethodSpec js_class_name::global_methods[] = { 495 JSMethodSpec js_class_name::global_methods[] = {
576 496
577 #define JS_STATIC_GLOBAL_FUN_ENTRY(method_name,nargs) JS_STATIC_METHOD_ENTRY(met hod_name,nargs) 497 #define JS_STATIC_GLOBAL_FUN_ENTRY(method_name,nargs) JS_STATIC_METHOD_ENTRY(met hod_name,nargs)
578 498
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
614 534
615 #define VALUE_NAME_STRING L"string" 535 #define VALUE_NAME_STRING L"string"
616 #define VALUE_NAME_NUMBER L"number" 536 #define VALUE_NAME_NUMBER L"number"
617 #define VALUE_NAME_BOOLEAN L"boolean" 537 #define VALUE_NAME_BOOLEAN L"boolean"
618 #define VALUE_NAME_DATE L"date" 538 #define VALUE_NAME_DATE L"date"
619 #define VALUE_NAME_OBJECT L"object" 539 #define VALUE_NAME_OBJECT L"object"
620 #define VALUE_NAME_FXOBJ L"fxobj" 540 #define VALUE_NAME_FXOBJ L"fxobj"
621 #define VALUE_NAME_NULL L"null" 541 #define VALUE_NAME_NULL L"null"
622 #define VALUE_NAME_UNDEFINED L"undefined" 542 #define VALUE_NAME_UNDEFINED L"undefined"
623 543
624 #define CLASSNAME_ARRAY L"Array"
625 #define CLASSNAME_DATE L"Date"
626 #define CLASSNAME_STRING L"v8::String"
627
628 FXJSVALUETYPE GET_VALUE_TYPE(v8::Handle<v8::Value> p); 544 FXJSVALUETYPE GET_VALUE_TYPE(v8::Handle<v8::Value> p);
629 545
630 #endif //_JS_DEFINE_H_ 546 #endif //_JS_DEFINE_H_
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698