diff --git a/README.md b/README.md index 51f74a514d2..1cf44629924 100644 --- a/README.md +++ b/README.md @@ -459,6 +459,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 @@ -550,9 +553,9 @@ If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.u 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()`; + 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 a914672c474..33bb8f57cb0 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -84,6 +84,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); @@ -3911,7 +3912,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/package.json b/package.json index afb5921c585..86e012d0888 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "homepage": "https://github.com/mishoo/UglifyJS2/tree/harmony", "author": "Mihai Bazon (http://lisperator.net/)", "license": "BSD-2-Clause", - "version": "3.0.8", + "version": "3.0.9", "engines": { "node": ">=0.8.0" }, diff --git a/test/compress/evaluate.js b/test/compress/evaluate.js index 2c2b3183364..21b595e9a8d 100644 --- a/test/compress/evaluate.js +++ b/test/compress/evaluate.js @@ -1083,3 +1083,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" +}