--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -115,16 +115,18 @@ private:
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 parseExpressionList(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
bool parseSwitchCaseList(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
bool parsePatternList(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
bool parseDirectiveList(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
+ // Returns a list of PNK_COLON.
+ bool parseKeyValueList(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);
bool parseExpressionStatementAux(SimpleTokenReader* reader, const BinKind kind, const SimpleTokenReader::BinFields& fields, UniquePtr<ParseNode>& out);
bool parseExpressionAux(SimpleTokenReader* reader, const BinKind kind, const SimpleTokenReader::BinFields& fields, UniquePtr<ParseNode>& out);
@@ -1485,19 +1487,33 @@ ASTReader::parseExpression(SimpleTokenRe
return false;
}
result->setKind(PNK_ARRAY);
result->setOp(JSOP_NEWINIT);
out = Move(result);
break;
}
- case BinKind::object_expression:
- // FIXME: Implement
+ case BinKind::object_expression: {
+ UniquePtr<ParseNode> result;
+ if (!this->parseKeyValueList(&sub, result)) {
+ return false;
+ }
+
+ for (ParseNode* iter = result.get(); iter != nullptr; iter = iter->pn_next) {
+ MOZ_ASSERT(iter->isKind(PNK_COLON));
+ MOZ_ASSERT(iter->pn_left != nullptr);
+ MOZ_ASSERT(iter->pn_right != nullptr);
+ }
+
+ result->setKind(PNK_OBJECT);
+ result->setOp(JSOP_NEWINIT);
+ out = Move(result);
break;
+ }
case BinKind::function_expression:
// FIXME: Implement
break;
case BinKind::unary_expression:
case BinKind::update_expression: {
UniquePtr<ParseNode> expr;
std::string operation;