我想在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中正确注册吗?
答案 0 :(得分:0)
对于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;
}
对于所有不同的MutableHandle专精, set
是不同的。即对于MutableHandle<JSString>
,您可以使用它来设置JSString*
。