--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -92,16 +92,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 parseScope(SimpleTokenReader* reader, ScopeData& out);
bool parseExpression(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>&);
// --- Parse the contents of a node whose kind has already been determined.
bool parseBlockStatementAux(SimpleTokenReader* reader, const SimpleTokenReader::Fields* fields, UniquePtr<ParseNode>& out);
bool parseExpressionStatementAux(SimpleTokenReader* reader, const SimpleTokenReader::Fields* fields, UniquePtr<ParseNode>& out);
// --- Utilities.
bool readString(SimpleTokenReader* reader, MutableHandleString);
@@ -621,17 +623,49 @@ ASTReader::parseStatement(SimpleTokenRea
UniquePtr<ParseNode> result(new_<UnaryNode>(PNK_THROW, JSOP_THROW, TokenPos(), arg.release()));
if (!result) {
return this->raiseError();
}
out = Move(result);
} else if (name == "TryStatement") {
- // FIXME: Implement
+
+ UniquePtr<ParseNode> block;
+ UniquePtr<ParseNode> handler;
+ UniquePtr<ParseNode> finalizer;
+
+ for (auto field: fields) {
+ if (field == "block") {
+ if (!this->parseBlockStatement(&sub, block)) {
+ return false;
+ }
+ } else if (field == "handler") {
+ if (!this->parseCatchClause(&sub, handler)) {
+ return false;
+ }
+ } else if (field == "finalizer") {
+ if (!this->parseBlockStatement(&sub, finalizer)) {
+ return false;
+ }
+ } else {
+ return this->raiseError();
+ }
+ }
+
+ if (!block || !handler) { // `finalizer` is optional
+ return this->raiseError();
+ }
+
+ UniquePtr<ParseNode> result(new_<TernaryNode>(PNK_TRY, JSOP_NOP, block.release(), handler.release(), finalizer.release(), TokenPos()));
+ if (!result) {
+ return false;
+ }
+
+ out = Move(result);
} else if (name == "WhileStatement") {
// FIXME: Implement
} else if (name == "DoWhileStatement") {
// FIXME: Implement
} else if (name == "ForStatement") {
// FIXME: Implement
} else if (name == "ForInStatement") {
// FIXME: Implement