Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #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 14 matching lines...) Expand all Loading... | |
| 39 #define JS_TRUE (unsigned)1 | 42 #define JS_TRUE (unsigned)1 |
| 40 #define JS_FALSE (unsigned)0 | 43 #define JS_FALSE (unsigned)0 |
| 41 | 44 |
| 42 | 45 |
| 43 #define CJS_PointsArray CFX_ArrayTemplate<float> | 46 #define CJS_PointsArray CFX_ArrayTemplate<float> |
| 44 #define CJS_IntArray CFX_ArrayTemplate<int> | 47 #define CJS_IntArray CFX_ArrayTemplate<int> |
| 45 | 48 |
| 46 /* ====================================== PUBLIC DEFINE SPEC =================== =========================== */ | 49 /* ====================================== PUBLIC DEFINE SPEC =================== =========================== */ |
| 47 #define JS_WIDESTRING(widestring) L###widestring | 50 #define JS_WIDESTRING(widestring) L###widestring |
| 48 | 51 |
| 49 #define OBJ_PROP_PARAMS IFXJS_Context* cc, CJS_PropValue& vp, JS _ErrorString& sError | |
| 50 #define OBJ_METHOD_PARAMS IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, JS_ErrorString& sError | |
| 51 #define BEGIN_JS_STATIC_CONST(js_class_name) JSConstSpec js_class_name::JS_Class _Consts[] = { | 52 #define BEGIN_JS_STATIC_CONST(js_class_name) JSConstSpec js_class_name::JS_Class _Consts[] = { |
| 52 #define JS_STATIC_CONST_ENTRY_NUMBER(const_name, pValue) {JS_WIDESTRING(const_na me), pValue, L"", 0}, | 53 #define JS_STATIC_CONST_ENTRY_NUMBER(const_name, pValue) {JS_WIDESTRING(const_na me), pValue, L"", 0}, |
| 53 #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}, |
| 54 #define END_JS_STATIC_CONST() {0, 0, 0, 0}}; | 55 #define END_JS_STATIC_CONST() {0, 0, 0, 0}}; |
| 55 | 56 |
| 56 #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[] = { |
| 57 #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}, |
| 58 #define END_JS_STATIC_PROP() {0, 0, 0}}; | 59 #define END_JS_STATIC_PROP() {0, 0, 0}}; |
| 59 | 60 |
| 60 #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[] = { |
| 61 #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}, |
| 62 #define END_JS_STATIC_METHOD() {0, 0, 0}}; | 63 #define END_JS_STATIC_METHOD() {0, 0, 0}}; |
| 63 #define MEMLEAKCHECK_1() ((void)0) | |
| 64 #define MEMLEAKCHECK_2(main_name, sub_name) ((void)0) | |
| 65 | |
| 66 | |
| 67 /* | |
| 68 #ifdef _DEBUG | |
| 69 #define MEMLEAKCHECK_1() \ | |
| 70 _CrtMemState state1;\ | |
| 71 _CrtMemCheckpoint(&state1); | |
| 72 | |
| 73 #define MEMLEAKCHECK_2(main_name,sub_name) \ | |
| 74 _CrtMemState state2;\ | |
| 75 _CrtMemCheckpoint(&state2);\ | |
| 76 _CrtMemState diff;\ | |
| 77 _CrtMemDifference(&diff,&state1,&state2);\ | |
| 78 if (diff.lSizes[_NORMAL_BLOCK] > 0)\ | |
| 79 {\ | |
| 80 TRACE("Detected normal block memory leaks in JS Module! [%s.%s]\ n",#main_name,#sub_name);\ | |
| 81 _CrtMemDumpStatistics(&diff);\ | |
| 82 } | |
| 83 #else | |
| 84 #define MEMLEAKCHECK_1() ((void)0) | |
| 85 #define MEMLEAKCHECK_2(main_name,sub_name) ((void)0) | |
| 86 #endif | |
| 87 */ | |
| 88 | 64 |
| 89 /* ======================================== PROP CALLBACK ====================== ====================== */ | 65 /* ======================================== PROP CALLBACK ====================== ====================== */ |
| 90 | 66 |
| 91 #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)> |
| 92 » static void get_##prop_name##_static(JS_PROPGET_ARGS)\ | 68 void JSPropGetter(const char* prop_name_string, |
| 93 {\ | 69 const char* class_name_string, |
| 94 » v8::Isolate* isolate = info.GetIsolate();\ | 70 v8::Local<v8::String> property, |
| 95 » v8::Local<v8::Context> context = isolate->GetCurrentContext();\ | 71 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 96 » v8::Local<v8::Value> v = context->GetEmbedderData(1);\ | 72 v8::Isolate* isolate = info.GetIsolate(); |
| 97 » ASSERT(!v.IsEmpty());\ | 73 v8::Local<v8::Context> context = isolate->GetCurrentContext(); |
| 98 » if(v.IsEmpty()) return;\ | 74 v8::Local<v8::Value> v = context->GetEmbedderData(1); |
| 99 » v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\ | 75 if (v.IsEmpty()) { |
|
brucedawson
2015/02/16 20:42:00
The assert/return was ambiguous in that it made it
| |
| 100 » IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\ | 76 return; |
| 101 » IFXJS_Context* cc = pRuntime->GetCurrentContext();\ | 77 } |
| 102 » CJS_PropValue value(isolate);\ | 78 v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v); |
| 103 » value.StartGetting();\ | 79 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value(); |
| 104 » CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\ | 80 IFXJS_Context* pContext = pRuntime->GetCurrentContext(); |
| 105 » ASSERT(pJSObj != NULL);\ | 81 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder()); |
| 106 » class_name* pObj = (class_name*)pJSObj->GetEmbedObject();\ | 82 C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject()); |
| 107 » ASSERT(pObj != NULL);\ | 83 JS_ErrorString sError; |
| 108 » JS_ErrorString sError;\ | 84 CJS_PropValue value(isolate); |
| 109 » FX_BOOL bRet = FALSE;\ | 85 value.StartGetting(); |
| 110 » MEMLEAKCHECK_1();\ | 86 if (!(pObj->*M)(pContext, value, sError)) { |
| 111 » bRet = pObj->prop_name(cc, value, sError);\ | 87 CFX_ByteString cbName; |
| 112 » MEMLEAKCHECK_2(class_name, prop_name);\ | 88 cbName.Format("%s.%s", class_name_string, prop_name_string); |
| 113 » if (bRet)\ | 89 JS_Error(NULL, CFX_WideString::FromLocal(cbName), sError); |
| 114 » {\ | 90 return; |
| 115 » » info.GetReturnValue().Set((v8::Handle<v8::Value>)value);\ | 91 } |
| 116 » » return ;\ | 92 info.GetReturnValue().Set((v8::Handle<v8::Value>)value); |
| 117 » }\ | |
| 118 » else\ | |
| 119 » {\ | |
| 120 » CFX_ByteString cbName;\ | |
| 121 » » cbName.Format("%s.%s", #class_name, #prop_name);\ | |
| 122 » » JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\ | |
| 123 » » return ;\ | |
| 124 » }\ | |
| 125 } | 93 } |
| 126 | 94 |
| 127 #define JS_STATIC_PROP_SET(prop_name, class_name)\ | 95 template <class C, FX_BOOL (C::*M)(IFXJS_Context* cc, CJS_PropValue& vp, JS_Erro rString& sError)> |
| 128 » static void set_##prop_name##_static(JS_PROPPUT_ARGS)\ | 96 void JSPropSetter(const char* prop_name_string, |
| 129 {\ | 97 const char* class_name_string, |
| 130 » v8::Isolate* isolate = info.GetIsolate();\ | 98 v8::Local<v8::String> property, |
| 131 » v8::Local<v8::Context> context = isolate->GetCurrentContext();\ | 99 v8::Local<v8::Value> value, |
| 132 » v8::Local<v8::Value> v = context->GetEmbedderData(1);\ | 100 const v8::PropertyCallbackInfo<void>& info) { |
| 133 » ASSERT(!v.IsEmpty());\ | 101 v8::Isolate* isolate = info.GetIsolate(); |
| 134 » if(v.IsEmpty()) return;\ | 102 v8::Local<v8::Context> context = isolate->GetCurrentContext(); |
| 135 » v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\ | 103 v8::Local<v8::Value> v = context->GetEmbedderData(1); |
| 136 » IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\ | 104 if (v.IsEmpty()) { |
| 137 » IFXJS_Context* cc = pRuntime->GetCurrentContext();\ | 105 return; |
| 138 » CJS_PropValue propValue(CJS_Value(isolate,value,VT_unknown));\ | 106 } |
| 139 » propValue.StartSetting();\ | 107 v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v); |
| 140 » CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\ | 108 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value(); |
| 141 » ASSERT(pJSObj != NULL);\ | 109 IFXJS_Context* pContext = pRuntime->GetCurrentContext(); |
| 142 » class_name* pObj = (class_name*)pJSObj->GetEmbedObject();\ | 110 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder()); |
| 143 » ASSERT(pObj != NULL);\ | 111 C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject()); |
| 144 » JS_ErrorString sError;\ | 112 JS_ErrorString sError; |
| 145 » FX_BOOL bRet = FALSE;\ | 113 CJS_PropValue propValue(CJS_Value(isolate, value, VT_unknown)); |
| 146 » MEMLEAKCHECK_1();\ | 114 propValue.StartSetting(); |
| 147 » bRet = pObj->prop_name(cc, propValue, sError);\ | 115 if (!(pObj->*M)(pContext, propValue, sError)) { |
| 148 » MEMLEAKCHECK_2(class_name, prop_name);\ | 116 CFX_ByteString cbName; |
| 149 » if (bRet)\ | 117 cbName.Format("%s.%s", class_name_string, prop_name_string); |
| 150 » {\ | 118 JS_Error(NULL, CFX_WideString::FromLocal(cbName), sError); |
| 151 » » return ;\ | 119 } |
| 152 » }\ | |
| 153 » else\ | |
| 154 » {\ | |
| 155 » » CFX_ByteString cbName;\ | |
| 156 » » cbName.Format("%s.%s", #class_name, #prop_name);\ | |
| 157 » » JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\ | |
| 158 » » return ;\ | |
| 159 » }\ | |
| 160 } | 120 } |
| 161 | 121 |
| 162 #define JS_STATIC_PROP(prop_name, class_name)\ | 122 #define JS_STATIC_PROP(prop_name, class_name) \ |
| 163 JS_STATIC_PROP_GET(prop_name, class_name);\ | 123 static void get_##prop_name##_static( \ |
| 164 JS_STATIC_PROP_SET(prop_name, class_name) | 124 v8::Local<v8::String> property, \ |
| 125 const v8::PropertyCallbackInfo<v8::Value>& info) { \ | |
| 126 JSPropGetter<class_name, &class_name::prop_name>( \ | |
| 127 #prop_name, #class_name, property, info); \ | |
| 128 } \ | |
| 129 static void set_##prop_name##_static( \ | |
| 130 v8::Local<v8::String> property, \ | |
| 131 v8::Local<v8::Value> value, \ | |
| 132 const v8::PropertyCallbackInfo<void>& info) { \ | |
| 133 JSPropSetter<class_name, &class_name::prop_name>( \ | |
| 134 #prop_name, #class_name, property, value, info); \ | |
| 135 } | |
| 165 | 136 |
| 166 /* ========================================= METHOD CALLBACK =================== ======================== */ | 137 /* ========================================= METHOD CALLBACK =================== ======================== */ |
| 167 | 138 |
| 168 #define JS_STATIC_METHOD(method_name, class_name)\ | 139 template <class C, FX_BOOL (C::*M)(IFXJS_Context* cc, const CJS_Parameters& para ms, CJS_Value& vRet, JS_ErrorString& sError)> |
| 169 » static void method_name##_static(JS_METHOD_ARGS)\ | 140 void JSMethod(const char* method_name_string, |
| 170 {\ | 141 const char* class_name_string, |
| 171 » v8::Isolate* isolate = info.GetIsolate();\ | 142 const v8::FunctionCallbackInfo<v8::Value>& info) { |
| 172 » v8::Local<v8::Context> context = isolate->GetCurrentContext();\ | 143 v8::Isolate* isolate = info.GetIsolate(); |
| 173 » v8::Local<v8::Value> v = context->GetEmbedderData(1);\ | 144 v8::Local<v8::Context> context = isolate->GetCurrentContext(); |
| 174 » ASSERT(!v.IsEmpty());\ | 145 v8::Local<v8::Value> v = context->GetEmbedderData(1); |
| 175 » if(v.IsEmpty()) return;\ | 146 if (v.IsEmpty()) { |
| 176 » v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\ | 147 return; |
| 177 » IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\ | 148 } |
| 178 » IFXJS_Context* cc = pRuntime->GetCurrentContext();\ | 149 v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v); |
| 179 » CJS_Parameters parameters;\ | 150 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value(); |
| 180 » for (unsigned int i = 0; i<(unsigned int)info.Length(); i++)\ | 151 IFXJS_Context* cc = pRuntime->GetCurrentContext(); |
| 181 {\ | 152 CJS_Parameters parameters; |
| 182 » » parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));\ | 153 for (unsigned int i = 0; i<(unsigned int)info.Length(); i++) { |
| 183 » }\ | 154 parameters.push_back(CJS_Value(isolate, info[i], VT_unknown)); |
| 184 » CJS_Value valueRes(isolate);\ | 155 } |
| 185 » CJS_Object* pJSObj = (CJS_Object *)JS_GetPrivate(isolate,info.Holder()); \ | 156 CJS_Value valueRes(isolate); |
| 186 » ASSERT(pJSObj != NULL);\ | 157 CJS_Object* pJSObj = (CJS_Object *)JS_GetPrivate(isolate,info.Holder()); |
| 187 » class_name* pObj = (class_name*)pJSObj->GetEmbedObject();\ | 158 C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject()); |
| 188 » ASSERT(pObj != NULL);\ | 159 JS_ErrorString sError; |
| 189 » JS_ErrorString sError;\ | 160 if (!(pObj->*M)(cc, parameters, valueRes, sError)) { |
| 190 » FX_BOOL bRet = FALSE;\ | 161 CFX_ByteString cbName; |
| 191 » MEMLEAKCHECK_1();\ | 162 cbName.Format("%s.%s", class_name_string, method_name_string); |
| 192 » bRet = pObj->method_name(cc, parameters, valueRes, sError);\ | 163 JS_Error(NULL, CFX_WideString::FromLocal(cbName), sError); |
| 193 » MEMLEAKCHECK_2(class_name, method_name);\ | 164 return; |
| 194 » if (bRet)\ | 165 } |
| 195 » {\ | 166 info.GetReturnValue().Set(valueRes.ToJSValue()); |
| 196 » » info.GetReturnValue().Set(valueRes.ToJSValue());\ | |
| 197 » » return ;\ | |
| 198 » }\ | |
| 199 » else\ | |
| 200 » {\ | |
| 201 » » CFX_ByteString cbName;\ | |
| 202 » » cbName.Format("%s.%s", #class_name, #method_name);\ | |
| 203 » » JS_Error(NULL, CFX_WideString::FromLocal(cbName), sError);\ | |
| 204 » » return ;\ | |
| 205 » }\ | |
| 206 } | 167 } |
| 207 | 168 |
| 169 #define JS_STATIC_METHOD(method_name, class_name) \ | |
| 170 static void method_name##_static( \ | |
| 171 const v8::FunctionCallbackInfo<v8::Value>& info) { \ | |
| 172 JSMethod<class_name, &class_name::method_name>( \ | |
| 173 #class_name, #method_name, info); \ | |
| 174 } | |
| 175 | |
| 176 #define JS_SPECIAL_STATIC_METHOD(method_name, class_alternate, class_name) \ | |
| 177 static void method_name##_static( \ | |
| 178 const v8::FunctionCallbackInfo<v8::Value>& info) { \ | |
| 179 JSMethod<class_alternate, &class_alternate::method_name>( \ | |
| 180 #class_name, #method_name, info); \ | |
| 181 } | |
| 182 | |
| 208 /* ===================================== JS CLASS ============================== ================= */ | 183 /* ===================================== JS CLASS ============================== ================= */ |
| 209 | 184 |
| 210 #define DECLARE_JS_CLASS(js_class_name) \ | 185 #define DECLARE_JS_CLASS(js_class_name) \ |
| 211 static JSBool JSConstructor(IFXJS_Context* cc, JSFXObject obj,JSFXObject global);\ | 186 static JSBool JSConstructor(IFXJS_Context* cc, JSFXObject obj,JSFXObject global);\ |
| 212 static JSBool JSDestructor(JSFXObject obj);\ | 187 static JSBool JSDestructor(JSFXObject obj);\ |
| 213 static int Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType);\ | 188 static int Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType);\ |
| 214 static void GetConsts(JSConstSpec*& pConsts, int& nSize);\ | 189 static void GetConsts(JSConstSpec*& pConsts, int& nSize);\ |
| 215 static void GetProperties(JSPropertySpec*& pProperties, int& nSize);\ | 190 static void GetProperties(JSPropertySpec*& pProperties, int& nSize);\ |
| 216 static void GetMethods(JSMethodSpec*& pMethods, int& nSize);\ | 191 static void GetMethods(JSMethodSpec*& pMethods, int& nSize);\ |
| 217 static JSConstSpec JS_Class_Consts[];\ | 192 static JSConstSpec JS_Class_Consts[];\ |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 333 void js_class_name::queryprop_##js_class_name##_static(JS_PROPQUERY_ARGS )\ | 308 void js_class_name::queryprop_##js_class_name##_static(JS_PROPQUERY_ARGS )\ |
| 334 {\ | 309 {\ |
| 335 v8::Isolate* isolate = info.GetIsolate();\ | 310 v8::Isolate* isolate = info.GetIsolate();\ |
| 336 v8::String::Utf8Value utf8_value(property);\ | 311 v8::String::Utf8Value utf8_value(property);\ |
| 337 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\ | 312 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\ |
| 338 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\ | 313 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\ |
| 339 ASSERT(pJSObj != NULL);\ | 314 ASSERT(pJSObj != NULL);\ |
| 340 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\ | 315 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\ |
| 341 ASSERT(pObj != NULL);\ | 316 ASSERT(pObj != NULL);\ |
| 342 FX_BOOL bRet = FALSE;\ | 317 FX_BOOL bRet = FALSE;\ |
| 343 MEMLEAKCHECK_1();\ | |
| 344 bRet = pObj->QueryProperty(propname.c_str());\ | 318 bRet = pObj->QueryProperty(propname.c_str());\ |
| 345 MEMLEAKCHECK_2(class_name, prop_name.c_str());\ | |
| 346 if (bRet)\ | 319 if (bRet)\ |
| 347 {\ | 320 {\ |
| 348 info.GetReturnValue().Set(0x004);\ | 321 info.GetReturnValue().Set(0x004);\ |
| 349 return ;\ | 322 return ;\ |
| 350 }\ | 323 }\ |
| 351 else\ | 324 else\ |
| 352 {\ | 325 {\ |
| 353 info.GetReturnValue().Set(0);\ | 326 info.GetReturnValue().Set(0);\ |
| 354 return ;\ | 327 return ;\ |
| 355 }\ | 328 }\ |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 368 v8::String::Utf8Value utf8_value(property);\ | 341 v8::String::Utf8Value utf8_value(property);\ |
| 369 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\ | 342 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\ |
| 370 CJS_PropValue value(isolate);\ | 343 CJS_PropValue value(isolate);\ |
| 371 value.StartGetting();\ | 344 value.StartGetting();\ |
| 372 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\ | 345 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\ |
| 373 ASSERT(pJSObj != NULL);\ | 346 ASSERT(pJSObj != NULL);\ |
| 374 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\ | 347 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\ |
| 375 ASSERT(pObj != NULL);\ | 348 ASSERT(pObj != NULL);\ |
| 376 JS_ErrorString sError;\ | 349 JS_ErrorString sError;\ |
| 377 FX_BOOL bRet = FALSE;\ | 350 FX_BOOL bRet = FALSE;\ |
| 378 MEMLEAKCHECK_1();\ | |
| 379 bRet = pObj->DoProperty(cc, propname.c_str(), value, sError);\ | 351 bRet = pObj->DoProperty(cc, propname.c_str(), value, sError);\ |
| 380 MEMLEAKCHECK_2(class_name, L"GetProperty");\ | |
| 381 if (bRet)\ | 352 if (bRet)\ |
| 382 {\ | 353 {\ |
| 383 info.GetReturnValue().Set((v8::Handle<v8::Value>)value);\ | 354 info.GetReturnValue().Set((v8::Handle<v8::Value>)value);\ |
| 384 return ;\ | 355 return ;\ |
| 385 }\ | 356 }\ |
| 386 else\ | 357 else\ |
| 387 {\ | 358 {\ |
| 388 CFX_ByteString cbName;\ | 359 CFX_ByteString cbName;\ |
| 389 cbName.Format("%s.%s", #class_name, L"GetProperty");\ | 360 cbName.Format("%s.%s", #class_name, L"GetProperty");\ |
| 390 JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\ | 361 JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\ |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 406 v8::String::Utf8Value utf8_value(property);\ | 377 v8::String::Utf8Value utf8_value(property);\ |
| 407 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\ | 378 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\ |
| 408 CJS_PropValue PropValue(CJS_Value(isolate,value,VT_unknown));\ | 379 CJS_PropValue PropValue(CJS_Value(isolate,value,VT_unknown));\ |
| 409 PropValue.StartSetting();\ | 380 PropValue.StartSetting();\ |
| 410 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\ | 381 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\ |
| 411 if(!pJSObj) return;\ | 382 if(!pJSObj) return;\ |
| 412 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\ | 383 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\ |
| 413 ASSERT(pObj != NULL);\ | 384 ASSERT(pObj != NULL);\ |
| 414 JS_ErrorString sError;\ | 385 JS_ErrorString sError;\ |
| 415 FX_BOOL bRet = FALSE;\ | 386 FX_BOOL bRet = FALSE;\ |
| 416 MEMLEAKCHECK_1();\ | |
| 417 bRet = pObj->DoProperty(cc, propname.c_str(), PropValue, sError);\ | 387 bRet = pObj->DoProperty(cc, propname.c_str(), PropValue, sError);\ |
| 418 MEMLEAKCHECK_2(class_name,L"PutProperty");\ | |
| 419 if (bRet)\ | 388 if (bRet)\ |
| 420 {\ | 389 {\ |
| 421 return ;\ | 390 return ;\ |
| 422 }\ | 391 }\ |
| 423 else\ | 392 else\ |
| 424 {\ | 393 {\ |
| 425 CFX_ByteString cbName;\ | 394 CFX_ByteString cbName;\ |
| 426 cbName.Format("%s.%s", #class_name, "PutProperty");\ | 395 cbName.Format("%s.%s", #class_name, "PutProperty");\ |
| 427 JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\ | 396 JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\ |
| 428 return ;\ | 397 return ;\ |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 441 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\ | 410 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\ |
| 442 IFXJS_Context* cc = pRuntime->GetCurrentContext();\ | 411 IFXJS_Context* cc = pRuntime->GetCurrentContext();\ |
| 443 v8::String::Utf8Value utf8_value(property);\ | 412 v8::String::Utf8Value utf8_value(property);\ |
| 444 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\ | 413 CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_val ue.length());\ |
| 445 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\ | 414 CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\ |
| 446 ASSERT(pJSObj != NULL);\ | 415 ASSERT(pJSObj != NULL);\ |
| 447 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\ | 416 class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\ |
| 448 ASSERT(pObj != NULL);\ | 417 ASSERT(pObj != NULL);\ |
| 449 JS_ErrorString sError;\ | 418 JS_ErrorString sError;\ |
| 450 FX_BOOL bRet = FALSE;\ | 419 FX_BOOL bRet = FALSE;\ |
| 451 MEMLEAKCHECK_1();\ | |
| 452 bRet = pObj->DelProperty(cc, propname.c_str(), sError);\ | 420 bRet = pObj->DelProperty(cc, propname.c_str(), sError);\ |
| 453 MEMLEAKCHECK_2(class_name,L"DelProperty");\ | |
| 454 if (bRet)\ | 421 if (bRet)\ |
| 455 {\ | 422 {\ |
| 456 return ;\ | 423 return ;\ |
| 457 }\ | 424 }\ |
| 458 else\ | 425 else\ |
| 459 {\ | 426 {\ |
| 460 CFX_ByteString cbName;\ | 427 CFX_ByteString cbName;\ |
| 461 cbName.Format("%s.%s", #class_name, "DelProperty");\ | 428 cbName.Format("%s.%s", #class_name, "DelProperty");\ |
| 462 return ;\ | 429 return ;\ |
| 463 }\ | 430 }\ |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 513 {\ | 480 {\ |
| 514 pProperties = JS_Class_Properties;\ | 481 pProperties = JS_Class_Properties;\ |
| 515 nSize = sizeof(JS_Class_Properties)/sizeof(JSPropertySpec)-1;\ | 482 nSize = sizeof(JS_Class_Properties)/sizeof(JSPropertySpec)-1;\ |
| 516 }\ | 483 }\ |
| 517 void js_class_name::GetMethods(JSMethodSpec*& pMethods, int& nSize)\ | 484 void js_class_name::GetMethods(JSMethodSpec*& pMethods, int& nSize)\ |
| 518 {\ | 485 {\ |
| 519 pMethods = JS_Class_Methods;\ | 486 pMethods = JS_Class_Methods;\ |
| 520 nSize = sizeof(JS_Class_Methods)/sizeof(JSMethodSpec)-1;\ | 487 nSize = sizeof(JS_Class_Methods)/sizeof(JSMethodSpec)-1;\ |
| 521 } | 488 } |
| 522 | 489 |
| 523 #define JS_SPECIAL_STATIC_METHOD(method_name, class_alternate, class_name)\ | 490 /* ======================================== GLOBAL METHODS ===================== ======================= */ |
| 524 » static void method_name##_static(JS_METHOD_ARGS)\ | 491 |
| 525 {\ | 492 template <FX_BOOL (*F)(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Valu e& vRet, JS_ErrorString& sError)> |
| 526 » v8::Isolate* isolate = info.GetIsolate();\ | 493 void JSGlobalFunc(const char *func_name_string, |
| 527 » v8::Local<v8::Context> context = isolate->GetCurrentContext();\ | 494 const v8::FunctionCallbackInfo<v8::Value>& info) { |
| 528 » v8::Local<v8::Value> v = context->GetEmbedderData(1);\ | 495 v8::Isolate* isolate = info.GetIsolate(); |
| 529 » ASSERT(!v.IsEmpty());\ | 496 v8::Local<v8::Context> context = isolate->GetCurrentContext(); |
| 530 » if(v.IsEmpty()) return;\ | 497 v8::Local<v8::Value> v = context->GetEmbedderData(1); |
| 531 » v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\ | 498 if (v.IsEmpty()) { |
|
Lei Zhang
2015/02/14 00:00:15
Can we ever hit this? If we were to hit this case,
| |
| 532 » IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\ | 499 return; |
| 533 » IFXJS_Context* cc = pRuntime->GetCurrentContext();\ | 500 } |
| 534 » CJS_Parameters parameters;\ | 501 v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v); |
| 535 » for (unsigned int i = 0; i<(unsigned int)info.Length(); i++)\ | 502 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value(); |
| 536 » {\ | 503 IFXJS_Context* cc = pRuntime->GetCurrentContext(); |
| 537 » parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));\ | 504 CJS_Parameters parameters; |
| 538 » }\ | 505 for (unsigned int i = 0; i<(unsigned int)info.Length(); i++) { |
| 539 » CJS_Value valueRes(isolate);\ | 506 parameters.push_back(CJS_Value(isolate, info[i], VT_unknown)); |
| 540 » CJS_Object* pJSObj = (CJS_Object *)JS_GetPrivate(isolate, info.Holder()) ;\ | 507 } |
| 541 » ASSERT(pJSObj != NULL);\ | 508 CJS_Value valueRes(isolate); |
| 542 » class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\ | 509 JS_ErrorString sError; |
| 543 » ASSERT(pObj != NULL);\ | 510 if (!(*F)(cc, parameters, valueRes, sError)) |
| 544 » JS_ErrorString sError;\ | 511 { |
| 545 » FX_BOOL bRet = FALSE;\ | 512 JS_Error(NULL, JS_WIDESTRING(fun_name), sError); |
| 546 » MEMLEAKCHECK_1();\ | 513 return; |
| 547 » bRet = pObj->method_name(cc, parameters, valueRes, sError);\ | 514 } |
| 548 » MEMLEAKCHECK_2(class_name, method_name);\ | 515 info.GetReturnValue().Set(valueRes.ToJSValue()); |
| 549 » if (bRet)\ | |
| 550 » {\ | |
| 551 » » info.GetReturnValue().Set(valueRes.ToJSValue());\ | |
| 552 » » return ;\ | |
| 553 » }\ | |
| 554 » else\ | |
| 555 » {\ | |
| 556 » » CFX_ByteString cbName;\ | |
| 557 » » cbName.Format("%s.%s", #class_name, #method_name);\ | |
| 558 » » JS_Error(NULL, CFX_WideString::FromLocal(cbName), sError);\ | |
| 559 » » return ;\ | |
| 560 » }\ | |
| 561 » JS_Error(NULL, JS_WIDESTRING(method_name), L"Embeded object not found!" );\ | |
| 562 return ;\ | |
| 563 } | 516 } |
| 564 | 517 |
| 565 /* ======================================== GLOBAL METHODS ===================== ======================= */ | |
| 566 #define JS_STATIC_GLOBAL_FUN(fun_name) \ | 518 #define JS_STATIC_GLOBAL_FUN(fun_name) \ |
| 567 static void fun_name##_static(JS_METHOD_ARGS)\ | 519 static void fun_name##_static(const v8::FunctionCallbackInfo<v8::Value>& info) { \ |
| 568 {\ | 520 JSGlobalFunc<fun_name>(#fun_name, info); \ |
| 569 » v8::Isolate* isolate = info.GetIsolate();\ | 521 } |
| 570 » v8::Local<v8::Context> context = isolate->GetCurrentContext();\ | |
| 571 » v8::Local<v8::Value> v = context->GetEmbedderData(1);\ | |
| 572 » ASSERT(!v.IsEmpty());\ | |
| 573 » if(v.IsEmpty()) return;\ | |
| 574 » v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(v);\ | |
| 575 » IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\ | |
| 576 » IFXJS_Context* cc = pRuntime->GetCurrentContext();\ | |
| 577 » CJS_Parameters parameters;\ | |
| 578 » for (unsigned int i = 0; i<(unsigned int)info.Length(); i++)\ | |
| 579 » {\ | |
| 580 » parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));\ | |
| 581 » }\ | |
| 582 » CJS_Value valueRes(isolate);\ | |
| 583 » JS_ErrorString sError;\ | |
| 584 » if (!fun_name(cc, parameters, valueRes, sError))\ | |
| 585 » {\ | |
| 586 » » JS_Error(NULL, JS_WIDESTRING(fun_name), sError);\ | |
| 587 » » return ;\ | |
| 588 » }\ | |
| 589 » info.GetReturnValue().Set(valueRes.ToJSValue());\ | |
| 590 » return ;\ | |
| 591 } | |
| 592 | 522 |
| 593 #define JS_STATIC_DECLARE_GLOBAL_FUN() \ | 523 #define JS_STATIC_DECLARE_GLOBAL_FUN() \ |
| 594 static JSMethodSpec global_methods[]; \ | 524 static JSMethodSpec global_methods[]; \ |
| 595 static int Init(IJS_Runtime* pRuntime) | 525 static int Init(IJS_Runtime* pRuntime) |
| 596 | 526 |
| 597 #define BEGIN_JS_STATIC_GLOBAL_FUN(js_class_name) \ | 527 #define BEGIN_JS_STATIC_GLOBAL_FUN(js_class_name) \ |
| 598 JSMethodSpec js_class_name::global_methods[] = { | 528 JSMethodSpec js_class_name::global_methods[] = { |
| 599 | 529 |
| 600 #define JS_STATIC_GLOBAL_FUN_ENTRY(method_name,nargs) JS_STATIC_METHOD_ENTRY(met hod_name,nargs) | 530 #define JS_STATIC_GLOBAL_FUN_ENTRY(method_name,nargs) JS_STATIC_METHOD_ENTRY(met hod_name,nargs) |
| 601 | 531 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 641 #define VALUE_NAME_DATE L"date" | 571 #define VALUE_NAME_DATE L"date" |
| 642 #define VALUE_NAME_OBJECT L"object" | 572 #define VALUE_NAME_OBJECT L"object" |
| 643 #define VALUE_NAME_FXOBJ L"fxobj" | 573 #define VALUE_NAME_FXOBJ L"fxobj" |
| 644 #define VALUE_NAME_NULL L"null" | 574 #define VALUE_NAME_NULL L"null" |
| 645 #define VALUE_NAME_UNDEFINED L"undefined" | 575 #define VALUE_NAME_UNDEFINED L"undefined" |
| 646 | 576 |
| 647 #define CLASSNAME_ARRAY L"Array" | 577 #define CLASSNAME_ARRAY L"Array" |
| 648 #define CLASSNAME_DATE L"Date" | 578 #define CLASSNAME_DATE L"Date" |
| 649 #define CLASSNAME_STRING L"v8::String" | 579 #define CLASSNAME_STRING L"v8::String" |
| 650 | 580 |
| 651 extern const unsigned int JSCONST_nStringHash; | 581 FXJSVALUETYPE GET_VALUE_TYPE(v8::Handle<v8::Value> p); |
| 652 extern const unsigned int JSCONST_nNumberHash; | |
| 653 extern const unsigned int JSCONST_nBoolHash; | |
| 654 extern const unsigned int JSCONST_nDateHash; | |
| 655 extern const unsigned int JSCONST_nObjectHash; | |
| 656 extern const unsigned int JSCONST_nFXobjHash; | |
| 657 extern const unsigned int JSCONST_nNullHash; | |
| 658 extern const unsigned int JSCONST_nUndefHash; | |
| 659 | |
| 660 static FXJSVALUETYPE GET_VALUE_TYPE(v8::Handle<v8::Value> p) | |
| 661 { | |
| 662 | |
| 663 » » const unsigned int nHash = JS_CalcHash(JS_GetTypeof(p)); | |
| 664 | |
| 665 » » if (nHash == JSCONST_nUndefHash) | |
| 666 » » » return VT_undefined; | |
| 667 » » else if (nHash == JSCONST_nNullHash) | |
| 668 » » » return VT_null; | |
| 669 » » else if (nHash == JSCONST_nStringHash) | |
| 670 » » » return VT_string; | |
| 671 » » else if (nHash == JSCONST_nNumberHash) | |
| 672 » » » return VT_number; | |
| 673 » » else if (nHash == JSCONST_nBoolHash) | |
| 674 » » » return VT_boolean; | |
| 675 » » else if (nHash == JSCONST_nDateHash) | |
| 676 » » » return VT_date; | |
| 677 » » else if (nHash == JSCONST_nObjectHash) | |
| 678 » » » return VT_object;» » | |
| 679 » » else if (nHash == JSCONST_nFXobjHash) | |
| 680 » » » return VT_fxobject; | |
| 681 | |
| 682 » » /* | |
| 683 » » const char * sType = p->getTypeof()->toDchars(); | |
| 684 » » if (strcmp(sType,VALUE_NAME_STRING) == 0) | |
| 685 » » » return VT_string; | |
| 686 » » else if (strcmp(sType,VALUE_NAME_NUMBER) == 0) | |
| 687 » » » return VT_number; | |
| 688 » » else if (strcmp(sType,VALUE_NAME_BOOLEAN) == 0) | |
| 689 » » » return VT_boolean; | |
| 690 » » else if (strcmp(sType,VALUE_NAME_DATE) == 0) | |
| 691 » » » return VT_date; | |
| 692 » » else if (strcmp(sType,VALUE_NAME_OBJECT) == 0) | |
| 693 » » » return VT_object; | |
| 694 » » else if (strcmp(sType,VALUE_NAME_FXOBJ) == 0) | |
| 695 » » » return VT_object; | |
| 696 » » else if (strcmp(sType,VALUE_NAME_NULL) == 0) | |
| 697 » » » return VT_null; | |
| 698 » » else if (strcmp(sType,VALUE_NAME_UNDEFINED) == 0) | |
| 699 » » » return VT_undefined; | |
| 700 » » » */ | |
| 701 | |
| 702 » return VT_unknown; | |
| 703 } | |
| 704 | 582 |
| 705 #endif //_JS_DEFINE_H_ | 583 #endif //_JS_DEFINE_H_ |
| OLD | NEW |