fallthrough should not execute case expression

Also enable switch statement fuzzing.

fixes #1680
This commit is contained in:
alexlamsl 2017-03-26 15:10:59 +08:00
parent 94f84727ce
commit 4ce5c784d6
3 changed files with 41 additions and 10 deletions

View File

@ -2562,11 +2562,6 @@ merge(Compressor.prototype, {
} }
for (; i < len && fallthrough; i++) { for (; i < len && fallthrough; i++) {
branch = self.body[i]; branch = self.body[i];
if (branch instanceof AST_Case) {
exact_match.body.push(make_node(AST_SimpleStatement, branch.expression, {
body: branch.expression
}));
}
exact_match.body = exact_match.body.concat(branch.body); exact_match.body = exact_match.body.concat(branch.body);
fallthrough = !aborts(exact_match); fallthrough = !aborts(exact_match);
} }

View File

@ -23,7 +23,6 @@ constant_switch_2: {
} }
expect: { expect: {
foo(); foo();
2;
bar(); bar();
} }
} }
@ -118,7 +117,6 @@ constant_switch_6: {
x(); x();
if (foo) break OUT; if (foo) break OUT;
y(); y();
2;
bar(); bar();
} }
} }
@ -157,7 +155,6 @@ constant_switch_7: {
console.log(x); console.log(x);
} }
y(); y();
2;
bar(); bar();
} }
} }
@ -206,7 +203,6 @@ constant_switch_9: {
x(); x();
for (;;) if (foo) break OUT; for (;;) if (foo) break OUT;
y(); y();
2;
bar(); bar();
def(); def();
} }
@ -481,3 +477,44 @@ issue_1679: {
} }
expect_stdout: true expect_stdout: true
} }
issue_1680: {
options = {
dead_code: true,
evaluate: true,
}
input: {
function f(x) {
console.log(x);
return x + 1;
}
switch (2) {
case f(0):
case f(1):
f(2);
case 2:
case f(3):
case f(4):
f(5);
}
}
expect: {
function f(x) {
console.log(x);
return x + 1;
}
switch (2) {
case f(0):
case f(1):
f(2);
case 2:
f(5);
}
}
expect_stdout: [
"0",
"1",
"2",
"5",
]
}

View File

@ -201,7 +201,6 @@ function createStatement(recurmax, canThrow, canBreak, canContinue) {
case 6: case 6:
return createExpression(recurmax) + ';'; return createExpression(recurmax) + ';';
case 7: case 7:
return ';'; // TODO: disabled until some switch issues are resolved
// note: case args are actual expressions // note: case args are actual expressions
// note: default does not _need_ to be last // note: default does not _need_ to be last
return 'switch (' + createExpression(recurmax) + ') { ' + createSwitchParts(recurmax, 4) + '}'; return 'switch (' + createExpression(recurmax) + ') { ' + createSwitchParts(recurmax, 4) + '}';