aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2020-09-03 10:41:33 +0100
committerGitHub <noreply@github.com>2020-09-03 17:41:33 +0800
commit980fcbb56b674c1c78e1483b6d66a2f49e58d80b (patch)
treec0d4c62385f5b84669384b6853d28dfe5dca6243
parent375ebe316d8ff1a421c1cafc95d64e3377f7737b (diff)
downloadtracifyjs-980fcbb56b674c1c78e1483b6d66a2f49e58d80b.tar.gz
tracifyjs-980fcbb56b674c1c78e1483b6d66a2f49e58d80b.zip
enhance `unused` (#4090)
-rw-r--r--lib/compress.js53
-rw-r--r--test/compress/drop-unused.js57
-rw-r--r--test/compress/functions.js3
3 files changed, 94 insertions, 19 deletions
diff --git a/lib/compress.js b/lib/compress.js
index 9aa70ef9..273c5a75 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -4312,6 +4312,7 @@ merge(Compressor.prototype, {
return sym;
};
var assign_in_use = Object.create(null);
+ var for_ins = Object.create(null);
var in_use = [];
var in_use_ids = Object.create(null); // avoid expensive linear scans of in_use
var value_read = Object.create(null);
@@ -4602,23 +4603,37 @@ merge(Compressor.prototype, {
return !def || fn.name && def === fn.name.definition();
}
});
- if (head.length == 0 && tail.length == duplicated) {
- [].unshift.apply(side_effects, tail.map(function(def) {
- AST_Node.warn("Dropping duplicated definition of variable {name} [{file}:{line},{col}]", template(def.name));
- var sym = def.name.definition();
- var ref = make_node(AST_SymbolRef, def.name, def.name);
- sym.references.push(ref);
- var assign = make_node(AST_Assign, def, {
- operator: "=",
- left: ref,
- right: def.value
- });
- var index = indexOf_assign(sym, def);
- if (index >= 0) assign_in_use[sym.id][index] = assign;
- sym.eliminated++;
- return assign;
- }));
- } else if (head.length > 0 || tail.length > 0) {
+ switch (head.length) {
+ case 0:
+ if (tail.length == 0) break;
+ if (tail.length == duplicated) {
+ [].unshift.apply(side_effects, tail.map(function(def) {
+ AST_Node.warn("Dropping duplicated definition of variable {name} [{file}:{line},{col}]", template(def.name));
+ var sym = def.name.definition();
+ var ref = make_node(AST_SymbolRef, def.name, def.name);
+ sym.references.push(ref);
+ var assign = make_node(AST_Assign, def, {
+ operator: "=",
+ left: ref,
+ right: def.value
+ });
+ var index = indexOf_assign(sym, def);
+ if (index >= 0) assign_in_use[sym.id][index] = assign;
+ sym.eliminated++;
+ return assign;
+ }));
+ break;
+ }
+ case 1:
+ if (tail.length == 0) {
+ var id = head[0].name.definition().id;
+ if (id in for_ins) {
+ node.definitions = head;
+ for_ins[id].init = node;
+ break;
+ }
+ }
+ default:
node.definitions = head.concat(tail);
body.push(node);
}
@@ -4814,6 +4829,10 @@ merge(Compressor.prototype, {
return true;
}
if (node instanceof AST_ForIn) {
+ if (node.init instanceof AST_SymbolRef && scope === self) {
+ var id = node.init.definition().id;
+ if (!(id in for_ins)) for_ins[id] = node;
+ }
if (!drop_vars || !compressor.option("loops")) return;
if (!is_empty(node.body)) return;
if (node.init.has_side_effects(compressor)) return;
diff --git a/test/compress/drop-unused.js b/test/compress/drop-unused.js
index 6ab4fe3b..052a013b 100644
--- a/test/compress/drop-unused.js
+++ b/test/compress/drop-unused.js
@@ -2848,3 +2848,60 @@ issue_4025: {
"1 1 1",
]
}
+
+forin_var_1: {
+ options = {
+ unused: true,
+ }
+ input: {
+ var k;
+ for (k in [ 1, 2 ])
+ console.log(k);
+ for (k in { PASS: 3 })
+ console.log(k);
+ console.log(k);
+ }
+ expect: {
+ for (var k in [ 1, 2 ])
+ console.log(k);
+ for (k in { PASS: 3 })
+ console.log(k);
+ console.log(k);
+ }
+ expect_stdout: [
+ "0",
+ "1",
+ "PASS",
+ "PASS",
+ ]
+}
+
+forin_var_2: {
+ options = {
+ unused: true,
+ }
+ input: {
+ console.log(function() {
+ switch (0) {
+ case function() {
+ for (a in 0);
+ }:
+ var b = 0;
+ }
+ for (var c = 0; a;);
+ var a;
+ }());
+ }
+ expect: {
+ console.log(function() {
+ switch (0) {
+ case function() {
+ for (a in 0);
+ }:
+ }
+ for (; a;);
+ var a;
+ }());
+ }
+ expect_stdout: "undefined"
+}
diff --git a/test/compress/functions.js b/test/compress/functions.js
index 18f4f900..8bfb2eaf 100644
--- a/test/compress/functions.js
+++ b/test/compress/functions.js
@@ -1483,8 +1483,7 @@ issue_2663_2: {
}
expect: {
(function() {
- var i;
- for (i in { a: 1, b: 2, c: 3 })
+ for (var i in { a: 1, b: 2, c: 3 })
j = i, console.log(j);
var j;
})();