aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2017-03-26 19:14:30 +0800
committerGitHub <noreply@github.com>2017-03-26 19:14:30 +0800
commit861a79ac9fdb2cdbb54054306eb896e2c134af73 (patch)
tree45fab27f3d43aad6001f02803ac008c74fc8e11f
parent00996afd2ce1f05fa973016e793495f69b524d5b (diff)
downloadtracifyjs-861a79ac9fdb2cdbb54054306eb896e2c134af73.tar.gz
tracifyjs-861a79ac9fdb2cdbb54054306eb896e2c134af73.zip
fix `delete` related issues in `collapse_vars` and `reduce_vars` (#1689)
-rw-r--r--lib/compress.js44
-rw-r--r--test/compress/collapse_vars.js3
-rw-r--r--test/compress/reduce_vars.js27
3 files changed, 46 insertions, 28 deletions
diff --git a/lib/compress.js b/lib/compress.js
index a617adbe..83486b61 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -1207,8 +1207,10 @@ merge(Compressor.prototype, {
node.DEFMETHOD("is_string", func);
});
+ var unary_side_effects = makePredicate("delete ++ --");
+
function isLHS(node, parent) {
- return parent instanceof AST_Unary && (parent.operator == "++" || parent.operator == "--")
+ return parent instanceof AST_Unary && unary_side_effects(parent.operator)
|| parent instanceof AST_Assign && parent.left === node;
}
@@ -1643,9 +1645,7 @@ merge(Compressor.prototype, {
|| this.alternative.has_side_effects(compressor);
});
def(AST_Unary, function(compressor){
- return this.operator == "delete"
- || this.operator == "++"
- || this.operator == "--"
+ return unary_side_effects(this.operator)
|| this.expression.has_side_effects(compressor);
});
def(AST_SymbolRef, function(compressor){
@@ -2196,26 +2196,19 @@ merge(Compressor.prototype, {
return node;
});
def(AST_Unary, function(compressor, first_in_statement){
- switch (this.operator) {
- case "delete":
- case "++":
- case "--":
- return this;
- case "typeof":
- if (this.expression instanceof AST_SymbolRef) return null;
- default:
- var expression = this.expression.drop_side_effect_free(compressor, first_in_statement);
- if (first_in_statement
- && this instanceof AST_UnaryPrefix
- && is_iife_call(expression)) {
- if (expression === this.expression && this.operator.length === 1) return this;
- return make_node(AST_UnaryPrefix, this, {
- operator: this.operator.length === 1 ? this.operator : "!",
- expression: expression
- });
- }
- return expression;
+ if (unary_side_effects(this.operator)) return this;
+ if (this.operator == "typeof" && this.expression instanceof AST_SymbolRef) return null;
+ var expression = this.expression.drop_side_effect_free(compressor, first_in_statement);
+ if (first_in_statement
+ && this instanceof AST_UnaryPrefix
+ && is_iife_call(expression)) {
+ if (expression === this.expression && this.operator.length === 1) return this;
+ return make_node(AST_UnaryPrefix, this, {
+ operator: this.operator.length === 1 ? this.operator : "!",
+ expression: expression
+ });
}
+ return expression;
});
def(AST_SymbolRef, function() {
return this.undeclared() ? this : null;
@@ -2945,10 +2938,7 @@ merge(Compressor.prototype, {
field = "left";
}
} else if (cdr instanceof AST_Call
- || cdr instanceof AST_Unary
- && cdr.operator != "delete"
- && cdr.operator != "++"
- && cdr.operator != "--") {
+ || cdr instanceof AST_Unary && !unary_side_effects(cdr.operator)) {
field = "expression";
} else break;
parent = cdr;
diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js
index 2437ca5f..4107707b 100644
--- a/test/compress/collapse_vars.js
+++ b/test/compress/collapse_vars.js
@@ -894,7 +894,8 @@ collapse_vars_unary: {
}
expect: {
function f0(o, p) {
- delete o[p];
+ var x = o[p];
+ delete x;
}
function f1(n) {
return n > +!!n
diff --git a/test/compress/reduce_vars.js b/test/compress/reduce_vars.js
index 943dd290..f4dd68d2 100644
--- a/test/compress/reduce_vars.js
+++ b/test/compress/reduce_vars.js
@@ -1544,3 +1544,30 @@ issue_1670_6: {
}
expect_stdout: "1"
}
+
+unary_delete: {
+ options = {
+ evaluate: true,
+ reduce_vars: true,
+ unused: true,
+ }
+ input: {
+ var b = 10;
+ function f() {
+ var a;
+ if (delete a) b--;
+ }
+ f();
+ console.log(b);
+ }
+ expect: {
+ var b = 10;
+ function f() {
+ var a;
+ if (delete a) b--;
+ }
+ f();
+ console.log(b);
+ }
+ expect_stdout: true
+}