Skip to content

Commit

Permalink
fix corner case in functions (#3365)
Browse files Browse the repository at this point in the history
fixes #3364
  • Loading branch information
alexlamsl committed Apr 18, 2019
1 parent 21cd7e3 commit e8a2c0b
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 4 deletions.
2 changes: 1 addition & 1 deletion lib/compress.js
Expand Up @@ -3602,7 +3602,7 @@ merge(Compressor.prototype, {
compressor.warn("Declaring {name} as function [{file}:{line},{col}]", template(def.name));
var defun = make_node(AST_Defun, def, def.value);
defun.name = make_node(AST_SymbolDefun, def.name, def.name);
self.def_function(defun.name);
defun.parent_scope.resolve().def_function(defun.name);
body.push(defun);
} else {
if (side_effects.length > 0) {
Expand Down
4 changes: 1 addition & 3 deletions lib/scope.js
Expand Up @@ -61,8 +61,6 @@ SymbolDef.next_id = 1;

SymbolDef.prototype = {
unmangleable: function(options) {
if (!options) options = {};

return this.global && !options.toplevel
|| this.undeclared
|| !options.eval && this.scope.pinned()
Expand Down Expand Up @@ -296,7 +294,7 @@ AST_Scope.DEFMETHOD("def_variable", function(symbol, init) {

AST_Lambda.DEFMETHOD("resolve", return_this);
AST_Scope.DEFMETHOD("resolve", function() {
return this.parent_scope;
return this.parent_scope.resolve();
});
AST_Toplevel.DEFMETHOD("resolve", return_this);

Expand Down
65 changes: 65 additions & 0 deletions test/compress/functions.js
Expand Up @@ -2916,3 +2916,68 @@ issue_2485: {
}
expect_stdout: "6"
}

issue_3364: {
options = {
functions: true,
reduce_vars: true,
toplevel: true,
unused: true,
}
mangle = {}
input: {
var s = 2, a = 100, b = 10, c = 0;
function f(p, e, r) {
try {
for (var i = 1; i-- > 0;)
var a = function(x) {
function g(y) {
y && y[a++];
}
var x = g(--s >= 0 && f(c++));
for (var j = 1; --j > 0;);
}();
} catch (e) {
try {
return;
} catch (z) {
for (var k = 1; --k > 0;) {
for (var l = 1; l > 0; --l) {
var n = function() {};
for (var k in n)
var o = (n, k);
}
}
}
}
}
var r = f();
console.log(c);
}
expect: {
var s = 2, c = 0;
(function n(r, o, a) {
try {
for (var f = 1; f-- >0;)
var t = function(r) {
(function(r) {
r && r[t++];
})(--s >= 0 && n(c++));
for (var o = 1; --o > 0;);
}();
} catch (o) {
try {
return;
} catch (r) {
for (var v = 1; --v > 0;)
for (var i = 1; i > 0;--i) {
function u() {}
for (var v in u);
}
}
}
})();
console.log(c);
}
expect_stdout: "2"
}

0 comments on commit e8a2c0b

Please sign in to comment.