fix corner case in `reduce_vars` (#3124)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sun, 6 May 2018 08:42:35 +0000 (16:42 +0800)
committerGitHub <noreply@github.com>
Sun, 6 May 2018 08:42:35 +0000 (16:42 +0800)
lib/compress.js
test/compress/reduce_vars.js

index bdce24b..03fb1c1 100644 (file)
@@ -383,7 +383,15 @@ merge(Compressor.prototype, {
         }
 
         function mark_defun(tw, def) {
-            if (def.id in tw.defun_ids) return def.fixed;
+            if (def.id in tw.defun_ids) {
+                var marker = tw.defun_ids[def.id];
+                if (!marker) return;
+                if (marker !== tw.safe_ids) {
+                    tw.defun_ids[def.id] = undefined;
+                    return;
+                }
+                return def.fixed;
+            }
             if (!tw.in_loop) {
                 tw.defun_ids[def.id] = tw.safe_ids;
                 return def.fixed;
index 14b6a46..e47b96b 100644 (file)
@@ -5999,7 +5999,7 @@ issue_3113_5: {
     ]
 }
 
-conditional_nested: {
+conditional_nested_1: {
     options = {
         evaluate: true,
         reduce_vars: true,
@@ -6030,3 +6030,31 @@ conditional_nested: {
     }
     expect_stdout: "2"
 }
+
+conditional_nested_2: {
+    options = {
+        evaluate: true,
+        reduce_vars: true,
+    }
+    input: {
+        var c = 0;
+        (function(a) {
+            function f() {
+                a && c++;
+            }
+            f(!c && f(), a = 1);
+        })();
+        console.log(c);
+    }
+    expect: {
+        var c = 0;
+        (function(a) {
+            function f() {
+                a && c++;
+            }
+            f(!c && f(), a = 1);
+        })();
+        console.log(c);
+    }
+    expect_stdout: "1"
+}