fix & tweak labels

This commit is contained in:
alexlamsl 2017-04-22 05:20:17 +08:00
parent efc17b6880
commit 19d8b1d441

View File

@ -345,6 +345,10 @@ function createStatements(n, recurmax, canThrow, canBreak, canContinue, cannotRe
return s; return s;
} }
function enableLoopControl(flag) {
return Array.isArray(flag) && flag.indexOf("") < 0 ? flag.concat("") : flag;
}
function createLabel(canBreak, canContinue) { function createLabel(canBreak, canContinue) {
var label; var label;
if (rng(10) < 3) { if (rng(10) < 3) {
@ -361,6 +365,9 @@ function createLabel(canBreak, canContinue) {
canContinue = canContinue ? [ "" ] : []; canContinue = canContinue ? [ "" ] : [];
} }
canContinue.push(label); canContinue.push(label);
} else {
canBreak = enableLoopControl(canBreak);
canContinue = enableLoopControl(canContinue);
} }
return { return {
break: canBreak, break: canBreak,
@ -490,20 +497,22 @@ function createStatement(recurmax, canThrow, canBreak, canContinue, cannotReturn
function createSwitchParts(recurmax, n, canThrow, canBreak, canContinue, cannotReturn, stmtDepth) { function createSwitchParts(recurmax, n, canThrow, canBreak, canContinue, cannotReturn, stmtDepth) {
var hadDefault = false; var hadDefault = false;
var s = ''; var s = '';
canBreak = enableLoopControl(canBreak);
if (!canBreak) canBreak = CAN_BREAK;
while (n-- > 0) { while (n-- > 0) {
//hadDefault = n > 0; // disables weird `default` clause positioning (use when handling destabilizes) //hadDefault = n > 0; // disables weird `default` clause positioning (use when handling destabilizes)
if (hadDefault || rng(5) > 0) { if (hadDefault || rng(5) > 0) {
s += '' + s += '' +
'case ' + createExpression(recurmax, NO_COMMA, stmtDepth, canThrow) + ':\n' + 'case ' + createExpression(recurmax, NO_COMMA, stmtDepth, canThrow) + ':\n' +
createStatements(rng(3) + 1, recurmax, canThrow, canBreak || CAN_BREAK, canContinue, cannotReturn, stmtDepth) + createStatements(rng(3) + 1, recurmax, canThrow, canBreak, canContinue, cannotReturn, stmtDepth) +
'\n' + '\n' +
(rng(10) > 0 ? ' break;' : '/* fall-through */') + (rng(10) > 0 ? ' break' + getLabel(canBreak) + ';' : '/* fall-through */') +
'\n'; '\n';
} else { } else {
hadDefault = true; hadDefault = true;
s += '' + s += '' +
'default:\n' + 'default:\n' +
createStatements(rng(3) + 1, recurmax, canThrow, canBreak || CAN_BREAK, canContinue, cannotReturn, stmtDepth) + createStatements(rng(3) + 1, recurmax, canThrow, canBreak, canContinue, cannotReturn, stmtDepth) +
'\n'; '\n';
} }
} }