new
constructors for WebIDL bindings introduce undefined behavior by not setting default values
#3937
Labels
new
constructors for WebIDL bindings introduce undefined behavior by not setting default values
#3937
Describe the Bug
The definitions for WebIDL dictionaries contain information if fields are optional or required by prefixing them with
required
or marking the type?
. However, there's a third option: fields can be neitherrequired
nor?
, but have a default value after=
.Currently, code generation for constructor bindings does not set default values in the body of the
new
function. Therefore, creating a dictionary withnew()
and immediately reading a field that should have a default value is undefined behavior.Steps to Reproduce
E.g. for the first dictionary declaration I could find going alphabetically in the enabled WebIDLs that uses default values:
wasm-bindgen/crates/web-sys/webidls/enabled/AnalyserNode.webidl
Lines 13 to 18 in e78db23
This example is using the getters as implemented in #3933, but the same case can be constructed by many Web APIs that take a dictionary with properties containing default values as argument.
Expected Behavior
Actual Behavior
Additional Context
The faulty generated code for
AnalyserOptions::new
that does not set default values:wasm-bindgen/crates/web-sys/src/features/gen_AnalyserOptions.rs
Lines 30 to 38 in e78db23
I discovered this by working on WebIDL dictionary getters in #3933 and thinking about the implications of unsetting dictionary values in #3921 (comment).
Not allowing to safely read properties that are known to exist on a dictionary would require using
Option
in return values of property getters and require to be unnecessarily defensive when reading them.The text was updated successfully, but these errors were encountered: