From fa14a9cfcd8d766887654b8b6da727489077033a Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Thu, 21 May 2020 22:26:46 +0100 Subject: [PATCH] fix corner case in `join_vars` (#3917) fixes #3916 --- lib/compress.js | 2 +- test/compress/join_vars.js | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/lib/compress.js b/lib/compress.js index 06d04cc5..17eeb87c 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -2508,7 +2508,7 @@ merge(Compressor.prototype, { } if (prop instanceof AST_Node) break; prop = "" + prop; - var diff = compressor.has_directive("use strict") ? function(node) { + var diff = prop == "__proto__" || compressor.has_directive("use strict") ? function(node) { return node.key != prop && node.key.name != prop; } : function(node) { return node.key.name != prop; diff --git a/test/compress/join_vars.js b/test/compress/join_vars.js index 67d7fd05..590f9970 100644 --- a/test/compress/join_vars.js +++ b/test/compress/join_vars.js @@ -1023,3 +1023,35 @@ issue_3856: { } expect_stdout: "undefined" } + +issue_3916: { + options = { + join_vars: true, + } + input: { + var o = {}; + o.p = "PASS"; + o.__proto__ = 42; + o.q = "FAIL"; + o.__proto__ = { + p: "FAIL", + q: "PASS", + }; + o.__proto__ = "foo"; + console.log(typeof o.__proto__, o.p, delete o.q, o.q); + } + expect: { + var o = { + p: "PASS", + __proto__: 42, + q: "FAIL", + }; + o.__proto__ = { + p: "FAIL", + q: "PASS", + }; + o.__proto__ = "foo"; + console.log(typeof o.__proto__, o.p, delete o.q, o.q); + } + expect_stdout: "object PASS true PASS" +} -- 2.34.1