MathLib::characterLiteralToLongNumber now reports more specific error messages for unsupported unicode literals (see #7162)
This commit is contained in:
parent
714579401f
commit
517922feb6
114
lib/mathlib.cpp
114
lib/mathlib.cpp
|
@ -316,73 +316,81 @@ MathLib::biguint MathLib::toULongNumber(const std::string & str)
|
|||
|
||||
MathLib::bigint MathLib::characterLiteralToLongNumber(const std::string& str)
|
||||
{
|
||||
if (str.empty())
|
||||
return 0; // for unit-testing...
|
||||
if (str.size()==1)
|
||||
return str[0] & 0xff;
|
||||
if (str[0] != '\\')
|
||||
throw InternalError(0, "Internal Error. MathLib::toLongNumber: Unhandled char constant " + str);
|
||||
|
||||
if (str[1]=='x') {
|
||||
switch (str[1]) {
|
||||
case 'x':
|
||||
return toLongNumber("0x" + str.substr(2));
|
||||
}
|
||||
char c;
|
||||
switch (str.size()-1) {
|
||||
case 1:
|
||||
switch (str[1]) {
|
||||
case '0':
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
return str[1]-'0';
|
||||
case 'a':
|
||||
c = '\a';
|
||||
case 'u': // 16bit unicode character
|
||||
throw InternalError(0, "Internal Error. MathLib::toLongNumber: Unhandled 16-bit unicode char constant " + str);
|
||||
case 'U': // 16bit unicode character
|
||||
throw InternalError(0, "Internal Error. MathLib::toLongNumber: Unhandled 32-bit unicode char constant " + str);
|
||||
default: {
|
||||
char c;
|
||||
switch (str.size()-1) {
|
||||
case 1:
|
||||
switch (str[1]) {
|
||||
case '0':
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
return str[1]-'0';
|
||||
case 'a':
|
||||
c = '\a';
|
||||
break;
|
||||
case 'b':
|
||||
c = '\b';
|
||||
break;
|
||||
case 'f':
|
||||
c = '\f';
|
||||
break;
|
||||
case 'n':
|
||||
c = '\n';
|
||||
break;
|
||||
case 'r':
|
||||
c = '\r';
|
||||
break;
|
||||
case 't':
|
||||
c = '\t';
|
||||
break;
|
||||
case 'v':
|
||||
c = '\v';
|
||||
break;
|
||||
case '\\':
|
||||
case '\?':
|
||||
case '\'':
|
||||
case '\"':
|
||||
c = str[1];
|
||||
break;
|
||||
default:
|
||||
throw InternalError(0, "Internal Error. MathLib::toLongNumber: Unhandled char constant " + str);
|
||||
break;
|
||||
}
|
||||
return c & 0xff;
|
||||
case 2:
|
||||
if (isOctalDigit(str[1]) && isOctalDigit(str[2]))
|
||||
return toLongNumber("0" + str.substr(1));
|
||||
break;
|
||||
case 'b':
|
||||
c = '\b';
|
||||
break;
|
||||
case 'f':
|
||||
c = '\f';
|
||||
break;
|
||||
case 'n':
|
||||
c = '\n';
|
||||
break;
|
||||
case 'r':
|
||||
c = '\r';
|
||||
break;
|
||||
case 't':
|
||||
c = '\t';
|
||||
break;
|
||||
case 'v':
|
||||
c = '\v';
|
||||
break;
|
||||
case '\\':
|
||||
case '\?':
|
||||
case '\'':
|
||||
case '\"':
|
||||
c = str[1];
|
||||
break;
|
||||
default:
|
||||
throw InternalError(0, "Internal Error. MathLib::toLongNumber: Unhandled char constant " + str);
|
||||
case 3:
|
||||
if (isOctalDigit(str[1]) && isOctalDigit(str[2]) && isOctalDigit(str[3]))
|
||||
return toLongNumber("0" + str.substr(1));
|
||||
break;
|
||||
}
|
||||
return c & 0xff;
|
||||
case 2:
|
||||
if (isOctalDigit(str[1]) && isOctalDigit(str[2]))
|
||||
return toLongNumber("0" + str.substr(1));
|
||||
break;
|
||||
case 3:
|
||||
if (isOctalDigit(str[1]) && isOctalDigit(str[2]) && isOctalDigit(str[3]))
|
||||
return toLongNumber("0" + str.substr(1));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
throw InternalError(0, "Internal Error. MathLib::toLongNumber: Unhandled char constant " + str);
|
||||
}
|
||||
|
||||
|
||||
MathLib::bigint MathLib::toLongNumber(const std::string & str)
|
||||
{
|
||||
// hexadecimal numbers:
|
||||
|
|
|
@ -282,6 +282,8 @@ private:
|
|||
ASSERT_EQUALS((int)('\134'), MathLib::toLongNumber("'\\134'"));
|
||||
ASSERT_THROW(MathLib::toLongNumber("'\\9'"), InternalError);
|
||||
ASSERT_THROW(MathLib::toLongNumber("'\\934'"), InternalError);
|
||||
ASSERT_THROW(MathLib::toLongNumber("'\\u9343'"), InternalError);
|
||||
ASSERT_THROW(MathLib::toLongNumber("'\\U0001f34c'"), InternalError);
|
||||
|
||||
ASSERT_EQUALS(-8552249625308161526, MathLib::toLongNumber("0x89504e470d0a1a0a"));
|
||||
ASSERT_EQUALS(-8481036456200365558, MathLib::toLongNumber("0x8a4d4e470d0a1a0a"));
|
||||
|
|
Loading…
Reference in New Issue