--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -98,25 +98,26 @@ public:
}
bool parse(char* start, char* stop, GlobalSharedContext* sc, UniquePtr<ParseNode>& out);
private:
bool raiseError();
// --- Parse full nodes.
+ bool parseBlockStatement(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
+ bool parseCatchClause(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
+ bool parseExpression(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
bool parsePattern(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
bool parseProgram(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
+ bool parsePropertyName(SimpleTokenReader* reader, UniquePtr<PropertyName>& out);
+ bool parseScope(SimpleTokenReader* reader, ScopeData& out);
bool parseStatement(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
bool parseStatementList(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
- bool parseScope(SimpleTokenReader* reader, ScopeData& out);
- bool parseExpression(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
- bool parsePropertyName(SimpleTokenReader* reader, UniquePtr<PropertyName>& out);
- bool parseBlockStatement(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
- bool parseCatchClause(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
+ bool parseSwitchCase(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
bool parseVariableDeclarator(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
// --- Parse lists of nodes.
// Produces a list of expressions. Empty expressions are replaced with PNK_ELISION.
bool parseExpressionOrElisionList(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
@@ -2161,16 +2162,52 @@ ASTReader::parseExpressionOrElisionList(
}
out = Move(result);
return true;
}
bool
+ASTReader::parseSwitchCaseList(SimpleTokenReader* reader, UniquePtr<ParseNode>& out) {
+ if (out) {
+ return this->raiseError();
+ }
+
+ uint32_t length;
+ SimpleTokenReader sub(this->cx);
+
+ if (!reader->readList(&length, &sub)) {
+ return false;
+ }
+
+ UniquePtr<ParseNode> result(new_<ListNode>(PNK_ARRAY, TokenPos()));
+ if (!result) {
+ return false;
+ }
+
+ for (uint32_t i = 0; i < length; ++i) {
+ UniquePtr<ParseNode> case_;
+ if (!this->parseSwitchCase(&sub, case_)) {
+ return false;
+ }
+
+ if (!case_) {
+ return this->raiseError();
+ }
+
+ result->append(case_.release());
+ }
+
+ out = Move(result);
+ return true;
+}
+
+
+bool
ASTReader::readNumber(SimpleTokenReader* reader, Maybe<double>& out) {
if (out) {
return this->raiseError();
}
return reader->readMaybeF64(&out);
}