aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2017-03-07 03:11:03 +0800
committerGitHub <noreply@github.com>2017-03-07 03:11:03 +0800
commitd787d70127af1b8df57eee2274c720d34092aef2 (patch)
treef95114de6109d4697a6a23244f90117f48c1320f
parent3ac24219322384539caae803482ea257e7971cf2 (diff)
downloadtracifyjs-d787d70127af1b8df57eee2274c720d34092aef2.tar.gz
tracifyjs-d787d70127af1b8df57eee2274c720d34092aef2.zip
avoid substitution of global variables (#1557)
- unless `toplevel` is enabled - global `const` works as before
-rw-r--r--lib/compress.js7
-rw-r--r--test/compress/dead-code.js2
-rw-r--r--test/compress/reduce_vars.js390
3 files changed, 306 insertions, 93 deletions
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();
}
}