From: Alex Lam S.L Date: Sat, 16 Dec 2017 07:21:09 +0000 (+0800) Subject: account for `catch` variable when `inline` (#2605) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=21794c9b8d0102ed00a15d1e54314908c92e4a24;p=UglifyJS.git account for `catch` variable when `inline` (#2605) fixes #2604 --- diff --git a/lib/compress.js b/lib/compress.js index 8c17422d..ebcae482 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -3924,10 +3924,20 @@ merge(Compressor.prototype, { return self; function can_flatten_args(fn) { - var scope = compressor.find_parent(AST_Scope); + var scope, level = 0; + var catches = Object.create(null); + do { + scope = compressor.parent(level++); + if (scope instanceof AST_Catch) { + catches[scope.argname.name] = true; + } + } while (!(scope instanceof AST_Scope)); var safe_to_inject = compressor.toplevel.vars || !(scope instanceof AST_Toplevel); return all(fn.argnames, function(arg) { - return arg.__unused || safe_to_inject && !scope.var_names()[arg.name]; + return arg.__unused + || safe_to_inject + && !catches[arg.name] + && !scope.var_names()[arg.name]; }) && scope; } diff --git a/test/compress/functions.js b/test/compress/functions.js index 8e67bc32..5f7fba6b 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -847,3 +847,79 @@ issue_2601_2: { } expect_stdout: "PASS" } + +issue_2604_1: { + options = { + inline: true, + side_effects: true, + unused: true, + } + input: { + var a = "FAIL"; + (function() { + try { + throw 1; + } catch (b) { + (function f(b) { + b && b(); + })(); + b && (a = "PASS"); + } + })(); + console.log(a); + } + expect: { + var a = "FAIL"; + (function() { + try { + throw 1; + } catch (b) { + (function(b) { + b && b(); + })(); + b && (a = "PASS"); + } + })(); + console.log(a); + } + expect_stdout: "PASS" +} + +issue_2604_2: { + rename = true + options = { + evaluate: true, + inline: true, + passes: 3, + reduce_vars: true, + side_effects: true, + unused: true, + } + mangle = {} + input: { + var a = "FAIL"; + (function() { + try { + throw 1; + } catch (b) { + (function f(b) { + b && b(); + })(); + b && (a = "PASS"); + } + })(); + console.log(a); + } + expect: { + var a = "FAIL"; + (function() { + try { + throw 1; + } catch (o) { + o && (a = "PASS"); + } + })(); + console.log(a); + } + expect_stdout: "PASS" +}