mirror of
https://github.com/Tencent/rapidjson.git
synced 2025-03-10 03:29:59 +01:00
Merge pull request #510 from miloyip/issue509_writingnaninf
Fix #509 by checking Nan/Inf when writing a double
This commit is contained in:
commit
8fbe442925
@ -40,6 +40,7 @@ public:
|
|||||||
|
|
||||||
bool IsNan() const { return (u_ & kExponentMask) == kExponentMask && Significand() != 0; }
|
bool IsNan() const { return (u_ & kExponentMask) == kExponentMask && Significand() != 0; }
|
||||||
bool IsInf() const { return (u_ & kExponentMask) == kExponentMask && Significand() == 0; }
|
bool IsInf() const { return (u_ & kExponentMask) == kExponentMask && Significand() == 0; }
|
||||||
|
bool IsNanOrInf() const { return (u_ & kExponentMask) == kExponentMask; }
|
||||||
bool IsNormal() const { return (u_ & kExponentMask) != 0 || Significand() == 0; }
|
bool IsNormal() const { return (u_ & kExponentMask) != 0 || Significand() == 0; }
|
||||||
bool IsZero() const { return (u_ & (kExponentMask | kSignificandMask)) == 0; }
|
bool IsZero() const { return (u_ & (kExponentMask | kSignificandMask)) == 0; }
|
||||||
|
|
||||||
|
@ -235,6 +235,9 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool WriteDouble(double d) {
|
bool WriteDouble(double d) {
|
||||||
|
if (internal::Double(d).IsNanOrInf())
|
||||||
|
return false;
|
||||||
|
|
||||||
char buffer[25];
|
char buffer[25];
|
||||||
char* end = internal::dtoa(d, buffer);
|
char* end = internal::dtoa(d, buffer);
|
||||||
for (char* p = buffer; p != end; ++p)
|
for (char* p = buffer; p != end; ++p)
|
||||||
@ -381,6 +384,9 @@ inline bool Writer<StringBuffer>::WriteUint64(uint64_t u) {
|
|||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline bool Writer<StringBuffer>::WriteDouble(double d) {
|
inline bool Writer<StringBuffer>::WriteDouble(double d) {
|
||||||
|
if (internal::Double(d).IsNanOrInf())
|
||||||
|
return false;
|
||||||
|
|
||||||
char *buffer = os_->Push(25);
|
char *buffer = os_->Push(25);
|
||||||
char* end = internal::dtoa(d, buffer);
|
char* end = internal::dtoa(d, buffer);
|
||||||
os_->Pop(static_cast<size_t>(25 - (end - buffer)));
|
os_->Pop(static_cast<size_t>(25 - (end - buffer)));
|
||||||
|
@ -375,3 +375,28 @@ TEST(Writer, InvalidEventSequence) {
|
|||||||
EXPECT_FALSE(writer.IsComplete());
|
EXPECT_FALSE(writer.IsComplete());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern double zero; // clang -Wmissing-variable-declarations
|
||||||
|
double zero = 0.0; // Use global variable to prevent compiler warning
|
||||||
|
|
||||||
|
TEST(Writer, NaN) {
|
||||||
|
double nan = zero / zero;
|
||||||
|
EXPECT_TRUE(internal::Double(nan).IsNan());
|
||||||
|
StringBuffer buffer;
|
||||||
|
Writer<StringBuffer> writer(buffer);
|
||||||
|
EXPECT_FALSE(writer.Double(nan));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(Writer, Inf) {
|
||||||
|
double inf = 1.0 / zero;
|
||||||
|
EXPECT_TRUE(internal::Double(inf).IsInf());
|
||||||
|
StringBuffer buffer;
|
||||||
|
{
|
||||||
|
Writer<StringBuffer> writer(buffer);
|
||||||
|
EXPECT_FALSE(writer.Double(inf));
|
||||||
|
}
|
||||||
|
{
|
||||||
|
Writer<StringBuffer> writer(buffer);
|
||||||
|
EXPECT_FALSE(writer.Double(-inf));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user