From ab36b9b10a3e9923d76fdfba4f86cca1c07437d7 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Fri, 22 Jun 2018 19:41:55 +0800 Subject: [PATCH] fix corner case in `ie8` (#3198) fixes #3197 --- lib/scope.js | 11 ++-- test/compress/ie8.js | 138 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 137 insertions(+), 12 deletions(-) diff --git a/lib/scope.js b/lib/scope.js index d4b13d12..8ce3e4da 100644 --- a/lib/scope.js +++ b/lib/scope.js @@ -132,10 +132,7 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) { node.thedef = node; node.references = []; } - if (node instanceof AST_SymbolLambda) { - defun.def_function(node, node.name == "arguments" ? undefined : defun); - } - else if (node instanceof AST_SymbolDefun) { + if (node instanceof AST_SymbolDefun || options.ie8 && node instanceof AST_SymbolLambda) { // Careful here, the scope where this should be defined is // the parent scope. The reason is that we enter a new // scope when we encounter the AST_Defun node (which is @@ -143,6 +140,9 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) { // later. (node.scope = defun.parent_scope).def_function(node, defun); } + else if (node instanceof AST_SymbolLambda) { + defun.def_function(node, node.name == "arguments" ? undefined : defun); + } else if (node instanceof AST_SymbolVar) { defun.def_variable(node, node.TYPE == "SymbolVar" ? null : undefined); if (defun !== scope) { @@ -349,9 +349,6 @@ function next_mangled_name(scope, options, def) { holes.push(scope.cname); } scope.names_in_use[name] = true; - if (options.ie8 && def.orig[0] instanceof AST_SymbolLambda) { - names_in_use(scope.parent_scope, options)[name] = true; - } return name; } diff --git a/test/compress/ie8.js b/test/compress/ie8.js index b21b8411..c3012bfa 100644 --- a/test/compress/ie8.js +++ b/test/compress/ie8.js @@ -420,8 +420,8 @@ issue_24_2: { })(); } expect: { - (function(n) { - console.log(typeof function o(){} === typeof n ? "FAIL" : "PASS"); + (function(o) { + console.log(typeof function n(){} === typeof o ? "FAIL" : "PASS"); })(); } expect_stdout: "PASS" @@ -457,9 +457,29 @@ issue_2976_2: { }()); } expect: { - console.log(function n() { - var o; - return o === n ? "FAIL" : "PASS"; + console.log(function f() { + var n; + return n === f ? "FAIL" : "PASS"; + }()); + } + expect_stdout: "PASS" +} + +issue_2976_3: { + mangle = { + ie8: true, + toplevel: true, + } + input: { + console.log(function f() { + var a; + return a === f ? "FAIL" : "PASS"; + }()); + } + expect: { + console.log(function o() { + var n; + return n === o ? "FAIL" : "PASS"; }()); } expect_stdout: "PASS" @@ -538,3 +558,111 @@ issue_3035_ie8: { } expect_stdout: "PASS" } + +issue_3197_1: { + options = { + ie8: false, + inline: true, + reduce_vars: true, + side_effects: true, + unused: true, + } + mangle = { + ie8: false, + } + input: { + var window = {}; + !function() { + function Foo() { + console.log(this instanceof Foo); + } + window.Foo = Foo; + }(); + new window.Foo(); + } + expect: { + var window = {}; + window.Foo = function o() { + console.log(this instanceof o); + }; + new window.Foo(); + } + expect_stdout: "true" +} + +issue_3197_1_ie8: { + options = { + ie8: true, + inline: true, + reduce_vars: true, + side_effects: true, + unused: true, + } + mangle = { + ie8: true, + } + input: { + var window = {}; + !function() { + function Foo() { + console.log(this instanceof Foo); + } + window.Foo = Foo; + }(); + new window.Foo(); + } + expect: { + var window = {}; + window.Foo = function Foo() { + console.log(this instanceof Foo); + }; + new window.Foo(); + } + expect_stdout: "true" +} + +issue_3197_2: { + mangle = { + ie8: false, + } + input: { + (function(a) { + var f = function f() { + console.log(this instanceof f); + }; + new f(a); + })(); + } + expect: { + (function(n) { + var o = function n() { + console.log(this instanceof n); + }; + new o(n); + })(); + } + expect_stdout: "true" +} + +issue_3197_2_ie8: { + mangle = { + ie8: true, + } + input: { + (function(a) { + var f = function f() { + console.log(this instanceof f); + }; + new f(a); + })(); + } + expect: { + (function(n) { + var o = function o() { + console.log(this instanceof o); + }; + new o(n); + })(); + } + expect_stdout: "true" +} -- 2.34.1