if (name && ctor !== AST_Accessor && !(name instanceof AST_SymbolDeclaration))
unexpected(prev());
expect("(");
- var argnames = [];
- for (var first = true; !is("punc", ")");) {
- if (first) first = false; else expect(",");
- argnames.push(maybe_destructured(AST_SymbolFunarg));
- }
- next();
+ var argnames = expr_list(")", !options.strict, false, function() {
+ return maybe_destructured(AST_SymbolFunarg);
+ });
var loop = S.in_loop;
var labels = S.labels;
++S.in_function;
var newexp = expr_atom(false), args;
if (is("punc", "(")) {
next();
- args = expr_list(")");
+ args = expr_list(")", !options.strict);
} else {
args = [];
}
while (!is("punc", closing)) {
if (first) first = false; else expect(",");
if (allow_trailing_comma && is("punc", closing)) break;
- if (is("punc", ",") && allow_empty) {
+ if (allow_empty && is("punc", ",")) {
a.push(new AST_Hole({ start: S.token, end: S.token }));
- } else if (is("operator", "...") && parser === expression) {
+ } else if (parser === expression && is("operator", "...")) {
a.push(new AST_Spread({
start: S.token,
expression: (next(), parser()),
var call = new AST_Call({
start : start,
expression : expr,
- args : expr_list(")"),
+ args : expr_list(")", !options.strict),
end : prev()
});
mark_pure(call);
return s;
}
+function addTrailingComma(list) {
+ return list && rng(20) == 0 ? list + "," : list;
+}
+
function createParams(noDuplicate) {
var len = unique_vars.length;
var params = [];
params.push(name);
}
unique_vars.length = len;
- return params.join(", ");
+ return addTrailingComma(params.join(", "));
}
function createArgs(recurmax, stmtDepth, canThrow) {
args.push(rng(2) ? createValue() : createExpression(recurmax, COMMA_OK, stmtDepth, canThrow));
break;
}
- return args.join(", ");
+ return addTrailingComma(args.join(", "));
}
function createAssignmentPairs(recurmax, noComma, stmtDepth, canThrow, varNames, was_async) {
while (!rng(10)) {
var index = rng(pairs.names.length + 1);
pairs.names.splice(index, 0, "");
- pairs.values.splice(index, 0, rng(2) ? createAssignmentValue(recurmax) : "");
+ if (rng(2)) {
+ if (index > pairs.values.length) pairs.values.length = index;
+ pairs.values.splice(index, 0, createAssignmentValue(recurmax));
+ }
}
names.unshift("[ " + pairs.names.join(", ") + " ]");
values.unshift("[ " + pairs.values.join(", ") + " ]");
keys[index] = key;
}
});
- names.unshift("{ " + pairs.names.map(function(name, index) {
+ names.unshift("{ " + addTrailingComma(pairs.names.map(function(name, index) {
var key = index in keys ? keys[index] : rng(10) && createKey(recurmax, keys);
return key ? key + ": " + name : name;
- }).join(", ") + " }");
- values.unshift("{ " + pairs.values.map(function(value, index) {
+ }).join(", ")) + " }");
+ values.unshift("{ " + addTrailingComma(pairs.values.map(function(value, index) {
var key = index in keys ? keys[index] : createKey(recurmax, keys);
return key + ": " + value;
- }).join(", ") + " }");
+ }).join(", ")) + " }");
}
break;
default:
if ((!allowDefun || !(name in called)) && rng(2)) {
called[name] = false;
var pairs = createAssignmentPairs(recurmax, COMMA_OK, stmtDepth, canThrow, varNames, save_async);
- params = pairs.names.join(", ");
- args = pairs.values.join(", ");
+ params = addTrailingComma(pairs.names.join(", "));
+ args = addTrailingComma(pairs.values.join(", "));
} else {
params = createParams();
}
createBlockVariables(recurmax, stmtDepth, canThrow, function(defns) {
var instantiate = rng(4) ? "new " : "";
s.push(
- instantiate + "function " + name + "(){",
+ instantiate + "function " + name + "(" + createParams() + "){",
strictMode(),
defns()
);
if (rng(2)) s.push("this." + getDotKey(true) + createAssignment() + _createBinaryExpr(recurmax, noComma, stmtDepth, canThrow) + ";");
else s.push("this[" + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + "]" + createAssignment() + _createBinaryExpr(recurmax, noComma, stmtDepth, canThrow) + ";");
}
- s.push(
- _createStatements(rng(5) + 1, recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CAN_RETURN, stmtDepth),
- rng(2) == 0 ? "}" : "}()"
- );
+ s.push(_createStatements(rng(5) + 1, recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CAN_RETURN, stmtDepth));
});
+ async = save_async;
+ VAR_NAMES.length = nameLenBefore;
+ s.push(rng(2) == 0 ? "}" : "}(" + createArgs(recurmax, stmtDepth, canThrow) + ")");
break;
}
async = save_async;