【问题标题】:How to return a JSObject from a C/C++ function in Spidermonkey 38如何从 Spidermonkey 38 中的 C/C++ 函数返回 JSObject
【发布时间】:2016-02-16 14:10:03
【问题描述】:

我想在 C/C++ 函数中创建一个 JSObject 并将其返回以供被调用者使用。我在官方文档中苦苦挣扎,因为必要的信息有点分散,而且指南中充满了过时的信息,而且几乎没有涵盖真实世界的场景。

忽略似乎引用过时版本的部分,cookbook 显示了调用args.rval().setInt32()setDouble()setNull() 的示例。但是,reference for JS::CallArgs 表示 rval() 返回一个 MutableHandleValue 哪个 doesn't appear to have those setter methods。他们的意思是rval()->set...,它可以通过-> 和/或强制转换运算符工作吗?

然后code example on the CallArgs page 额外显示使用CallArgs 的set() 方法。那和上面的方法有什么区别呢? set()setObject() 会确保我的新对象正确注册到 GC 吗?

【问题讨论】:

    标签: spidermonkey


    【解决方案1】:

    对于 SpiderMonkey,不要太相信 MDN,它通常已经过时或不完整。 MutableHandle<Value> 特化实现了 MutableValueOperations,其中包括 setObject() 等。

    例如,您可能想在您的情况下做什么:

    static boolean
    Test(JSContext* cx, unsigned argc, Value* vp) {
      CallArgs args = CallArgsFromVp(argc, vp);
      RootedObject obj(cx, JS_NewPlainObject(cx);
      if (!obj)
        return false;
      args.rval().setObject(*obj);
      return true;
    }
    

    set 对于所有不同的 MutableHandle 特化是不同的。 IE。对于MutableHandle<JSString>,您可以使用它来设置JSString*

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-04
      • 2020-04-07
      • 1970-01-01
      • 2012-06-17
      • 1970-01-01
      • 2020-02-17
      • 2013-10-12
      相关资源
      最近更新 更多