2013-09-27 22 views
0

我嵌入SpiderMonkey並試圖使用JS_BindCallable。但是,我有JSObject *,我想用作newThis,但該功能需要JSRawObject。關於JSRawObject的文檔似乎很少,頭文件沒有提供任何線索。什麼是JSRawObject,以及如何從JSObject *獲取它?

它似乎編譯,如果我只是通過它JSObject *,沒有崩潰,但我不知道爲什麼,這讓我不舒服。此外,它似乎並不奏效 - 不確定是因爲這個問題還是因爲其他原因。特別是,我這樣做:

JSObject *result = JS_NewObject(cx, NULL, NULL, NULL); 

//create .finish() callable 
int props = JSPROP_READONLY | JSPROP_PERMANENT | JSPROP_ENUMERATE; 
JS_DefineFunction(cx, result, "finish", my_native_func, 0, props); 

//bind finish to always use 'this' 
jsval jsvFinishFuncObj; 
JS_GetProperty(cx, result, "finish", &jsvFinishFuncObj); 
JSObject *finishFuncObj = JSVAL_TO_OBJECT(jsvFinishFuncObj); 
JS_BindCallable(cx, finishFuncObj, result); 

回答

1

JSRawObject是一個typedef爲JSObject*,讓您的使用是正確的。我們這樣做了,因爲在將來的版本中,所有的API都將採用句柄,就像JS :: HandleObject一樣。你可能會在這裏看到有關即將發生的變化:https://developer.mozilla.org/en-US/docs/SpiderMonkey/31#Migrating_to_SpiderMonkey_31

我認爲你必須使用返回值JS_BindCallable並用它覆蓋「finish」。其實你可能會這樣做:

//define a function on an object which is bound to the object it is defined on 
JSBool JS_DefineBoundFunction(JSContext *cx, JSObject *obj, const char *name, 
           JSNative call, unsigned int nargs, unsigned int attrs) { 
    JSFunction *func = JS_NewFunction(cx, call, nargs, 0, NULL, name); 
    if (!func) { 
     return JS_FALSE; 
    } 
    JSObject *funcObj = JS_GetFunctionObject(func); 
    if (!funcObj) { 
     return JS_FALSE; 
    } 
    JSObject *boundFuncObj = JS_BindCallable(cx, funcObj, obj); 
    if (!boundFuncObj) { 
     return JS_FALSE; 
    } 
    return JS_DefineProperty(cx, obj, name, 
          OBJECT_TO_JSVAL(boundFuncObj), 
          NULL, NULL, attrs); 
}
+0

啊,這是有道理的,謝謝......現在,我如何從'JSFunction *'到'JSObject *'? – Claudiu

+0

只需投射JSFunction是JSObject的一個子類:http://dxr.mozilla.org/mozilla-central/source/js/src/jsfun.h?from=JSFunction#l25 – evilpie

+0

哎呀。我使用'JS_GetFunctionObject',似乎只是施放它。我做了一個可以工作的幫助函數,我將編輯你的測試代碼並接受答案。 – Claudiu

相關問題