WIP: Implemented this_expression draft
authorDavid Teller <dteller@mozilla.com>
Mon, 31 Jul 2017 16:01:53 +0200
changeset 641360 5ee9676fb9409fc15a2d5a5012072951543cf10a
parent 641359 3bfd18d589cb5f87876773a8089b2a273194b153
child 641361 8e3cb5a7687297396e59ca1ee956f247cb9d4f27
push id72504
push userdteller@mozilla.com
push dateSun, 06 Aug 2017 22:28:40 +0000
milestone57.0a1
WIP: Implemented this_expression MozReview-Commit-ID: InqMsg539sV
js/src/frontend/BinSource.cpp
--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -132,18 +132,23 @@ private:
     bool readString(SimpleTokenReader* reader, Maybe<std::u16string>&);
     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;
+    ThisBinding thisBinding() const;
     const ReadOnlyCompileOptions& options() const;
 
+    // Names
+
+    
+
     // --- GC.
 
     /* List of objects allocated during parsing, for GC tracing. */
     ObjectBox* traceListHead;
     void trace(JSTracer* trc)
     {
         ObjectBox::TraceList(trc, this->traceListHead);
     }
@@ -1429,19 +1434,34 @@ ASTReader::parseExpression(SimpleTokenRe
             UniquePtr<ParseNode> result(new_<NullaryNode>(PNK_STRING, JSOP_NOP, TokenPos(), value));
             if (!result) {
                 return false;
             }
 
             out = Move(result);
             break;
         }
-        case BinKind::this_expression:
-            // FIXME: Implement
+        case BinKind::this_expression: {
+            UniquePtr<ParseNode> thisName;
+            if (this->thisBinding() == ThisBinding::Function) {
+                thisName = UniquePtr<ParseNode>(new_<NameNode>(PNK_NAME, JSOP_GETNAME, this->cx->names().dotThis, TokenPos()));
+                if (!thisName) {
+                    return false;
+                }
+            }
+
+            UniquePtr<ParseNode> result(new_<ThisLiteral>(TokenPos(), thisName.get()));
+            if (!result) {
+                return false;
+            }
+            Unused << thisName.release();
+
+            out = Move(result);
             break;
+        }
         case BinKind::array_expression:
             // FIXME: Implement
             break;
         case BinKind::object_expression:
             // FIXME: Implement
             break;
         case BinKind::function_expression:
             // FIXME: Implement