From 703a5b1fda7edc41cb36d34627fe02deb1a68733 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Santos?= Date: Wed, 14 Mar 2018 18:46:26 +0000 Subject: [PATCH 1/4] fix #2994 by fixing block aborts() definition --- lib/compress.js | 8 +++++-- test/compress/conditionals.js | 39 +++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 886a4b5b..70a70465 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -3074,8 +3074,12 @@ merge(Compressor.prototype, { def(AST_Statement, return_null); def(AST_Jump, return_this); function block_aborts(){ - var n = this.body.length; - return n > 0 && aborts(this.body[n - 1]); + for (var i = 0; i < this.body.length; i++) { + if (aborts(this.body[i])) { + return this.body[i]; + } + } + return null; }; def(AST_Import, function(){ return null; }); def(AST_BlockStatement, block_aborts); diff --git a/test/compress/conditionals.js b/test/compress/conditionals.js index e37c5556..2754ffba 100644 --- a/test/compress/conditionals.js +++ b/test/compress/conditionals.js @@ -1204,6 +1204,45 @@ issue_2560: { ] } +issue_2994: { + options = { + conditionals: true, + if_return: true + } + input: { + function f() { + if (condition1) { + if (condition2) { + return aValue; + } else { + const variable1 = 'something'; + if (condition3) { + const variable2 = 'else'; + return anotherValue; + } else { + return undefined; + } + } + } + } + } + expect: { + function f() { + if (condition1) { + if (condition2) return aValue; + { + const variable1 = 'something'; + if (condition3) { + const variable2 = 'else'; + return anotherValue; + } + return; + } + } + } + } +} + hoist_decl: { options = { conditionals: true, From 6d9f6e0756462e82cd0204707c60e6d7a534c6f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Santos?= Date: Wed, 14 Mar 2018 19:44:51 +0000 Subject: [PATCH 2/4] fix broken tests --- test/compress/issue-1034.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/compress/issue-1034.js b/test/compress/issue-1034.js index 860a597f..d202fa4a 100644 --- a/test/compress/issue-1034.js +++ b/test/compress/issue-1034.js @@ -69,15 +69,15 @@ non_hoisted_function_after_return_2a: { "WARN: Declarations in unreachable code! [test/compress/issue-1034.js:48,16]", "WARN: Dropping unreachable code [test/compress/issue-1034.js:51,16]", "WARN: Declarations in unreachable code! [test/compress/issue-1034.js:51,16]", - "WARN: Dropping unused variable a [test/compress/issue-1034.js:48,20]", - "WARN: Dropping unused function nope [test/compress/issue-1034.js:55,21]", - "WARN: pass 0: last_count: Infinity, count: 37", "WARN: Dropping unreachable code [test/compress/issue-1034.js:53,12]", "WARN: Declarations in unreachable code! [test/compress/issue-1034.js:53,12]", "WARN: Dropping unreachable code [test/compress/issue-1034.js:56,12]", + "WARN: Dropping unused variable a [test/compress/issue-1034.js:48,20]", "WARN: Dropping unused variable b [test/compress/issue-1034.js:51,20]", "WARN: Dropping unused variable c [test/compress/issue-1034.js:53,16]", - "WARN: pass 1: last_count: 37, count: 18", + "WARN: Dropping unused function nope [test/compress/issue-1034.js:55,21]", + "WARN: pass 0: last_count: Infinity, count: 23", + "WARN: pass 1: last_count: 23, count: 18", ] } @@ -200,15 +200,15 @@ non_hoisted_function_after_return_2a_strict: { "WARN: Declarations in unreachable code! [test/compress/issue-1034.js:175,16]", "WARN: Dropping unreachable code [test/compress/issue-1034.js:178,16]", "WARN: Declarations in unreachable code! [test/compress/issue-1034.js:178,16]", - "WARN: Dropping unused variable a [test/compress/issue-1034.js:175,20]", - "WARN: Dropping unused function nope [test/compress/issue-1034.js:182,21]", - "WARN: pass 0: last_count: Infinity, count: 48", "WARN: Dropping unreachable code [test/compress/issue-1034.js:180,12]", "WARN: Declarations in unreachable code! [test/compress/issue-1034.js:180,12]", "WARN: Dropping unreachable code [test/compress/issue-1034.js:183,12]", + "WARN: Dropping unused variable a [test/compress/issue-1034.js:175,20]", "WARN: Dropping unused variable b [test/compress/issue-1034.js:178,20]", "WARN: Dropping unused variable c [test/compress/issue-1034.js:180,16]", - "WARN: pass 1: last_count: 48, count: 29", + "WARN: Dropping unused function nope [test/compress/issue-1034.js:182,21]", + "WARN: pass 0: last_count: Infinity, count: 34", + "WARN: pass 1: last_count: 34, count: 29", ] } From 727eb8a5d2136b08f8f541c9af585de090944e6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Santos?= Date: Wed, 14 Mar 2018 19:45:04 +0000 Subject: [PATCH 3/4] improve test warning error output --- test/run-tests.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/run-tests.js b/test/run-tests.js index deb1f954..8d05e462 100755 --- a/test/run-tests.js +++ b/test/run-tests.js @@ -175,8 +175,8 @@ function run_compress_tests() { if (expected_warnings != actual_warnings) { log("!!! failed\n---INPUT---\n{input}\n---EXPECTED WARNINGS---\n{expected_warnings}\n---ACTUAL WARNINGS---\n{actual_warnings}\n\n", { input: input_formatted, - expected_warnings: expected_warnings, - actual_warnings: actual_warnings, + expected_warnings: JSON.parse(expected_warnings).join('\n'), + actual_warnings: JSON.parse(actual_warnings).join('\n'), }); return false; } From 2e9a3092d7c8aad9b6130682a4c29270b7e01704 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Santos?= Date: Thu, 15 Mar 2018 18:51:53 +0000 Subject: [PATCH 4/4] make test stdout-based --- test/compress/conditionals.js | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/test/compress/conditionals.js b/test/compress/conditionals.js index 2754ffba..d06f6552 100644 --- a/test/compress/conditionals.js +++ b/test/compress/conditionals.js @@ -1210,7 +1210,7 @@ issue_2994: { if_return: true } input: { - function f() { + function f(condition1, condition2, condition3) { if (condition1) { if (condition2) { return aValue; @@ -1225,22 +1225,40 @@ issue_2994: { } } } + let aValue = 2, anotherValue = 3; + for (let i = 0; i < 8; ++i) { + console.log(f(i & 4, i & 2, i & 1)); + } } expect: { - function f() { + function f(condition1, condition2, condition3) { if (condition1) { if (condition2) return aValue; { - const variable1 = 'something'; + const variable1 = "something"; if (condition3) { - const variable2 = 'else'; + const variable2 = "else"; return anotherValue; } return; } } } + let aValue = 2, anotherValue = 3; + for (let i = 0; i < 8; ++i) + console.log(f(4 & i, 2 & i, 1 & i)); } + expect_stdout: [ + "undefined", + "undefined", + "undefined", + "undefined", + "undefined", + "3", + "2", + "2", + ] + node_version: ">=6" } hoist_decl: {