【问题标题】:Calling callback function in SpiderMonkey JS Engine在 SpiderMonkey JS Engine 中调用回调函数
【发布时间】:2012-12-30 17:38:26
【问题描述】:

我正在使用 SpiderMonkey JS Engine 1.8.5 API。

JS 代码如下:

visitChildren(function() {
                             log("something");
                         });

VisitChildren 类似于:

JSBool visit_children(JSContext* cx, uintN argc, jsval *vp) {

    JSFunction* function;
    if (!JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "f", &function))
        return JS_FALSE;

    jsval retVal;
    JS_CallFunction(cx, JS_GetGlobalObject(cx), function, 0, NULL, &retVal);

    return JS_TRUE;
}

我有意简化代码以使问题更清晰。绝对我做错了什么,有人可以建议我为什么调用 *JS_CallFunction* 会导致应用程序崩溃?

UPD1:

在这里找到一些模糊的信息https://developer.mozilla.org/en-US/docs/SpiderMonkey/JSAPI_Reference/JSFunction,但仍然崩溃:

jsval functionVal = OBJECT_TO_JSVAL(JS_GetFunctionObject(function));
JS_CallFunctionValue(cx, JS_GetGlobalObject(cx), functionVal, 0, NULL, &retVal);

【问题讨论】:

  • 我对 C++ 了解不多,但是如果将 jsval 设置为 nullptr 会发生什么。
  • 否则,您可能有兴趣看看这个:dxr.mozilla.org/…

标签: javascript spidermonkey


【解决方案1】:

你想要的是JS_CallFunctionValue[1]。测试类型后(您的 JS_ConvertArguments 调用),忽略转换的结果 JSFunction 并改用实际的 jsval。我还没有找到JSFunctions 的用途。

【讨论】:

  • 谢谢! JS_CallFunctionValue(cx, JS_GetGlobalObject(cx), *(JS_ARGV(cx, vp)), 0, NULL, &retVal);像魅力一样工作!
猜你喜欢
  • 2014-05-07
  • 2016-01-29
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多