fix corner case in #2763 (#2766)
authorAlex Lam S.L <alexlamsl@gmail.com>
Thu, 11 Jan 2018 13:18:08 +0000 (21:18 +0800)
committerGitHub <noreply@github.com>
Thu, 11 Jan 2018 13:18:08 +0000 (21:18 +0800)
lib/compress.js
test/compress/properties.js

index b093832..8687317 100644 (file)
@@ -1698,6 +1698,8 @@ merge(Compressor.prototype, {
 
         function join_object_assignments(defn, body) {
             if (!(defn instanceof AST_Definitions)) return;
+            var def = defn.definitions[defn.definitions.length - 1];
+            if (!(def.value instanceof AST_Object)) return;
             var exprs;
             if (body instanceof AST_Assign) {
                 exprs = [ body ];
@@ -1705,17 +1707,14 @@ merge(Compressor.prototype, {
                 exprs = body.expressions.slice();
             }
             if (!exprs) return;
+            var trimmed = false;
             do {
                 var node = exprs[0];
                 if (!(node instanceof AST_Assign)) break;
                 if (!(node.left instanceof AST_PropAccess)) break;
                 var sym = node.left.expression;
                 if (!(sym instanceof AST_SymbolRef)) break;
-                var def = find_if(function(def) {
-                    return def.name.name == sym.name
-                        && def.value instanceof AST_Object;
-                }, defn.definitions);
-                if (!def) break;
+                if (def.name.name != sym.name) break;
                 if (!node.right.is_constant_expression(scope)) break;
                 var prop = node.left.property;
                 if (prop instanceof AST_Node) {
@@ -1727,8 +1726,9 @@ merge(Compressor.prototype, {
                     value: node.right
                 }));
                 exprs.shift();
+                trimmed = true;
             } while (exprs.length);
-            return exprs;
+            return trimmed && exprs;
         }
 
         function join_consecutive_vars(statements, compressor) {
@@ -1766,14 +1766,11 @@ merge(Compressor.prototype, {
                 } else if (stat instanceof AST_SimpleStatement) {
                     var exprs = join_object_assignments(prev, stat.body);
                     if (exprs) {
-                        if (exprs.length > 0) {
-                            stat.body = make_sequence(stat.body, exprs);
-                            statements[++j] = stat;
-                        }
                         CHANGED = true;
-                    } else {
-                        statements[++j] = stat;
+                        if (!exprs.length) continue;
+                        stat.body = make_sequence(stat.body, exprs);
                     }
+                    statements[++j] = stat;
                 } else {
                     statements[++j] = stat;
                 }
index d70eb85..6b368e6 100644 (file)
@@ -1162,3 +1162,29 @@ join_object_assignments_2: {
     }
     expect_stdout: "1 4 6"
 }
+
+join_object_assignments_3: {
+    options = {
+        evaluate: true,
+        join_vars: true,
+    }
+    input: {
+        console.log(function() {
+            var o = {
+                a: "PASS",
+            }, a = o.a;
+            o.a = "FAIL";
+            return a;
+        }());
+    }
+    expect: {
+        console.log(function() {
+            var o = {
+                a: "PASS",
+            }, a = o.a;
+            o.a = "FAIL";
+            return a;
+        }());
+    }
+    expect_stdout: "PASS"
+}