workaround `toString()` quirks on global context (#4814)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 23 Mar 2021 03:15:41 +0000 (03:15 +0000)
committerGitHub <noreply@github.com>
Tue, 23 Mar 2021 03:15:41 +0000 (11:15 +0800)
test/compress/sandbox.js
test/mocha/reduce.js
test/sandbox.js
test/ufuzz/index.js

index f932dcf..9111e31 100644 (file)
@@ -176,13 +176,13 @@ issue_4054: {
 issue_4811_1: {
     input: {
         for (var PASS in this);
-        console.log(PASS, this);
+        console.log(PASS, this, {} < this);
     }
     expect: {
         for (var PASS in this);
-        console.log(PASS, this);
+        console.log(PASS, this, {} < this);
     }
-    expect_stdout: "PASS [object global]"
+    expect_stdout: "PASS [object global] true"
 }
 
 issue_4811_2: {
@@ -192,12 +192,12 @@ issue_4811_2: {
     input: {
         (async function() {});
         for (var PASS in this);
-        console.log(PASS, this);
+        console.log(PASS, this, {} < this);
     }
     expect: {
         for (var PASS in this);
-        console.log(PASS, this);
+        console.log(PASS, this, {} < this);
     }
-    expect_stdout: "PASS [object global]"
+    expect_stdout: "PASS [object global] true"
     node_version: ">=8"
 }
index 238d11e..64fea56 100644 (file)
@@ -366,7 +366,7 @@ describe("test/reduce.js", function() {
         var code = [
             "(async function() {});",
             "for (var k in this);",
-            "console.log(k);",
+            "console.log(k, 42 + this);",
         ].join("\n");
         var result = reduce_test(code, {
             mangle: false,
index 9a49fd9..630a605 100644 (file)
@@ -170,12 +170,6 @@ function setup(global, builtins, setup_log, setup_tty) {
         },
         global: { get: self },
         self: { get: self },
-        // for Node.js v8+
-        toString: {
-            get: function() {
-                return global_toString;
-            },
-        },
         window: { get: self },
     };
     [
@@ -205,15 +199,19 @@ function setup(global, builtins, setup_log, setup_tty) {
         } catch (e) {}
     });
     Object.defineProperties(global, props);
+    // for Node.js v8+
+    if (global.toString !== Object.prototype.toString) {
+        global.__proto__ = Object.defineProperty(Object.create(global.__proto__), "toString", {
+            value: function() {
+                return "[object global]";
+            },
+        });
+    }
 
     function self() {
         return this;
     }
 
-    function global_toString() {
-        return "[object global]";
-    }
-
     function safe_log(arg, cache) {
         if (arg) switch (typeof arg) {
           case "function":
index e2bcdf2..768009a 100644 (file)
@@ -2206,8 +2206,7 @@ function log(options) {
 function sort_globals(code) {
     var globals = run_code("throw Object.keys(this).sort(" + function(global) {
         return function(m, n) {
-            return (n == "toString") - (m == "toString")
-                || (typeof global[n] == "function") - (typeof global[m] == "function")
+            return (typeof global[n] == "function") - (typeof global[m] == "function")
                 || (m < n ? -1 : m > n ? 1 : 0);
         };
     } + "(this));" + code);