TL;DR: If you need to produce a JS::Value from some C++ type, use mozilla::dom::ToJSValue. Anything else will probably need to be search-and-replaced out of the codebase later.

Background: There are some situations in which it's not possible to just use WebIDL bindings to handle conversions from C++ values to JS values. Examples include resolving a Promise with the value, calls to XPCOM APIs that take "jsval" in the xpidl, and various interactions with JSAPI that might become more prevalent as there is tighter coupling between EcmaScript and other parts of the web platform. Furthermore, we might end up with some .... interesting rules about which compartment should be used when allocating objects when called via Xrays.

To address all this, we now have a mozilla/dom/ToJSValue.h header, which provides various overloads of the mozilla::dom::ToJSValue function. All overloads take a JSContext*, a C++ value, and a JS::MutableHandleValue to put the resulting JS::Value into. These functions should be used for all your "create a JS::Value in C++" needs.

Promises make use of this infrastructure automatically via the single-argument Promise::MaybeResolve/MaybeReject, but other code that for some reason needs to create JS values can and should be using this as well. You can see an example use in http://hg.mozilla.org/mozilla-central/diff/4182ec5042d5/dom/mobilemessage/src/SmsFilter.cpp

The following C++ types are currently supported:

1) nsString.
2) int32_t, uint32_t, int64_t, uint64_t.
3) float, double.
4) A reference to a WebIDL-binding object which inherits from both
   nsWrapperCache and nsISupports.
5) A reference to any C++ type which singly-inherits from nsISupports
   (e.g. any nsIFoo).
6) An nsRefPtr or nsCOMPtr around an object that satisfies the
   conditions of #4 or #5.
7) const nsTArray<T>, where T is any supported type.
8) const FallibleTArray<T>, where T is any supported type.
9) const T[N], where T is any supported type and N is an integer.
10) WebIDL dictionaries.

There is also an explicit four-argument form of ToJSValue that can handle an arbitrary (T*, length) pair and produces an array; you can see an example use in http://hg.mozilla.org/mozilla-central/diff/4182ec5042d5/content/canvas/src/WebGLContextGL.cpp

We will add other types as needed, of course, but I expect that the above should cover most current use cases.

If you find yourself reaching for JS_NewArrayObject, stop, take a deep breath, and use ToJSValue instead. ;)

-Boris
_______________________________________________
dev-platform mailing list
dev-platform@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-platform

Reply via email to