speed up ufuzz asynchronous testing (#4750)
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user