Skip to content

Commit 6cdc035

Browse files
authored
fix corner case in if_return (#5689)
fixes #5688
1 parent e1e3516 commit 6cdc035

3 files changed

Lines changed: 56 additions & 4 deletions

File tree

lib/compress.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3745,14 +3745,17 @@ Compressor.prototype.compress = function(node) {
37453745
return true;
37463746
}
37473747
if (!(ab instanceof AST_LoopControl)) return false;
3748-
if (jump && self instanceof AST_SwitchBranch) {
3748+
if (self instanceof AST_SwitchBranch) {
37493749
if (jump instanceof AST_Exit) {
37503750
if (!in_lambda) return false;
37513751
if (jump.value) return false;
3752-
} else if (compressor.loopcontrol_target(jump) !== parent) {
3752+
merge_jump = true;
3753+
} else if (jump) {
3754+
if (compressor.loopcontrol_target(jump) !== parent) return false;
3755+
merge_jump = true;
3756+
} else if (jump === false) {
37533757
return false;
37543758
}
3755-
merge_jump = true;
37563759
}
37573760
var lct = compressor.loopcontrol_target(ab);
37583761
if (ab instanceof AST_Continue) return match_target(loop_body(lct));
@@ -3789,7 +3792,7 @@ Compressor.prototype.compress = function(node) {
37893792
end = statements.lastIndexOf(stop);
37903793
} else {
37913794
stop = statements[end];
3792-
if (stop !== jump) jump = null;
3795+
if (stop !== jump) jump = false;
37933796
}
37943797
var tail = statements.splice(start, end - start).filter(function(stat) {
37953798
if (stat instanceof AST_LambdaDefinition) {

test/compress.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,17 @@ function parse_test(file) {
126126
croak(node);
127127
}
128128
var name = node.left.name;
129+
assert.ok([
130+
"beautify",
131+
"expression",
132+
"mangle",
133+
"options",
134+
"rename",
135+
].indexOf(name) >= 0, tmpl("Unsupported setting {name} [{line},{col}]", {
136+
name: name,
137+
line: node.start.line,
138+
col: node.start.col,
139+
}));
129140
test[name] = evaluate(node.right);
130141
return true;
131142
}

test/compress/if_return.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2442,3 +2442,41 @@ issue_5649: {
24422442
}
24432443
expect_stdout: "PASS"
24442444
}
2445+
2446+
issue_5688: {
2447+
options = {
2448+
conditionals: true,
2449+
if_return: true,
2450+
}
2451+
input: {
2452+
L: do {
2453+
switch (console) {
2454+
default:
2455+
if (console)
2456+
break;
2457+
if (FAIL_1)
2458+
;
2459+
else
2460+
break L;
2461+
break;
2462+
case 42:
2463+
FAIL_2;
2464+
}
2465+
} while (console.log("PASS"));
2466+
}
2467+
expect: {
2468+
L: do {
2469+
switch (console) {
2470+
default:
2471+
if (console)
2472+
break;
2473+
if (FAIL_1)
2474+
break;
2475+
break L;
2476+
case 42:
2477+
FAIL_2;
2478+
}
2479+
} while (console.log("PASS"));
2480+
}
2481+
expect_stdout: "PASS"
2482+
}

0 commit comments

Comments
 (0)