aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2017-05-19 09:06:29 +0800
committerGitHub <noreply@github.com>2017-05-19 09:06:29 +0800
commiteae26756f1419e7e601bae8b44d69f4e80dd0d61 (patch)
tree2b5e4eb11e177db8c7da1e7b666b693d49a9814c
parent43add9416b927703471a1a722f6a73dcecb0dac3 (diff)
downloadtracifyjs-eae26756f1419e7e601bae8b44d69f4e80dd0d61.tar.gz
tracifyjs-eae26756f1419e7e601bae8b44d69f4e80dd0d61.zip
introduce `unsafe_regexp` (#1970)
fixes #1964
-rw-r--r--README.md11
-rw-r--r--lib/compress.js3
-rw-r--r--test/compress/evaluate.js47
3 files changed, 56 insertions, 5 deletions
diff --git a/README.md b/README.md
index a2997b7f..a7635095 100644
--- a/README.md
+++ b/README.md
@@ -462,6 +462,9 @@ If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.u
- `unsafe_proto` (default: false) -- optimize expressions like
`Array.prototype.slice.call(a)` into `[].slice.call(a)`
+- `unsafe_regexp` (default: false) -- enable substitutions of variables with
+ `RegExp` values the same way as if they are constants.
+
- `conditionals` -- apply optimizations for `if`-s and conditional
expressions
@@ -552,10 +555,10 @@ If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.u
- `keep_infinity` -- default `false`. Pass `true` to prevent `Infinity` from
being compressed into `1/0`, which may cause performance issues on Chrome.
-- `side_effects` -- default `true`. Pass `false` to disable potentially dropping
-functions marked as "pure". A function call is marked as "pure" if a comment
-annotation `/*@__PURE__*/` or `/*#__PURE__*/` immediately precedes the call. For
-example: `/*@__PURE__*/foo()`;
+- `side_effects` -- default `true`. Pass `false` to disable potentially dropping
+ functions marked as "pure". A function call is marked as "pure" if a comment
+ annotation `/*@__PURE__*/` or `/*#__PURE__*/` immediately precedes the call. For
+ example: `/*@__PURE__*/foo();`
## Mangle options
diff --git a/lib/compress.js b/lib/compress.js
index f168b942..f6bf3d05 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -83,6 +83,7 @@ function Compressor(options, false_by_default) {
unsafe_comps : false,
unsafe_math : false,
unsafe_proto : false,
+ unsafe_regexp : false,
unused : !false_by_default,
warnings : false,
}, true);
@@ -3765,7 +3766,7 @@ merge(Compressor.prototype, {
if (fixed) {
if (d.should_replace === undefined) {
var init = fixed.evaluate(compressor);
- if (init !== fixed) {
+ if (init !== fixed && (compressor.option("unsafe_regexp") || !(init instanceof RegExp))) {
init = make_node_from_constant(init, fixed);
var value_length = init.optimize(compressor).print_to_string().length;
var fn;
diff --git a/test/compress/evaluate.js b/test/compress/evaluate.js
index b8077564..a1e3d0be 100644
--- a/test/compress/evaluate.js
+++ b/test/compress/evaluate.js
@@ -990,3 +990,50 @@ Infinity_NaN_undefined_LHS: {
"}",
]
}
+
+issue_1964_1: {
+ options = {
+ evaluate: true,
+ reduce_vars: true,
+ unsafe_regexp: false,
+ unused: true,
+ }
+ input: {
+ function f() {
+ var long_variable_name = /\s/;
+ return "a b c".split(long_variable_name)[1];
+ }
+ console.log(f());
+ }
+ expect: {
+ function f() {
+ var long_variable_name = /\s/;
+ return "a b c".split(long_variable_name)[1];
+ }
+ console.log(f());
+ }
+ expect_stdout: "b"
+}
+
+issue_1964_2: {
+ options = {
+ evaluate: true,
+ reduce_vars: true,
+ unsafe_regexp: true,
+ unused: true,
+ }
+ input: {
+ function f() {
+ var long_variable_name = /\s/;
+ return "a b c".split(long_variable_name)[1];
+ }
+ console.log(f());
+ }
+ expect: {
+ function f() {
+ return "a b c".split(/\s/)[1];
+ }
+ console.log(f());
+ }
+ expect_stdout: "b"
+}