From 80646986b5773194043c0152900bd3d2b4bbd738 Mon Sep 17 00:00:00 2001 From: Cameron Kaiser Date: Sat, 15 Sep 2018 12:37:12 -0700 Subject: [PATCH] #521: async/await M1185106 parts 3 and 4 --- js/src/frontend/TokenKind.h | 1 + js/src/frontend/TokenStream.cpp | 6 ++++++ js/src/frontend/TokenStream.h | 24 ++++++++++++++++++++++++ js/src/vm/CommonPropertyNames.h | 1 + js/src/vm/Keywords.h | 1 + 5 files changed, 33 insertions(+) diff --git a/js/src/frontend/TokenKind.h b/js/src/frontend/TokenKind.h index 83ee77172..a52b3f846 100644 --- a/js/src/frontend/TokenKind.h +++ b/js/src/frontend/TokenKind.h @@ -107,6 +107,7 @@ macro(THROW, "keyword 'throw'") \ macro(DEBUGGER, "keyword 'debugger'") \ macro(YIELD, "keyword 'yield'") \ + macro(AWAIT, "keyword 'await'") \ macro(LET, "keyword 'let'") \ macro(EXPORT, "keyword 'export'") \ macro(IMPORT, "keyword 'import'") \ diff --git a/js/src/frontend/TokenStream.cpp b/js/src/frontend/TokenStream.cpp index 770d77d5b..cb9b5b675 100644 --- a/js/src/frontend/TokenStream.cpp +++ b/js/src/frontend/TokenStream.cpp @@ -981,6 +981,12 @@ TokenStream::putIdentInTokenbuf(const char16_t* identStart) bool TokenStream::checkForKeyword(const KeywordInfo* kw, TokenKind* ttp) { + if (!awaitIsKeyword && kw->tokentype == TOK_AWAIT) { + if (ttp) + *ttp = TOK_NAME; + return true; + } + if (kw->tokentype == TOK_RESERVED) return reportError(JSMSG_RESERVED_ID, kw->chars); diff --git a/js/src/frontend/TokenStream.h b/js/src/frontend/TokenStream.h index f3712cfec..ae1ca6f7d 100644 --- a/js/src/frontend/TokenStream.h +++ b/js/src/frontend/TokenStream.h @@ -32,6 +32,8 @@ struct KeywordInfo; namespace js { namespace frontend { +class AutoAwaitIsKeyword; + struct TokenPos { uint32_t begin; // Offset of the token's first char. uint32_t end; // Offset of 1 past the token's last char. @@ -452,6 +454,9 @@ class MOZ_STACK_CLASS TokenStream {} }; + bool awaitIsKeyword = false; + friend class AutoAwaitIsKeyword; + public: typedef Token::Modifier Modifier; static MOZ_CONSTEXPR_VAR Modifier None = Token::None; @@ -1034,6 +1039,25 @@ class MOZ_STACK_CLASS TokenStream StrictModeGetter* strictModeGetter; // used to test for strict mode }; +class MOZ_STACK_CLASS AutoAwaitIsKeyword +{ +private: + TokenStream* ts_; + bool oldAwaitIsKeyword_; + +public: + AutoAwaitIsKeyword(TokenStream* ts, bool awaitIsKeyword) { + ts_ = ts; + oldAwaitIsKeyword_ = ts_->awaitIsKeyword; + ts_->awaitIsKeyword = awaitIsKeyword; + } + + ~AutoAwaitIsKeyword() { + ts_->awaitIsKeyword = oldAwaitIsKeyword_; + ts_ = nullptr; + } +}; + // Steal one JSREPORT_* bit (see jsapi.h) to tell that arguments to the error // message have const char16_t* type, not const char*. #define JSREPORT_UC 0x100 diff --git a/js/src/vm/CommonPropertyNames.h b/js/src/vm/CommonPropertyNames.h index 9828268a8..1a8aa25ec 100644 --- a/js/src/vm/CommonPropertyNames.h +++ b/js/src/vm/CommonPropertyNames.h @@ -23,6 +23,7 @@ macro(ArrayValues, ArrayValues, "ArrayValues") \ macro(ArrayValuesAt, ArrayValuesAt, "ArrayValuesAt") \ macro(Async, Async, "Async") \ + macro(await, await, "await") \ macro(breakdown, breakdown, "breakdown") \ macro(buffer, buffer, "buffer") \ macro(builder, builder, "builder") \ diff --git a/js/src/vm/Keywords.h b/js/src/vm/Keywords.h index 73e73d26f..de91031fc 100644 --- a/js/src/vm/Keywords.h +++ b/js/src/vm/Keywords.h @@ -56,6 +56,7 @@ macro(protected, protected_, TOK_STRICT_RESERVED) \ macro(public, public_, TOK_STRICT_RESERVED) \ macro(static, static_, TOK_STRICT_RESERVED) \ + macro(await, await, TOK_AWAIT) \ /* \ * Yield is a token inside function*. Outside of a function*, it is a \ * future reserved keyword in strict mode, but a keyword in JS1.7 even \