我正在嵌入SpiderMonkey并尝试使用JS_BindCallable
。但是,我有一个JSObject *
我想用作newThis
,但该函数需要JSRawObject
。 JSRawObject
上的文档看起来很稀疏,头文件没有提供任何线索。
如果我简单地将它传递给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);
答案 0 :(得分:1)
JSRawObject
是JSObject*
的typedef,因此您的使用是正确的。我们这样做了,因为在将来的版本中,所有API都将采用句柄,就像JS :: HandleObject一样。您可以在此处阅读有关即将发生的更改:https://developer.mozilla.org/en-US/docs/SpiderMonkey/31#Migrating_to_SpiderMonkey_31
我认为你必须使用JS_BindCallable
的返回值并用它覆盖“完成”。实际上你可能会这样做:
//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);
}