From: Alex Lam S.L Date: Wed, 24 Apr 2019 14:21:28 +0000 (+0800) Subject: fix corner case in `unsafe` (#3380) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=d3b93ec682f948e80c9617421128597a12651f78;p=UglifyJS.git fix corner case in `unsafe` (#3380) --- diff --git a/lib/compress.js b/lib/compress.js index 767f3dcc..758e4595 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -3018,6 +3018,7 @@ merge(Compressor.prototype, { if (arg === value) return this; args.push(value); } + if (key == "replace" && typeof args[1] == "function") return this; try { return val[key].apply(val, args); } catch (ex) { @@ -3139,6 +3140,7 @@ merge(Compressor.prototype, { } else if (expr instanceof AST_RegExp) { map = native_fns.RegExp; } else if (expr.is_string(compressor)) { + if (this.property == "replace") return false; map = native_fns.String; } else if (!this.may_throw_on_access(compressor)) { map = native_fns.Object; diff --git a/test/compress/dead-code.js b/test/compress/dead-code.js index 1ce5355a..5f1ca71c 100644 --- a/test/compress/dead-code.js +++ b/test/compress/dead-code.js @@ -942,3 +942,21 @@ issue_2929: { } expect_stdout: "PASS" } + +unsafe_string_replace: { + options = { + side_effects: true, + unsafe: true, + } + input: { + "foo".replace("f", function() { + console.log("PASS"); + }); + } + expect: { + "foo".replace("f", function() { + console.log("PASS"); + }); + } + expect_stdout: "PASS" +} diff --git a/test/compress/evaluate.js b/test/compress/evaluate.js index ebdffadb..5b16824b 100644 --- a/test/compress/evaluate.js +++ b/test/compress/evaluate.js @@ -1712,3 +1712,21 @@ unsafe_escaped: { } expect_stdout: "PASS" } + +unsafe_string_replace: { + options = { + evaluate: true, + unsafe: true, + } + input: { + "foo".replace("f", function() { + console.log("PASS"); + }); + } + expect: { + "foo".replace("f", function() { + console.log("PASS"); + }); + } + expect_stdout: "PASS" +}