--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -104,16 +104,17 @@ private:
bool parseScope(SimpleTokenReader* reader, ScopeData& out);
bool parseExpression(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
bool parsePropertyName(SimpleTokenReader* reader, UniquePtr<PropertyName>& out);
bool parseSwitchCaseList(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
bool parseBlockStatement(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
bool parseCatchClause(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
bool parseVariableDeclarator(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
bool parsePatternList(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
+ bool parseDirectiveList(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
// --- Parse the contents of a node whose kind has already been determined.
bool parseFunctionAux(SimpleTokenReader* reader, const std::string& name, const SimpleTokenReader::Fields* fields, UniquePtr<ParseNode>& out);
bool parsePatternAux(SimpleTokenReader* reader, const std::string& name, const SimpleTokenReader::Fields* fields, UniquePtr<ParseNode>& out);
bool parseBlockStatementAux(SimpleTokenReader* reader, const std::string& name, const SimpleTokenReader::Fields* fields, UniquePtr<ParseNode>& out);
bool parseExpressionStatementAux(SimpleTokenReader* reader, const std::string& name, const SimpleTokenReader::Fields* fields, UniquePtr<ParseNode>& out);
bool parseExpressionAux(SimpleTokenReader* reader, const std::string& name, const SimpleTokenReader::Fields* fields, UniquePtr<ParseNode>& out);
@@ -272,35 +273,40 @@ ASTReader::parseScope(SimpleTokenReader*
bool
ASTReader::parseBlockStatementAux(SimpleTokenReader* reader,
const std::string& name,
const SimpleTokenReader::Fields* fields,
UniquePtr<ParseNode>& out)
{
UniquePtr<ParseNode> body;
+ UniquePtr<ParseNode> directives;
ScopeData scope(this->cx);
for (auto field: *fields) {
if (field == BINJS_SCOPE) {
if (!this->parseScope(reader, scope)) {
return false;
}
} else if (field == "body") {
if (!this->parseStatementList(reader, body)) {
return false;
}
+ } else if (field == "directives") {
+ if (!this->parseDirectiveList(reader, directives)) {
+ return false;
+ }
} else {
this->raiseError();
return false;
}
}
// Check if all fields have been parsed.
- if (!body || !scope.isSome()) {
+ if (!body || !directives || !scope.isSome()) {
// FIXME: Once we have headers + header validation, this error check
// should become an assertion.
return this->raiseError();
}
// Probably not a good idea.
UniquePtr<LexicalScope::Data> bindings(
NewEmptyBindingData<LexicalScope>(this->cx, this->alloc, scope.letNames->length() + scope.constNames->length())