fix corner case in `properties` (#3390)
authorAlex Lam S.L <alexlamsl@gmail.com>
Mon, 29 Apr 2019 09:23:00 +0000 (17:23 +0800)
committerGitHub <noreply@github.com>
Mon, 29 Apr 2019 09:23:00 +0000 (17:23 +0800)
fixes #3389

lib/compress.js
test/compress/properties.js

index 1a1b64f..7d9a74d 100644 (file)
@@ -6067,7 +6067,7 @@ merge(Compressor.prototype, {
             }
         }
         var parent = compressor.parent();
-        if (compressor.option("reduce_vars") && is_lhs(self, parent) !== self) {
+        if (compressor.option("reduce_vars") && is_lhs(compressor.self(), parent) !== compressor.self()) {
             var def = self.definition();
             var fixed = self.fixed_value();
             var single_use = def.single_use && !(parent instanceof AST_Call && parent.is_expr_pure(compressor));
@@ -6689,7 +6689,7 @@ merge(Compressor.prototype, {
                 return sym;
             }
         }
-        if (is_lhs(self, compressor.parent())) return self;
+        if (is_lhs(compressor.self(), compressor.parent())) return self;
         if (key !== prop) {
             var sub = self.flatten_object(property, compressor);
             if (sub) {
@@ -6787,7 +6787,7 @@ merge(Compressor.prototype, {
                 col: self.start.col
             });
         }
-        if (is_lhs(self, compressor.parent())) return self;
+        if (is_lhs(compressor.self(), compressor.parent())) return self;
         if (compressor.option("unsafe_proto")
             && self.expression instanceof AST_Dot
             && self.expression.property == "prototype") {
index 3a78d62..a70ab7d 100644 (file)
@@ -1862,3 +1862,29 @@ join_expr: {
     }
     expect_stdout: "PASS"
 }
+
+issue_3389: {
+    options = {
+        evaluate: true,
+        properties: true,
+        reduce_vars: true,
+        unsafe: true,
+    }
+    input: {
+        (function() {
+            var a = "PASS";
+            if (delete b)
+                b = a[null] = 42;
+            console.log(a);
+        })();
+    }
+    expect: {
+        (function() {
+            var a = "PASS";
+            if (delete b)
+                b = a.null = 42;
+            console.log(a);
+        })();
+    }
+    expect_stdout: "PASS"
+}