From: Alex Lam S.L Date: Mon, 14 Oct 2019 10:15:40 +0000 (+0800) Subject: fix corner cases in `ie8` (#3472) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=736019b767548268044e665bd6cde4b5e34c0bd3;p=UglifyJS.git fix corner cases in `ie8` (#3472) fixes #3471 --- diff --git a/lib/compress.js b/lib/compress.js index 06ba43c0..be9e8dc8 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -3716,6 +3716,7 @@ merge(Compressor.prototype, { if (!def.value) { head.push(def); } else if (compressor.option("functions") + && !compressor.option("ie8") && def.value === def.name.fixed_value() && def.value instanceof AST_Function && !(def.value.name && def.value.name.definition().assignments) @@ -6183,7 +6184,9 @@ merge(Compressor.prototype, { var fn = node.fixed_value(); if (!(fn instanceof AST_Lambda)) return; if (!fn.name) return; - if (fixed.variables.get(fn.name.name) !== fn.name.definition()) return; + var fn_def = fn.name.definition(); + if (fn_def.scope !== fn.name.scope) return; + if (fixed.variables.get(fn.name.name) !== fn_def) return; fn.name = fn.name.clone(); var value_def = value.variables.get(fn.name.name) || value.def_function(fn.name); node.thedef = value_def; diff --git a/test/compress/ie8.js b/test/compress/ie8.js index f0298de3..94b83de6 100644 --- a/test/compress/ie8.js +++ b/test/compress/ie8.js @@ -1013,3 +1013,71 @@ issue_3468_ie8: { } expect_stdout: "function" } + +issue_3471: { + options = { + ie8: false, + functions: true, + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + var c = 1; + function f() { + var a = function g() { + --c && f(); + g.p = 0; + }; + for (var p in a) + a[p]; + } + f(); + } + expect: { + var c = 1; + (function f() { + function a() { + --c && f(); + a.p = 0; + } + for (var p in a) + a[p]; + })(); + } + expect_stdout: true +} + +issue_3471_ie8: { + options = { + ie8: true, + functions: true, + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + var c = 1; + function f() { + var a = function g() { + --c && f(); + g.p = 0; + }; + for (var p in a) + a[p]; + } + f(); + } + expect: { + var c = 1; + (function f() { + var a = function g() { + --c && f(); + g.p = 0; + }; + for (var p in a) + a[p]; + })(); + } + expect_stdout: true +}