fix corner case in `functions` (#3365)
authorAlex Lam S.L <alexlamsl@gmail.com>
Thu, 18 Apr 2019 09:03:52 +0000 (17:03 +0800)
committerGitHub <noreply@github.com>
Thu, 18 Apr 2019 09:03:52 +0000 (17:03 +0800)
fixes #3364

lib/compress.js
lib/scope.js
test/compress/functions.js

index 2fdfc89..f5479be 100644 (file)
@@ -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) {
index 47e05da..08c9efd 100644 (file)
@@ -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()
@@ -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);
 
index 2d00c59..c43c17e 100644 (file)
@@ -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"
+}