From: Alex Lam S.L Date: Wed, 4 Dec 2019 16:59:57 +0000 (+0800) Subject: fix corner case in `collapse_vars` (#3627) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=bf7e4ca1a3b1305308c66fcdf188d31a398c4ba2;p=UglifyJS.git fix corner case in `collapse_vars` (#3627) fixes #3626 --- diff --git a/lib/compress.js b/lib/compress.js index 4442bbb5..74e2c6fc 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -1578,9 +1578,11 @@ merge(Compressor.prototype, { } if (parent instanceof AST_Binary) { if (lazy_op[parent.operator] && parent.left !== node) { - var grandparent = scanner.parent(level + 1); - if (!(grandparent instanceof AST_Binary)) return node; - if (grandparent.operator != parent.operator) return node; + do { + node = parent; + parent = scanner.parent(++level); + } while (parent instanceof AST_Binary && parent.operator == node.operator); + return node; } return find_stop_value(parent, level + 1); } diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js index cc6c5f9a..9fe5a93f 100644 --- a/test/compress/collapse_vars.js +++ b/test/compress/collapse_vars.js @@ -7308,3 +7308,40 @@ substitution_unary: { "true 42 42", ] } + +issue_3626_1: { + options = { + collapse_vars: true, + } + input: { + var a = "foo", b = 42; + a.p && (b = a) && a; + console.log(a, b); + } + expect: { + var a = "foo", b = 42; + a.p && (b = a) && a; + console.log(a, b); + } + expect_stdout: "foo 42" +} + +issue_3626_2: { + options = { + collapse_vars: true, + conditionals: true, + } + input: { + var a = "foo", b = 42, c = null; + if (a && a.p) + if (b = a) + c++ + a; + console.log(a, b, c); + } + expect: { + var a = "foo", b = 42, c = null; + a && a.p && (b = a) && c++ + a; + console.log(a, b, c); + } + expect_stdout: "foo 42 null" +}