--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -9,16 +9,21 @@
#include <frontend/ParseNode.h>
#include <frontend/BinTokenReader.h>
using namespace mozilla;
using NameBag = GCHashSet<JSString*>;
using Names = GCVector<JSString*, 8>;
+// FIXME: Better error handling.
+// FIXME: Proper error handling if `new_` fails.
+// FIXME: Check that subnodes have the right type.
+// FIXME: Check scope information.
+
namespace js {
namespace frontend {
// Copied from Parser.cpp
template <typename Scope>
static typename Scope::Data*
@@ -567,17 +572,41 @@ ASTReader::parseStatement(SimpleTokenRea
UniquePtr<ParseNode> result(new_<BinaryNode>(PNK_SWITCH, JSOP_NOP, TokenPos(), discriminant.release(), cases.release()));
if (!result) {
return false;
}
out = Move(result);
} else if (name == "SwitchCase") {
- // FIXME: Implement
+
+ UniquePtr<ParseNode> test;
+ UniquePtr<ParseNode> consequent;
+
+ for (auto field: fields) {
+ if (field == "test") {
+ if (!this->parseExpression(&sub, test)) {
+ return false;
+ }
+ } else if (field == "consequent") {
+ if (!this->parseStatementList(&sub, consequent)) {
+ return false;
+ }
+ } else {
+ return this->raiseError();
+ }
+ }
+
+ UniquePtr<ParseNode> result(new_<CaseClause>(test.release(), consequent.release(), 0));
+ if (!result) {
+ return false;
+ }
+
+ out = Move(result);
+
} else if (name == "ThrowStatement") {
// FIXME: Implement
} else if (name == "TryStatement") {
// FIXME: Implement
} else if (name == "WhileStatement") {
// FIXME: Implement
} else if (name == "DoWhileStatement") {
// FIXME: Implement