--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -126,16 +126,17 @@ private:
// --- 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>&);
+ bool readNumber(SimpleTokenReader* reader, Maybe<double>&);
const Directives& currentDirectives() const;
const ReadOnlyCompileOptions& options() const;
// --- GC.
/* List of objects allocated during parsing, for GC tracing. */
ObjectBox* traceListHead;
@@ -1275,19 +1276,42 @@ ASTReader::parseExpression(SimpleTokenRe
case BinKind::null_literal: {
UniquePtr<ParseNode> result(new_<NullLiteral>(TokenPos()));
if (!result) {
return false;
}
out = Move(result);
break;
}
- case BinKind::numeric_literal:
- // FIXME: Implement
+ case BinKind::numeric_literal: {
+ Maybe<double> value;
+ for (auto field: fields) {
+ switch (field) {
+ case BinField::value:
+ if (!this->readNumber(&sub, value)) {
+ return false;
+ }
+ break;
+ default:
+ return this->raiseError();
+ }
+ }
+
+ if (!value) {
+ return false;
+ }
+
+ UniquePtr<ParseNode> result(new_<NullaryNode>(PNK_NUMBER, TokenPos()));
+ if (!result) {
+ return false;
+ }
+ result->initNumber(*value, DecimalPoint::HasDecimal); // FIXME: Is the DecimalPoint important?
+ out = Move(result);
break;
+ }
case BinKind::regexp_literal:
// FIXME: Implement
break;
case BinKind::string_literal: {
RootedAtom value(this->cx);
for (auto field: fields) {
switch (field) {
case BinField::value: