fix infinite recursion in ufuzz (#4318)
This commit is contained in:
@@ -314,6 +314,7 @@ var TYPEOF_OUTCOMES = [
|
|||||||
"crap",
|
"crap",
|
||||||
];
|
];
|
||||||
|
|
||||||
|
var avoid_vars = [];
|
||||||
var block_vars = [];
|
var block_vars = [];
|
||||||
var unique_vars = [];
|
var unique_vars = [];
|
||||||
var loops = 0;
|
var loops = 0;
|
||||||
@@ -393,16 +394,12 @@ function createAssignmentPairs(recurmax, noComma, stmtDepth, canThrow, varNames,
|
|||||||
}
|
}
|
||||||
|
|
||||||
function createKey(recurmax, keys) {
|
function createKey(recurmax, keys) {
|
||||||
var save = VAR_NAMES;
|
addAvoidVars(avoid);
|
||||||
VAR_NAMES = VAR_NAMES.filter(function(name) {
|
|
||||||
return avoid.indexOf(name) < 0;
|
|
||||||
});
|
|
||||||
var len = VAR_NAMES.length;
|
|
||||||
var key;
|
var key;
|
||||||
do {
|
do {
|
||||||
key = createObjectKey(recurmax, stmtDepth, canThrow);
|
key = createObjectKey(recurmax, stmtDepth, canThrow);
|
||||||
} while (keys.indexOf(key) >= 0);
|
} while (keys.indexOf(key) >= 0);
|
||||||
VAR_NAMES = save.concat(VAR_NAMES.slice(len));
|
removeAvoidVars(avoid);
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -511,6 +508,8 @@ function createBlockVariables(recurmax, stmtDepth, canThrow, fn) {
|
|||||||
}
|
}
|
||||||
unique_vars.length -= 6;
|
unique_vars.length -= 6;
|
||||||
fn(function() {
|
fn(function() {
|
||||||
|
addAvoidVars(consts);
|
||||||
|
addAvoidVars(lets);
|
||||||
if (rng(2)) {
|
if (rng(2)) {
|
||||||
return createDefinitions("const", consts) + "\n" + createDefinitions("let", lets) + "\n";
|
return createDefinitions("const", consts) + "\n" + createDefinitions("let", lets) + "\n";
|
||||||
} else {
|
} else {
|
||||||
@@ -522,11 +521,6 @@ function createBlockVariables(recurmax, stmtDepth, canThrow, fn) {
|
|||||||
|
|
||||||
function createDefinitions(type, names) {
|
function createDefinitions(type, names) {
|
||||||
if (!names.length) return "";
|
if (!names.length) return "";
|
||||||
var save = VAR_NAMES;
|
|
||||||
VAR_NAMES = VAR_NAMES.filter(function(name) {
|
|
||||||
return names.indexOf(name) < 0;
|
|
||||||
});
|
|
||||||
var len = VAR_NAMES.length;
|
|
||||||
var s = type + " ";
|
var s = type + " ";
|
||||||
switch (rng(10)) {
|
switch (rng(10)) {
|
||||||
case 0:
|
case 0:
|
||||||
@@ -547,18 +541,18 @@ function createBlockVariables(recurmax, stmtDepth, canThrow, fn) {
|
|||||||
}).join(", ") + "};";
|
}).join(", ") + "};";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
s += names.map(function(name, i) {
|
s += names.map(function(name) {
|
||||||
if (type == "let" && !rng(10)) {
|
if (type == "let" && !rng(10)) {
|
||||||
VAR_NAMES.push(name);
|
removeAvoidVars([ name ]);
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
var value = createExpression(recurmax, NO_COMMA, stmtDepth, canThrow);
|
var value = createExpression(recurmax, NO_COMMA, stmtDepth, canThrow);
|
||||||
VAR_NAMES.push(name);
|
removeAvoidVars([ name ]);
|
||||||
return name + " = " + value;
|
return name + " = " + value;
|
||||||
}).join(", ") + ";";
|
}).join(", ") + ";";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
VAR_NAMES = save.concat(VAR_NAMES.slice(len));
|
removeAvoidVars(names);
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1300,10 +1294,25 @@ function createUnaryPostfix() {
|
|||||||
return UNARY_POSTFIX[rng(UNARY_POSTFIX.length)];
|
return UNARY_POSTFIX[rng(UNARY_POSTFIX.length)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function addAvoidVars(names) {
|
||||||
|
avoid_vars = avoid_vars.concat(names);
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeAvoidVars(names) {
|
||||||
|
names.forEach(function(name) {
|
||||||
|
var index = avoid_vars.lastIndexOf(name);
|
||||||
|
if (index >= 0) avoid_vars.splice(index, 1);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function getVarName(noConst) {
|
function getVarName(noConst) {
|
||||||
// try to get a generated name reachable from current scope. default to just `a`
|
// try to get a generated name reachable from current scope. default to just `a`
|
||||||
var name = VAR_NAMES[INITIAL_NAMES_LEN + rng(VAR_NAMES.length - INITIAL_NAMES_LEN)];
|
var name, tries = 10;
|
||||||
return !name || noConst && block_vars.indexOf(name) >= 0 ? "a" : name;
|
do {
|
||||||
|
if (--tries < 0) return "a";
|
||||||
|
name = VAR_NAMES[INITIAL_NAMES_LEN + rng(VAR_NAMES.length - INITIAL_NAMES_LEN)];
|
||||||
|
} while (!name || avoid_vars.indexOf(name) >= 0 || noConst && block_vars.indexOf(name) >= 0);
|
||||||
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
function createVarName(maybe, dontStore) {
|
function createVarName(maybe, dontStore) {
|
||||||
|
|||||||
Reference in New Issue
Block a user