WIP: Supporting null tuples draft
authorDavid Teller <dteller@mozilla.com>
Mon, 31 Jul 2017 16:39:12 +0200
changeset 641361 8e3cb5a7687297396e59ca1ee956f247cb9d4f27
parent 641360 5ee9676fb9409fc15a2d5a5012072951543cf10a
child 641362 3228b9db4034d9c15a9487127fe1bbafd3c13176
push id72504
push userdteller@mozilla.com
push dateSun, 06 Aug 2017 22:28:40 +0000
milestone57.0a1
WIP: Supporting null tuples MozReview-Commit-ID: IxITVDgjabn
js/src/frontend/BinSource.cpp
js/src/frontend/BinTokenReader.h
--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -267,16 +267,19 @@ ASTReader::parseScope(SimpleTokenReader*
     BinKind kind;
     SimpleTokenReader::BinFields fields(this->cx);
     SimpleTokenReader sub(this->cx);
 
     if (!reader->taggedTuple(kind, fields, &sub)) {
         return false;
     }
 
+    if (kind == BinKind::binjs_null) {
+        return true;
+    }
     if (kind != BinKind::binjs_scope) {
         return this->raiseError();
     }
 
     for (auto field: fields) {
         switch (field) {
             case BinField::has_direct_eval:
                 if (!this->parseBool(reader, &out.hasDirectEval)) {
@@ -464,16 +467,19 @@ ASTReader::parseStatement(SimpleTokenRea
     }
     BinKind kind;
     SimpleTokenReader::BinFields fields(this->cx);
     SimpleTokenReader sub(this->cx);
 
     if (!reader->taggedTuple(kind, fields, &sub)) {
         return false;
     }
+    if (kind == BinKind::binjs_null) {
+        return true;
+    }
 
     switch (kind) {
         case BinKind::empty_statement: {
             UniquePtr<ParseNode> result(new_<NullaryNode>(PNK_NOP, TokenPos()));
             if (!result) {
                 return false;
             }
             out = Move(result);
@@ -892,16 +898,22 @@ ASTReader::parseStatement(SimpleTokenRea
                     SimpleTokenReader::BinFields subFields(this->cx);
                     SimpleTokenReader subSub(this->cx);
                     BinKind subKind;
 
                     if (!sub.taggedTuple(subKind, subFields, &subSub)) {
                         return false;
                     }
 
+                    if (subKind == BinKind::binjs_null) {
+                        if (init) {
+                            return false;
+                        }
+                        break;
+                    }
                     if (subKind == BinKind::variable_declaration) {
                         if (!this->parseVariableDeclarationAux(&subSub, subKind, subFields, init)) {
                             return false;
                         }
                     } else /* Parse as expression */ {
                         if (!this->parseExpressionAux(&subSub, subKind, subFields, init)) {
                             return false;
                         }
@@ -972,17 +984,22 @@ ASTReader::parseStatement(SimpleTokenRea
                     // This can be either a VarDecl or a Pattern.
                     SimpleTokenReader::BinFields subFields(this->cx);
                     SimpleTokenReader subSub(this->cx);
                     BinKind subKind;
 
                     if (!sub.taggedTuple(subKind, subFields, &subSub)) {
                         return false;
                     }
-
+                    if (subKind == BinKind::binjs_null) {
+                        if (left) {
+                            return false;
+                        }
+                        break;
+                    }
                     if (subKind == BinKind::variable_declaration) {
                         if (!this->parseVariableDeclarationAux(&subSub, subKind, subFields, left)) {
                             return false;
                         }
                     } else /* Parse as pattern */ {
                         if (!this->parsePatternAux(&subSub, subKind, subFields, left)) {
                             return false;
                         }
@@ -1247,16 +1264,18 @@ ASTReader::parseExpression(SimpleTokenRe
     SimpleTokenReader sub(this->cx);
     BinKind kind;
 
     if (!reader->taggedTuple(kind, fields, &sub)) {
         return false;
     }
 
     switch (kind) {
+        case BinKind::binjs_null:
+            return true;
         case BinKind::identifier: {
             Rooted<PropertyName*> id(this->cx);
             for (auto field: fields) {
                 switch (field) {
                     case BinField::name:
                         if (!this->readString(&sub, &id)) {
                             return false;
                         }
@@ -1361,18 +1380,16 @@ ASTReader::parseExpression(SimpleTokenRe
                         return this->raiseError();
                 }
             }
 
             if (!pattern || !flags) {
                 return this->raiseError();
             }
 
-            // FIXME: RegExpFlag flags = tokenStream.currentToken().regExpFlags();
-
             RegExpFlag reflags = NoFlags;
             for (char c: *flags) {
                 if (c == 'g' && !(reflags & GlobalFlag))
                     reflags = RegExpFlag(reflags | GlobalFlag);
                 else if (c == 'i' && !(reflags & IgnoreCaseFlag))
                     reflags = RegExpFlag(reflags | IgnoreCaseFlag);
                 else if (c == 'm' && !(reflags & MultilineFlag))
                     reflags = RegExpFlag(reflags | MultilineFlag);
--- a/js/src/frontend/BinTokenReader.h
+++ b/js/src/frontend/BinTokenReader.h
@@ -13,16 +13,17 @@ using namespace mozilla;
 using namespace JS;
 
 enum class BinKind {
     array_expression,
     assignment_expression,
     assignment_operator,
     binary_expression,
     binary_operator,
+    binjs_null,
     binjs_scope,
     block_statement,
     boolean_literal,
     break_statement,
     call_expression,
     catch_clause,
     conditional_expression,
     continue_statement,