diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 14a26268efd..226587b5283 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -1184,22 +1184,23 @@ class CGArgumentConverter(CGThing): template, variadicConversion, declType, "slot")] arg = "arg%d" % index - vec = "Vec::with_capacity((%(argc)s - %(index)s) as usize)" % {'argc': argc, 'index': index} if argument.type.isGeckoInterface(): - code = "let mut %s = RootedVec::new();\n*%s = %s;\n" % (arg, arg, vec) + vec = "RootedVec::new()" innerConverter.append(CGGeneric("%s.push(JS::from_ref(&*slot));" % arg)) else: - code = "let mut %s = %s;\n" % (arg, vec) + vec = "vec![]" innerConverter.append(CGGeneric("%s.push(slot);" % arg)) - inner = CGIndenter(CGList(innerConverter, "\n"), 4).define() + inner = CGIndenter(CGList(innerConverter, "\n"), 8).define() - code += """\ -for variadicArg in %(index)s..%(argc)s { + self.converter = CGGeneric("""\ +let mut %(arg)s = %(vec)s; +if %(argc)s > %(index)s { + %(arg)s.reserve(%(argc)s as usize - %(index)s); + for variadicArg in %(index)s..%(argc)s { %(inner)s -}""" % {'argc': argc, 'index': index, 'inner': inner} - - self.converter = CGGeneric(code) + } +}""" % {'arg': arg, 'argc': argc, 'index': index, 'inner': inner, 'vec': vec}) def define(self): return self.converter.define() diff --git a/components/script/dom/testbinding.rs b/components/script/dom/testbinding.rs index df098b98aa5..bd9515d55bf 100644 --- a/components/script/dom/testbinding.rs +++ b/components/script/dom/testbinding.rs @@ -362,6 +362,7 @@ impl TestBindingMethods for TestBinding { // fn PassOptionalNullableEnumWithNonNullDefault(self, _: Option) {} fn PassVariadicBoolean(&self, _: Vec) {} + fn PassVariadicBooleanAndDefault(&self, _: bool, _: Vec) {} fn PassVariadicByte(&self, _: Vec) {} fn PassVariadicOctet(&self, _: Vec) {} fn PassVariadicShort(&self, _: Vec) {} diff --git a/components/script/dom/webidls/TestBinding.webidl b/components/script/dom/webidls/TestBinding.webidl index 803944b75fa..419f5e6ad19 100644 --- a/components/script/dom/webidls/TestBinding.webidl +++ b/components/script/dom/webidls/TestBinding.webidl @@ -325,6 +325,7 @@ interface TestBinding { // void passOptionalNullableUnion2WithNonNullDefault(optional (Event or DOMString)? data = "foo"); void passVariadicBoolean(boolean... args); + void passVariadicBooleanAndDefault(optional boolean arg = true, boolean... args); void passVariadicByte(byte... args); void passVariadicOctet(octet... args); void passVariadicShort(short... args); diff --git a/tests/wpt/mozilla/tests/mozilla/variadic-interface.html b/tests/wpt/mozilla/tests/mozilla/variadic-interface.html index bf928f8fe09..5ab0557c5e0 100644 --- a/tests/wpt/mozilla/tests/mozilla/variadic-interface.html +++ b/tests/wpt/mozilla/tests/mozilla/variadic-interface.html @@ -5,7 +5,12 @@