From: Alex Lam S.L Date: Mon, 22 Mar 2021 14:43:33 +0000 (+0000) Subject: improve global context enumeration under `sandbox` (#4812) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=51bdb7281bb555f0cc56ca15560a8ab514b0a632;p=UglifyJS.git improve global context enumeration under `sandbox` (#4812) fixes #4811 --- diff --git a/test/compress/sandbox.js b/test/compress/sandbox.js index 9cf76725..f932dcf5 100644 --- a/test/compress/sandbox.js +++ b/test/compress/sandbox.js @@ -172,3 +172,32 @@ issue_4054: { } expect_stdout: "{ p: [Setter] }" } + +issue_4811_1: { + input: { + for (var PASS in this); + console.log(PASS, this); + } + expect: { + for (var PASS in this); + console.log(PASS, this); + } + expect_stdout: "PASS [object global]" +} + +issue_4811_2: { + options = { + side_effects: true, + } + input: { + (async function() {}); + for (var PASS in this); + console.log(PASS, this); + } + expect: { + for (var PASS in this); + console.log(PASS, this); + } + expect_stdout: "PASS [object global]" + node_version: ">=8" +} diff --git a/test/mocha/reduce.js b/test/mocha/reduce.js index 9e3fc8be..238d11ef 100644 --- a/test/mocha/reduce.js +++ b/test/mocha/reduce.js @@ -361,4 +361,22 @@ describe("test/reduce.js", function() { if (result.error) throw result.error; assert.strictEqual(result.code, read("test/input/reduce/destructured_catch.reduced.js")); }); + it("Should not enumerate `toString` over global context", function() { + if (semver.satisfies(process.version, "<8")) return; + var code = [ + "(async function() {});", + "for (var k in this);", + "console.log(k);", + ].join("\n"); + var result = reduce_test(code, { + mangle: false, + }); + if (result.error) throw result.error; + assert.strictEqual(result.code, [ + "// Can't reproduce test failure", + "// minify options: {", + '// "mangle": false', + "// }", + ].join("\n")); + }); }); diff --git a/test/sandbox.js b/test/sandbox.js index 18934f45..9a49fd94 100644 --- a/test/sandbox.js +++ b/test/sandbox.js @@ -170,6 +170,12 @@ 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 }, }; [ @@ -199,15 +205,15 @@ function setup(global, builtins, setup_log, setup_tty) { } catch (e) {} }); Object.defineProperties(global, props); - // for Node.js v8+ - global.toString = 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":