From 5c169615a84201b707e77c1b72b56908ca369d40 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Thu, 22 Mar 2018 23:46:26 +0800 Subject: [PATCH] fix corner case in `inline` (#3017) fixes #3016 --- lib/compress.js | 3 +- test/compress/functions.js | 157 +++++++++++++++++++++++++++++++++++++ 2 files changed, 159 insertions(+), 1 deletion(-) diff --git a/lib/compress.js b/lib/compress.js index f9fe3c63..fba88f42 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -4774,7 +4774,8 @@ merge(Compressor.prototype, { var name = var_def.name; append_var(decls, expressions, name, var_def.value); if (in_loop) { - var def = name.definition(); + var def = fn.variables.get(name.name); + if (def.orig[0] instanceof AST_SymbolFunarg) continue; var sym = make_node(AST_SymbolRef, name, name); def.references.push(sym); expressions.splice(pos++, 0, make_node(AST_Assign, var_def, { diff --git a/test/compress/functions.js b/test/compress/functions.js index ddf5fe05..bbe94ebf 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -2051,3 +2051,160 @@ drop_lone_use_strict: { } } } + +issue_3016_1: { + options = { + inline: true, + toplevel: true, + } + input: { + var b = 1; + do { + (function(a) { + return a[b]; + var a; + })(3); + } while (0); + console.log(b); + } + expect: { + var b = 1; + do { + a = 3, + a[b]; + } while(0); + var a; + console.log(b); + } + expect_stdout: "1" +} + +issue_3016_2: { + options = { + dead_code: true, + inline: true, + toplevel: true, + } + input: { + var b = 1; + do { + (function(a) { + return a[b]; + try { + a = 2; + } catch (a) { + var a; + } + })(3); + } while (0); + console.log(b); + } + expect: { + var b = 1; + do { + a = 3, + a[b]; + } while(0); + var a; + console.log(b); + } + expect_stdout: "1" +} + +issue_3016_2_ie8: { + options = { + dead_code: true, + ie8: true, + inline: true, + toplevel: true, + } + input: { + var b = 1; + do { + (function(a) { + return a[b]; + try { + a = 2; + } catch (a) { + var a; + } + })(3); + } while (0); + console.log(b); + } + expect: { + var b = 1; + do { + a = 3, + a[b]; + } while(0); + var a; + console.log(b); + } + expect_stdout: "1" +} + +issue_3016_3: { + options = { + dead_code: true, + inline: true, + toplevel: true, + } + input: { + var b = 1; + do { + console.log(function() { + return a ? "FAIL" : a = "PASS"; + try { + a = 2; + } catch (a) { + var a; + } + }()); + } while (b--); + } + expect: { + var b = 1; + do { + console.log((a = void 0, a ? "FAIL" : a = "PASS")); + } while(b--); + var a; + } + expect_stdout: [ + "PASS", + "PASS", + ] +} + +issue_3016_3_ie8: { + options = { + dead_code: true, + ie8: true, + inline: true, + toplevel: true, + } + input: { + var b = 1; + do { + console.log(function() { + return a ? "FAIL" : a = "PASS"; + try { + a = 2; + } catch (a) { + var a; + } + }()); + } while (b--); + } + expect: { + var b = 1; + do { + console.log((a = void 0, a ? "FAIL" : a = "PASS")); + } while(b--); + var a; + } + expect_stdout: [ + "PASS", + "PASS", + ] +} -- 2.34.1