From: Alex Lam S.L Date: Mon, 6 Mar 2017 19:11:03 +0000 (+0800) Subject: avoid substitution of global variables (#1557) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=d787d70127af1b8df57eee2274c720d34092aef2;p=UglifyJS.git avoid substitution of global variables (#1557) - unless `toplevel` is enabled - global `const` works as before --- diff --git a/lib/compress.js b/lib/compress.js index 8c3fb155..696e2056 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 cd96d02d..45b7af6e 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 70e915d3..27f77fb5 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(); } }