From 3e0b9b6b4eee4ef38e15dae39aed37c7a642cff8 Mon Sep 17 00:00:00 2001 From: Jhen Date: Sun, 20 Sep 2015 04:01:10 +0800 Subject: [PATCH 1/3] [es6.tailCall] Move ' = undefined' to the place in front of Continue statement --- .../transformers/es6/tail-call.js | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/packages/babel/src/transformation/transformers/es6/tail-call.js b/packages/babel/src/transformation/transformers/es6/tail-call.js index 7a4ae6c37d..350de4c0c6 100644 --- a/packages/babel/src/transformation/transformers/es6/tail-call.js +++ b/packages/babel/src/transformation/transformers/es6/tail-call.js @@ -240,20 +240,6 @@ class TailCallTransformer { bodyNode._blockHoist = 2; } - if (this.vars.length > 0) { - var declarations = flatten(map(this.vars, function (decl) { - return decl.declarations; - })); - - var assignment = reduceRight(declarations, function (expr, decl) { - return t.assignmentExpression("=", decl.id, expr); - }, t.identifier("undefined")); - - var statement = t.expressionStatement(assignment); - statement._blockHoist = Infinity; - body.unshift(statement); - } - var paramDecls = this.paramDecls; if (paramDecls.length > 0) { var paramDecl = t.variableDeclaration("var", paramDecls); @@ -492,6 +478,19 @@ class TailCallTransformer { t.assignmentExpression("=", this.getAgainId(), t.literal(true)) )); + if (this.vars.length > 0) { + var declarations = flatten(map(this.vars, function (decl) { + return decl.declarations; + })); + + var assignment = reduceRight(declarations, function (expr, decl) { + return t.assignmentExpression("=", decl.id, expr); + }, t.identifier("undefined")); + + var statement = t.expressionStatement(assignment); + body.push(statement); + } + body.push(t.continueStatement(this.getFunctionId())); return body; From 441f5a14f69b1f716ba78309ae0a36b806a52049 Mon Sep 17 00:00:00 2001 From: Jhen Date: Sun, 20 Sep 2015 04:01:24 +0800 Subject: [PATCH 2/3] [es6.tailCall] Update tests --- .../es6.tail-call/default-parameters/expected.js | 2 +- .../transformation/es6.tail-call/factorial/expected.js | 2 +- .../transformation/es6.tail-call/max-args/expected.js | 4 ++-- .../transformation/es6.tail-call/recursion/expected.js | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/babel/test/fixtures/transformation/es6.tail-call/default-parameters/expected.js b/packages/babel/test/fixtures/transformation/es6.tail-call/default-parameters/expected.js index 43e6c9cc73..9d39867eef 100644 --- a/packages/babel/test/fixtures/transformation/es6.tail-call/default-parameters/expected.js +++ b/packages/babel/test/fixtures/transformation/es6.tail-call/default-parameters/expected.js @@ -5,7 +5,6 @@ function sum() { var _again = true; _function: while (_again) { - a = b = undefined; var a = _arguments.length <= 0 || _arguments[0] === undefined ? 1 : _arguments[0]; _again = false; var b = _arguments.length <= 1 || _arguments[1] === undefined ? 2 : _arguments[1]; @@ -13,6 +12,7 @@ function sum() { if (b > 0) { _arguments = [a + 1, b - 1]; _again = true; + a = b = undefined; continue _function; } return a; diff --git a/packages/babel/test/fixtures/transformation/es6.tail-call/factorial/expected.js b/packages/babel/test/fixtures/transformation/es6.tail-call/factorial/expected.js index 55fbf85b21..42af9dacaa 100644 --- a/packages/babel/test/fixtures/transformation/es6.tail-call/factorial/expected.js +++ b/packages/babel/test/fixtures/transformation/es6.tail-call/factorial/expected.js @@ -6,12 +6,12 @@ function fact(_x2) { _function: while (_again) { var n = _x2; - acc = undefined; _again = false; var acc = _arguments.length <= 1 || _arguments[1] === undefined ? 1 : _arguments[1]; if (n > 1) { _arguments = [_x2 = n - 1, acc * n]; _again = true; + acc = undefined; continue _function; } else { return acc; diff --git a/packages/babel/test/fixtures/transformation/es6.tail-call/max-args/expected.js b/packages/babel/test/fixtures/transformation/es6.tail-call/max-args/expected.js index 5e609ac64e..974cc6a835 100644 --- a/packages/babel/test/fixtures/transformation/es6.tail-call/max-args/expected.js +++ b/packages/babel/test/fixtures/transformation/es6.tail-call/max-args/expected.js @@ -5,13 +5,13 @@ var count = function count() { var _again = true; _function: while (_again) { - i = undefined; _again = false; var i = _arguments.length <= 0 || _arguments[0] === undefined ? 10 : _arguments[0]; if (!i) return; _arguments = [i - 1]; _again = true; + i = undefined; continue _function; } }; @@ -21,13 +21,13 @@ function count2() { var _again2 = true; _function2: while (_again2) { - i = undefined; _again2 = false; var i = _arguments2.length <= 0 || _arguments2[0] === undefined ? 10 : _arguments2[0]; if (!i) return; _arguments2 = [i - 1]; _again2 = true; + i = undefined; continue _function2; } } \ No newline at end of file diff --git a/packages/babel/test/fixtures/transformation/es6.tail-call/recursion/expected.js b/packages/babel/test/fixtures/transformation/es6.tail-call/recursion/expected.js index 62607b250f..b313622038 100755 --- a/packages/babel/test/fixtures/transformation/es6.tail-call/recursion/expected.js +++ b/packages/babel/test/fixtures/transformation/es6.tail-call/recursion/expected.js @@ -6,7 +6,6 @@ _function: while (_again) { var n = _x2; - m = local1 = local2 = local3 = undefined; var g = function g() {}; @@ -25,6 +24,7 @@ g = 123; _arguments = [_x2 = n - 1]; _again = true; + m = local1 = local2 = local3 = undefined; continue _function; } })(1e6, true) === "foo"; \ No newline at end of file From 67efa9ee4a834ed5ddd19a2c71f226fc6d709745 Mon Sep 17 00:00:00 2001 From: Jhen Date: Sat, 26 Sep 2015 13:16:34 +0800 Subject: [PATCH 3/3] [es6.tailCall] Add default-parameters-black-es6-block-scoping test case refer: https://github.com/babel/babel/issues/2401 --- .../actual.js | 6 ++++++ .../expected.js | 20 +++++++++++++++++++ .../options.json | 3 +++ 3 files changed, 29 insertions(+) create mode 100644 packages/babel/test/fixtures/transformation/es6.tail-call/default-parameters-black-es6-block-scoping/actual.js create mode 100644 packages/babel/test/fixtures/transformation/es6.tail-call/default-parameters-black-es6-block-scoping/expected.js create mode 100644 packages/babel/test/fixtures/transformation/es6.tail-call/default-parameters-black-es6-block-scoping/options.json diff --git a/packages/babel/test/fixtures/transformation/es6.tail-call/default-parameters-black-es6-block-scoping/actual.js b/packages/babel/test/fixtures/transformation/es6.tail-call/default-parameters-black-es6-block-scoping/actual.js new file mode 100644 index 0000000000..4322fa1e05 --- /dev/null +++ b/packages/babel/test/fixtures/transformation/es6.tail-call/default-parameters-black-es6-block-scoping/actual.js @@ -0,0 +1,6 @@ +function sum(a=1, b=2) { + if (b > 0) { + return sum(a + 1, b - 1); + } + return a; +} diff --git a/packages/babel/test/fixtures/transformation/es6.tail-call/default-parameters-black-es6-block-scoping/expected.js b/packages/babel/test/fixtures/transformation/es6.tail-call/default-parameters-black-es6-block-scoping/expected.js new file mode 100644 index 0000000000..c8124c58bc --- /dev/null +++ b/packages/babel/test/fixtures/transformation/es6.tail-call/default-parameters-black-es6-block-scoping/expected.js @@ -0,0 +1,20 @@ +"use strict"; + +function sum() { + var _arguments = arguments; + var _again = true; + + _function: while (_again) { + let a = _arguments.length <= 0 || _arguments[0] === undefined ? 1 : _arguments[0]; + _again = false; + let b = _arguments.length <= 1 || _arguments[1] === undefined ? 2 : _arguments[1]; + + if (b > 0) { + _arguments = [a + 1, b - 1]; + _again = true; + a = b = undefined; + continue _function; + } + return a; + } +} \ No newline at end of file diff --git a/packages/babel/test/fixtures/transformation/es6.tail-call/default-parameters-black-es6-block-scoping/options.json b/packages/babel/test/fixtures/transformation/es6.tail-call/default-parameters-black-es6-block-scoping/options.json new file mode 100644 index 0000000000..395feeea94 --- /dev/null +++ b/packages/babel/test/fixtures/transformation/es6.tail-call/default-parameters-black-es6-block-scoping/options.json @@ -0,0 +1,3 @@ +{ + "blacklist": ["es6.blockScoping"] +} \ No newline at end of file