1326454 - Rename TokenStream::getBracedUnicode to TokenStream::matchBracedUnicode and make its signature fallible.

This commit is contained in:
Gaming4JC 2019-06-08 15:48:25 -04:00 committed by Roy Tam
commit 3d4f7e67fc
5 changed files with 51 additions and 21 deletions

View file

@ -821,6 +821,19 @@ TokenStream::error(unsigned errorNumber, ...)
va_end(args);
}
void
TokenStream::errorAt(uint32_t offset, unsigned errorNumber, ...)
{
va_list args;
va_start(args, errorNumber);
#ifdef DEBUG
bool result =
#endif
reportCompileErrorNumberVA(offset, JSREPORT_ERROR, errorNumber, args);
MOZ_ASSERT(!result, "reporting an error returned true?");
va_end(args);
}
// We have encountered a '\': check for a Unicode escape sequence after it.
// Return the length of the escape sequence and the character code point (by
// value) if we found a Unicode escape sequence. Otherwise, return 0. In both
@ -1869,32 +1882,47 @@ TokenStream::getTokenInternal(TokenKind* ttp, Modifier modifier)
}
bool
TokenStream::getBracedUnicode(uint32_t* cp)
TokenStream::matchBracedUnicode(bool* matched, uint32_t* cp)
{
if (peekChar() != '{') {
*matched = false;
return true;
}
consumeKnownChar('{');
uint32_t start = userbuf.offset();
bool first = true;
int32_t c;
uint32_t code = 0;
while (true) {
c = getCharIgnoreEOL();
if (c == EOF)
do {
int32_t c = getCharIgnoreEOL();
if (c == EOF) {
error(JSMSG_MALFORMED_ESCAPE, "Unicode");
return false;
}
if (c == '}') {
if (first)
if (first) {
error(JSMSG_MALFORMED_ESCAPE, "Unicode");
return false;
}
break;
}
if (!JS7_ISHEX(c))
if (!JS7_ISHEX(c)) {
error(JSMSG_MALFORMED_ESCAPE, "Unicode");
return false;
}
code = (code << 4) | JS7_UNHEX(c);
if (code > unicode::NonBMPMax)
if (code > unicode::NonBMPMax) {
errorAt(start, JSMSG_UNICODE_OVERFLOW, "escape sequence");
return false;
}
first = false;
}
} while (true);
*matched = true;
*cp = code;
return true;
}
@ -1936,12 +1964,11 @@ TokenStream::getStringOrTemplateToken(int untilChar, Token** tp)
// Unicode character specification.
case 'u': {
if (peekChar() == '{') {
uint32_t code;
if (!getBracedUnicode(&code)) {
error(JSMSG_MALFORMED_ESCAPE, "Unicode");
return false;
}
bool matched;
uint32_t code;
if (!matchBracedUnicode(&matched, &code))
return false;
if (matched) {
MOZ_ASSERT(code <= unicode::NonBMPMax);
if (code < unicode::NonBMPMin) {