speed up `equivalent_to()` and `AST_Switch` (#1727)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 29 Mar 2017 14:08:26 +0000 (22:08 +0800)
committerGitHub <noreply@github.com>
Wed, 29 Mar 2017 14:08:26 +0000 (22:08 +0800)
lib/compress.js

index 66a6a18..786fc56 100644 (file)
@@ -196,8 +196,7 @@ merge(Compressor.prototype, {
     });
 
     AST_Node.DEFMETHOD("equivalent_to", function(node){
-        // XXX: this is a rather expensive way to test two node's equivalence:
-        return this.print_to_string() == node.print_to_string();
+        return this.TYPE == node.TYPE && this.print_to_string() == node.print_to_string();
     });
 
     AST_Node.DEFMETHOD("process_expression", function(insert) {
@@ -2518,7 +2517,6 @@ merge(Compressor.prototype, {
             self.expression = best_of_expression(expression, self.expression);
         }
         if (!compressor.option("dead_code")) return self;
-        var prev_block;
         var decl = [];
         var body = [];
         var default_branch;
@@ -2547,14 +2545,16 @@ merge(Compressor.prototype, {
                 }
             }
             if (aborts(branch)) {
-                var block = make_node(AST_BlockStatement, branch, branch).print_to_string();
-                if (!fallthrough && prev_block === block) body[body.length - 1].body = [];
+                if (body.length > 0 && !fallthrough) {
+                    var prev = body[body.length - 1];
+                    if (prev.body.length == branch.body.length
+                        && make_node(AST_BlockStatement, prev, prev).equivalent_to(make_node(AST_BlockStatement, branch, branch)))
+                        prev.body = [];
+                }
                 body.push(branch);
-                prev_block = block;
                 fallthrough = false;
             } else {
                 body.push(branch);
-                prev_block = null;
                 fallthrough = true;
             }
         }