From 888ab5473a2acc22aad9880e70cbc71d04e9101e Mon Sep 17 00:00:00 2001 From: James Kyle Date: Tue, 2 Dec 2014 16:26:18 -0800 Subject: [PATCH] Only slice arguments when necessary - fixes #239 --- lib/6to5/transformation/transformers/es6-spread.js | 7 ++++++- .../es6-spread/arguments-array/actual.js | 9 +++++++++ .../es6-spread/arguments-array/expected.js | 12 ++++++++++++ .../es6-spread/arguments-concat/actual.js | 9 +++++++++ .../es6-spread/arguments-concat/expected.js | 12 ++++++++++++ .../transformation/es6-spread/arguments/actual.js | 2 +- .../transformation/es6-spread/arguments/expected.js | 3 +-- 7 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 test/fixtures/transformation/es6-spread/arguments-array/actual.js create mode 100644 test/fixtures/transformation/es6-spread/arguments-array/expected.js create mode 100644 test/fixtures/transformation/es6-spread/arguments-concat/actual.js create mode 100644 test/fixtures/transformation/es6-spread/arguments-concat/expected.js diff --git a/lib/6to5/transformation/transformers/es6-spread.js b/lib/6to5/transformation/transformers/es6-spread.js index 20f2165bda..8e07127db2 100644 --- a/lib/6to5/transformation/transformers/es6-spread.js +++ b/lib/6to5/transformation/transformers/es6-spread.js @@ -64,7 +64,12 @@ exports.CallExpression = function (node, parent, file) { node.arguments = []; - var nodes = build(args, file); + var nodes; + if (args.length === 1 && args[0].argument.name === 'arguments') { + nodes = [args[0].argument]; + } else { + nodes = build(args, file); + } var first = nodes.shift(); if (nodes.length) { diff --git a/test/fixtures/transformation/es6-spread/arguments-array/actual.js b/test/fixtures/transformation/es6-spread/arguments-array/actual.js new file mode 100644 index 0000000000..e18c362b1b --- /dev/null +++ b/test/fixtures/transformation/es6-spread/arguments-array/actual.js @@ -0,0 +1,9 @@ +function foo() { + return bar([...arguments]); +} + +function bar(one, two, three) { + return [one, two, three]; +} + +foo("foo", "bar"); diff --git a/test/fixtures/transformation/es6-spread/arguments-array/expected.js b/test/fixtures/transformation/es6-spread/arguments-array/expected.js new file mode 100644 index 0000000000..705f37c31e --- /dev/null +++ b/test/fixtures/transformation/es6-spread/arguments-array/expected.js @@ -0,0 +1,12 @@ +"use strict"; + +var _slice = Array.prototype.slice; +function foo() { + return bar([].concat(_slice.call(arguments))); +} + +function bar(one, two, three) { + return [one, two, three]; +} + +foo("foo", "bar"); diff --git a/test/fixtures/transformation/es6-spread/arguments-concat/actual.js b/test/fixtures/transformation/es6-spread/arguments-concat/actual.js new file mode 100644 index 0000000000..a6fdb21bef --- /dev/null +++ b/test/fixtures/transformation/es6-spread/arguments-concat/actual.js @@ -0,0 +1,9 @@ +function foo() { + return bar("test", ...arguments); +} + +function bar(one, two, three) { + return [one, two, three]; +} + +foo("foo", "bar"); diff --git a/test/fixtures/transformation/es6-spread/arguments-concat/expected.js b/test/fixtures/transformation/es6-spread/arguments-concat/expected.js new file mode 100644 index 0000000000..1ba8c3aeb2 --- /dev/null +++ b/test/fixtures/transformation/es6-spread/arguments-concat/expected.js @@ -0,0 +1,12 @@ +"use strict"; + +var _slice = Array.prototype.slice; +function foo() { + return bar.apply(null, ["test"].concat(_slice.call(arguments))); +} + +function bar(one, two, three) { + return [one, two, three]; +} + +foo("foo", "bar"); diff --git a/test/fixtures/transformation/es6-spread/arguments/actual.js b/test/fixtures/transformation/es6-spread/arguments/actual.js index a6fdb21bef..476da431e8 100644 --- a/test/fixtures/transformation/es6-spread/arguments/actual.js +++ b/test/fixtures/transformation/es6-spread/arguments/actual.js @@ -1,5 +1,5 @@ function foo() { - return bar("test", ...arguments); + return bar(...arguments); } function bar(one, two, three) { diff --git a/test/fixtures/transformation/es6-spread/arguments/expected.js b/test/fixtures/transformation/es6-spread/arguments/expected.js index 1ba8c3aeb2..c78c808ef0 100644 --- a/test/fixtures/transformation/es6-spread/arguments/expected.js +++ b/test/fixtures/transformation/es6-spread/arguments/expected.js @@ -1,8 +1,7 @@ "use strict"; -var _slice = Array.prototype.slice; function foo() { - return bar.apply(null, ["test"].concat(_slice.call(arguments))); + return bar.apply(null, arguments); } function bar(one, two, three) {