extend test/ufuzz.js
- generate labels for blocks & loops - generate for-in statements - skip suspicious option search if `minify()` errs
This commit is contained in:
parent
f071a783c6
commit
068c141b2a
124
test/ufuzz.js
124
test/ufuzz.js
|
|
@ -20,49 +20,26 @@ var MAX_GENERATED_TOPLEVELS_PER_RUN = 1;
|
||||||
var MAX_GENERATION_RECURSION_DEPTH = 12;
|
var MAX_GENERATION_RECURSION_DEPTH = 12;
|
||||||
var INTERVAL_COUNT = 100;
|
var INTERVAL_COUNT = 100;
|
||||||
|
|
||||||
var STMT_BLOCK = 0;
|
var STMT_ARG_TO_ID = Object.create(null);
|
||||||
var STMT_IF_ELSE = 1;
|
var STMTS_TO_USE = [];
|
||||||
var STMT_DO_WHILE = 2;
|
function STMT_(name) {
|
||||||
var STMT_WHILE = 3;
|
return STMT_ARG_TO_ID[name] = STMTS_TO_USE.push(STMTS_TO_USE.length) - 1;
|
||||||
var STMT_FOR_LOOP = 4;
|
}
|
||||||
var STMT_SEMI = 5;
|
|
||||||
var STMT_EXPR = 6;
|
var STMT_BLOCK = STMT_("block");
|
||||||
var STMT_SWITCH = 7;
|
var STMT_IF_ELSE = STMT_("ifelse");
|
||||||
var STMT_VAR = 8;
|
var STMT_DO_WHILE = STMT_("dowhile");
|
||||||
var STMT_RETURN_ETC = 9;
|
var STMT_WHILE = STMT_("while");
|
||||||
var STMT_FUNC_EXPR = 10;
|
var STMT_FOR_LOOP = STMT_("forloop");
|
||||||
var STMT_TRY = 11;
|
var STMT_FOR_IN = STMT_("forin");
|
||||||
var STMT_C = 12;
|
var STMT_SEMI = STMT_("semi");
|
||||||
var STMTS_TO_USE = [
|
var STMT_EXPR = STMT_("expr");
|
||||||
STMT_BLOCK,
|
var STMT_SWITCH = STMT_("switch");
|
||||||
STMT_IF_ELSE,
|
var STMT_VAR = STMT_("var");
|
||||||
STMT_DO_WHILE,
|
var STMT_RETURN_ETC = STMT_("stop");
|
||||||
STMT_WHILE,
|
var STMT_FUNC_EXPR = STMT_("funcexpr");
|
||||||
STMT_FOR_LOOP,
|
var STMT_TRY = STMT_("try");
|
||||||
STMT_SEMI,
|
var STMT_C = STMT_("c");
|
||||||
STMT_EXPR,
|
|
||||||
STMT_SWITCH,
|
|
||||||
STMT_VAR,
|
|
||||||
STMT_RETURN_ETC,
|
|
||||||
STMT_FUNC_EXPR,
|
|
||||||
STMT_TRY,
|
|
||||||
STMT_C,
|
|
||||||
];
|
|
||||||
var STMT_ARG_TO_ID = {
|
|
||||||
block: STMT_BLOCK,
|
|
||||||
ifelse: STMT_IF_ELSE,
|
|
||||||
dowhile: STMT_DO_WHILE,
|
|
||||||
while: STMT_WHILE,
|
|
||||||
forloop: STMT_FOR_LOOP,
|
|
||||||
semi: STMT_SEMI,
|
|
||||||
expr: STMT_EXPR,
|
|
||||||
switch: STMT_SWITCH,
|
|
||||||
var: STMT_VAR,
|
|
||||||
stop: STMT_RETURN_ETC,
|
|
||||||
funcexpr: STMT_FUNC_EXPR,
|
|
||||||
try: STMT_TRY,
|
|
||||||
c: STMT_C,
|
|
||||||
};
|
|
||||||
|
|
||||||
var STMT_FIRST_LEVEL_OVERRIDE = -1;
|
var STMT_FIRST_LEVEL_OVERRIDE = -1;
|
||||||
var STMT_SECOND_LEVEL_OVERRIDE = -1;
|
var STMT_SECOND_LEVEL_OVERRIDE = -1;
|
||||||
|
|
@ -345,7 +322,7 @@ function createFunction(recurmax, inGlobal, noDecl, canThrow, stmtDepth) {
|
||||||
s = 'function ' + name + '(' + createParams() + '){' + createFunctions(rng(5) + 1, Math.ceil(recurmax * 0.7), NOT_GLOBAL, ANY_TYPE, canThrow, stmtDepth) + '}\n';
|
s = 'function ' + name + '(' + createParams() + '){' + createFunctions(rng(5) + 1, Math.ceil(recurmax * 0.7), NOT_GLOBAL, ANY_TYPE, canThrow, stmtDepth) + '}\n';
|
||||||
} else {
|
} else {
|
||||||
// functions with statements
|
// functions with statements
|
||||||
s = 'function ' + name + '(' + createParams() + '){' + createStatements(3, recurmax, canThrow, CANNOT_THROW, CANNOT_CONTINUE, CAN_RETURN, stmtDepth) + '}\n';
|
s = 'function ' + name + '(' + createParams() + '){' + createStatements(3, recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CAN_RETURN, stmtDepth) + '}\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
VAR_NAMES.length = namesLenBefore;
|
VAR_NAMES.length = namesLenBefore;
|
||||||
|
|
@ -367,6 +344,36 @@ function createStatements(n, recurmax, canThrow, canBreak, canContinue, cannotRe
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function createLabel(canBreak, canContinue) {
|
||||||
|
var label;
|
||||||
|
if (rng(10) < 3) {
|
||||||
|
if (Array.isArray(canBreak)) {
|
||||||
|
canBreak = canBreak.slice();
|
||||||
|
label = canBreak[canBreak.length - 1] + 1;
|
||||||
|
} else {
|
||||||
|
canBreak = canBreak ? [ "" ] : [];
|
||||||
|
label = 1;
|
||||||
|
}
|
||||||
|
canBreak.push(label);
|
||||||
|
if (Array.isArray(canContinue)) {
|
||||||
|
canContinue = canContinue.slice();
|
||||||
|
} else {
|
||||||
|
canContinue = canContinue ? [ "" ] : [];
|
||||||
|
}
|
||||||
|
canContinue.push(label);
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
break: CAN_BREAK && canBreak,
|
||||||
|
continue: CAN_CONTINUE && canContinue,
|
||||||
|
target: label ? "L" + label + ": " : ""
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function getLabel(label) {
|
||||||
|
label = label[rng(label.length)];
|
||||||
|
return label && " L" + label;
|
||||||
|
}
|
||||||
|
|
||||||
function createStatement(recurmax, canThrow, canBreak, canContinue, cannotReturn, stmtDepth) {
|
function createStatement(recurmax, canThrow, canBreak, canContinue, cannotReturn, stmtDepth) {
|
||||||
++stmtDepth;
|
++stmtDepth;
|
||||||
var loop = ++loops;
|
var loop = ++loops;
|
||||||
|
|
@ -382,15 +389,26 @@ function createStatement(recurmax, canThrow, canBreak, canContinue, cannotReturn
|
||||||
|
|
||||||
switch (target) {
|
switch (target) {
|
||||||
case STMT_BLOCK:
|
case STMT_BLOCK:
|
||||||
return '{' + createStatements(rng(5) + 1, recurmax, canThrow, canBreak, canContinue, cannotReturn, stmtDepth) + '}';
|
var label = createLabel(canBreak);
|
||||||
|
return label.target + '{' + createStatements(rng(5) + 1, recurmax, canThrow, label.break, canContinue, cannotReturn, stmtDepth) + '}';
|
||||||
case STMT_IF_ELSE:
|
case STMT_IF_ELSE:
|
||||||
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:
|
||||||
return '{var brake' + loop + ' = 5; do {' + createStatement(recurmax, canThrow, CAN_BREAK, CAN_CONTINUE, cannotReturn, stmtDepth) + '} while ((' + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + ') && --brake' + loop + ' > 0);}';
|
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);}';
|
||||||
case STMT_WHILE:
|
case STMT_WHILE:
|
||||||
return '{var brake' + loop + ' = 5; while ((' + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + ') && --brake' + loop + ' > 0)' + createStatement(recurmax, canThrow, CAN_BREAK, CAN_CONTINUE, cannotReturn, stmtDepth) + '}';
|
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) + '}';
|
||||||
case STMT_FOR_LOOP:
|
case STMT_FOR_LOOP:
|
||||||
return 'for (var brake' + loop + ' = 5; (' + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + ') && brake' + loop + ' > 0; --brake' + loop + ')' + createStatement(recurmax, canThrow, CAN_BREAK, CAN_CONTINUE, cannotReturn, stmtDepth);
|
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);
|
||||||
|
case STMT_FOR_IN:
|
||||||
|
var label = createLabel(canBreak, canContinue);
|
||||||
|
var optElementVar = '';
|
||||||
|
if (rng(5) > 1) {
|
||||||
|
optElementVar = 'var ' + createVarName(MANDATORY) + ' = expr' + loop + '[key' + loop + ']; ';
|
||||||
|
}
|
||||||
|
return label.target + ' for (var key' + loop + ' in ' + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + ') {' + optElementVar + createStatement(recurmax, canThrow, label.break, label.continue, cannotReturn, stmtDepth) + '}';
|
||||||
case STMT_SEMI:
|
case STMT_SEMI:
|
||||||
return ';';
|
return ';';
|
||||||
case STMT_EXPR:
|
case STMT_EXPR:
|
||||||
|
|
@ -424,8 +442,8 @@ function createStatement(recurmax, canThrow, canBreak, canContinue, cannotReturn
|
||||||
case 1:
|
case 1:
|
||||||
case 2:
|
case 2:
|
||||||
case 3:
|
case 3:
|
||||||
if (canBreak && rng(5) === 0) return 'break;';
|
if (canBreak && rng(5) === 0) return 'break' + getLabel(canBreak) + ';';
|
||||||
if (canContinue && rng(5) === 0) return 'continue;';
|
if (canContinue && rng(5) === 0) return 'continue' + getLabel(canContinue) + ';';
|
||||||
if (cannotReturn) return createExpression(recurmax, NO_COMMA, stmtDepth, canThrow) + ';';
|
if (cannotReturn) return createExpression(recurmax, NO_COMMA, stmtDepth, canThrow) + ';';
|
||||||
if (rng(3) == 0) return '/*3*/return;';
|
if (rng(3) == 0) return '/*3*/return;';
|
||||||
return 'return ' + createExpression(recurmax, NO_COMMA, stmtDepth, canThrow) + ';';
|
return 'return ' + createExpression(recurmax, NO_COMMA, stmtDepth, canThrow) + ';';
|
||||||
|
|
@ -476,7 +494,7 @@ function createSwitchParts(recurmax, n, canThrow, canBreak, canContinue, cannotR
|
||||||
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, CAN_BREAK, canContinue, cannotReturn, stmtDepth) +
|
createStatements(rng(3) + 1, recurmax, canThrow, canBreak || CAN_BREAK, canContinue, cannotReturn, stmtDepth) +
|
||||||
'\n' +
|
'\n' +
|
||||||
(rng(10) > 0 ? ' break;' : '/* fall-through */') +
|
(rng(10) > 0 ? ' break;' : '/* fall-through */') +
|
||||||
'\n';
|
'\n';
|
||||||
|
|
@ -484,7 +502,7 @@ function createSwitchParts(recurmax, n, canThrow, canBreak, canContinue, cannotR
|
||||||
hadDefault = true;
|
hadDefault = true;
|
||||||
s += '' +
|
s += '' +
|
||||||
'default:\n' +
|
'default:\n' +
|
||||||
createStatements(rng(3) + 1, recurmax, canThrow, CAN_BREAK, canContinue, cannotReturn, stmtDepth) +
|
createStatements(rng(3) + 1, recurmax, canThrow, canBreak || CAN_BREAK, canContinue, cannotReturn, stmtDepth) +
|
||||||
'\n';
|
'\n';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -862,7 +880,7 @@ function log(options) {
|
||||||
options = JSON.parse(options);
|
options = JSON.parse(options);
|
||||||
console.log(options);
|
console.log(options);
|
||||||
console.log();
|
console.log();
|
||||||
if (!ok) {
|
if (!ok && typeof uglify_code == "string") {
|
||||||
Object.keys(default_options).forEach(log_suspects.bind(null, options));
|
Object.keys(default_options).forEach(log_suspects.bind(null, options));
|
||||||
console.log("!!!!!! Failed... round", round);
|
console.log("!!!!!! Failed... round", round);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user