There are several changes here:
1) When wrapping a callback interface object for JS, just extract the
underlying JSObject from inside it and hand that object out.
2) Flag callback interface descriptors as "not concrete" (only matters
for cases when they have constants on the interface object) and not
wrappercached (will catch bugs if someone tries to treat them as a
Gecko object).
3) Fix a preexisting bug in sequence wrapping where we'd try to
JS_DefineElement twice if we were wrapping a null value for a
sequence of nullable interface objects.
The new setup is:
* Consequential interfaces with no explicit descriptor are still skipped.
* If no information is provided about an interface, an empty descriptor is
assumed.
* If a list is provided and the only entry is a worker descriptor, an empty
main-thread descriptor is assumed.
This is the full implementation of the AudioBuffer object. There are
two ways to create these objects from an audio context and this patch
implements only one of them.
The construction of the AudioBuffer object is a two step process: the
object should be created with operator new first, and then
InitializeBuffers should be called on it. InitializeBuffers is
fallible, because it uses the JS API to create the underlying typed
arrays, but that's fine, since the length of the buffers comes from web
content, and we don't want to use infallible allocations for those
anyways.
We hold on to the JS objects from the C++ implementation, and trace
through all of those objects, so that a GC does not kill those object
without us knowing.
The buffer should be possible to manipulate from both C++ and JS, and
the C++ object probably needs to support a set of methods for the C++
callers at some point.
This is the bare minimum that one needs in order to get those interfaces
implemented. The work to make the simplest of Web Audio test cases
actually pass will be done in bug 792649.
This is the bare minimum that one needs in order to get those interfaces
implemented. The work to make the simplest of Web Audio test cases
actually pass will be done in bug 792649.
In this new setup, there are three new extended attributes: Infallible,
GetterInfallible, SetterInfallible. The first one applies to both methods and
attributes, while the last two apply only to attributes. Each one can be
either set with no value specified (in which case it applies both on main
thread and in workers) or can be set to MainThread or Workers to limit where it
applies.
If Infallible is set on an attribute, then GetterInfallible and
SetterInfallible will be ignored. So if you want to specify, for example, an
attribute that's infallible on the main thread and has an infallible getter in
workers, the right way to do that is [GetterInfallible,
SetterInfallible=MainThread].