--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -88,36 +88,41 @@ 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 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 parseVariableDeclarator(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
+
+ // --- Parse lists of nodes.
+ //
+ // By convention, all parse*List() that take a `UniquePtr<ParseNode>`
+ // construct an instance of `ListNode`. Since `ListNode` cannot represent
+ // `nullptr`, we follow the conventions of `PNK_ARRAY` and represent
+ // null nodes as `PNK_ELISIION`.
+
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>&);
// --- Parse the contents of a node whose kind has already been determined.
bool parseFunctionAux(SimpleTokenReader* reader, const BinKind kind, const SimpleTokenReader::BinFields& fields, UniquePtr<ParseNode>& out);
bool parsePatternAux(SimpleTokenReader* reader, const BinKind kind, const SimpleTokenReader::BinFields& fields, UniquePtr<ParseNode>& out);
bool parseBlockStatementAux(SimpleTokenReader* reader, const BinKind kind, const SimpleTokenReader::BinFields& fields, UniquePtr<ParseNode>& out);
@@ -1469,19 +1474,27 @@ ASTReader::parseExpression(SimpleTokenRe
if (!result) {
return false;
}
Unused << thisName.release();
out = Move(result);
break;
}
- case BinKind::array_expression:
- // FIXME: Implement
+ case BinKind::array_expression: {
+ UniquePtr<ParseNode> result;
+ if (!this->parseExpressionList(&sub, result)) {
+ return false;
+ }
+
+ result->setKind(PNK_ARRAY);
+ result->setOp(JSOP_NEWINIT);
+ out = Move(result);
break;
+ }
case BinKind::object_expression:
// FIXME: Implement
break;
case BinKind::function_expression:
// FIXME: Implement
break;
case BinKind::unary_expression:
case BinKind::update_expression: {