Merge pull request #1081 from babel/fix-tco-binding-clearing

Clear bindings immediately inside the TCO loop.
This commit is contained in:
Sebastian McKenzie 2015-03-25 14:16:46 +11:00
commit 048f9acc55
5 changed files with 33 additions and 4 deletions

View File

@ -179,10 +179,12 @@ class TailCallTransformer {
var declarations = flatten(map(this.vars, function (decl) {
return decl.declarations;
}, this));
var statement = reduceRight(declarations, function (expr, decl) {
var assignment = reduceRight(declarations, function (expr, decl) {
return t.assignmentExpression("=", decl.id, expr);
}, t.identifier("undefined"));
body.unshift(t.expressionStatement(statement));
var statement = t.expressionStatement(assignment);
statement._blockHoist = Infinity;
body.unshift(statement);
}
var paramDecls = this.paramDecls;

View File

@ -0,0 +1,6 @@
function sum(a=1, b=2) {
if (b > 0) {
return sum(a + 1, b - 1);
}
return a;
}

View File

@ -0,0 +1,20 @@
"use strict";
function sum() {
var _arguments = arguments;
var _again = true;
_function: while (_again) {
a = b = undefined;
var a = _arguments[0] === undefined ? 1 : _arguments[0];
_again = false;
var b = _arguments[1] === undefined ? 2 : _arguments[1];
if (b > 0) {
_arguments = [a + 1, b - 1];
_again = true;
continue _function;
}
return a;
}
}

View File

@ -5,9 +5,9 @@ function fact(_x2) {
var _again = true;
_function: while (_again) {
acc = undefined;
_again = false;
var n = _x2;
acc = undefined;
var acc = _arguments[1] === undefined ? 1 : _arguments[1];
if (n > 1) {
_arguments = [_x2 = n - 1, acc * n];

View File

@ -5,11 +5,12 @@
var _again = true;
_function: while (_again) {
m = local1 = local2 = local3 = undefined;
var g = function g() {};
_again = false;
var n = _x2;
m = local1 = local2 = local3 = undefined;
var m = _arguments[1] === undefined ? getDefaultValue() : _arguments[1];
// `m` should be `getDefaultValue()` after first pass