0

我正在嵌入 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);
4

1 回答 1

1

JSRawObject是一个 typedef JSObject*,所以你的用法是正确的。我们这样做是因为在未来的版本中所有的 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);
}
于 2013-09-27T19:53:15.187 回答