Bug 1403911 - Part 12: Inline RegExp flag validation and correct return type. r=jandem

--HG--
extra : rebase_source : 2a4f230705de05951b05094daf67cd10a94031bd
This commit is contained in:
André Bargull 2017-10-03 16:11:08 +02:00
parent 315414bde6
commit d607068c85

View File

@ -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;