From: Alex Lam S.L Date: Fri, 25 Oct 2019 21:41:02 +0000 (+0800) Subject: fix corner case in `collapse_vars` (#3527) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=85237b08d46c62a97c9b338c4e62d71cdba76e24;p=UglifyJS.git fix corner case in `collapse_vars` (#3527) fixes #3526 --- diff --git a/lib/compress.js b/lib/compress.js index c8eb3487..03c1f590 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -1228,6 +1228,7 @@ merge(Compressor.prototype, { var scan_lhs = lhs && !side_effects && !is_lhs_read_only(lhs, compressor); var scan_rhs = foldable(get_rhs(candidate)); if (!scan_lhs && !scan_rhs) continue; + var modify_toplevel = false; // Locate symbols which may execute code outside of scanning range var lvalues = get_lvalues(candidate); var lhs_local = is_lhs_local(lhs); @@ -1580,7 +1581,16 @@ merge(Compressor.prototype, { if (candidate instanceof AST_VarDef) { lvalues[candidate.name.name] = lhs; } + var scan_iife = scope instanceof AST_Toplevel; var tw = new TreeWalker(function(node) { + if (scan_iife && node.TYPE == "Call") { + var exp = node.expression; + if (exp instanceof AST_PropAccess) return; + if (exp instanceof AST_Function && !exp.contains_this()) return; + modify_toplevel = true; + scan_iife = false; + return; + } var value; if (node instanceof AST_SymbolRef) { value = node.fixed_value() || node; @@ -1667,6 +1677,7 @@ merge(Compressor.prototype, { var def = sym.definition(); if (def.orig.length == 1 && def.orig[0] instanceof AST_SymbolDefun) return false; if (def.scope !== scope) return true; + if (modify_toplevel && compressor.exposed(def)) return true; return !all(def.references, function(ref) { return ref.scope.resolve() === scope; }); diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js index 5723f6d9..858d3d41 100644 --- a/test/compress/collapse_vars.js +++ b/test/compress/collapse_vars.js @@ -6296,3 +6296,55 @@ issue_3520: { } expect_stdout: "2" } + +issue_3526_1: { + options = { + collapse_vars: true, + } + input: { + var b = function() { + this.a = "FAIL"; + }(); + var a = "PASS"; + var b; + var c = b; + console.log(a); + } + expect: { + var b = function() { + this.a = "FAIL"; + }(); + var a = "PASS"; + var b; + var c = b; + console.log(a); + } + expect_stdout: "PASS" +} + +issue_3526_2: { + options = { + collapse_vars: true, + } + input: { + function f() { + this.a = "FAIL"; + } + var b = f(); + var a = "PASS"; + var b; + var c = b; + console.log(a); + } + expect: { + function f() { + this.a = "FAIL"; + } + var b = f(); + var a = "PASS"; + var b; + var c = b; + console.log(a); + } + expect_stdout: "PASS" +}