[Pkg-javascript-commits] [uglifyjs] 84/228: avoid substitution of global variables (#1557)

Jonas Smedegaard dr at jones.dk
Sat Apr 15 14:25:19 UTC 2017


This is an automated email from the git hooks/post-receive script.

js pushed a commit to branch master
in repository uglifyjs.

commit d787d70127af1b8df57eee2274c720d34092aef2
Author: Alex Lam S.L <alexlamsl at gmail.com>
Date:   Tue Mar 7 03:11:03 2017 +0800

    avoid substitution of global variables (#1557)
    
    - unless `toplevel` is enabled
    - global `const` works as before
---
 lib/compress.js              |   7 +-
 test/compress/dead-code.js   |   2 +
 test/compress/reduce_vars.js | 390 +++++++++++++++++++++++++++++++++----------
 3 files changed, 306 insertions(+), 93 deletions(-)

diff --git a/lib/compress.js b/lib/compress.js
index 8c3fb15..696e205 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -223,6 +223,7 @@ merge(Compressor.prototype, {
 
     AST_Node.DEFMETHOD("reset_opt_flags", function(compressor, rescan){
         var reduce_vars = rescan && compressor.option("reduce_vars");
+        var toplevel = compressor.option("toplevel");
         var ie8 = !compressor.option("screw_ie8");
         var safe_ids = [];
         push();
@@ -334,7 +335,11 @@ merge(Compressor.prototype, {
         }
 
         function reset_def(def) {
-            def.fixed = undefined;
+            if (toplevel || !def.global || def.orig[0] instanceof AST_SymbolConst) {
+                def.fixed = undefined;
+            } else {
+                def.fixed = false;
+            }
             def.references = [];
             def.should_replace = undefined;
         }
diff --git a/test/compress/dead-code.js b/test/compress/dead-code.js
index cd96d02..45b7af6 100644
--- a/test/compress/dead-code.js
+++ b/test/compress/dead-code.js
@@ -123,6 +123,7 @@ dead_code_const_annotation: {
         conditionals : true,
         evaluate     : true,
         reduce_vars  : true,
+        toplevel     : true,
     };
     input: {
         var unused;
@@ -172,6 +173,7 @@ dead_code_const_annotation_complex_scope: {
         conditionals : true,
         evaluate     : true,
         reduce_vars  : true,
+        toplevel     : true,
     };
     input: {
         var unused_var;
diff --git a/test/compress/reduce_vars.js b/test/compress/reduce_vars.js
index 70e915d..27f77fb 100644
--- a/test/compress/reduce_vars.js
+++ b/test/compress/reduce_vars.js
@@ -6,6 +6,7 @@ reduce_vars: {
             C : 0
         },
         reduce_vars   : true,
+        toplevel      : true,
         unused        : true
     }
     input: {
@@ -452,22 +453,26 @@ multi_def_2: {
         reduce_vars: true,
     }
     input: {
-        if (code == 16)
-            var bitsLength = 2, bitsOffset = 3, what = len;
-        else if (code == 17)
-            var bitsLength = 3, bitsOffset = 3, what = (len = 0);
-        else if (code == 18)
-            var bitsLength = 7, bitsOffset = 11, what = (len = 0);
-        var repeatLength = this.getBits(bitsLength) + bitsOffset;
+        function f(){
+            if (code == 16)
+                var bitsLength = 2, bitsOffset = 3, what = len;
+            else if (code == 17)
+                var bitsLength = 3, bitsOffset = 3, what = (len = 0);
+            else if (code == 18)
+                var bitsLength = 7, bitsOffset = 11, what = (len = 0);
+            var repeatLength = this.getBits(bitsLength) + bitsOffset;
+        }
     }
     expect: {
-        if (16 == code)
-            var bitsLength = 2, bitsOffset = 3, what = len;
-        else if (17 == code)
-            var bitsLength = 3, bitsOffset = 3, what = (len = 0);
-        else if (18 == code)
-            var bitsLength = 7, bitsOffset = 11, what = (len = 0);
-        var repeatLength = this.getBits(bitsLength) + bitsOffset;
+        function f(){
+            if (16 == code)
+                var bitsLength = 2, bitsOffset = 3, what = len;
+            else if (17 == code)
+                var bitsLength = 3, bitsOffset = 3, what = (len = 0);
+            else if (18 == code)
+                var bitsLength = 7, bitsOffset = 11, what = (len = 0);
+            var repeatLength = this.getBits(bitsLength) + bitsOffset;
+        }
     }
 }
 
@@ -477,12 +482,16 @@ use_before_var: {
         reduce_vars: true,
     }
     input: {
-        console.log(t);
-        var t = 1;
+        function f(){
+            console.log(t);
+            var t = 1;
+        }
     }
     expect: {
-        console.log(t);
-        var t = 1;
+        function f(){
+            console.log(t);
+            var t = 1;
+        }
     }
 }
 
@@ -492,22 +501,20 @@ inner_var_if: {
         reduce_vars: true,
     }
     input: {
-        function f(){
-            return 0;
+        function f(a){
+            if (a)
+                var t = 1;
+            if (!t)
+                console.log(t);
         }
-        if (f())
-            var t = 1;
-        if (!t)
-            console.log(t);
     }
     expect: {
-        function f(){
-            return 0;
+        function f(a){
+            if (a)
+                var t = 1;
+            if (!t)
+                console.log(t);
         }
-        if (f())
-            var t = 1;
-        if (!t)
-            console.log(t);
     }
 }
 
@@ -517,24 +524,22 @@ inner_var_label: {
         reduce_vars: true,
     }
     input: {
-        function f(){
-            return 1;
-        }
-        l: {
-            if (f()) break l;
-            var t = 1;
+        function f(a){
+            l: {
+                if (a) break l;
+                var t = 1;
+            }
+            console.log(t);
         }
-        console.log(t);
     }
     expect: {
-        function f(){
-            return 1;
-        }
-        l: {
-            if (f()) break l;
-            var t = 1;
+        function f(a){
+            l: {
+                if (a) break l;
+                var t = 1;
+            }
+            console.log(t);
         }
-        console.log(t);
     }
 }
 
@@ -544,22 +549,26 @@ inner_var_for: {
         reduce_vars: true,
     }
     input: {
-        var a = 1;
-        x(a, b, d);
-        for (var b = 2, c = 3; x(a, b, c, d); x(a, b, c, d)) {
-            var d = 4, e = 5;
+        function f() {
+            var a = 1;
+            x(a, b, d);
+            for (var b = 2, c = 3; x(a, b, c, d); x(a, b, c, d)) {
+                var d = 4, e = 5;
+                x(a, b, c, d, e);
+            }
             x(a, b, c, d, e);
         }
-        x(a, b, c, d, e)
     }
     expect: {
-        var a = 1;
-        x(1, b, d);
-        for (var b = 2, c = 3; x(1, b, 3, d); x(1, b, 3, d)) {
-            var d = 4, e = 5;
+        function f() {
+            var a = 1;
+            x(1, b, d);
+            for (var b = 2, c = 3; x(1, b, 3, d); x(1, b, 3, d)) {
+                var d = 4, e = 5;
+                x(1, b, 3, d, e);
+            }
             x(1, b, 3, d, e);
         }
-        x(1, b, 3, d, e);
     }
 }
 
@@ -569,24 +578,28 @@ inner_var_for_in_1: {
         reduce_vars: true,
     }
     input: {
-        var a = 1, b = 2;
-        for (b in (function() {
-            return x(a, b, c);
-        })()) {
-            var c = 3, d = 4;
+        function f() {
+            var a = 1, b = 2;
+            for (b in (function() {
+                return x(a, b, c);
+            })()) {
+                var c = 3, d = 4;
+                x(a, b, c, d);
+            }
             x(a, b, c, d);
         }
-        x(a, b, c, d);
     }
     expect: {
-        var a = 1, b = 2;
-        for (b in (function() {
-            return x(1, b, c);
-        })()) {
-            var c = 3, d = 4;
+        function f() {
+            var a = 1, b = 2;
+            for (b in (function() {
+                return x(1, b, c);
+            })()) {
+                var c = 3, d = 4;
+                x(1, b, c, d);
+            }
             x(1, b, c, d);
         }
-        x(1, b, c, d);
     }
 }
 
@@ -596,12 +609,16 @@ inner_var_for_in_2: {
         reduce_vars: true,
     }
     input: {
-        for (var long_name in {})
-            console.log(long_name);
+        function f() {
+            for (var long_name in {})
+                console.log(long_name);
+        }
     }
     expect: {
-        for (var long_name in {})
-            console.log(long_name);
+        function f() {
+            for (var long_name in {})
+                console.log(long_name);
+        }
     }
 }
 
@@ -611,20 +628,24 @@ inner_var_catch: {
         reduce_vars: true,
     }
     input: {
-        try {
-            a();
-        } catch (e) {
-            var b = 1;
+        function f() {
+            try {
+                a();
+            } catch (e) {
+                var b = 1;
+            }
+            console.log(b);
         }
-        console.log(b);
     }
     expect: {
-        try {
-            a();
-        } catch (e) {
-            var b = 1;
+        function f() {
+            try {
+                a();
+            } catch (e) {
+                var b = 1;
+            }
+            console.log(b);
         }
-        console.log(b);
     }
 }
 
@@ -634,14 +655,18 @@ issue_1533_1: {
         reduce_vars: true,
     }
     input: {
-        var id = "";
-        for (id in {break: "me"})
-            console.log(id);
+        function f() {
+            var id = "";
+            for (id in {break: "me"})
+                console.log(id);
+        }
     }
     expect: {
-        var id = "";
-        for (id in {break: "me"})
-            console.log(id);
+        function f() {
+            var id = "";
+            for (id in {break: "me"})
+                console.log(id);
+        }
     }
 }
 
@@ -651,15 +676,196 @@ issue_1533_2: {
         reduce_vars: true,
     }
     input: {
-        var id = "";
-        for (var id in {break: "me"})
+        function f() {
+            var id = "";
+            for (var id in {break: "me"})
+                console.log(id);
             console.log(id);
-        console.log(id);
+        }
     }
     expect: {
-        var id = "";
-        for (var id in {break: "me"})
+        function f() {
+            var id = "";
+            for (var id in {break: "me"})
+                console.log(id);
             console.log(id);
-        console.log(id);
+        }
+    }
+}
+
+toplevel_on: {
+    options = {
+        evaluate: true,
+        reduce_vars: true,
+        toplevel:true,
+        unused: true,
+    }
+    input: {
+        var x = 3;
+        console.log(x);
+    }
+    expect: {
+        console.log(3);
+    }
+}
+
+toplevel_off: {
+    options = {
+        evaluate: true,
+        reduce_vars: true,
+        toplevel:false,
+        unused: true,
+    }
+    input: {
+        var x = 3;
+        console.log(x);
+    }
+    expect: {
+        var x = 3;
+        console.log(x);
+    }
+}
+
+toplevel_on_loops_1: {
+    options = {
+        evaluate: true,
+        loops: true,
+        reduce_vars: true,
+        toplevel:true,
+        unused: true,
+    }
+    input: {
+        function bar() {
+            console.log("bar:", --x);
+        }
+        var x = 3;
+        do
+            bar();
+        while (x);
+    }
+    expect: {
+        function bar() {
+            console.log("bar:", --x);
+        }
+        var x = 3;
+        do
+            bar();
+        while (x);
+    }
+}
+
+toplevel_off_loops_1: {
+    options = {
+        evaluate: true,
+        loops: true,
+        reduce_vars: true,
+        toplevel:false,
+        unused: true,
+    }
+    input: {
+        function bar() {
+            console.log("bar:", --x);
+        }
+        var x = 3;
+        do
+            bar();
+        while (x);
+    }
+    expect: {
+        function bar() {
+            console.log("bar:", --x);
+        }
+        var x = 3;
+        do
+            bar();
+        while (x);
+    }
+}
+
+toplevel_on_loops_2: {
+    options = {
+        evaluate: true,
+        loops: true,
+        reduce_vars: true,
+        toplevel:true,
+        unused: true,
+    }
+    input: {
+        function bar() {
+            console.log("bar:");
+        }
+        var x = 3;
+        do
+            bar();
+        while (x);
+    }
+    expect: {
+        function bar() {
+            console.log("bar:");
+        }
+        for (;;) bar();
+    }
+}
+
+toplevel_off_loops_2: {
+    options = {
+        evaluate: true,
+        loops: true,
+        reduce_vars: true,
+        toplevel:false,
+        unused: true,
+    }
+    input: {
+        function bar() {
+            console.log("bar:");
+        }
+        var x = 3;
+        do
+            bar();
+        while (x);
+    }
+    expect: {
+        function bar() {
+            console.log("bar:");
+        }
+        var x = 3;
+        do
+            bar();
+        while (x);
+    }
+}
+
+toplevel_on_loops_3: {
+    options = {
+        evaluate: true,
+        loops: true,
+        reduce_vars: true,
+        toplevel:true,
+        unused: true,
+    }
+    input: {
+        var x = 3;
+        while (x) bar();
+    }
+    expect: {
+        for (;;) bar();
+    }
+}
+
+toplevel_off_loops_3: {
+    options = {
+        evaluate: true,
+        loops: true,
+        reduce_vars: true,
+        toplevel:false,
+        unused: true,
+    }
+    input: {
+        var x = 3;
+        while (x) bar();
+    }
+    expect: {
+        var x = 3;
+        for (;x;) bar();
     }
 }

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/uglifyjs.git



More information about the Pkg-javascript-commits mailing list