fix `top_retain` on `hoist_props` (#2474)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sun, 12 Nov 2017 16:59:41 +0000 (00:59 +0800)
committerGitHub <noreply@github.com>
Sun, 12 Nov 2017 16:59:41 +0000 (00:59 +0800)
fixes #2473

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

index 54ac3d7..0635c41 100644 (file)
@@ -2769,6 +2769,7 @@ merge(Compressor.prototype, {
     AST_Scope.DEFMETHOD("hoist_properties", function(compressor){
         var self = this;
         if (!compressor.option("hoist_props") || compressor.has_directive("use asm")) return self;
+        var top_retain = self instanceof AST_Toplevel && compressor.top_retain || return_false;
         var defs_by_id = Object.create(null);
         var var_names = Object.create(null);
         self.enclosed.forEach(function(def) {
@@ -2784,6 +2785,7 @@ merge(Compressor.prototype, {
                     && !(def = sym.definition()).escaped
                     && !def.single_use
                     && !def.direct_access
+                    && !top_retain(def)
                     && (value = sym.fixed_value()) === node.value
                     && value instanceof AST_Object) {
                     var defs = new Dictionary();
index 1fa321c..40d36ac 100644 (file)
@@ -411,3 +411,92 @@ new_this: {
     }
     expect_stdout: "1 2"
 }
+
+issue_2473_1: {
+    options = {
+        hoist_props: false,
+        reduce_vars: true,
+        top_retain: [ "x", "y" ],
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        var x = {};
+        var y = [];
+        var z = {};
+    }
+    expect: {
+        var x = {};
+        var y = [];
+    }
+}
+
+issue_2473_2: {
+    options = {
+        hoist_props: true,
+        reduce_vars: true,
+        top_retain: [ "x", "y" ],
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        var x = {};
+        var y = [];
+        var z = {};
+    }
+    expect: {
+        var x = {};
+        var y = [];
+    }
+}
+
+issue_2473_3: {
+    options = {
+        hoist_props: true,
+        reduce_vars: true,
+        top_retain: "o",
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        var o = {
+            a: 1,
+            b: 2,
+        };
+        console.log(o.a, o.b);
+    }
+    expect: {
+        var o = {
+            a: 1,
+            b: 2,
+        };
+        console.log(o.a, o.b);
+    }
+    expect_stdout: "1 2"
+}
+
+issue_2473_4: {
+    options = {
+        hoist_props: true,
+        reduce_vars: true,
+        top_retain: "o",
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        (function() {
+            var o = {
+                a: 1,
+                b: 2,
+            };
+            console.log(o.a, o.b);
+        })();
+    }
+    expect: {
+        (function() {
+            var o_a = 1, o_b = 2;
+            console.log(o_a, o_b);
+        })();
+    }
+    expect_stdout: "1 2"
+}