Auto merge of #8498 - nox:fix-variadic-and-default-arguments, r=jdm

Properly handle variadic arguments preceded by default values

I broke that in #8197.

<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/8498)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2015-11-13 04:22:11 +05:30
commit c44c73aa00
4 changed files with 19 additions and 11 deletions

View file

@ -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()