optimizing the output of compiled splat arguments.

This commit is contained in:
Jeremy Ashkenas
2010-07-24 12:40:36 -07:00
parent dc1288d319
commit 6b6beb588c
3 changed files with 27 additions and 21 deletions

View File

@@ -922,14 +922,17 @@ exports.SplatNode: class SplatNode extends BaseNode
compileParam: (o) ->
name: @name.compile(o)
o.scope.find name
len: o.scope.freeVariable()
o.scope.assign len, "arguments.length"
variadic: o.scope.freeVariable()
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})"
end: ''
if @trailings.length
len: o.scope.freeVariable()
o.scope.assign len, "arguments.length"
variadic: o.scope.freeVariable()
o.scope.assign variadic, "$len >= $@arglength"
end: if @trailings.length then ", $len - ${@trailings.length}"
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$end)"
# A compiling a splat as a destructuring assignment means slicing arguments
# from the right-hand-side's corresponding array.