WIP: Implemented identifier draft
authorDavid Teller <dteller@mozilla.com>
Fri, 28 Jul 2017 13:01:12 +0200
changeset 641354 6faae396314578fcf132db439b071dfed4b6fc2c
parent 641353 b10ce742139f4d35d90061e4f6196dc1dfed1b95
child 641355 9659bebe5741d427e44f124bb3b60fbff5bb16bd
push id72504
push userdteller@mozilla.com
push dateSun, 06 Aug 2017 22:28:40 +0000
milestone57.0a1
WIP: Implemented identifier MozReview-Commit-ID: 3LZLBobfJNE
js/src/frontend/BinSource.cpp
--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -124,16 +124,17 @@ private:
     bool parseExpressionAux(SimpleTokenReader* reader, const BinKind kind, const SimpleTokenReader::BinFields& fields, UniquePtr<ParseNode>& out);
     bool parseVariableDeclarationAux(SimpleTokenReader* reader, const BinKind kind, const SimpleTokenReader::BinFields& fields, UniquePtr<ParseNode>& out);
 
     // --- 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>&);
 
     const Directives& currentDirectives() const;
     const ReadOnlyCompileOptions& options() const;
 
     // --- GC.
 
     /* List of objects allocated during parsing, for GC tracing. */
@@ -1210,17 +1211,62 @@ ASTReader::parseExpression(SimpleTokenRe
     SimpleTokenReader::BinFields fields(this->cx);
     SimpleTokenReader sub(this->cx);
     BinKind kind;
 
     if (!reader->taggedTuple(kind, fields, &sub)) {
         return false;
     }
 
+    // FIXME: Literals!
+    // FIXME: Identifiers!
     switch (kind) {
+        case BinKind::identifier: {
+            Rooted<PropertyName*> id(this->cx);
+            for (auto field: fields) {
+                switch (field) {
+                    case BinField::name:
+                        if (!this->readString(&sub, &id)) {
+                            return false;
+                        }
+                        break;
+                    default:
+                        return this->raiseError();
+                }
+            }
+
+            if (!id) {
+                return this->raiseError();
+            }
+
+            UniquePtr<ParseNode> result(new_<NameNode>(PNK_NAME, JSOP_GETNAME, id, TokenPos()));
+            if (!result) {
+                return false;
+            }
+
+            out = Move(result);
+        }
+        case BinKind::boolean_literal:
+            // FIXME: Implement
+            break;
+        case BinKind::directive_literal:
+            // FIXME: Implement
+            break;
+        case BinKind::null_literal:
+            // FIXME: Implement
+            break;
+        case BinKind::numeric_literal:
+            // FIXME: Implement
+            break;
+        case BinKind::regexp_literal:
+            // FIXME: Implement
+            break;
+        case BinKind::string_literal:
+            // FIXME: Implement
+            break;
         case BinKind::this_expression:
             // FIXME: Implement
             break;
         case BinKind::array_expression:
             // FIXME: Implement
             break;
         case BinKind::object_expression:
             // FIXME: Implement