fix createLabel()
generate globally unique label names
This commit is contained in:
parent
5f9076de4a
commit
efc17b6880
|
|
@ -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:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user