mirror of
https://github.com/Tencent/rapidjson.git
synced 2025-03-06 13:41:35 +01:00
Merge branch 'nan-inf-parse-fix' into token-by-token-parsing
This commit is contained in:
commit
ecf3d64293
@ -1247,18 +1247,27 @@ private:
|
||||
}
|
||||
// Parse NaN or Infinity here
|
||||
else if ((parseFlags & kParseNanAndInfFlag) && RAPIDJSON_LIKELY((s.Peek() == 'I' || s.Peek() == 'N'))) {
|
||||
useNanOrInf = true;
|
||||
if (RAPIDJSON_LIKELY(Consume(s, 'N') && Consume(s, 'a') && Consume(s, 'N'))) {
|
||||
d = std::numeric_limits<double>::quiet_NaN();
|
||||
if (Consume(s, 'N')) {
|
||||
if (Consume(s, 'a') && Consume(s, 'N')) {
|
||||
d = std::numeric_limits<double>::quiet_NaN();
|
||||
useNanOrInf = true;
|
||||
}
|
||||
}
|
||||
else if (RAPIDJSON_LIKELY(Consume(s, 'I') && Consume(s, 'n') && Consume(s, 'f'))) {
|
||||
d = (minus ? -std::numeric_limits<double>::infinity() : std::numeric_limits<double>::infinity());
|
||||
if (RAPIDJSON_UNLIKELY(s.Peek() == 'i' && !(Consume(s, 'i') && Consume(s, 'n')
|
||||
&& Consume(s, 'i') && Consume(s, 't') && Consume(s, 'y'))))
|
||||
RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell());
|
||||
else if (RAPIDJSON_LIKELY(Consume(s, 'I'))) {
|
||||
if (Consume(s, 'n') && Consume(s, 'f')) {
|
||||
d = (minus ? -std::numeric_limits<double>::infinity() : std::numeric_limits<double>::infinity());
|
||||
useNanOrInf = true;
|
||||
|
||||
if (RAPIDJSON_UNLIKELY(s.Peek() == 'i' && !(Consume(s, 'i') && Consume(s, 'n')
|
||||
&& Consume(s, 'i') && Consume(s, 't') && Consume(s, 'y')))) {
|
||||
RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell());
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
if (RAPIDJSON_UNLIKELY(!useNanOrInf)) {
|
||||
RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell());
|
||||
}
|
||||
}
|
||||
else
|
||||
RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell());
|
||||
|
@ -1877,6 +1877,10 @@ TEST(Reader, ParseNanAndInfinity) {
|
||||
TEST_NAN_INF("Infinity", inf);
|
||||
TEST_NAN_INF("-Inf", -inf);
|
||||
TEST_NAN_INF("-Infinity", -inf);
|
||||
TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NInf", 1);
|
||||
TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NaInf", 2);
|
||||
TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "INan", 1);
|
||||
TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "InNan", 2);
|
||||
TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "nan", 1);
|
||||
TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "-nan", 1);
|
||||
TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NAN", 1);
|
||||
|
Loading…
x
Reference in New Issue
Block a user