Skip to content

Commit

Permalink
enhance if_return (#3560)
Browse files Browse the repository at this point in the history
  • Loading branch information
alexlamsl authored Oct 31, 2019
1 parent 1e9b576 commit 815eff1
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 12 deletions.
31 changes: 19 additions & 12 deletions lib/compress.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
}
Expand Down
28 changes: 28 additions & 0 deletions test/compress/typeof.js
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}

0 comments on commit 815eff1

Please sign in to comment.