fix corner cases in `merge_vars` & with `exports` (#4762)
authorAlex Lam S.L <alexlamsl@gmail.com>
Thu, 11 Mar 2021 01:16:16 +0000 (01:16 +0000)
committerGitHub <noreply@github.com>
Thu, 11 Mar 2021 01:16:16 +0000 (09:16 +0800)
fixes #4761

lib/compress.js
lib/parse.js
test/compress/exports.js
test/compress/merge_vars.js

index d01ebbe..807872f 100644 (file)
@@ -5605,21 +5605,25 @@ merge(Compressor.prototype, {
         }
 
         function mark(sym, read) {
-            if (in_try) push();
-            var def = sym.definition(), ldef;
+            var def = sym.definition(), ldef, seg = segment;
+            if (in_try) {
+                push();
+                seg = segment;
+                pop();
+            }
             if (def.id in references) {
                 var refs = references[def.id];
                 if (!refs) return;
-                if (refs.start.block !== segment.block) return references[def.id] = false;
+                if (refs.start.block !== seg.block) return references[def.id] = false;
                 refs.push(sym);
-                refs.end = segment;
+                refs.end = seg;
                 if (def.id in prev) {
                     last[prev[def.id]] = null;
                 } else if (!read) {
                     return;
                 }
             } else if ((ldef = self.variables.get(def.name)) !== def) {
-                if (ldef && root === segment) references[ldef.id] = false;
+                if (ldef && root === seg) references[ldef.id] = false;
                 return references[def.id] = false;
             } else if (compressor.exposed(def) || NO_MERGE[sym.name]) {
                 return references[def.id] = false;
@@ -5628,13 +5632,13 @@ merge(Compressor.prototype, {
                 refs.push(sym);
                 references[def.id] = refs;
                 if (!read) {
-                    refs.start = segment;
+                    refs.start = seg;
                     return first.push({
                         index: index++,
                         definition: def,
                     });
                 }
-                if (segment.block !== self) return references[def.id] = false;
+                if (seg.block !== self) return references[def.id] = false;
                 refs.start = root;
             }
             prev[def.id] = last.length;
index 5a4d981..ef88e72 100644 (file)
@@ -1504,14 +1504,14 @@ function parse($TEXT, options) {
     }
 
     function export_default_decl() {
-        switch (S.token.value) {
-          case "async":
+        if (is("name", "async")) {
             if (!is_token(peek(), "keyword", "function")) return;
             next();
             next();
             if (!is("operator", "*")) return maybe_named(AST_AsyncDefun, function_(AST_AsyncFunction));
             next();
             return maybe_named(AST_AsyncGeneratorDefun, function_(AST_AsyncGeneratorFunction));
+        } else if (is("keyword")) switch (S.token.value) {
           case "class":
             next();
             return maybe_named(AST_DefClass, class_(AST_ClassExpression));
@@ -1524,13 +1524,13 @@ function parse($TEXT, options) {
     }
 
     var export_decl = embed_tokens(function() {
-        switch (S.token.value) {
-          case "async":
+        if (is("name", "async")) {
             next();
             expect_token("keyword", "function");
             if (!is("operator", "*")) return function_(AST_AsyncDefun);
             next();
             return function_(AST_AsyncGeneratorDefun);
+        } else if (is("keyword")) switch (S.token.value) {
           case "class":
             next();
             return class_(AST_DefClass);
index 3aaae4a..33059bc 100644 (file)
@@ -457,3 +457,10 @@ issue_4742_unused_2: {
         a = "bar";
     }
 }
+
+issue_4761: {
+    input: {
+        export default "function" == 42;
+    }
+    expect_exact: 'export default"function"==42;'
+}
index a26c0dd..0494acf 100644 (file)
@@ -3281,3 +3281,23 @@ issue_4759: {
     }
     expect_stdout: "undefined"
 }
+
+issue_4761: {
+    options = {
+        merge_vars: true,
+        toplevel: true,
+    }
+    input: {
+        var a = "FAIL", b;
+        try {
+            !a && --a && (b = 0)[console] || console.log(b);
+        } catch (e) {}
+    }
+    expect: {
+        var a = "FAIL", b;
+        try {
+            !a && --a && (b = 0)[console] || console.log(b);
+        } catch (e) {}
+    }
+    expect_stdout: "undefined"
+}