fix corner case in `hoist_props` (#3872)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sun, 10 May 2020 14:23:09 +0000 (15:23 +0100)
committerGitHub <noreply@github.com>
Sun, 10 May 2020 14:23:09 +0000 (22:23 +0800)
fixes #3871

lib/compress.js
test/compress.js
test/compress/hoist_props.js

index 4f5e925..5509137 100644 (file)
@@ -4931,7 +4931,11 @@ merge(Compressor.prototype, {
             if (def.single_use) return;
             if (top_retain(def)) return;
             if (sym.fixed_value() !== right) return;
-            return right instanceof AST_Object && right.properties.length > 0;
+            return right instanceof AST_Object
+                && right.properties.length > 0
+                && all(right.properties, function(prop) {
+                    return prop instanceof AST_ObjectKeyVal;
+                });
         }
     });
 
index 8a6dd22..2fe0280 100644 (file)
@@ -14,7 +14,6 @@ var file = process.argv[2];
 var dir = path.resolve(path.dirname(module.filename), "compress");
 if (file) {
     var minify_options = require("./ufuzz/options.json").map(JSON.stringify);
-    U.AST_Node.enable_validation();
     log("--- {file}", { file: file });
     var tests = parse_test(path.resolve(dir, file));
     process.exit(Object.keys(tests).filter(function(name) {
@@ -189,6 +188,7 @@ function reminify(orig_options, input_code, input_formatted, stdout) {
             }
         });
         var options_formatted = JSON.stringify(options, null, 4);
+        options.validate = true;
         var result = U.minify(input_code, options);
         if (result.error) {
             log([
@@ -252,6 +252,7 @@ function run_code(code, toplevel) {
 
 function test_case(test) {
     log("    Running test [{name}]", { name: test.name });
+    U.AST_Node.enable_validation();
     var output_options = test.beautify || {};
     var expect;
     if (test.expect) {
index cc7ef02..a73df1f 100644 (file)
@@ -940,3 +940,35 @@ issue_3868: {
     }
     expect_stdout: "PASS"
 }
+
+issue_3871: {
+    options = {
+        hoist_props: true,
+        reduce_vars: true,
+    }
+    input: {
+        console.log(function() {
+            do {
+                var b = {
+                    get null() {
+                        c;
+                    }
+                };
+            } while (!b);
+            return "PASS";
+        }());
+    }
+    expect: {
+        console.log(function() {
+            do {
+                var b = {
+                    get null() {
+                        c;
+                    }
+                };
+            } while (!b);
+            return "PASS";
+        }());
+    }
+    expect_stdout: "PASS"
+}