Commit b6996007 authored by marja@chromium.org's avatar marja@chromium.org

Parser: fix confusion when there are multiple errors to report.

(For more details, see bug.)

The problem occurs when a parsing function hits a stack overflow, but still
manages to return something meaningful. This happens because the call to
ParserBase::Next() which hits the stack overflow will still return a valid token
(the last token which we had already read), and only the next call after the
stack overflow will return INVALID. So for example ParseIdentifier will still
return a valid identifier even if we've hit a stack overflow.

In this case, some upper recursion level might detect and report a valid syntax
error, and then we bail out of the recursive descent because of the syntax
error. So we end up having both stack overflow and a syntax error present. When
we try to report the stack overflow after parsing (e.g., end of ParseLazy), the
isolate already has the syntax error as a pending exception, and a CHECK fails.

This fix suppresses the syntax errors in when a stack overflow has been
detected.

BUG=351335
LOG=N
R=mstarzinger@chromium.org

Review URL: https://codereview.chromium.org/194713013

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@19845 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent abace56b
......@@ -452,6 +452,12 @@ bool ParserTraits::IsEvalOrArguments(Handle<String> identifier) const {
void ParserTraits::ReportMessageAt(Scanner::Location source_location,
const char* message,
Vector<const char*> args) {
if (parser_->stack_overflow()) {
// Suppress the error message (syntax error or such) in the presence of a
// stack overflow. The isolate allows only one pending exception at at time
// and we want to report the stack overflow later.
return;
}
MessageLocation location(parser_->script_,
source_location.beg_pos,
source_location.end_pos);
......@@ -477,6 +483,12 @@ void ParserTraits::ReportMessage(const char* message,
void ParserTraits::ReportMessageAt(Scanner::Location source_location,
const char* message,
Vector<Handle<String> > args) {
if (parser_->stack_overflow()) {
// Suppress the error message (syntax error or such) in the presence of a
// stack overflow. The isolate allows only one pending exception at at time
// and we want to report the stack overflow later.
return;
}
MessageLocation location(parser_->script_,
source_location.beg_pos,
source_location.end_pos);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment