From: Alex Lam S.L Date: Thu, 31 Oct 2019 18:08:31 +0000 (+0800) Subject: enhance `if_return` (#3560) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=815eff1f7c5c2fca63814f11fbf6e769bc599e38;p=UglifyJS.git enhance `if_return` (#3560) --- diff --git a/lib/compress.js b/lib/compress.js index 65768c02..0321a532 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -1749,9 +1749,7 @@ merge(Compressor.prototype, { if (stat instanceof AST_If) { var ab = aborts(stat.body); if (can_merge_flow(ab)) { - if (ab.label) { - remove(ab.label.thedef.references, ab); - } + if (ab.label) remove(ab.label.thedef.references, ab); CHANGED = true; stat = stat.clone(); stat.condition = stat.condition.negate(compressor); @@ -1779,23 +1777,34 @@ merge(Compressor.prototype, { } } - var ab = aborts(stat.alternative); - if (can_merge_flow(ab)) { - if (ab.label) { - remove(ab.label.thedef.references, ab); - } + var alt = aborts(stat.alternative); + if (can_merge_flow(alt)) { + if (alt.label) remove(alt.label.thedef.references, alt); CHANGED = true; stat = stat.clone(); stat.body = make_node(AST_BlockStatement, stat.body, { body: as_statement_array(stat.body).concat(extract_functions()) }); - var body = as_statement_array_with_return(stat.alternative, ab); + var body = as_statement_array_with_return(stat.alternative, alt); stat.alternative = make_node(AST_BlockStatement, stat.alternative, { body: body }); statements[i] = stat.transform(compressor); continue; } + + if (compressor.option("typeofs")) { + if (ab && !alt) { + mark_locally_defined(stat.condition, null, make_node(AST_BlockStatement, self, { + body: statements.slice(i + 1) + })); + } + if (!ab && alt) { + mark_locally_defined(stat.condition, make_node(AST_BlockStatement, self, { + body: statements.slice(i + 1) + })); + } + } } if (stat instanceof AST_If && stat.body instanceof AST_Return) { @@ -1940,9 +1949,7 @@ merge(Compressor.prototype, { && loop_body(lct) === self || stat instanceof AST_Continue && loop_body(lct) === self) { - if (stat.label) { - remove(stat.label.thedef.references, stat); - } + if (stat.label) remove(stat.label.thedef.references, stat); } else { statements[n++] = stat; } diff --git a/test/compress/typeof.js b/test/compress/typeof.js index c3c2e9ec..3b99521e 100644 --- a/test/compress/typeof.js +++ b/test/compress/typeof.js @@ -409,3 +409,31 @@ typeof_defined_4: { "object" != typeof A || "object" == typeof B || B; } } + +emberjs_global: { + options = { + comparisons: true, + conditionals: true, + if_return: true, + passes: 2, + side_effects: true, + toplevel: true, + typeofs: true, + unused: true, + } + input: { + var a; + if (typeof A === "object") { + a = A; + } else if (typeof B === "object") { + a = B; + } else { + throw new Error("PASS"); + } + } + expect: { + if ("object" != typeof A && "object" != typeof B) + throw new Error("PASS"); + } + expect_stdout: Error("PASS") +}