speed up ufuzz asynchronous testing (#4750)

This commit is contained in:
Alex Lam S.L
2021-03-07 20:25:56 +00:00
committed by GitHub
parent f52b0e7c31
commit e4848a7f5a
2 changed files with 47 additions and 29 deletions

View File

@@ -27,7 +27,7 @@ exports.run_code = semver.satisfies(process.version, "0.8") ? function(code, top
} : semver.satisfies(process.version, "<0.12") ? run_code_vm : function(code, toplevel, timeout) { } : semver.satisfies(process.version, "<0.12") ? run_code_vm : function(code, toplevel, timeout) {
if ([ if ([
/\basync[ \t]*\([\s\S]*?\)[ \t]*=>/, /\basync[ \t]*\([\s\S]*?\)[ \t]*=>/,
/\b(async[ \t]+function|setInterval|setTimeout)\b/, /\b(async[ \t]+function|setImmediate|setInterval|setTimeout)\b/,
/\basync([ \t]+|[ \t]*\*[ \t]*)[^\s()[\]{},.&|!~=*%/+-]+(\s*\(|[ \t]*=>)/, /\basync([ \t]+|[ \t]*\*[ \t]*)[^\s()[\]{},.&|!~=*%/+-]+(\s*\(|[ \t]*=>)/,
].some(function(pattern) { ].some(function(pattern) {
return pattern.test(code); return pattern.test(code);
@@ -175,12 +175,14 @@ function setup(global, builtins, setup_log, setup_tty) {
[ [
// for Node.js v0.12 // for Node.js v0.12
"Buffer", "Buffer",
"clearImmediate",
"clearInterval", "clearInterval",
"clearTimeout", "clearTimeout",
// for Node.js v0.12 // for Node.js v0.12
"DTRACE_NET_STREAM_END", "DTRACE_NET_STREAM_END",
// for Node.js v8 // for Node.js v8
"process", "process",
"setImmediate",
"setInterval", "setInterval",
"setTimeout", "setTimeout",
].forEach(function(name) { ].forEach(function(name) {

View File

@@ -363,6 +363,7 @@ var lambda_vars = [];
var unique_vars = []; var unique_vars = [];
var classes = []; var classes = [];
var async = false; var async = false;
var has_await = false;
var export_default = false; var export_default = false;
var generator = false; var generator = false;
var loops = 0; var loops = 0;
@@ -394,7 +395,11 @@ function appendExport(stmtDepth, allowDefault) {
} }
function mayDefer(code) { function mayDefer(code) {
return SUPPORT.arrow && rng(50) == 0 ? "void setTimeout(() => (" + code + "), 0)" : code; if (SUPPORT.arrow && rng(200) == 0) {
has_await = true;
return "void setImmediate(() => (" + code + "))";
}
return code;
} }
function createTopLevelCode() { function createTopLevelCode() {
@@ -404,6 +409,7 @@ function createTopLevelCode() {
unique_vars.length = 0; unique_vars.length = 0;
classes.length = 0; classes.length = 0;
async = false; async = false;
has_await = false;
export_default = false; export_default = false;
generator = false; generator = false;
loops = 0; loops = 0;
@@ -425,7 +431,9 @@ function createTopLevelCode() {
} }
}); });
// preceding `null` makes for a cleaner output (empty string still shows up etc) // preceding `null` makes for a cleaner output (empty string still shows up etc)
s.push(mayDefer("console.log(null, a, b, c, Infinity, NaN, undefined)") + ";"); var log = "console.log(null, a, b, c, Infinity, NaN, undefined)";
if (SUPPORT.arrow && has_await && rng(20) == 0) log = "setImmediate(() => " + log + ")";
s.push(log + ";");
return s.join("\n"); return s.join("\n");
} }
@@ -714,7 +722,7 @@ function createBlockVariables(recurmax, stmtDepth, canThrow, fn) {
consts.forEach(addAvoidVar); consts.forEach(addAvoidVar);
lets.forEach(addAvoidVar); lets.forEach(addAvoidVar);
var s = []; var s = [];
if (SUPPORT.class) while (rng(100) == 0) { if (SUPPORT.class) while (rng(200) == 0) {
var name = "C" + clazz++; var name = "C" + clazz++;
classes.push(name); classes.push(name);
s.push(appendExport(stmtDepth, true) + createClassLiteral(recurmax, stmtDepth, canThrow, name)); s.push(appendExport(stmtDepth, true) + createClassLiteral(recurmax, stmtDepth, canThrow, name));
@@ -812,8 +820,8 @@ function createFunction(recurmax, allowDefun, canThrow, stmtDepth) {
var nameLenBefore = VAR_NAMES.length; var nameLenBefore = VAR_NAMES.length;
var lambda_len = lambda_vars.length; var lambda_len = lambda_vars.length;
var save_async = async; var save_async = async;
async = SUPPORT.async && rng(50) == 0;
var save_generator = generator; var save_generator = generator;
async = SUPPORT.async && rng(200) == 0;
generator = SUPPORT.generator && rng(50) == 0; generator = SUPPORT.generator && rng(50) == 0;
if (async && generator && !SUPPORT.async_generator) { if (async && generator && !SUPPORT.async_generator) {
if (rng(2)) { if (rng(2)) {
@@ -1016,7 +1024,10 @@ function createStatement(recurmax, canThrow, canBreak, canContinue, cannotReturn
s += '"" + (' + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + "); "; s += '"" + (' + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + "); ";
} }
s += label.target + " for "; s += label.target + " for ";
if (await) s += "await "; if (await) {
s += "await ";
has_await = true;
}
s += "(" + init + " of expr" + loop + ") {"; s += "(" + init + " of expr" + loop + ") {";
} else { } else {
s += createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + "; "; s += createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + "; ";
@@ -1212,7 +1223,10 @@ function createExpression(recurmax, noComma, stmtDepth, canThrow) {
return "((c = c + 1) + (" + _createExpression(recurmax, noComma, stmtDepth, canThrow) + "))"; // c only gets incremented return "((c = c + 1) + (" + _createExpression(recurmax, noComma, stmtDepth, canThrow) + "))"; // c only gets incremented
default: default:
var expr = "(" + _createExpression(recurmax, noComma, stmtDepth, canThrow) + ")"; var expr = "(" + _createExpression(recurmax, noComma, stmtDepth, canThrow) + ")";
if (async && rng(50) == 0) return "(await" + expr + ")"; if (async && rng(50) == 0) {
has_await = true;
return "(await" + expr + ")";
}
if (generator && rng(50) == 0) return "(yield" + (canThrow && rng(20) == 0 ? "*" : "") + expr + ")"; if (generator && rng(50) == 0) return "(yield" + (canThrow && rng(20) == 0 ? "*" : "") + expr + ")";
return expr; return expr;
} }
@@ -1282,8 +1296,8 @@ function _createExpression(recurmax, noComma, stmtDepth, canThrow) {
var nameLenBefore = VAR_NAMES.length; var nameLenBefore = VAR_NAMES.length;
var lambda_len = lambda_vars.length; var lambda_len = lambda_vars.length;
var save_async = async; var save_async = async;
async = SUPPORT.async && rng(50) == 0;
var save_generator = generator; var save_generator = generator;
async = SUPPORT.async && rng(200) == 0;
generator = SUPPORT.generator && rng(50) == 0; generator = SUPPORT.generator && rng(50) == 0;
if (async && generator && !SUPPORT.async_generator) { if (async && generator && !SUPPORT.async_generator) {
if (rng(2)) { if (rng(2)) {
@@ -1481,27 +1495,29 @@ function _createExpression(recurmax, noComma, stmtDepth, canThrow) {
var s = "typeof " + fn + ' == "function" && --_calls_ >= 0 && ' + fn + createArgs(recurmax, stmtDepth, canThrow); var s = "typeof " + fn + ' == "function" && --_calls_ >= 0 && ' + fn + createArgs(recurmax, stmtDepth, canThrow);
return mayDefer(canThrow && rng(20) == 0 ? s : name + " && " + s); return mayDefer(canThrow && rng(20) == 0 ? s : name + " && " + s);
case p++: case p++:
if (SUPPORT.class && classes.length) switch (rng(20)) { if (SUPPORT.class) {
case 0: if (classes.length && rng(20) == 0) {
return "--_calls_ >= 0 && new " + classes[rng(classes.length)] + createArgs(recurmax, stmtDepth, canThrow, NO_TEMPLATE); return "--_calls_ >= 0 && new " + classes[rng(classes.length)] + createArgs(recurmax, stmtDepth, canThrow, NO_TEMPLATE);
case 1: }
var s = "--_calls_ >= 0 && new "; if (rng(200) == 0) {
var nameLenBefore = VAR_NAMES.length; var s = "--_calls_ >= 0 && new ";
var class_len = classes.length; var nameLenBefore = VAR_NAMES.length;
var name; var class_len = classes.length;
if (canThrow && rng(20) == 0) { var name;
in_class++; if (canThrow && rng(20) == 0) {
name = createVarName(MAYBE); in_class++;
in_class--; name = createVarName(MAYBE);
} else if (rng(2)) { in_class--;
name = "C" + clazz++; } else if (rng(2)) {
classes.push(name); name = "C" + clazz++;
classes.push(name);
}
s += createClassLiteral(recurmax, stmtDepth, canThrow, name);
classes.length = class_len;
VAR_NAMES.length = nameLenBefore;
s += createArgs(recurmax, stmtDepth, canThrow, NO_TEMPLATE);
return s;
} }
s += createClassLiteral(recurmax, stmtDepth, canThrow, name);
classes.length = class_len;
VAR_NAMES.length = nameLenBefore;
s += createArgs(recurmax, stmtDepth, canThrow, NO_TEMPLATE);
return s;
} }
case p++: case p++:
case p++: case p++:
@@ -1677,7 +1693,7 @@ function createObjectFunction(recurmax, stmtDepth, canThrow, internal, isClazz)
generator = false; generator = false;
name = "constructor"; name = "constructor";
} else { } else {
async = SUPPORT.async && rng(50) == 0; async = SUPPORT.async && rng(200) == 0;
generator = SUPPORT.generator && rng(50) == 0; generator = SUPPORT.generator && rng(50) == 0;
if (async && generator && !SUPPORT.async_generator) { if (async && generator && !SUPPORT.async_generator) {
if (rng(2)) { if (rng(2)) {