Track strict mode errors in unary deletions correctly when

syntax-parsing.
This commit is contained in:
wolfbeast 2019-04-05 21:32:55 +02:00 committed by Roy Tam
commit e92f878a93
2 changed files with 24 additions and 2 deletions

View file

@ -641,6 +641,17 @@ Parser<ParseHandler>::strictModeError(unsigned errorNumber, ...)
return res;
}
template <typename ParseHandler>
bool
Parser<ParseHandler>::strictModeErrorAt(uint32_t offset, unsigned errorNumber, ...)
{
va_list args;
va_start(args, errorNumber);
bool res = reportHelper(ParseStrictError, pc->sc()->strict(), offset, errorNumber, args);
va_end(args);
return res;
}
template <typename ParseHandler>
bool
Parser<ParseHandler>::reportWithNode(ParseReportKind kind, bool strict, Node pn, unsigned errorNumber, ...)
@ -8031,6 +8042,10 @@ Parser<ParseHandler>::unaryExpr(YieldHandling yieldHandling, TripledotHandling t
}
case TOK_DELETE: {
uint32_t exprOffset;
if (!tokenStream.peekOffset(&exprOffset, TokenStream::Operand))
return null();
Node expr = unaryExpr(yieldHandling, TripledotProhibited);
if (!expr)
return null();
@ -8038,9 +8053,9 @@ Parser<ParseHandler>::unaryExpr(YieldHandling yieldHandling, TripledotHandling t
// Per spec, deleting any unary expression is valid -- it simply
// returns true -- except for one case that is illegal in strict mode.
if (handler.isNameAnyParentheses(expr)) {
bool strict = pc->sc()->strict();
if (!reportWithNode(ParseStrictError, strict, expr, JSMSG_DEPRECATED_DELETE_OPERAND))
if (!strictModeErrorAt(exprOffset, JSMSG_DEPRECATED_DELETE_OPERAND))
return null();
pc->sc()->setBindingsAccessedDynamically();
}