Bug 1283710 - Part 6: Make CompileError subclass of JSErrorReport. r=jwalden

This commit is contained in:
Tooru Fujisawa 2016-08-14 20:39:31 +09:00
parent 6f9d4ca127
commit 331fcf2d25
3 changed files with 20 additions and 32 deletions

View File

@ -567,8 +567,8 @@ TokenStream::reportStrictModeErrorNumberVA(uint32_t offset, bool strictMode, uns
void
CompileError::throwError(JSContext* cx)
{
if (JSREPORT_IS_WARNING(report.flags)) {
CallWarningReporter(cx, &report);
if (JSREPORT_IS_WARNING(flags)) {
CallWarningReporter(cx, this);
return;
}
@ -583,11 +583,7 @@ CompileError::throwError(JSContext* cx)
// as the non-top-level "load", "eval", or "compile" native function
// returns false, the top-level reporter will eventually receive the
// uncaught exception report.
ErrorToException(cx, &report, nullptr, nullptr);
}
CompileError::~CompileError()
{
ErrorToException(cx, this, nullptr, nullptr);
}
bool
@ -609,33 +605,33 @@ TokenStream::reportCompileErrorNumberVA(uint32_t offset, unsigned flags, unsigne
return false;
CompileError& err = *tempErrPtr;
err.report.flags = flags;
err.report.errorNumber = errorNumber;
err.report.filename = filename;
err.report.isMuted = mutedErrors;
err.flags = flags;
err.errorNumber = errorNumber;
err.filename = filename;
err.isMuted = mutedErrors;
if (offset == NoOffset) {
err.report.lineno = 0;
err.report.column = 0;
err.lineno = 0;
err.column = 0;
} else {
err.report.lineno = srcCoords.lineNum(offset);
err.report.column = srcCoords.columnIndex(offset);
err.lineno = srcCoords.lineNum(offset);
err.column = srcCoords.columnIndex(offset);
}
// If we have no location information, try to get one from the caller.
bool callerFilename = false;
if (offset != NoOffset && !err.report.filename && cx->isJSContext()) {
if (offset != NoOffset && !err.filename && cx->isJSContext()) {
NonBuiltinFrameIter iter(cx->asJSContext(),
FrameIter::FOLLOW_DEBUGGER_EVAL_PREV_LINK,
cx->compartment()->principals());
if (!iter.done() && iter.filename()) {
callerFilename = true;
err.report.filename = iter.filename();
err.report.lineno = iter.computeLine(&err.report.column);
err.filename = iter.filename();
err.lineno = iter.computeLine(&err.column);
}
}
if (!ExpandErrorArgumentsVA(cx, GetErrorMessage, nullptr, errorNumber,
nullptr, ArgumentsAreLatin1, &err.report, args))
nullptr, ArgumentsAreLatin1, &err, args))
{
return false;
}
@ -648,7 +644,7 @@ TokenStream::reportCompileErrorNumberVA(uint32_t offset, unsigned flags, unsigne
// So we don't even try, leaving report.linebuf and friends zeroed. This
// means that any error involving a multi-line token (e.g. an unterminated
// multi-line string literal) won't have a context printed.
if (offset != NoOffset && err.report.lineno == lineno && !callerFilename) {
if (offset != NoOffset && err.lineno == lineno && !callerFilename) {
// We show only a portion (a "window") of the line around the erroneous
// token -- the first char in the token, plus |windowRadius| chars
// before it and |windowRadius - 1| chars after it. This is because
@ -686,7 +682,7 @@ TokenStream::reportCompileErrorNumberVA(uint32_t offset, unsigned flags, unsigne
if (!linebuf)
return false;
err.report.initOwnedLinebuf(linebuf.release(), windowLength, offset - windowStart);
err.initOwnedLinebuf(linebuf.release(), windowLength, offset - windowStart);
}
if (cx->isJSContext())

View File

@ -237,17 +237,9 @@ struct Token
}
};
struct CompileError {
JSErrorReport report;
CompileError() {}
~CompileError();
class CompileError : public JSErrorReport {
public:
void throwError(JSContext* cx);
private:
// CompileError owns raw allocated memory, so disable assignment and copying
// for safety.
void operator=(const CompileError&) = delete;
CompileError(const CompileError&) = delete;
};
// Ideally, tokenizing would be entirely independent of context. But the

View File

@ -67,7 +67,7 @@ TraceCycleDetectionSet(JSTracer* trc, AutoCycleDetector::Set& set);
struct AutoResolving;
namespace frontend { struct CompileError; }
namespace frontend { class CompileError; }
/*
* Execution Context Overview: