Add ES6 extended (braced) unicode literals.

This adds support for the form \u{xxxxxx}
This commit is contained in:
Pale Moon
2016-09-09 11:22:26 +02:00
committed by roytam1
parent 1745c31a25
commit 5c82426d94
3 changed files with 114 additions and 0 deletions
+49
View File
@@ -1656,6 +1656,37 @@ TokenStream::getTokenInternal(TokenKind* ttp, Modifier modifier)
return false;
}
bool
TokenStream::getBracedUnicode(uint32_t* cp)
{
consumeKnownChar('{');
bool first = true;
int32_t c;
uint32_t code = 0;
while (true) {
c = getCharIgnoreEOL();
if (c == EOF)
return false;
if (c == '}') {
if (first)
return false;
break;
}
if (!JS7_ISHEX(c))
return false;
code = (code << 4) | JS7_UNHEX(c);
if (code > 0x10FFFF)
return false;
first = false;
}
*cp = code;
return true;
}
bool
TokenStream::getStringOrTemplateToken(int untilChar, Token** tp)
{
@@ -1693,6 +1724,24 @@ TokenStream::getStringOrTemplateToken(int untilChar, Token** tp)
// Unicode character specification.
case 'u': {
if (peekChar() == '{') {
uint32_t code;
if (!getBracedUnicode(&code)) {
reportError(JSMSG_MALFORMED_ESCAPE, "Unicode");
return false;
}
MOZ_ASSERT(code <= 0x10FFFF);
if (code < 0x10000) {
c = code;
} else {
if (!tokenbuf.append((code - 0x10000) / 1024 + 0xD800))
return false;
c = ((code - 0x10000) % 1024) + 0xDC00;
}
break;
}
char16_t cp[4];
if (peekChars(4, cp) &&
JS7_ISHEX(cp[0]) && JS7_ISHEX(cp[1]) && JS7_ISHEX(cp[2]) && JS7_ISHEX(cp[3]))