mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-21 01:05:45 +00:00
Bug 1403911 - Part 12: Inline RegExp flag validation and correct return type. r=jandem
--HG-- extra : rebase_source : 2a4f230705de05951b05094daf67cd10a94031bd
This commit is contained in:
parent
315414bde6
commit
d607068c85
@ -1347,47 +1347,39 @@ js::CloneRegExpObject(JSContext* cx, Handle<RegExpObject*> regex)
|
||||
return clone;
|
||||
}
|
||||
|
||||
static bool
|
||||
HandleRegExpFlag(RegExpFlag flag, RegExpFlag* flags)
|
||||
{
|
||||
if (*flags & flag)
|
||||
return false;
|
||||
*flags = RegExpFlag(*flags | flag);
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename CharT>
|
||||
static size_t
|
||||
ParseRegExpFlags(const CharT* chars, size_t length, RegExpFlag* flagsOut, char16_t* lastParsedOut)
|
||||
static bool
|
||||
ParseRegExpFlags(const CharT* chars, size_t length, RegExpFlag* flagsOut, char16_t* invalidFlag)
|
||||
{
|
||||
*flagsOut = RegExpFlag(0);
|
||||
|
||||
for (size_t i = 0; i < length; i++) {
|
||||
*lastParsedOut = chars[i];
|
||||
RegExpFlag flag;
|
||||
switch (chars[i]) {
|
||||
case 'i':
|
||||
if (!HandleRegExpFlag(IgnoreCaseFlag, flagsOut))
|
||||
return false;
|
||||
flag = IgnoreCaseFlag;
|
||||
break;
|
||||
case 'g':
|
||||
if (!HandleRegExpFlag(GlobalFlag, flagsOut))
|
||||
return false;
|
||||
flag = GlobalFlag;
|
||||
break;
|
||||
case 'm':
|
||||
if (!HandleRegExpFlag(MultilineFlag, flagsOut))
|
||||
return false;
|
||||
flag = MultilineFlag;
|
||||
break;
|
||||
case 'y':
|
||||
if (!HandleRegExpFlag(StickyFlag, flagsOut))
|
||||
return false;
|
||||
flag = StickyFlag;
|
||||
break;
|
||||
case 'u':
|
||||
if (!HandleRegExpFlag(UnicodeFlag, flagsOut))
|
||||
return false;
|
||||
flag = UnicodeFlag;
|
||||
break;
|
||||
default:
|
||||
*invalidFlag = chars[i];
|
||||
return false;
|
||||
}
|
||||
if (*flagsOut & flag) {
|
||||
*invalidFlag = chars[i];
|
||||
return false;
|
||||
}
|
||||
*flagsOut = RegExpFlag(*flagsOut | flag);
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -1403,17 +1395,17 @@ js::ParseRegExpFlags(JSContext* cx, JSString* flagStr, RegExpFlag* flagsOut)
|
||||
size_t len = linear->length();
|
||||
|
||||
bool ok;
|
||||
char16_t lastParsed;
|
||||
char16_t invalidFlag;
|
||||
if (linear->hasLatin1Chars()) {
|
||||
AutoCheckCannotGC nogc;
|
||||
ok = ::ParseRegExpFlags(linear->latin1Chars(nogc), len, flagsOut, &lastParsed);
|
||||
ok = ::ParseRegExpFlags(linear->latin1Chars(nogc), len, flagsOut, &invalidFlag);
|
||||
} else {
|
||||
AutoCheckCannotGC nogc;
|
||||
ok = ::ParseRegExpFlags(linear->twoByteChars(nogc), len, flagsOut, &lastParsed);
|
||||
ok = ::ParseRegExpFlags(linear->twoByteChars(nogc), len, flagsOut, &invalidFlag);
|
||||
}
|
||||
|
||||
if (!ok) {
|
||||
TwoByteChars range(&lastParsed, 1);
|
||||
TwoByteChars range(&invalidFlag, 1);
|
||||
UniqueChars utf8(JS::CharsToNewUTF8CharsZ(nullptr, range).c_str());
|
||||
if (!utf8)
|
||||
return false;
|
||||
|
Loading…
Reference in New Issue
Block a user