--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -87,27 +87,31 @@ public:
, alloc(alloc_)
{ }
bool parse(char* start, char* stop, GlobalSharedContext* sc, UniquePtr<ParseNode>& out);
private:
bool raiseError();
// --- Parse full nodes.
+ //
+ // By convention, all parse*List() that take a `UniquePtr<ParseNode>`
+ // construct an instance of `ListNode`.
bool parseBool(SimpleTokenReader*, Maybe<bool>*);
bool parseProgram(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
bool parseStatement(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
bool parseStatementList(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
bool parseStringList(SimpleTokenReader* reader, MutableHandle<Maybe<Names>> out);
bool parseStringList(SimpleTokenReader* reader, MutableHandle<Names> out);
bool parseStringSet(SimpleTokenReader* reader, MutableHandle<Maybe<NameBag>>);
bool parseStringSet(SimpleTokenReader* reader, MutableHandle<NameBag>);
bool parseScope(SimpleTokenReader* reader, ScopeData& out);
bool parseExpression(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
+ bool parseExpressionList(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>&);
@@ -1480,19 +1484,39 @@ ASTReader::parseExpression(SimpleTokenRe
break;
}
case BinKind::call_expression:
// FIXME: Implement
break;
case BinKind::new_expression:
// FIXME: Implement
break;
- case BinKind::sequence_expression:
- // FIXME: Implement
+ case BinKind::sequence_expression: {
+ UniquePtr<ParseNode> sequence;
+
+ for (auto field: fields) {
+ switch (field) {
+ case BinField::expressions:
+ if (!this->parseExpressionList(&sub, sequence)) {
+ return false;
+ }
+ break;
+ default:
+ return this->raiseError();
+ }
+ }
+
+ if (!sequence) {
+ this->raiseError();
+ }
+
+ sequence->setKind(PNK_COMMA);
+ out = Move(sequence);
break;
+ }
default:
return this->raiseError();
}
return false;
}