From 91cae51d8f8a7f06e55dba7d100bbb663448875b Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Wed, 16 Oct 2019 01:09:16 +0800 Subject: [PATCH] fix corner case in `evaluate` & `ie8` (#3483) fixes #3482 --- lib/scope.js | 1 + test/compress/ie8.js | 166 +++++++++++++++++++++++++++++++++++++------ 2 files changed, 145 insertions(+), 22 deletions(-) diff --git a/lib/scope.js b/lib/scope.js index 01a67b7dbd..038dd640c5 100644 --- a/lib/scope.js +++ b/lib/scope.js @@ -216,6 +216,7 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) { node.reference(options); }); if (old_def.lambda) new_def.lambda = true; + if (new_def.undeclared) self.variables.set(name, new_def); } }); diff --git a/test/compress/ie8.js b/test/compress/ie8.js index f371bbf0ab..e57c233ed9 100644 --- a/test/compress/ie8.js +++ b/test/compress/ie8.js @@ -125,28 +125,36 @@ do_screw_try_catch_undefined: { ie8: false, } input: { - function a(b){ + function a(b) { try { - throw 'Stuff'; + throw "Stuff"; } catch (undefined) { - console.log('caught: ' + undefined); + console.log("caught: " + undefined); } - console.log('undefined is ' + undefined); + console.log("undefined is " + undefined); return b === undefined; - }; + } + console.log(a(42), a(void 0)); } expect: { - function a(o){ + function a(o) { try { - throw "Stuff" + throw "Stuff"; } catch (o) { - console.log("caught: "+o) + console.log("caught: " + o); } console.log("undefined is " + void 0); - return void 0===o + return void 0 === o; } - } - expect_stdout: true + console.log(a(42), a(void 0)); + } + expect_stdout: [ + "caught: Stuff", + "undefined is undefined", + "caught: Stuff", + "undefined is undefined", + "false true", + ] } dont_screw_try_catch_undefined: { @@ -160,28 +168,37 @@ dont_screw_try_catch_undefined: { ie8: true, } input: { - function a(b){ + function a(b) { try { - throw 'Stuff'; + throw "Stuff"; } catch (undefined) { - console.log('caught: ' + undefined); + console.log("caught: " + undefined); } - console.log('undefined is ' + undefined); + // IE8: undefined is Stuff + console.log("undefined is " + undefined); return b === undefined; - }; + } + console.log(a(42), a(void 0)); } expect: { - function a(n){ + function a(n) { try { - throw "Stuff" + throw "Stuff"; } catch (undefined) { - console.log("caught: " + undefined) + console.log("caught: " + undefined); } console.log("undefined is " + undefined); - return n === undefined + return n === undefined; } - } - expect_stdout: true + console.log(a(42), a(void 0)); + } + expect_stdout: [ + "caught: Stuff", + "undefined is undefined", + "caught: Stuff", + "undefined is undefined", + "false true", + ] } reduce_vars: { @@ -1561,3 +1578,108 @@ issue_3478_2_ie8_toplevel: { } expect_stdout: "PASS" } + +issue_3482_1: { + options = { + evaluate: true, + ie8: false, + } + input: { + try { + throw 42; + } catch (NaN) { + var a = +"a"; + } + console.log(a, NaN, 0 / 0); + } + expect: { + try { + throw 42; + } catch (NaN) { + var a = 0 / 0; + } + console.log(a, NaN, NaN); + } + expect_stdout: "NaN NaN NaN" +} + +issue_3482_1_ie8: { + options = { + evaluate: true, + ie8: true, + } + input: { + try { + throw 42; + } catch (NaN) { + var a = +"a"; + } + // IE8: NaN 42 NaN + console.log(a, NaN, 0 / 0); + } + expect: { + try { + throw 42; + } catch (NaN) { + var a = 0 / 0; + } + console.log(a, NaN, 0 / 0); + } + expect_stdout: "NaN NaN NaN" +} + +issue_3482_2: { + options = { + evaluate: true, + ie8: false, + } + input: { + (function() { + try { + throw 42; + } catch (NaN) { + a = +"a"; + } + })(); + console.log(a, NaN, 0 / 0); + } + expect: { + (function() { + try { + throw 42; + } catch (NaN) { + a = 0 / 0; + } + })(); + console.log(a, NaN, NaN); + } + expect_stdout: "NaN NaN NaN" +} + +issue_3482_2_ie8: { + options = { + evaluate: true, + ie8: true, + } + input: { + (function() { + try { + throw 42; + } catch (NaN) { + a = +"a"; + } + })(); + console.log(a, NaN, 0 / 0); + } + expect: { + (function() { + try { + throw 42; + } catch (NaN) { + a = 0 / 0; + } + })(); + console.log(a, NaN, 0 / 0); + } + expect_stdout: "NaN NaN NaN" +}