hoist param declaration when performing tco - fixes #1478
This commit is contained in:
@@ -181,9 +181,11 @@ class TailCallTransformer {
|
||||
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);
|
||||
@@ -191,7 +193,9 @@ class TailCallTransformer {
|
||||
|
||||
var paramDecls = this.paramDecls;
|
||||
if (paramDecls.length > 0) {
|
||||
body.unshift(t.variableDeclaration("var", paramDecls));
|
||||
var paramDecl = t.variableDeclaration("var", paramDecls);
|
||||
paramDecl._blockHoist = Infinity;
|
||||
body.unshift(paramDecl);
|
||||
}
|
||||
|
||||
body.unshift(t.expressionStatement(
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
var _again = true;
|
||||
|
||||
_function: while (_again) {
|
||||
_again = false;
|
||||
var n = _x;
|
||||
_again = false;
|
||||
|
||||
if (n <= 0) {
|
||||
console.log(_this, _arguments);
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
var _again = true;
|
||||
|
||||
_function: while (_again) {
|
||||
_again = false;
|
||||
var n = _x;
|
||||
_again = false;
|
||||
if (n <= 0) {
|
||||
return "foo";
|
||||
} else {
|
||||
@@ -26,4 +26,4 @@
|
||||
continue _function;
|
||||
}
|
||||
}
|
||||
})(1000000, true) === "foo";
|
||||
})(1000000, true) === "foo";
|
||||
|
||||
@@ -5,9 +5,9 @@ function fact(_x2) {
|
||||
var _again = true;
|
||||
|
||||
_function: while (_again) {
|
||||
var n = _x2;
|
||||
acc = undefined;
|
||||
_again = false;
|
||||
var n = _x2;
|
||||
var acc = _arguments[1] === undefined ? 1 : _arguments[1];
|
||||
if (n > 1) {
|
||||
_arguments = [_x2 = n - 1, acc * n];
|
||||
@@ -17,4 +17,4 @@ function fact(_x2) {
|
||||
return acc;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
var _again = true;
|
||||
|
||||
_function: while (_again) {
|
||||
var n = _x2;
|
||||
m = local1 = local2 = local3 = undefined;
|
||||
|
||||
var g = function g() {};
|
||||
|
||||
_again = false;
|
||||
var n = _x2;
|
||||
var m = _arguments[1] === undefined ? getDefaultValue() : _arguments[1];
|
||||
|
||||
// `m` should be `getDefaultValue()` after first pass
|
||||
@@ -27,4 +27,4 @@
|
||||
_again = true;
|
||||
continue _function;
|
||||
}
|
||||
})(1000000, true) === "foo";
|
||||
})(1000000, true) === "foo";
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
var _again = true;
|
||||
|
||||
_function: while (_again) {
|
||||
_again = false;
|
||||
var n = _x;
|
||||
_again = false;
|
||||
|
||||
if (n <= 0) {
|
||||
return "foo";
|
||||
@@ -47,8 +47,8 @@
|
||||
var _again2 = true;
|
||||
|
||||
_function2: while (_again2) {
|
||||
_again2 = false;
|
||||
var n = _x2;
|
||||
_again2 = false;
|
||||
|
||||
if (n <= 0) {
|
||||
return "foo";
|
||||
@@ -60,4 +60,4 @@
|
||||
continue _function2;
|
||||
}
|
||||
}
|
||||
})(1000000) === "foo";
|
||||
})(1000000) === "foo";
|
||||
|
||||
Reference in New Issue
Block a user