introduce unsafe_regexp (#1970)

fixes #1964
This commit is contained in:
Alex Lam S.L
2017-05-19 09:06:29 +08:00
committed by alexlamsl
parent 4cbf5a7821
commit 957c54bc87
4 changed files with 56 additions and 6 deletions

View File

@@ -1,5 +1,4 @@
language: node_js language: node_js
before_install: "npm install -g npm"
node_js: node_js:
- "0.10" - "0.10"
- "0.12" - "0.12"

View File

@@ -353,6 +353,9 @@ to set `true`; it's effectively a shortcut for `foo=true`).
- `unsafe_proto` (default: false) -- optimize expressions like - `unsafe_proto` (default: false) -- optimize expressions like
`Array.prototype.slice.call(a)` into `[].slice.call(a)` `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 - `conditionals` -- apply optimizations for `if`-s and conditional
expressions expressions
@@ -443,10 +446,10 @@ to set `true`; it's effectively a shortcut for `foo=true`).
- `keep_infinity` -- default `false`. Pass `true` to prevent `Infinity` from - `keep_infinity` -- default `false`. Pass `true` to prevent `Infinity` from
being compressed into `1/0`, which may cause performance issues on Chrome. being compressed into `1/0`, which may cause performance issues on Chrome.
- `side_effects` -- default `false`. Pass `true` to potentially drop functions - `side_effects` -- default `true`. Pass `false` to disable potentially dropping
marked as "pure". A function call is marked as "pure" if a comment annotation functions marked as "pure". A function call is marked as "pure" if a comment
`/*@__PURE__*/` or `/*#__PURE__*/` immediately precedes the call. For example: annotation `/*@__PURE__*/` or `/*#__PURE__*/` immediately precedes the call. For
`/*@__PURE__*/foo()`; example: `/*@__PURE__*/foo();`
### The `unsafe` option ### The `unsafe` option

View File

@@ -84,6 +84,7 @@ function Compressor(options, false_by_default) {
unsafe_comps : false, unsafe_comps : false,
unsafe_math : false, unsafe_math : false,
unsafe_proto : false, unsafe_proto : false,
unsafe_regexp : false,
unused : !false_by_default, unused : !false_by_default,
warnings : true, warnings : true,
}, true); }, true);
@@ -3680,7 +3681,7 @@ merge(Compressor.prototype, {
if (fixed) { if (fixed) {
if (d.should_replace === undefined) { if (d.should_replace === undefined) {
var init = fixed.evaluate(compressor); 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); init = make_node_from_constant(init, fixed);
var value = init.optimize(compressor).print_to_string().length; var value = init.optimize(compressor).print_to_string().length;
var fn; var fn;

View File

@@ -989,3 +989,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"
}