fix createLabel()

generate globally unique label names
This commit is contained in:
alexlamsl 2017-04-21 23:31:29 +08:00
parent 5f9076de4a
commit efc17b6880

View File

@ -273,6 +273,7 @@ var TYPEOF_OUTCOMES = [
var loops = 0; var loops = 0;
var funcs = 0; var funcs = 0;
var labels = 10000;
function rng(max) { function rng(max) {
var r = randomBytes(2).readUInt16LE(0) / 65536; var r = randomBytes(2).readUInt16LE(0) / 65536;
@ -347,12 +348,11 @@ function createStatements(n, recurmax, canThrow, canBreak, canContinue, cannotRe
function createLabel(canBreak, canContinue) { function createLabel(canBreak, canContinue) {
var label; var label;
if (rng(10) < 3) { if (rng(10) < 3) {
label = ++labels;
if (Array.isArray(canBreak)) { if (Array.isArray(canBreak)) {
canBreak = canBreak.slice(); canBreak = canBreak.slice();
label = canBreak[canBreak.length - 1] + 1;
} else { } else {
canBreak = canBreak ? [ "" ] : []; canBreak = canBreak ? [ "" ] : [];
label = 10000;
} }
canBreak.push(label); canBreak.push(label);
if (Array.isArray(canContinue)) { if (Array.isArray(canContinue)) {
@ -361,9 +361,6 @@ function createLabel(canBreak, canContinue) {
canContinue = canContinue ? [ "" ] : []; canContinue = canContinue ? [ "" ] : [];
} }
canContinue.push(label); canContinue.push(label);
} else {
if (!canBreak) canBreak = CAN_BREAK;
if (!canContinue) canContinue = CAN_CONTINUE;
} }
return { return {
break: canBreak, break: canBreak,
@ -399,20 +396,20 @@ function createStatement(recurmax, canThrow, canBreak, canContinue, cannotReturn
return 'if (' + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + ')' + createStatement(recurmax, canThrow, canBreak, canContinue, cannotReturn, stmtDepth) + (rng(2) === 1 ? ' else ' + createStatement(recurmax, canThrow, canBreak, canContinue, cannotReturn, stmtDepth) : ''); return 'if (' + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + ')' + createStatement(recurmax, canThrow, canBreak, canContinue, cannotReturn, stmtDepth) + (rng(2) === 1 ? ' else ' + createStatement(recurmax, canThrow, canBreak, canContinue, cannotReturn, stmtDepth) : '');
case STMT_DO_WHILE: case STMT_DO_WHILE:
var label = createLabel(canBreak, canContinue); var label = createLabel(canBreak, canContinue);
return '{var brake' + loop + ' = 5; ' + label.target + 'do {' + createStatement(recurmax, canThrow, label.break, label.continue, cannotReturn, stmtDepth) + '} while ((' + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + ') && --brake' + loop + ' > 0);}'; return '{var brake' + loop + ' = 5; ' + label.target + 'do {' + createStatement(recurmax, canThrow, label.break || CAN_BREAK, label.continue || CAN_CONTINUE, cannotReturn, stmtDepth) + '} while ((' + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + ') && --brake' + loop + ' > 0);}';
case STMT_WHILE: case STMT_WHILE:
var label = createLabel(canBreak, canContinue); var label = createLabel(canBreak, canContinue);
return '{var brake' + loop + ' = 5; ' + label.target + 'while ((' + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + ') && --brake' + loop + ' > 0)' + createStatement(recurmax, canThrow, label.break, label.continue, cannotReturn, stmtDepth) + '}'; return '{var brake' + loop + ' = 5; ' + label.target + 'while ((' + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + ') && --brake' + loop + ' > 0)' + createStatement(recurmax, canThrow, label.break || CAN_BREAK, label.continue || CAN_CONTINUE, cannotReturn, stmtDepth) + '}';
case STMT_FOR_LOOP: case STMT_FOR_LOOP:
var label = createLabel(canBreak, canContinue); var label = createLabel(canBreak, canContinue);
return label.target + 'for (var brake' + loop + ' = 5; (' + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + ') && brake' + loop + ' > 0; --brake' + loop + ')' + createStatement(recurmax, canThrow, label.break, label.continue, cannotReturn, stmtDepth); return label.target + 'for (var brake' + loop + ' = 5; (' + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + ') && brake' + loop + ' > 0; --brake' + loop + ')' + createStatement(recurmax, canThrow, label.break || CAN_BREAK, label.continue || CAN_CONTINUE, cannotReturn, stmtDepth);
case STMT_FOR_IN: case STMT_FOR_IN:
var label = createLabel(canBreak, canContinue); var label = createLabel(canBreak, canContinue);
var optElementVar = ''; var optElementVar = '';
if (rng(5) > 1) { if (rng(5) > 1) {
optElementVar = 'c = 1 + c; var ' + createVarName(MANDATORY) + ' = expr' + loop + '[key' + loop + ']; '; optElementVar = 'c = 1 + c; var ' + createVarName(MANDATORY) + ' = expr' + loop + '[key' + loop + ']; ';
} }
return '{var expr' + loop + ' = ' + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + '; ' + label.target + ' for (var key' + loop + ' in expr' + loop + ') {' + optElementVar + createStatement(recurmax, canThrow, label.break, label.continue, cannotReturn, stmtDepth) + '}}'; return '{var expr' + loop + ' = ' + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + '; ' + label.target + ' for (var key' + loop + ' in expr' + loop + ') {' + optElementVar + createStatement(recurmax, canThrow, label.break || CAN_BREAK, label.continue || CAN_CONTINUE, cannotReturn, stmtDepth) + '}}';
case STMT_SEMI: case STMT_SEMI:
return ';'; return ';';
case STMT_EXPR: case STMT_EXPR: