1357506 - Remove assert that constructorBox can only be set once when parsing classes.

Both asm.js and syntax parsing can abort and rewind parsing of an inner function.
The bookkeeping to make sure that a class's constructor FunctionBox is only set once is not worth it -- duplicate constructor definitions already throw an early error.
This commit is contained in:
Gaming4JC 2019-07-13 23:20:19 -04:00 • committed by Roy Tam
commit b9409d8774
4 changed files with 14 additions and 33 deletions

View file

@ -547,7 +547,7 @@ FunctionBox::initWithEnclosingParseContext(ParseContext* enclosing, FunctionSynt
if (kind == ClassConstructor || kind == DerivedClassConstructor) {
auto stmt = enclosing->findInnermostStatement<ParseContext::ClassStatement>();
MOZ_ASSERT(stmt);
stmt->setConstructorBox(this);
stmt->constructorBox = this;
if (kind == DerivedClassConstructor) {
setDerivedClassConstructor();
@ -573,16 +573,6 @@ FunctionBox::initWithEnclosingParseContext(ParseContext* enclosing, FunctionSynt
}
}
void
FunctionBox::resetForAbortedSyntaxParse(ParseContext* enclosing, FunctionSyntaxKind kind)
{
if (kind == ClassConstructor || kind == DerivedClassConstructor) {
auto stmt = enclosing->findInnermostStatement<ParseContext::ClassStatement>();
MOZ_ASSERT(stmt);
stmt->clearConstructorBoxForAbortedSyntaxParse(this);
}
}
void
FunctionBox::initWithEnclosingScope(Scope* enclosingScope)
{
@ -3407,7 +3397,6 @@ Parser<FullParseHandler>::trySyntaxParseInnerFunction(ParseNode* pn, HandleFunct
// correctness.
parser->clearAbortedSyntaxParse();
usedNames.rewind(token);
funbox->resetForAbortedSyntaxParse(pc, kind);
MOZ_ASSERT_IF(parser->context->isJSContext(),
!parser->context->asJSContext()->isExceptionPending());
break;
@ -7078,7 +7067,7 @@ Parser<ParseHandler>::classDefinition(YieldHandling yieldHandling,
errorAt(nameOffset, JSMSG_BAD_METHOD_DEF);
return null();
}
if (classStmt.constructorBox()) {
if (classStmt.constructorBox) {
errorAt(nameOffset, JSMSG_DUPLICATE_PROPERTY, "constructor");
return null();
}
@ -7125,7 +7114,7 @@ Parser<ParseHandler>::classDefinition(YieldHandling yieldHandling,
// Amend the toStringEnd offset for the constructor now that we've
// finished parsing the class.
uint32_t classEndOffset = pos().end;
if (FunctionBox* ctorbox = classStmt.constructorBox()) {
if (FunctionBox* ctorbox = classStmt.constructorBox) {
if (ctorbox->function()->isInterpretedLazy())
ctorbox->function()->lazyScript()->setToStringEnd(classEndOffset);
ctorbox->toStringEnd = classEndOffset;

View file

@ -85,29 +85,14 @@ class ParseContext : public Nestable<ParseContext>
}
};
class ClassStatement : public Statement
struct ClassStatement : public Statement
{
FunctionBox* constructorBox_;
FunctionBox* constructorBox;
public:
explicit ClassStatement(ParseContext* pc)
: Statement(pc, StatementKind::Class),
constructorBox_(nullptr)
constructorBox(nullptr)
{ }
void clearConstructorBoxForAbortedSyntaxParse(FunctionBox* funbox) {
MOZ_ASSERT(constructorBox_ == funbox);
constructorBox_ = nullptr;
}
void setConstructorBox(FunctionBox* funbox) {
MOZ_ASSERT(!constructorBox_);
constructorBox_ = funbox;
}
FunctionBox* constructorBox() const {
return constructorBox_;
}
};
// The intra-function scope stack.

View file

@ -503,7 +503,6 @@ class FunctionBox : public ObjectBox, public SharedContext
void initFromLazyFunction();
void initStandaloneFunction(Scope* enclosingScope);
void initWithEnclosingParseContext(ParseContext* enclosing, FunctionSyntaxKind kind);
void resetForAbortedSyntaxParse(ParseContext* enclosing, FunctionSyntaxKind kind);
ObjectBox* toObjectBox() override { return this; }
JSFunction* function() const { return &object->as<JSFunction>(); }

View file

@ -0,0 +1,8 @@
// Test that constructors that abort due to asm.js do not assert due to the
// parser keeping track of the FunctionBox corresponding to the constructor.
class a {
constructor() {
"use asm";
}
}