WIP: Implemented BreakStatement/ContinueStatement
MozReview-Commit-ID: Fnl8ncyd5xm
--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -414,17 +414,17 @@ ASTReader::parseStatement(SimpleTokenRea
}
if (!body || !expr) {
return false;
}
UniquePtr<ParseNode> result(new_<BinaryNode>(PNK_WITH, JSOP_NOP, TokenPos(),
expr.release(), body.release()));
if (!result) {
- return false;
+ return this->raiseError();
}
out = Move(result);
} else if (name == "ReturnStatement") {
UniquePtr<ParseNode> arg;
for (auto field: fields) {
if (field == "argument") {
@@ -434,17 +434,17 @@ ASTReader::parseStatement(SimpleTokenRea
} else {
return this->raiseError();
}
}
// `arg` is optional, so we don't check whether it's `nullptr`.
UniquePtr<ParseNode> result(new_<UnaryNode>(PNK_RETURN, JSOP_RETURN, TokenPos(), arg.release()));
if (!result) {
- return false;
+ return this->raiseError();
}
out = Move(result);
} else if (name == "LabeledStatement") {
UniquePtr<PropertyName> label;
UniquePtr<ParseNode> body;
@@ -458,30 +458,58 @@ ASTReader::parseStatement(SimpleTokenRea
return false;
}
} else {
return this->raiseError();
}
}
if (!label || !body) {
- return false;
+ return this->raiseError();
}
UniquePtr<ParseNode> result(new_<LabeledStatement>(label.release(), body.release(), 0));
if (!result) {
return false;
}
out = Move(result);
- } else if (name == "BreakStatement") {
- // FIXME: Implement
- } else if (name == "ContinueStatement") {
- // FIXME: Implement
+ } else if (name == "BreakStatement" || name == "ContinueStatement") {
+
+ UniquePtr<PropertyName> label;
+
+ for (auto field: fields) {
+ if (field == "label") {
+ if (!this->parsePropertyName(&sub, label)) {
+ return false;
+ }
+ } else {
+ return this->raiseError();
+ }
+ }
+
+ if (!label) {
+ return this->raiseError();
+ }
+
+ if (name == "BreakStatement") {
+ UniquePtr<ParseNode> result(new_<BreakStatement>(label.release(), TokenPos()));
+ if (!result) {
+ return false;
+ }
+ out = Move(result);
+ } else {
+ UniquePtr<ParseNode> result(new_<ContinueStatement>(label.release(), TokenPos()));
+ if (!result) {
+ return false;
+ }
+ out = Move(result);
+ }
+
} else if (name == "IfStatement") {
// FIXME: Implement
} else if (name == "SwitchStatement") {
// FIXME: Implement
} else if (name == "SwitchCase") {
// FIXME: Implement
} else if (name == "ThrowStatement") {
// FIXME: Implement