Merge branch 'nan-inf-parse-fix' into token-by-token-parsing
This commit is contained in:
commit
ecf3d64293
@ -1247,19 +1247,28 @@ private:
|
|||||||
}
|
}
|
||||||
// Parse NaN or Infinity here
|
// Parse NaN or Infinity here
|
||||||
else if ((parseFlags & kParseNanAndInfFlag) && RAPIDJSON_LIKELY((s.Peek() == 'I' || s.Peek() == 'N'))) {
|
else if ((parseFlags & kParseNanAndInfFlag) && RAPIDJSON_LIKELY((s.Peek() == 'I' || s.Peek() == 'N'))) {
|
||||||
useNanOrInf = true;
|
if (Consume(s, 'N')) {
|
||||||
if (RAPIDJSON_LIKELY(Consume(s, 'N') && Consume(s, 'a') && Consume(s, 'N'))) {
|
if (Consume(s, 'a') && Consume(s, 'N')) {
|
||||||
d = std::numeric_limits<double>::quiet_NaN();
|
d = std::numeric_limits<double>::quiet_NaN();
|
||||||
|
useNanOrInf = true;
|
||||||
}
|
}
|
||||||
else if (RAPIDJSON_LIKELY(Consume(s, 'I') && Consume(s, 'n') && Consume(s, 'f'))) {
|
}
|
||||||
|
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());
|
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')
|
if (RAPIDJSON_UNLIKELY(s.Peek() == 'i' && !(Consume(s, 'i') && Consume(s, 'n')
|
||||||
&& Consume(s, 'i') && Consume(s, 't') && Consume(s, 'y'))))
|
&& Consume(s, 'i') && Consume(s, 't') && Consume(s, 'y')))) {
|
||||||
RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell());
|
RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell());
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RAPIDJSON_UNLIKELY(!useNanOrInf)) {
|
||||||
RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell());
|
RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell());
|
RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell());
|
||||||
|
|
||||||
|
@ -1877,6 +1877,10 @@ TEST(Reader, ParseNanAndInfinity) {
|
|||||||
TEST_NAN_INF("Infinity", inf);
|
TEST_NAN_INF("Infinity", inf);
|
||||||
TEST_NAN_INF("-Inf", -inf);
|
TEST_NAN_INF("-Inf", -inf);
|
||||||
TEST_NAN_INF("-Infinity", -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);
|
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