clean up AST_Binary optimisation logic (#3458)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 9 Oct 2019 15:45:41 +0000 (23:45 +0800)
committerGitHub <noreply@github.com>
Wed, 9 Oct 2019 15:45:41 +0000 (23:45 +0800)
lib/compress.js

index bffb6f7..29ef07c 100644 (file)
@@ -5696,7 +5696,8 @@ merge(Compressor.prototype, {
             }
             break;
         }
-        if (compressor.option("booleans") && compressor.in_boolean_context()) switch (self.operator) {
+        var in_bool = compressor.option("booleans") && compressor.in_boolean_context();
+        if (in_bool) switch (self.operator) {
           case "+":
             var ll = self.left.evaluate(compressor);
             var rr = self.right.evaluate(compressor);
@@ -5729,9 +5730,9 @@ merge(Compressor.prototype, {
             }
             break;
         }
+        var parent = compressor.parent();
         if (compressor.option("comparisons") && self.is_boolean(compressor)) {
-            if (!(compressor.parent() instanceof AST_Binary)
-                || compressor.parent() instanceof AST_Assign) {
+            if (!(parent instanceof AST_Binary) || parent instanceof AST_Assign) {
                 var negated = make_node(AST_UnaryPrefix, self, {
                     operator: "!",
                     expression: self.negate(compressor, first_in_statement(compressor))
@@ -5769,14 +5770,14 @@ merge(Compressor.prototype, {
                 var ll = fuzzy_eval(self.left);
                 if (!ll) {
                     AST_Node.warn("Condition left of && always false [{file}:{line},{col}]", self.start);
-                    return maintain_this_binding(compressor, compressor.parent(), compressor.self(), self.left).optimize(compressor);
+                    return maintain_this_binding(compressor, parent, compressor.self(), self.left).optimize(compressor);
                 } else if (!(ll instanceof AST_Node)) {
                     AST_Node.warn("Condition left of && always true [{file}:{line},{col}]", self.start);
                     return make_sequence(self, [ self.left, self.right ]).optimize(compressor);
                 }
                 var rr = self.right.evaluate(compressor);
                 if (!rr) {
-                    if (compressor.option("booleans") && compressor.in_boolean_context()) {
+                    if (in_bool) {
                         AST_Node.warn("Boolean && always false [{file}:{line},{col}]", self.start);
                         return make_sequence(self, [
                             self.left,
@@ -5784,9 +5785,7 @@ merge(Compressor.prototype, {
                         ]).optimize(compressor);
                     } else self.falsy = true;
                 } else if (!(rr instanceof AST_Node)) {
-                    var parent = compressor.parent();
-                    if (parent.operator == "&&" && parent.left === compressor.self()
-                        || compressor.option("booleans") && compressor.in_boolean_context()) {
+                    if (in_bool || parent.operator == "&&" && parent.left === compressor.self()) {
                         AST_Node.warn("Dropping side-effect-free && [{file}:{line},{col}]", self.start);
                         return self.left.optimize(compressor);
                     }
@@ -5808,18 +5807,16 @@ merge(Compressor.prototype, {
                     return make_sequence(self, [ self.left, self.right ]).optimize(compressor);
                 } else if (!(ll instanceof AST_Node)) {
                     AST_Node.warn("Condition left of || always true [{file}:{line},{col}]", self.start);
-                    return maintain_this_binding(compressor, compressor.parent(), compressor.self(), self.left).optimize(compressor);
+                    return maintain_this_binding(compressor, parent, compressor.self(), self.left).optimize(compressor);
                 }
                 var rr = self.right.evaluate(compressor);
                 if (!rr) {
-                    var parent = compressor.parent();
-                    if (parent.operator == "||" && parent.left === compressor.self()
-                        || compressor.option("booleans") && compressor.in_boolean_context()) {
+                    if (in_bool || parent.operator == "||" && parent.left === compressor.self()) {
                         AST_Node.warn("Dropping side-effect-free || [{file}:{line},{col}]", self.start);
                         return self.left.optimize(compressor);
                     }
                 } else if (!(rr instanceof AST_Node)) {
-                    if (compressor.option("booleans") && compressor.in_boolean_context()) {
+                    if (in_bool) {
                         AST_Node.warn("Boolean || always true [{file}:{line},{col}]", self.start);
                         return make_sequence(self, [
                             self.left,
@@ -6017,12 +6014,11 @@ merge(Compressor.prototype, {
         }
         if (compressor.option("unsafe")) {
             var indexRight = is_indexFn(self.right);
-            if (compressor.option("booleans")
+            if (in_bool
                 && indexRight
                 && (self.operator == "==" || self.operator == "!=")
                 && self.left instanceof AST_Number
-                && self.left.getValue() == 0
-                && compressor.in_boolean_context()) {
+                && self.left.getValue() == 0) {
                 return (self.operator == "==" ? make_node(AST_UnaryPrefix, self, {
                     operator: "!",
                     expression: self.right