compress `RegExp()` in `unsafe` (#2735)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sat, 6 Jan 2018 13:04:47 +0000 (21:04 +0800)
committerGitHub <noreply@github.com>
Sat, 6 Jan 2018 13:04:47 +0000 (21:04 +0800)
lib/compress.js
test/compress/issue-269.js

index 0f15eb7..28d6a1c 100644 (file)
@@ -3869,6 +3869,27 @@ merge(Compressor.prototype, {
                     operator: "!"
                 }).optimize(compressor);
                 break;
+              case "RegExp":
+                var params = [];
+                if (all(self.args, function(arg) {
+                    var value = arg.evaluate(compressor);
+                    params.unshift(value);
+                    return arg !== value;
+                })) {
+                    try {
+                        return best_of(compressor, self, make_node(AST_RegExp, self, {
+                            value: RegExp.apply(RegExp, params),
+                        }));
+                    } catch (ex) {
+                        compressor.warn("Error converting {expr} [{file}:{line},{col}]", {
+                            expr: self.print_to_string(),
+                            file: self.start.file,
+                            line: self.start.line,
+                            col: self.start.col
+                        });
+                    }
+                }
+                break;
             } else if (exp instanceof AST_Dot) switch(exp.property) {
               case "toString":
                 if (self.args.length == 0) return make_node(AST_Binary, self, {
index 1d41dea..a29e754 100644 (file)
@@ -64,3 +64,27 @@ strings_concat: {
                );
        }
 }
+
+regexp: {
+       options = {
+               evaluate: true,
+               unsafe: true,
+       }
+       input: {
+               RegExp("foo");
+               RegExp("bar", "ig");
+               RegExp(foo);
+               RegExp("bar", ig);
+               RegExp("should", "fail");
+       }
+       expect: {
+               /foo/;
+               /bar/ig;
+               RegExp(foo);
+               RegExp("bar", ig);
+               RegExp("should", "fail");
+       }
+       expect_warnings: [
+               'WARN: Error converting RegExp("should","fail") [test/compress/issue-269.js:78,2]',
+       ]
+}