diff --git a/js/src/frontend/TokenStream.cpp b/js/src/frontend/TokenStream.cpp index 1b8c7aaa87ce..5d09d2a3e810 100644 --- a/js/src/frontend/TokenStream.cpp +++ b/js/src/frontend/TokenStream.cpp @@ -1431,20 +1431,18 @@ TokenStreamSpecific::identifierName(TokenStart start, } } - const CharT* chars; - size_t length; - if (escaping == IdentifierEscapes::SawUnicodeEscape) { + JSAtom* atom; + if (MOZ_UNLIKELY(escaping == IdentifierEscapes::SawUnicodeEscape)) { // Identifiers containing Unicode escapes have to be converted into // tokenbuf before atomizing. if (!putIdentInCharBuffer(identStart)) return false; - chars = charBuffer.begin(); - length = charBuffer.length(); + atom = drainCharBufferIntoAtom(anyCharsAccess().cx); } else { // Escape-free identifiers can be created directly from sourceUnits. - chars = identStart; - length = sourceUnits.addressOfNextCodeUnit() - identStart; + const CharT* chars = identStart; + size_t length = sourceUnits.addressOfNextCodeUnit() - identStart; // Represent reserved words lacking escapes as reserved word tokens. if (const ReservedWordInfo* rw = FindReservedWord(chars, length)) { @@ -1452,9 +1450,9 @@ TokenStreamSpecific::identifierName(TokenStart start, newSimpleToken(rw->tokentype, start, modifier, out); return true; } - } - JSAtom* atom = atomizeChars(anyCharsAccess().cx, chars, length); + atom = atomizeChars(anyCharsAccess().cx, chars, length); + } if (!atom) return false; @@ -2612,7 +2610,7 @@ TokenStreamSpecific::getStringOrTemplateToken(char untilC return false; } - JSAtom* atom = atomizeChars(anyCharsAccess().cx, charBuffer.begin(), charBuffer.length()); + JSAtom* atom = drainCharBufferIntoAtom(anyCharsAccess().cx); if (!atom) return false; diff --git a/js/src/frontend/TokenStream.h b/js/src/frontend/TokenStream.h index 054644551634..8de80e1d2705 100644 --- a/js/src/frontend/TokenStream.h +++ b/js/src/frontend/TokenStream.h @@ -1105,6 +1105,12 @@ class TokenStreamCharsShared return mozilla::IsAscii(unit); } + JSAtom* drainCharBufferIntoAtom(JSContext* cx) { + JSAtom* atom = AtomizeChars(cx, charBuffer.begin(), charBuffer.length()); + charBuffer.clear(); + return atom; + } + public: CharBuffer& getCharBuffer() { return charBuffer; } }; @@ -1538,6 +1544,7 @@ class MOZ_STACK_CLASS TokenStreamSpecific using CharsBase::consumeKnownCodeUnit; using GeneralCharsBase::consumeRestOfSingleLineComment; using TokenStreamCharsShared::copyCharBufferTo; + using TokenStreamCharsShared::drainCharBufferIntoAtom; using CharsBase::fillCharBufferWithTemplateStringContents; using SpecializedCharsBase::getCodePoint; using GeneralCharsBase::getCodeUnit; @@ -1662,7 +1669,7 @@ class MOZ_STACK_CLASS TokenStreamSpecific if (!fillCharBufferWithTemplateStringContents(cur, end)) return nullptr; - return atomizeChars(anyChars.cx, charBuffer.begin(), charBuffer.length()); + return drainCharBufferIntoAtom(anyChars.cx); } private: