70 lines
2.7 KiB
Diff
70 lines
2.7 KiB
Diff
|
From 08d36a6540644f636466d118f1fa92d23060e24a Mon Sep 17 00:00:00 2001
|
||
|
From: Christoph Oelckers <coelckers@users.noreply.github.com>
|
||
|
Date: Sat, 1 Apr 2023 12:45:55 +0200
|
||
|
Subject: [PATCH 47/51] - backported RapidJSON fix from Raze.
|
||
|
|
||
|
---
|
||
|
src/common/thirdparty/rapidjson/writer.h | 36 +++++++++++++++---------
|
||
|
1 file changed, 22 insertions(+), 14 deletions(-)
|
||
|
|
||
|
diff --git a/src/common/thirdparty/rapidjson/writer.h b/src/common/thirdparty/rapidjson/writer.h
|
||
|
index 50f6af989..bbc944979 100644
|
||
|
--- a/src/common/thirdparty/rapidjson/writer.h
|
||
|
+++ b/src/common/thirdparty/rapidjson/writer.h
|
||
|
@@ -552,30 +552,38 @@ inline bool Writer<StringBuffer>::WriteUint64(uint64_t u) {
|
||
|
|
||
|
template<>
|
||
|
inline bool Writer<StringBuffer>::WriteDouble(double d) {
|
||
|
+ bool ret = true;
|
||
|
if (internal::Double(d).IsNanOrInf()) {
|
||
|
// Note: This code path can only be reached if (RAPIDJSON_WRITE_DEFAULT_FLAGS & kWriteNanAndInfFlag).
|
||
|
if (!(kWriteDefaultFlags & kWriteNanAndInfFlag))
|
||
|
- return false;
|
||
|
- if (internal::Double(d).IsNan()) {
|
||
|
- PutReserve(*os_, 3);
|
||
|
- PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N');
|
||
|
- return true;
|
||
|
- }
|
||
|
- if (internal::Double(d).Sign()) {
|
||
|
- PutReserve(*os_, 9);
|
||
|
- PutUnsafe(*os_, '-');
|
||
|
+ {
|
||
|
+ // if we abort here, the writer is left in a broken state, unable to recover, so better write a 0 in addition to returning an error.
|
||
|
+ ret = false;
|
||
|
+ d = 0;
|
||
|
}
|
||
|
else
|
||
|
- PutReserve(*os_, 8);
|
||
|
- PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f');
|
||
|
- PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y');
|
||
|
- return true;
|
||
|
+ {
|
||
|
+ if (internal::Double(d).IsNan()) {
|
||
|
+ PutReserve(*os_, 3);
|
||
|
+ PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N');
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+ if (internal::Double(d).Sign()) {
|
||
|
+ PutReserve(*os_, 9);
|
||
|
+ PutUnsafe(*os_, '-');
|
||
|
+ }
|
||
|
+ else
|
||
|
+ PutReserve(*os_, 8);
|
||
|
+ PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f');
|
||
|
+ PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y');
|
||
|
+ return true;
|
||
|
+ }
|
||
|
}
|
||
|
|
||
|
char *buffer = os_->Push(25);
|
||
|
char* end = internal::dtoa(d, buffer, maxDecimalPlaces_);
|
||
|
os_->Pop(static_cast<size_t>(25 - (end - buffer)));
|
||
|
- return true;
|
||
|
+ return ret;
|
||
|
}
|
||
|
|
||
|
#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42)
|
||
|
--
|
||
|
2.39.3
|
||
|
|