--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -124,16 +124,17 @@ private:
bool parseExpressionAux(SimpleTokenReader* reader, const BinKind kind, const SimpleTokenReader::BinFields& fields, UniquePtr<ParseNode>& out);
bool parseVariableDeclarationAux(SimpleTokenReader* reader, const BinKind kind, const SimpleTokenReader::BinFields& fields, UniquePtr<ParseNode>& out);
// --- Utilities.
bool readString(SimpleTokenReader* reader, std::string&);
bool readString(SimpleTokenReader* reader, MutableHandleString);
bool readString(SimpleTokenReader* reader, MutableHandleAtom);
+ bool readString(SimpleTokenReader* reader, MutableHandle<PropertyName*>);
bool readBool(SimpleTokenReader* reader, Maybe<bool>&);
const Directives& currentDirectives() const;
const ReadOnlyCompileOptions& options() const;
// --- GC.
/* List of objects allocated during parsing, for GC tracing. */
@@ -1210,17 +1211,62 @@ ASTReader::parseExpression(SimpleTokenRe
SimpleTokenReader::BinFields fields(this->cx);
SimpleTokenReader sub(this->cx);
BinKind kind;
if (!reader->taggedTuple(kind, fields, &sub)) {
return false;
}
+ // FIXME: Literals!
+ // FIXME: Identifiers!
switch (kind) {
+ case BinKind::identifier: {
+ Rooted<PropertyName*> id(this->cx);
+ for (auto field: fields) {
+ switch (field) {
+ case BinField::name:
+ if (!this->readString(&sub, &id)) {
+ return false;
+ }
+ break;
+ default:
+ return this->raiseError();
+ }
+ }
+
+ if (!id) {
+ return this->raiseError();
+ }
+
+ UniquePtr<ParseNode> result(new_<NameNode>(PNK_NAME, JSOP_GETNAME, id, TokenPos()));
+ if (!result) {
+ return false;
+ }
+
+ out = Move(result);
+ }
+ case BinKind::boolean_literal:
+ // FIXME: Implement
+ break;
+ case BinKind::directive_literal:
+ // FIXME: Implement
+ break;
+ case BinKind::null_literal:
+ // FIXME: Implement
+ break;
+ case BinKind::numeric_literal:
+ // FIXME: Implement
+ break;
+ case BinKind::regexp_literal:
+ // FIXME: Implement
+ break;
+ case BinKind::string_literal:
+ // FIXME: Implement
+ break;
case BinKind::this_expression:
// FIXME: Implement
break;
case BinKind::array_expression:
// FIXME: Implement
break;
case BinKind::object_expression:
// FIXME: Implement