--- 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