fix corner case in `unsafe` (#3380)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 24 Apr 2019 14:21:28 +0000 (22:21 +0800)
committerGitHub <noreply@github.com>
Wed, 24 Apr 2019 14:21:28 +0000 (22:21 +0800)
lib/compress.js
test/compress/dead-code.js
test/compress/evaluate.js

index 767f3dc..758e459 100644 (file)
@@ -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;
index 1ce5355..5f1ca71 100644 (file)
@@ -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"
+}
index ebdffad..5b16824 100644 (file)
@@ -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"
+}