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

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

Issue 908033002: Replace ugly JS_Define macros with templates (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@js_global_func
Patch Set: kill more unused #defines 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* cc, CJS_PropValue& vp, JS_Erro rString& sError)>
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 » v8::Local<v8::Value> v = context->GetEmbedderData(1);\ 73 v8::Local<v8::Context> context = isolate->GetCurrentContext();
96 » ASSERT(!v.IsEmpty());\ 74 v8::Local<v8::Value> v = context->GetEmbedderData(1);
97 » if(v.IsEmpty()) return;\ 75 v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);
98 » v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\ 76 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();
99 » IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\ 77 IFXJS_Context* pContext = pRuntime->GetCurrentContext();
100 » IFXJS_Context* cc = pRuntime->GetCurrentContext();\ 78 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());
101 » CJS_PropValue value(isolate);\ 79 C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject());
102 » value.StartGetting();\ 80 JS_ErrorString sError;
103 » CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\ 81 CJS_PropValue value(isolate);
104 » ASSERT(pJSObj != NULL);\ 82 value.StartGetting();
105 » class_name* pObj = (class_name*)pJSObj->GetEmbedObject();\ 83 if (!(pObj->*M)(pContext, value, sError)) {
106 » ASSERT(pObj != NULL);\ 84 CFX_ByteString cbName;
107 » JS_ErrorString sError;\ 85 cbName.Format("%s.%s", class_name_string, prop_name_string);
108 » FX_BOOL bRet = FALSE;\ 86 JS_Error(NULL, CFX_WideString::FromLocal(cbName), sError);
109 » MEMLEAKCHECK_1();\ 87 return;
110 » bRet = pObj->prop_name(cc, value, sError);\ 88 }
111 » MEMLEAKCHECK_2(class_name, prop_name);\ 89 info.GetReturnValue().Set((v8::Handle<v8::Value>)value);
112 » if (bRet)\
113 » {\
114 » » info.GetReturnValue().Set((v8::Handle<v8::Value>)value);\
115 » » return ;\
116 » }\
117 » else\
118 » {\
119 » CFX_ByteString cbName;\
120 » » cbName.Format("%s.%s", #class_name, #prop_name);\
121 » » JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\
122 » » return ;\
123 » }\
124 } 90 }
125 91
126 #define JS_STATIC_PROP_SET(prop_name, class_name)\ 92 template <class C, FX_BOOL (C::*M)(IFXJS_Context* cc, CJS_PropValue& vp, JS_Erro rString& sError)>
127 static void set_##prop_name##_static(v8::Local<v8::String> property, \ 93 void JSPropSetter(const char* prop_name_string,
128 v8::Local<v8::Value> value, \ 94 const char* class_name_string,
129 const v8::PropertyCallbackInfo<void>& inf o) \ 95 v8::Local<v8::String> property,
130 {\ 96 v8::Local<v8::Value> value,
131 » v8::Isolate* isolate = info.GetIsolate();\ 97 const v8::PropertyCallbackInfo<void>& info) {
132 » v8::Local<v8::Context> context = isolate->GetCurrentContext();\ 98 v8::Isolate* isolate = info.GetIsolate();
133 » v8::Local<v8::Value> v = context->GetEmbedderData(1);\ 99 v8::Local<v8::Context> context = isolate->GetCurrentContext();
134 » ASSERT(!v.IsEmpty());\ 100 v8::Local<v8::Value> v = context->GetEmbedderData(1);
135 » if(v.IsEmpty()) return;\ 101 v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);
136 » v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\ 102 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();
137 » IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\ 103 IFXJS_Context* pContext = pRuntime->GetCurrentContext();
138 » IFXJS_Context* cc = pRuntime->GetCurrentContext();\ 104 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());
139 » CJS_PropValue propValue(CJS_Value(isolate,value,VT_unknown));\ 105 C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject());
140 » propValue.StartSetting();\ 106 JS_ErrorString sError;
141 » CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\ 107 CJS_PropValue propValue(CJS_Value(isolate, value, VT_unknown));
142 » ASSERT(pJSObj != NULL);\ 108 propValue.StartSetting();
143 » class_name* pObj = (class_name*)pJSObj->GetEmbedObject();\ 109 if (!(pObj->*M)(pContext, propValue, sError)) {
144 » ASSERT(pObj != NULL);\ 110 CFX_ByteString cbName;
145 » JS_ErrorString sError;\ 111 cbName.Format("%s.%s", class_name_string, prop_name_string);
146 » FX_BOOL bRet = FALSE;\ 112 JS_Error(NULL, CFX_WideString::FromLocal(cbName), sError);
147 » MEMLEAKCHECK_1();\ 113 }
148 » bRet = pObj->prop_name(cc, propValue, sError);\
149 » MEMLEAKCHECK_2(class_name, prop_name);\
150 » if (bRet)\
151 » {\
152 » » return ;\
153 » }\
154 » else\
155 » {\
156 » » CFX_ByteString cbName;\
157 » » cbName.Format("%s.%s", #class_name, #prop_name);\
158 » » JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\
159 » » return ;\
160 » }\
161 } 114 }
162 115
163 #define JS_STATIC_PROP(prop_name, class_name)\ 116 #define JS_STATIC_PROP(prop_name, class_name) \
164 JS_STATIC_PROP_GET(prop_name, class_name);\ 117 static void get_##prop_name##_static( \
165 JS_STATIC_PROP_SET(prop_name, class_name) 118 v8::Local<v8::String> property, \
119 const v8::PropertyCallbackInfo<v8::Value>& info) { \
120 JSPropGetter<class_name, &class_name::prop_name>( \
121 #prop_name, #class_name, property, info); \
122 } \
123 static void set_##prop_name##_static( \
124 v8::Local<v8::String> property, \
125 v8::Local<v8::Value> value, \
126 const v8::PropertyCallbackInfo<void>& info) { \
127 JSPropSetter<class_name, &class_name::prop_name>( \
128 #prop_name, #class_name, property, value, info); \
129 }
166 130
167 /* ========================================= METHOD CALLBACK =================== ======================== */ 131 /* ========================================= METHOD CALLBACK =================== ======================== */
168 132
169 #define JS_STATIC_METHOD(method_name, class_name)\ 133 template <class C, FX_BOOL (C::*M)(IFXJS_Context* cc, const CJS_Parameters& para ms, CJS_Value& vRet, JS_ErrorString& sError)>
170 static void method_name##_static(const v8::FunctionCallbackInfo<v8::Value>& in fo) \ 134 void JSMethod(const char* method_name_string,
171 {\ 135 const char* class_name_string,
172 » v8::Isolate* isolate = info.GetIsolate();\ 136 const v8::FunctionCallbackInfo<v8::Value>& info) {
173 » v8::Local<v8::Context> context = isolate->GetCurrentContext();\ 137 v8::Isolate* isolate = info.GetIsolate();
174 » v8::Local<v8::Value> v = context->GetEmbedderData(1);\ 138 v8::Local<v8::Context> context = isolate->GetCurrentContext();
175 » ASSERT(!v.IsEmpty());\ 139 v8::Local<v8::Value> v = context->GetEmbedderData(1);
176 » if(v.IsEmpty()) return;\ 140 v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);
177 » v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\ 141 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();
178 » IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\ 142 IFXJS_Context* cc = pRuntime->GetCurrentContext();
179 » IFXJS_Context* cc = pRuntime->GetCurrentContext();\ 143 CJS_Parameters parameters;
180 » CJS_Parameters parameters;\ 144 for (unsigned int i = 0; i<(unsigned int)info.Length(); i++) {
181 » for (unsigned int i = 0; i<(unsigned int)info.Length(); i++)\ 145 parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));
182 {\ 146 }
183 » » parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));\ 147 CJS_Value valueRes(isolate);
184 » }\ 148 CJS_Object* pJSObj = (CJS_Object *)JS_GetPrivate(isolate,info.Holder());
185 » CJS_Value valueRes(isolate);\ 149 C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject());
186 » CJS_Object* pJSObj = (CJS_Object *)JS_GetPrivate(isolate,info.Holder()); \ 150 JS_ErrorString sError;
187 » ASSERT(pJSObj != NULL);\ 151 if (!(pObj->*M)(cc, parameters, valueRes, sError)) {
188 » class_name* pObj = (class_name*)pJSObj->GetEmbedObject();\ 152 CFX_ByteString cbName;
189 » ASSERT(pObj != NULL);\ 153 cbName.Format("%s.%s", class_name_string, method_name_string);
190 » JS_ErrorString sError;\ 154 JS_Error(NULL, CFX_WideString::FromLocal(cbName), sError);
191 » FX_BOOL bRet = FALSE;\ 155 return;
192 » MEMLEAKCHECK_1();\ 156 }
193 » bRet = pObj->method_name(cc, parameters, valueRes, sError);\ 157 info.GetReturnValue().Set(valueRes.ToJSValue());
194 » MEMLEAKCHECK_2(class_name, method_name);\
195 » if (bRet)\
196 » {\
197 » » info.GetReturnValue().Set(valueRes.ToJSValue());\
198 » » return ;\
199 » }\
200 » else\
201 » {\
202 » » CFX_ByteString cbName;\
203 » » cbName.Format("%s.%s", #class_name, #method_name);\
204 » » JS_Error(NULL, CFX_WideString::FromLocal(cbName), sError);\
205 » » return ;\
206 » }\
207 } 158 }
208 159
160 #define JS_STATIC_METHOD(method_name, class_name) \
161 static void method_name##_static( \
162 const v8::FunctionCallbackInfo<v8::Value>& info) { \
163 JSMethod<class_name, &class_name::method_name>( \
164 #class_name, #method_name, info); \
165 }
166
167 #define JS_SPECIAL_STATIC_METHOD(method_name, class_alternate, class_name) \
168 static void method_name##_static( \
169 const v8::FunctionCallbackInfo<v8::Value>& info) { \
170 JSMethod<class_alternate, &class_alternate::method_name>( \
171 #class_name, #method_name, info); \
172 }
173
209 /* ===================================== JS CLASS ============================== ================= */ 174 /* ===================================== JS CLASS ============================== ================= */
210 175
211 #define DECLARE_JS_CLASS(js_class_name) \ 176 #define DECLARE_JS_CLASS(js_class_name) \
212 static JSBool JSConstructor(IFXJS_Context* cc, JSFXObject obj,JSFXObject global);\ 177 static JSBool JSConstructor(IFXJS_Context* cc, JSFXObject obj,JSFXObject global);\
213 static JSBool JSDestructor(JSFXObject obj);\ 178 static JSBool JSDestructor(JSFXObject obj);\
214 static int Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType);\ 179 static int Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType);\
215 static void GetConsts(JSConstSpec*& pConsts, int& nSize);\ 180 static void GetConsts(JSConstSpec*& pConsts, int& nSize);\
216 static void GetProperties(JSPropertySpec*& pProperties, int& nSize);\ 181 static void GetProperties(JSPropertySpec*& pProperties, int& nSize);\
217 static void GetMethods(JSMethodSpec*& pMethods, int& nSize);\ 182 static void GetMethods(JSMethodSpec*& pMethods, int& nSize);\
218 static JSConstSpec JS_Class_Consts[];\ 183 static JSConstSpec JS_Class_Consts[];\
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 void js_class_name::queryprop_##js_class_name##_static(JS_PROPQUERY_ARGS )\ 299 void js_class_name::queryprop_##js_class_name##_static(JS_PROPQUERY_ARGS )\
335 {\ 300 {\
336 v8::Isolate* isolate = info.GetIsolate();\ 301 v8::Isolate* isolate = info.GetIsolate();\
337 v8::String::Utf8Value utf8_value(property);\ 302 v8::String::Utf8Value utf8_value(property);\
338 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\ 303 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\
339 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\ 304 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
340 ASSERT(pJSObj != NULL);\ 305 ASSERT(pJSObj != NULL);\
341 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\ 306 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\
342 ASSERT(pObj != NULL);\ 307 ASSERT(pObj != NULL);\
343 FX_BOOL bRet = FALSE;\ 308 FX_BOOL bRet = FALSE;\
344 MEMLEAKCHECK_1();\
345 bRet = pObj->QueryProperty(propname.c_str());\ 309 bRet = pObj->QueryProperty(propname.c_str());\
346 MEMLEAKCHECK_2(class_name, prop_name.c_str());\
347 if (bRet)\ 310 if (bRet)\
348 {\ 311 {\
349 info.GetReturnValue().Set(0x004);\ 312 info.GetReturnValue().Set(0x004);\
350 return ;\ 313 return ;\
351 }\ 314 }\
352 else\ 315 else\
353 {\ 316 {\
354 info.GetReturnValue().Set(0);\ 317 info.GetReturnValue().Set(0);\
355 return ;\ 318 return ;\
356 }\ 319 }\
(...skipping 12 matching lines...) Expand all
369 v8::String::Utf8Value utf8_value(property);\ 332 v8::String::Utf8Value utf8_value(property);\
370 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\ 333 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\
371 CJS_PropValue value(isolate);\ 334 CJS_PropValue value(isolate);\
372 value.StartGetting();\ 335 value.StartGetting();\
373 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\ 336 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
374 ASSERT(pJSObj != NULL);\ 337 ASSERT(pJSObj != NULL);\
375 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\ 338 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\
376 ASSERT(pObj != NULL);\ 339 ASSERT(pObj != NULL);\
377 JS_ErrorString sError;\ 340 JS_ErrorString sError;\
378 FX_BOOL bRet = FALSE;\ 341 FX_BOOL bRet = FALSE;\
379 MEMLEAKCHECK_1();\
380 bRet = pObj->DoProperty(cc, propname.c_str(), value, sError);\ 342 bRet = pObj->DoProperty(cc, propname.c_str(), value, sError);\
381 MEMLEAKCHECK_2(class_name, L"GetProperty");\
382 if (bRet)\ 343 if (bRet)\
383 {\ 344 {\
384 info.GetReturnValue().Set((v8::Handle<v8::Value>)value);\ 345 info.GetReturnValue().Set((v8::Handle<v8::Value>)value);\
385 return ;\ 346 return ;\
386 }\ 347 }\
387 else\ 348 else\
388 {\ 349 {\
389 CFX_ByteString cbName;\ 350 CFX_ByteString cbName;\
390 cbName.Format("%s.%s", #class_name, L"GetProperty");\ 351 cbName.Format("%s.%s", #class_name, L"GetProperty");\
391 JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\ 352 JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\
(...skipping 15 matching lines...) Expand all
407 v8::String::Utf8Value utf8_value(property);\ 368 v8::String::Utf8Value utf8_value(property);\
408 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\ 369 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\
409 CJS_PropValue PropValue(CJS_Value(isolate,value,VT_unknown));\ 370 CJS_PropValue PropValue(CJS_Value(isolate,value,VT_unknown));\
410 PropValue.StartSetting();\ 371 PropValue.StartSetting();\
411 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\ 372 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
412 if(!pJSObj) return;\ 373 if(!pJSObj) return;\
413 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\ 374 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\
414 ASSERT(pObj != NULL);\ 375 ASSERT(pObj != NULL);\
415 JS_ErrorString sError;\ 376 JS_ErrorString sError;\
416 FX_BOOL bRet = FALSE;\ 377 FX_BOOL bRet = FALSE;\
417 MEMLEAKCHECK_1();\
418 bRet = pObj->DoProperty(cc, propname.c_str(), PropValue, sError);\ 378 bRet = pObj->DoProperty(cc, propname.c_str(), PropValue, sError);\
419 MEMLEAKCHECK_2(class_name,L"PutProperty");\
420 if (bRet)\ 379 if (bRet)\
421 {\ 380 {\
422 return ;\ 381 return ;\
423 }\ 382 }\
424 else\ 383 else\
425 {\ 384 {\
426 CFX_ByteString cbName;\ 385 CFX_ByteString cbName;\
427 cbName.Format("%s.%s", #class_name, "PutProperty");\ 386 cbName.Format("%s.%s", #class_name, "PutProperty");\
428 JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\ 387 JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\
429 return ;\ 388 return ;\
(...skipping 12 matching lines...) Expand all
442 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\ 401 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
443 IFXJS_Context* cc = pRuntime->GetCurrentContext();\ 402 IFXJS_Context* cc = pRuntime->GetCurrentContext();\
444 v8::String::Utf8Value utf8_value(property);\ 403 v8::String::Utf8Value utf8_value(property);\
445 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\ 404 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\
446 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\ 405 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
447 ASSERT(pJSObj != NULL);\ 406 ASSERT(pJSObj != NULL);\
448 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\ 407 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\
449 ASSERT(pObj != NULL);\ 408 ASSERT(pObj != NULL);\
450 JS_ErrorString sError;\ 409 JS_ErrorString sError;\
451 FX_BOOL bRet = FALSE;\ 410 FX_BOOL bRet = FALSE;\
452 MEMLEAKCHECK_1();\
453 bRet = pObj->DelProperty(cc, propname.c_str(), sError);\ 411 bRet = pObj->DelProperty(cc, propname.c_str(), sError);\
454 MEMLEAKCHECK_2(class_name,L"DelProperty");\
455 if (bRet)\ 412 if (bRet)\
456 {\ 413 {\
457 return ;\ 414 return ;\
458 }\ 415 }\
459 else\ 416 else\
460 {\ 417 {\
461 CFX_ByteString cbName;\ 418 CFX_ByteString cbName;\
462 cbName.Format("%s.%s", #class_name, "DelProperty");\ 419 cbName.Format("%s.%s", #class_name, "DelProperty");\
463 return ;\ 420 return ;\
464 }\ 421 }\
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
514 {\ 471 {\
515 pProperties = JS_Class_Properties;\ 472 pProperties = JS_Class_Properties;\
516 nSize = sizeof(JS_Class_Properties)/sizeof(JSPropertySpec)-1;\ 473 nSize = sizeof(JS_Class_Properties)/sizeof(JSPropertySpec)-1;\
517 }\ 474 }\
518 void js_class_name::GetMethods(JSMethodSpec*& pMethods, int& nSize)\ 475 void js_class_name::GetMethods(JSMethodSpec*& pMethods, int& nSize)\
519 {\ 476 {\
520 pMethods = JS_Class_Methods;\ 477 pMethods = JS_Class_Methods;\
521 nSize = sizeof(JS_Class_Methods)/sizeof(JSMethodSpec)-1;\ 478 nSize = sizeof(JS_Class_Methods)/sizeof(JSMethodSpec)-1;\
522 } 479 }
523 480
524 #define JS_SPECIAL_STATIC_METHOD(method_name, class_alternate, class_name)\ 481 /* ======================================== GLOBAL METHODS ===================== ======================= */
525 » static void method_name##_static(const v8::FunctionCallbackInfo<v8::Valu e>& info)\ 482
526 {\ 483 template <FX_BOOL (*F)(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Valu e& vRet, JS_ErrorString& sError)>
527 » v8::Isolate* isolate = info.GetIsolate();\ 484 void JSGlobalFunc(const char *func_name_string,
528 » v8::Local<v8::Context> context = isolate->GetCurrentContext();\ 485 const v8::FunctionCallbackInfo<v8::Value>& info) {
529 » v8::Local<v8::Value> v = context->GetEmbedderData(1);\ 486 v8::Isolate* isolate = info.GetIsolate();
530 » ASSERT(!v.IsEmpty());\ 487 v8::Local<v8::Context> context = isolate->GetCurrentContext();
531 » if(v.IsEmpty()) return;\ 488 v8::Local<v8::Value> v = context->GetEmbedderData(1);
532 » v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\ 489 v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);
533 » IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\ 490 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();
534 » IFXJS_Context* cc = pRuntime->GetCurrentContext();\ 491 IFXJS_Context* cc = pRuntime->GetCurrentContext();
535 » CJS_Parameters parameters;\ 492 CJS_Parameters parameters;
536 » for (unsigned int i = 0; i<(unsigned int)info.Length(); i++)\ 493 for (unsigned int i = 0; i<(unsigned int)info.Length(); i++) {
537 » {\ 494 parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));
538 » parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));\ 495 }
539 » }\ 496 CJS_Value valueRes(isolate);
540 » CJS_Value valueRes(isolate);\ 497 JS_ErrorString sError;
541 » CJS_Object* pJSObj = (CJS_Object *)JS_GetPrivate(isolate, info.Holder()) ;\ 498 if (!(*F)(cc, parameters, valueRes, sError))
542 » ASSERT(pJSObj != NULL);\ 499 {
543 » class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\ 500 JS_Error(NULL, JS_WIDESTRING(fun_name), sError);
544 » ASSERT(pObj != NULL);\ 501 return;
545 » JS_ErrorString sError;\ 502 }
546 » FX_BOOL bRet = FALSE;\ 503 info.GetReturnValue().Set(valueRes.ToJSValue());
547 » MEMLEAKCHECK_1();\
548 » bRet = pObj->method_name(cc, parameters, valueRes, sError);\
549 » MEMLEAKCHECK_2(class_name, method_name);\
550 » if (bRet)\
551 » {\
552 » » info.GetReturnValue().Set(valueRes.ToJSValue());\
553 » » return ;\
554 » }\
555 » else\
556 » {\
557 » » CFX_ByteString cbName;\
558 » » cbName.Format("%s.%s", #class_name, #method_name);\
559 » » JS_Error(NULL, CFX_WideString::FromLocal(cbName), sError);\
560 » » return ;\
561 » }\
562 » JS_Error(NULL, JS_WIDESTRING(method_name), L"Embeded object not found!" );\
563 return ;\
564 } 504 }
565 505
566 /* ======================================== GLOBAL METHODS ===================== ======================= */
567 #define JS_STATIC_GLOBAL_FUN(fun_name) \ 506 #define JS_STATIC_GLOBAL_FUN(fun_name) \
568 static void fun_name##_static(const v8::FunctionCallbackInfo<v8::Value>& info)\ 507 static void fun_name##_static(const v8::FunctionCallbackInfo<v8::Value>& info) { \
569 {\ 508 JSGlobalFunc<fun_name>(#fun_name, info); \
570 » v8::Isolate* isolate = info.GetIsolate();\ 509 }
571 » v8::Local<v8::Context> context = isolate->GetCurrentContext();\
572 » v8::Local<v8::Value> v = context->GetEmbedderData(1);\
573 » ASSERT(!v.IsEmpty());\
574 » if(v.IsEmpty()) return;\
575 » v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\
576 » IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
577 » IFXJS_Context* cc = pRuntime->GetCurrentContext();\
578 » CJS_Parameters parameters;\
579 » for (unsigned int i = 0; i<(unsigned int)info.Length(); i++)\
580 » {\
581 » parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));\
582 » }\
583 » CJS_Value valueRes(isolate);\
584 » JS_ErrorString sError;\
585 » if (!fun_name(cc, parameters, valueRes, sError))\
586 » {\
587 » » JS_Error(NULL, JS_WIDESTRING(fun_name), sError);\
588 » » return ;\
589 » }\
590 » info.GetReturnValue().Set(valueRes.ToJSValue());\
591 » return ;\
592 }
593 510
594 #define JS_STATIC_DECLARE_GLOBAL_FUN() \ 511 #define JS_STATIC_DECLARE_GLOBAL_FUN() \
595 static JSMethodSpec global_methods[]; \ 512 static JSMethodSpec global_methods[]; \
596 static int Init(IJS_Runtime* pRuntime) 513 static int Init(IJS_Runtime* pRuntime)
597 514
598 #define BEGIN_JS_STATIC_GLOBAL_FUN(js_class_name) \ 515 #define BEGIN_JS_STATIC_GLOBAL_FUN(js_class_name) \
599 JSMethodSpec js_class_name::global_methods[] = { 516 JSMethodSpec js_class_name::global_methods[] = {
600 517
601 #define JS_STATIC_GLOBAL_FUN_ENTRY(method_name,nargs) JS_STATIC_METHOD_ENTRY(met hod_name,nargs) 518 #define JS_STATIC_GLOBAL_FUN_ENTRY(method_name,nargs) JS_STATIC_METHOD_ENTRY(met hod_name,nargs)
602 519
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
638 555
639 #define VALUE_NAME_STRING L"string" 556 #define VALUE_NAME_STRING L"string"
640 #define VALUE_NAME_NUMBER L"number" 557 #define VALUE_NAME_NUMBER L"number"
641 #define VALUE_NAME_BOOLEAN L"boolean" 558 #define VALUE_NAME_BOOLEAN L"boolean"
642 #define VALUE_NAME_DATE L"date" 559 #define VALUE_NAME_DATE L"date"
643 #define VALUE_NAME_OBJECT L"object" 560 #define VALUE_NAME_OBJECT L"object"
644 #define VALUE_NAME_FXOBJ L"fxobj" 561 #define VALUE_NAME_FXOBJ L"fxobj"
645 #define VALUE_NAME_NULL L"null" 562 #define VALUE_NAME_NULL L"null"
646 #define VALUE_NAME_UNDEFINED L"undefined" 563 #define VALUE_NAME_UNDEFINED L"undefined"
647 564
648 #define CLASSNAME_ARRAY L"Array"
649 #define CLASSNAME_DATE L"Date"
650 #define CLASSNAME_STRING L"v8::String"
651
652 FXJSVALUETYPE GET_VALUE_TYPE(v8::Handle<v8::Value> p); 565 FXJSVALUETYPE GET_VALUE_TYPE(v8::Handle<v8::Value> p);
653 566
654 #endif //_JS_DEFINE_H_ 567 #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