mirror of
https://github.com/servo/servo.git
synced 2025-07-25 08:10:21 +01:00
Properly handle variadic arguments preceded by default values
I broke that in #8197.
This commit is contained in:
parent
e394c0d859
commit
d4ce25d07c
4 changed files with 19 additions and 11 deletions
|
@ -1189,22 +1189,23 @@ class CGArgumentConverter(CGThing):
|
||||||
template, variadicConversion, declType, "slot")]
|
template, variadicConversion, declType, "slot")]
|
||||||
|
|
||||||
arg = "arg%d" % index
|
arg = "arg%d" % index
|
||||||
vec = "Vec::with_capacity((%(argc)s - %(index)s) as usize)" % {'argc': argc, 'index': index}
|
|
||||||
|
|
||||||
if argument.type.isGeckoInterface():
|
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))
|
innerConverter.append(CGGeneric("%s.push(JS::from_ref(&*slot));" % arg))
|
||||||
else:
|
else:
|
||||||
code = "let mut %s = %s;\n" % (arg, vec)
|
vec = "vec![]"
|
||||||
innerConverter.append(CGGeneric("%s.push(slot);" % arg))
|
innerConverter.append(CGGeneric("%s.push(slot);" % arg))
|
||||||
inner = CGIndenter(CGList(innerConverter, "\n"), 4).define()
|
inner = CGIndenter(CGList(innerConverter, "\n"), 8).define()
|
||||||
|
|
||||||
code += """\
|
self.converter = CGGeneric("""\
|
||||||
for variadicArg in %(index)s..%(argc)s {
|
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
|
%(inner)s
|
||||||
}""" % {'argc': argc, 'index': index, 'inner': inner}
|
}
|
||||||
|
}""" % {'arg': arg, 'argc': argc, 'index': index, 'inner': inner, 'vec': vec})
|
||||||
self.converter = CGGeneric(code)
|
|
||||||
|
|
||||||
def define(self):
|
def define(self):
|
||||||
return self.converter.define()
|
return self.converter.define()
|
||||||
|
|
|
@ -362,6 +362,7 @@ impl TestBindingMethods for TestBinding {
|
||||||
// fn PassOptionalNullableEnumWithNonNullDefault(self, _: Option<TestEnum>) {}
|
// fn PassOptionalNullableEnumWithNonNullDefault(self, _: Option<TestEnum>) {}
|
||||||
|
|
||||||
fn PassVariadicBoolean(&self, _: Vec<bool>) {}
|
fn PassVariadicBoolean(&self, _: Vec<bool>) {}
|
||||||
|
fn PassVariadicBooleanAndDefault(&self, _: bool, _: Vec<bool>) {}
|
||||||
fn PassVariadicByte(&self, _: Vec<i8>) {}
|
fn PassVariadicByte(&self, _: Vec<i8>) {}
|
||||||
fn PassVariadicOctet(&self, _: Vec<u8>) {}
|
fn PassVariadicOctet(&self, _: Vec<u8>) {}
|
||||||
fn PassVariadicShort(&self, _: Vec<i16>) {}
|
fn PassVariadicShort(&self, _: Vec<i16>) {}
|
||||||
|
|
|
@ -325,6 +325,7 @@ interface TestBinding {
|
||||||
// void passOptionalNullableUnion2WithNonNullDefault(optional (Event or DOMString)? data = "foo");
|
// void passOptionalNullableUnion2WithNonNullDefault(optional (Event or DOMString)? data = "foo");
|
||||||
|
|
||||||
void passVariadicBoolean(boolean... args);
|
void passVariadicBoolean(boolean... args);
|
||||||
|
void passVariadicBooleanAndDefault(optional boolean arg = true, boolean... args);
|
||||||
void passVariadicByte(byte... args);
|
void passVariadicByte(byte... args);
|
||||||
void passVariadicOctet(octet... args);
|
void passVariadicOctet(octet... args);
|
||||||
void passVariadicShort(short... args);
|
void passVariadicShort(short... args);
|
||||||
|
|
|
@ -8,4 +8,9 @@ test(function() {
|
||||||
var t = new TestBinding;
|
var t = new TestBinding;
|
||||||
t.passVariadicInterface(new Blob, new Blob);
|
t.passVariadicInterface(new Blob, new Blob);
|
||||||
}, "Variadic interface arguments work.");
|
}, "Variadic interface arguments work.");
|
||||||
|
|
||||||
|
test(function() {
|
||||||
|
var t = new TestBinding;
|
||||||
|
t.passVariadicBooleanAndDefault();
|
||||||
|
}, "Default values and variadic arguments work together.");
|
||||||
</script>
|
</script>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue