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の戻り値を使用して、 「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);
}
于 2013-09-27T19:53:15.187 に答える