WIP: Implemented number_literal draft
authorDavid Teller <dteller@mozilla.com>
Fri, 28 Jul 2017 13:18:25 +0200
changeset 641358 111cd7db282a8889387ab7117dac2b2f8cda3520
parent 641357 bb25a8e572d379f40d154458f21cc041b88a30d6
child 641359 3bfd18d589cb5f87876773a8089b2a273194b153
push id72504
push userdteller@mozilla.com
push dateSun, 06 Aug 2017 22:28:40 +0000
milestone57.0a1
WIP: Implemented number_literal MozReview-Commit-ID: 2b6NrsSo9NQ
js/src/frontend/BinSource.cpp
--- 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: