mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-17 07:15:46 +00:00
Bug 1451826 - Part 1: Don't print bogus error locations on BCE internal errors. (r=Waldo)
--HG-- extra : rebase_source : a5ea2330fd9e65a64c4fb31131eb9a4d041eaa48
This commit is contained in:
parent
96dbf29680
commit
4afb1cb7b8
@ -2175,6 +2175,7 @@ BytecodeEmitter::BytecodeEmitter(BytecodeEmitter* parent,
|
||||
hasTryFinally(false),
|
||||
emittingRunOnceLambda(false),
|
||||
emitterMode(emitterMode),
|
||||
scriptStartOffsetSet(false),
|
||||
functionBodyEndPosSet(false)
|
||||
{
|
||||
MOZ_ASSERT_IF(emitterMode == LazyFunction, lazyScript);
|
||||
@ -2188,6 +2189,7 @@ BytecodeEmitter::BytecodeEmitter(BytecodeEmitter* parent,
|
||||
parser.tokenStream().srcCoords.lineNum(bodyPosition.begin),
|
||||
emitterMode)
|
||||
{
|
||||
setScriptStartOffsetIfUnset(bodyPosition);
|
||||
setFunctionBodyEndPos(bodyPosition);
|
||||
}
|
||||
|
||||
@ -3587,13 +3589,14 @@ BytecodeEmitter::tokenStream()
|
||||
void
|
||||
BytecodeEmitter::reportError(ParseNode* pn, unsigned errorNumber, ...)
|
||||
{
|
||||
TokenPos pos = pn ? pn->pn_pos : tokenStream().currentToken().pos;
|
||||
MOZ_ASSERT_IF(!pn, this->scriptStartOffsetSet);
|
||||
uint32_t offset = pn ? pn->pn_pos.begin : this->scriptStartOffset;
|
||||
|
||||
va_list args;
|
||||
va_start(args, errorNumber);
|
||||
|
||||
ErrorMetadata metadata;
|
||||
if (parser.computeErrorMetadata(&metadata, pos.begin))
|
||||
if (parser.computeErrorMetadata(&metadata, offset))
|
||||
ReportCompileError(cx, Move(metadata), nullptr, JSREPORT_ERROR, errorNumber, args);
|
||||
|
||||
va_end(args);
|
||||
@ -3602,12 +3605,13 @@ BytecodeEmitter::reportError(ParseNode* pn, unsigned errorNumber, ...)
|
||||
bool
|
||||
BytecodeEmitter::reportExtraWarning(ParseNode* pn, unsigned errorNumber, ...)
|
||||
{
|
||||
TokenPos pos = pn ? pn->pn_pos : tokenStream().currentToken().pos;
|
||||
MOZ_ASSERT_IF(!pn, this->scriptStartOffsetSet);
|
||||
uint32_t offset = pn ? pn->pn_pos.begin : this->scriptStartOffset;
|
||||
|
||||
va_list args;
|
||||
va_start(args, errorNumber);
|
||||
|
||||
bool result = parser.reportExtraWarningErrorNumberVA(nullptr, pos.begin, errorNumber, &args);
|
||||
bool result = parser.reportExtraWarningErrorNumberVA(nullptr, offset, errorNumber, &args);
|
||||
|
||||
va_end(args);
|
||||
return result;
|
||||
@ -4860,6 +4864,8 @@ BytecodeEmitter::emitScript(ParseNode* body)
|
||||
{
|
||||
AutoFrontendTraceLog traceLog(cx, TraceLogger_BytecodeEmission, tokenStream(), body);
|
||||
|
||||
setScriptStartOffsetIfUnset(body->pn_pos);
|
||||
|
||||
TDZCheckCache tdzCache(this);
|
||||
EmitterScope emitterScope(this);
|
||||
if (sc->isGlobalContext()) {
|
||||
@ -4932,6 +4938,8 @@ BytecodeEmitter::emitFunctionScript(ParseNode* body)
|
||||
FunctionBox* funbox = sc->asFunctionBox();
|
||||
AutoFrontendTraceLog traceLog(cx, TraceLogger_BytecodeEmission, tokenStream(), funbox);
|
||||
|
||||
setScriptStartOffsetIfUnset(body->pn_pos);
|
||||
|
||||
// The ordering of these EmitterScopes is important. The named lambda
|
||||
// scope needs to enclose the function scope needs to enclose the extra
|
||||
// var scope.
|
||||
|
@ -281,6 +281,9 @@ struct MOZ_STACK_CLASS BytecodeEmitter
|
||||
|
||||
const EmitterMode emitterMode;
|
||||
|
||||
MOZ_INIT_OUTSIDE_CTOR uint32_t scriptStartOffset;
|
||||
bool scriptStartOffsetSet;
|
||||
|
||||
// The end location of a function body that is being emitted.
|
||||
MOZ_INIT_OUTSIDE_CTOR uint32_t functionBodyEndPos;
|
||||
// Whether functionBodyEndPos was set.
|
||||
@ -417,6 +420,13 @@ struct MOZ_STACK_CLASS BytecodeEmitter
|
||||
functionBodyEndPosSet = true;
|
||||
}
|
||||
|
||||
void setScriptStartOffsetIfUnset(TokenPos pos) {
|
||||
if (!scriptStartOffsetSet) {
|
||||
scriptStartOffset = pos.begin;
|
||||
scriptStartOffsetSet = true;
|
||||
}
|
||||
}
|
||||
|
||||
void reportError(ParseNode* pn, unsigned errorNumber, ...);
|
||||
bool reportExtraWarning(ParseNode* pn, unsigned errorNumber, ...);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user