adding support for calling variadic functions with less than the requested number of arguments.

This commit is contained in:
Jeremy Ashkenas
2010-05-08 12:44:54 -04:00
parent be72120311
commit 9a7420ccd0
3 changed files with 32 additions and 9 deletions

View File

@@ -773,8 +773,9 @@ exports.CodeNode: class CodeNode extends BaseNode
if param instanceof SplatNode and not splat?
splat: param
splat.index: i
@body.unshift(splat)
splat.trailings: []
splat.arglength: @params.length
@body.unshift(splat)
else if splat?
splat.trailings.push(param)
else
@@ -830,8 +831,11 @@ exports.SplatNode: class SplatNode extends BaseNode
o.scope.find name
len: o.scope.free_variable()
o.scope.assign len, "arguments.length"
for trailing, pos in @trailings
o.scope.assign(trailing.compile(o), "arguments[$len - ${@trailings.length + pos}]")
variadic: o.scope.free_variable()
o.scope.assign variadic, "$len >= $@arglength"
for trailing, idx in @trailings
pos: @trailings.length - idx
o.scope.assign(trailing.compile(o), "arguments[$variadic ? $len - $pos : ${@index + idx}]")
"$name = ${utility('slice')}.call(arguments, $@index, $len - ${@trailings.length})"
# A compiling a splat as a destructuring assignment means slicing arguments