Apply changes from latest known public version of bounce dated 2019-11-13
This commit is contained in:
		
							
								
								
									
										4
									
								
								external/rapidjson/internal/biginteger.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								external/rapidjson/internal/biginteger.h
									
									
									
									
										vendored
									
									
								
							| @@ -17,7 +17,7 @@ | ||||
|  | ||||
| #include "../rapidjson.h" | ||||
|  | ||||
| #if defined(_MSC_VER) && defined(_M_AMD64) | ||||
| #if defined(_MSC_VER) && !__INTEL_COMPILER && defined(_M_AMD64) | ||||
| #include <intrin.h> // for _umul128 | ||||
| #pragma intrinsic(_umul128) | ||||
| #endif | ||||
| @@ -133,7 +133,7 @@ public: | ||||
|         RAPIDJSON_ASSERT(count_ + offset <= kCapacity); | ||||
|  | ||||
|         if (interShift == 0) { | ||||
|             std::memmove(&digits_[count_ - 1 + offset], &digits_[count_ - 1], count_ * sizeof(Type)); | ||||
|             std::memmove(digits_ + offset, digits_, count_ * sizeof(Type)); | ||||
|             count_ += offset; | ||||
|         } | ||||
|         else { | ||||
|   | ||||
							
								
								
									
										37
									
								
								external/rapidjson/internal/diyfp.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								external/rapidjson/internal/diyfp.h
									
									
									
									
										vendored
									
									
								
							| @@ -1,5 +1,5 @@ | ||||
| // Tencent is pleased to support the open source community by making RapidJSON available. | ||||
| //  | ||||
| // | ||||
| // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. | ||||
| // | ||||
| // Licensed under the MIT License (the "License"); you may not use this file except | ||||
| @@ -7,9 +7,9 @@ | ||||
| // | ||||
| // http://opensource.org/licenses/MIT | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software distributed  | ||||
| // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR  | ||||
| // CONDITIONS OF ANY KIND, either express or implied. See the License for the  | ||||
| // Unless required by applicable law or agreed to in writing, software distributed | ||||
| // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR | ||||
| // CONDITIONS OF ANY KIND, either express or implied. See the License for the | ||||
| // specific language governing permissions and limitations under the License. | ||||
|  | ||||
| // This is a C++ header-only implementation of Grisu2 algorithm from the publication: | ||||
| @@ -20,8 +20,9 @@ | ||||
| #define RAPIDJSON_DIYFP_H_ | ||||
|  | ||||
| #include "../rapidjson.h" | ||||
| #include <limits> | ||||
|  | ||||
| #if defined(_MSC_VER) && defined(_M_AMD64) | ||||
| #if defined(_MSC_VER) && defined(_M_AMD64) && !defined(__INTEL_COMPILER) | ||||
| #include <intrin.h> | ||||
| #pragma intrinsic(_BitScanReverse64) | ||||
| #pragma intrinsic(_umul128) | ||||
| @@ -56,7 +57,7 @@ struct DiyFp { | ||||
|         if (biased_e != 0) { | ||||
|             f = significand + kDpHiddenBit; | ||||
|             e = biased_e - kDpExponentBias; | ||||
|         }  | ||||
|         } | ||||
|         else { | ||||
|             f = significand; | ||||
|             e = kDpMinExponent + 1; | ||||
| @@ -99,6 +100,7 @@ struct DiyFp { | ||||
|     } | ||||
|  | ||||
|     DiyFp Normalize() const { | ||||
|         RAPIDJSON_ASSERT(f != 0); // https://stackoverflow.com/a/26809183/291737 | ||||
| #if defined(_MSC_VER) && defined(_M_AMD64) | ||||
|         unsigned long index; | ||||
|         _BitScanReverse64(&index, f); | ||||
| @@ -141,7 +143,16 @@ struct DiyFp { | ||||
|             double d; | ||||
|             uint64_t u64; | ||||
|         }u; | ||||
|         const uint64_t be = (e == kDpDenormalExponent && (f & kDpHiddenBit) == 0) ? 0 :  | ||||
|         RAPIDJSON_ASSERT(f <= kDpHiddenBit + kDpSignificandMask); | ||||
|         if (e < kDpDenormalExponent) { | ||||
|             // Underflow. | ||||
|             return 0.0; | ||||
|         } | ||||
|         if (e >= kDpMaxExponent) { | ||||
|             // Overflow. | ||||
|             return std::numeric_limits<double>::infinity(); | ||||
|         } | ||||
|         const uint64_t be = (e == kDpDenormalExponent && (f & kDpHiddenBit) == 0) ? 0 : | ||||
|             static_cast<uint64_t>(e + kDpExponentBias); | ||||
|         u.u64 = (f & kDpSignificandMask) | (be << kDpSignificandSize); | ||||
|         return u.d; | ||||
| @@ -220,9 +231,10 @@ inline DiyFp GetCachedPowerByIndex(size_t index) { | ||||
|         641,   667,   694,   720,   747,   774,   800,   827,   853,   880, | ||||
|         907,   933,   960,   986,  1013,  1039,  1066 | ||||
|     }; | ||||
|     RAPIDJSON_ASSERT(index < 87); | ||||
|     return DiyFp(kCachedPowers_F[index], kCachedPowers_E[index]); | ||||
| } | ||||
|      | ||||
|  | ||||
| inline DiyFp GetCachedPower(int e, int* K) { | ||||
|  | ||||
|     //int k = static_cast<int>(ceil((-61 - e) * 0.30102999566398114)) + 374; | ||||
| @@ -238,10 +250,11 @@ inline DiyFp GetCachedPower(int e, int* K) { | ||||
| } | ||||
|  | ||||
| inline DiyFp GetCachedPower10(int exp, int *outExp) { | ||||
|      unsigned index = (static_cast<unsigned>(exp) + 348u) / 8u; | ||||
|      *outExp = -348 + static_cast<int>(index) * 8; | ||||
|      return GetCachedPowerByIndex(index); | ||||
|  } | ||||
|     RAPIDJSON_ASSERT(exp >= -348); | ||||
|     unsigned index = static_cast<unsigned>(exp + 348) / 8u; | ||||
|     *outExp = -348 + static_cast<int>(index) * 8; | ||||
|     return GetCachedPowerByIndex(index); | ||||
| } | ||||
|  | ||||
| #ifdef __GNUC__ | ||||
| RAPIDJSON_DIAG_POP | ||||
|   | ||||
							
								
								
									
										82
									
								
								external/rapidjson/internal/itoa.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										82
									
								
								external/rapidjson/internal/itoa.h
									
									
									
									
										vendored
									
									
								
							| @@ -1,5 +1,5 @@ | ||||
| // Tencent is pleased to support the open source community by making RapidJSON available. | ||||
| //  | ||||
| // | ||||
| // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. | ||||
| // | ||||
| // Licensed under the MIT License (the "License"); you may not use this file except | ||||
| @@ -7,9 +7,9 @@ | ||||
| // | ||||
| // http://opensource.org/licenses/MIT | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software distributed  | ||||
| // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR  | ||||
| // CONDITIONS OF ANY KIND, either express or implied. See the License for the  | ||||
| // Unless required by applicable law or agreed to in writing, software distributed | ||||
| // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR | ||||
| // CONDITIONS OF ANY KIND, either express or implied. See the License for the | ||||
| // specific language governing permissions and limitations under the License. | ||||
|  | ||||
| #ifndef RAPIDJSON_ITOA_ | ||||
| @@ -37,12 +37,14 @@ inline const char* GetDigitsLut() { | ||||
| } | ||||
|  | ||||
| inline char* u32toa(uint32_t value, char* buffer) { | ||||
|     RAPIDJSON_ASSERT(buffer != 0); | ||||
|  | ||||
|     const char* cDigitsLut = GetDigitsLut(); | ||||
|  | ||||
|     if (value < 10000) { | ||||
|         const uint32_t d1 = (value / 100) << 1; | ||||
|         const uint32_t d2 = (value % 100) << 1; | ||||
|          | ||||
|  | ||||
|         if (value >= 1000) | ||||
|             *buffer++ = cDigitsLut[d1]; | ||||
|         if (value >= 100) | ||||
| @@ -55,13 +57,13 @@ inline char* u32toa(uint32_t value, char* buffer) { | ||||
|         // value = bbbbcccc | ||||
|         const uint32_t b = value / 10000; | ||||
|         const uint32_t c = value % 10000; | ||||
|          | ||||
|  | ||||
|         const uint32_t d1 = (b / 100) << 1; | ||||
|         const uint32_t d2 = (b % 100) << 1; | ||||
|          | ||||
|  | ||||
|         const uint32_t d3 = (c / 100) << 1; | ||||
|         const uint32_t d4 = (c % 100) << 1; | ||||
|          | ||||
|  | ||||
|         if (value >= 10000000) | ||||
|             *buffer++ = cDigitsLut[d1]; | ||||
|         if (value >= 1000000) | ||||
| @@ -69,7 +71,7 @@ inline char* u32toa(uint32_t value, char* buffer) { | ||||
|         if (value >= 100000) | ||||
|             *buffer++ = cDigitsLut[d2]; | ||||
|         *buffer++ = cDigitsLut[d2 + 1]; | ||||
|          | ||||
|  | ||||
|         *buffer++ = cDigitsLut[d3]; | ||||
|         *buffer++ = cDigitsLut[d3 + 1]; | ||||
|         *buffer++ = cDigitsLut[d4]; | ||||
| @@ -77,10 +79,10 @@ inline char* u32toa(uint32_t value, char* buffer) { | ||||
|     } | ||||
|     else { | ||||
|         // value = aabbbbcccc in decimal | ||||
|          | ||||
|  | ||||
|         const uint32_t a = value / 100000000; // 1 to 42 | ||||
|         value %= 100000000; | ||||
|          | ||||
|  | ||||
|         if (a >= 10) { | ||||
|             const unsigned i = a << 1; | ||||
|             *buffer++ = cDigitsLut[i]; | ||||
| @@ -91,13 +93,13 @@ inline char* u32toa(uint32_t value, char* buffer) { | ||||
|  | ||||
|         const uint32_t b = value / 10000; // 0 to 9999 | ||||
|         const uint32_t c = value % 10000; // 0 to 9999 | ||||
|          | ||||
|  | ||||
|         const uint32_t d1 = (b / 100) << 1; | ||||
|         const uint32_t d2 = (b % 100) << 1; | ||||
|          | ||||
|  | ||||
|         const uint32_t d3 = (c / 100) << 1; | ||||
|         const uint32_t d4 = (c % 100) << 1; | ||||
|          | ||||
|  | ||||
|         *buffer++ = cDigitsLut[d1]; | ||||
|         *buffer++ = cDigitsLut[d1 + 1]; | ||||
|         *buffer++ = cDigitsLut[d2]; | ||||
| @@ -111,6 +113,7 @@ inline char* u32toa(uint32_t value, char* buffer) { | ||||
| } | ||||
|  | ||||
| inline char* i32toa(int32_t value, char* buffer) { | ||||
|     RAPIDJSON_ASSERT(buffer != 0); | ||||
|     uint32_t u = static_cast<uint32_t>(value); | ||||
|     if (value < 0) { | ||||
|         *buffer++ = '-'; | ||||
| @@ -121,6 +124,7 @@ inline char* i32toa(int32_t value, char* buffer) { | ||||
| } | ||||
|  | ||||
| inline char* u64toa(uint64_t value, char* buffer) { | ||||
|     RAPIDJSON_ASSERT(buffer != 0); | ||||
|     const char* cDigitsLut = GetDigitsLut(); | ||||
|     const uint64_t  kTen8 = 100000000; | ||||
|     const uint64_t  kTen9 = kTen8 * 10; | ||||
| @@ -131,13 +135,13 @@ inline char* u64toa(uint64_t value, char* buffer) { | ||||
|     const uint64_t kTen14 = kTen8 * 1000000; | ||||
|     const uint64_t kTen15 = kTen8 * 10000000; | ||||
|     const uint64_t kTen16 = kTen8 * kTen8; | ||||
|      | ||||
|  | ||||
|     if (value < kTen8) { | ||||
|         uint32_t v = static_cast<uint32_t>(value); | ||||
|         if (v < 10000) { | ||||
|             const uint32_t d1 = (v / 100) << 1; | ||||
|             const uint32_t d2 = (v % 100) << 1; | ||||
|              | ||||
|  | ||||
|             if (v >= 1000) | ||||
|                 *buffer++ = cDigitsLut[d1]; | ||||
|             if (v >= 100) | ||||
| @@ -150,13 +154,13 @@ inline char* u64toa(uint64_t value, char* buffer) { | ||||
|             // value = bbbbcccc | ||||
|             const uint32_t b = v / 10000; | ||||
|             const uint32_t c = v % 10000; | ||||
|              | ||||
|  | ||||
|             const uint32_t d1 = (b / 100) << 1; | ||||
|             const uint32_t d2 = (b % 100) << 1; | ||||
|              | ||||
|  | ||||
|             const uint32_t d3 = (c / 100) << 1; | ||||
|             const uint32_t d4 = (c % 100) << 1; | ||||
|              | ||||
|  | ||||
|             if (value >= 10000000) | ||||
|                 *buffer++ = cDigitsLut[d1]; | ||||
|             if (value >= 1000000) | ||||
| @@ -164,7 +168,7 @@ inline char* u64toa(uint64_t value, char* buffer) { | ||||
|             if (value >= 100000) | ||||
|                 *buffer++ = cDigitsLut[d2]; | ||||
|             *buffer++ = cDigitsLut[d2 + 1]; | ||||
|              | ||||
|  | ||||
|             *buffer++ = cDigitsLut[d3]; | ||||
|             *buffer++ = cDigitsLut[d3 + 1]; | ||||
|             *buffer++ = cDigitsLut[d4]; | ||||
| @@ -174,22 +178,22 @@ inline char* u64toa(uint64_t value, char* buffer) { | ||||
|     else if (value < kTen16) { | ||||
|         const uint32_t v0 = static_cast<uint32_t>(value / kTen8); | ||||
|         const uint32_t v1 = static_cast<uint32_t>(value % kTen8); | ||||
|          | ||||
|  | ||||
|         const uint32_t b0 = v0 / 10000; | ||||
|         const uint32_t c0 = v0 % 10000; | ||||
|          | ||||
|  | ||||
|         const uint32_t d1 = (b0 / 100) << 1; | ||||
|         const uint32_t d2 = (b0 % 100) << 1; | ||||
|          | ||||
|  | ||||
|         const uint32_t d3 = (c0 / 100) << 1; | ||||
|         const uint32_t d4 = (c0 % 100) << 1; | ||||
|  | ||||
|         const uint32_t b1 = v1 / 10000; | ||||
|         const uint32_t c1 = v1 % 10000; | ||||
|          | ||||
|  | ||||
|         const uint32_t d5 = (b1 / 100) << 1; | ||||
|         const uint32_t d6 = (b1 % 100) << 1; | ||||
|          | ||||
|  | ||||
|         const uint32_t d7 = (c1 / 100) << 1; | ||||
|         const uint32_t d8 = (c1 % 100) << 1; | ||||
|  | ||||
| @@ -207,9 +211,8 @@ inline char* u64toa(uint64_t value, char* buffer) { | ||||
|             *buffer++ = cDigitsLut[d3 + 1]; | ||||
|         if (value >= kTen9) | ||||
|             *buffer++ = cDigitsLut[d4]; | ||||
|         if (value >= kTen8) | ||||
|             *buffer++ = cDigitsLut[d4 + 1]; | ||||
|          | ||||
|  | ||||
|         *buffer++ = cDigitsLut[d4 + 1]; | ||||
|         *buffer++ = cDigitsLut[d5]; | ||||
|         *buffer++ = cDigitsLut[d5 + 1]; | ||||
|         *buffer++ = cDigitsLut[d6]; | ||||
| @@ -222,7 +225,7 @@ inline char* u64toa(uint64_t value, char* buffer) { | ||||
|     else { | ||||
|         const uint32_t a = static_cast<uint32_t>(value / kTen16); // 1 to 1844 | ||||
|         value %= kTen16; | ||||
|          | ||||
|  | ||||
|         if (a < 10) | ||||
|             *buffer++ = static_cast<char>('0' + static_cast<char>(a)); | ||||
|         else if (a < 100) { | ||||
| @@ -232,7 +235,7 @@ inline char* u64toa(uint64_t value, char* buffer) { | ||||
|         } | ||||
|         else if (a < 1000) { | ||||
|             *buffer++ = static_cast<char>('0' + static_cast<char>(a / 100)); | ||||
|              | ||||
|  | ||||
|             const uint32_t i = (a % 100) << 1; | ||||
|             *buffer++ = cDigitsLut[i]; | ||||
|             *buffer++ = cDigitsLut[i + 1]; | ||||
| @@ -245,28 +248,28 @@ inline char* u64toa(uint64_t value, char* buffer) { | ||||
|             *buffer++ = cDigitsLut[j]; | ||||
|             *buffer++ = cDigitsLut[j + 1]; | ||||
|         } | ||||
|          | ||||
|  | ||||
|         const uint32_t v0 = static_cast<uint32_t>(value / kTen8); | ||||
|         const uint32_t v1 = static_cast<uint32_t>(value % kTen8); | ||||
|          | ||||
|  | ||||
|         const uint32_t b0 = v0 / 10000; | ||||
|         const uint32_t c0 = v0 % 10000; | ||||
|          | ||||
|  | ||||
|         const uint32_t d1 = (b0 / 100) << 1; | ||||
|         const uint32_t d2 = (b0 % 100) << 1; | ||||
|          | ||||
|  | ||||
|         const uint32_t d3 = (c0 / 100) << 1; | ||||
|         const uint32_t d4 = (c0 % 100) << 1; | ||||
|          | ||||
|  | ||||
|         const uint32_t b1 = v1 / 10000; | ||||
|         const uint32_t c1 = v1 % 10000; | ||||
|          | ||||
|  | ||||
|         const uint32_t d5 = (b1 / 100) << 1; | ||||
|         const uint32_t d6 = (b1 % 100) << 1; | ||||
|          | ||||
|  | ||||
|         const uint32_t d7 = (c1 / 100) << 1; | ||||
|         const uint32_t d8 = (c1 % 100) << 1; | ||||
|          | ||||
|  | ||||
|         *buffer++ = cDigitsLut[d1]; | ||||
|         *buffer++ = cDigitsLut[d1 + 1]; | ||||
|         *buffer++ = cDigitsLut[d2]; | ||||
| @@ -284,11 +287,12 @@ inline char* u64toa(uint64_t value, char* buffer) { | ||||
|         *buffer++ = cDigitsLut[d8]; | ||||
|         *buffer++ = cDigitsLut[d8 + 1]; | ||||
|     } | ||||
|      | ||||
|  | ||||
|     return buffer; | ||||
| } | ||||
|  | ||||
| inline char* i64toa(int64_t value, char* buffer) { | ||||
|     RAPIDJSON_ASSERT(buffer != 0); | ||||
|     uint64_t u = static_cast<uint64_t>(value); | ||||
|     if (value < 0) { | ||||
|         *buffer++ = '-'; | ||||
|   | ||||
							
								
								
									
										9
									
								
								external/rapidjson/internal/meta.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								external/rapidjson/internal/meta.h
									
									
									
									
										vendored
									
									
								
							| @@ -21,7 +21,8 @@ | ||||
| RAPIDJSON_DIAG_PUSH | ||||
| RAPIDJSON_DIAG_OFF(effc++) | ||||
| #endif | ||||
| #if defined(_MSC_VER) | ||||
|  | ||||
| #if defined(_MSC_VER) && !defined(__clang__) | ||||
| RAPIDJSON_DIAG_PUSH | ||||
| RAPIDJSON_DIAG_OFF(6334) | ||||
| #endif | ||||
| @@ -174,7 +175,11 @@ template <typename T> struct RemoveSfinaeTag<SfinaeTag&(*)(T)> { typedef T Type; | ||||
| RAPIDJSON_NAMESPACE_END | ||||
| //@endcond | ||||
|  | ||||
| #if defined(__GNUC__) || defined(_MSC_VER) | ||||
| #if defined(_MSC_VER) && !defined(__clang__) | ||||
| RAPIDJSON_DIAG_POP | ||||
| #endif | ||||
|  | ||||
| #ifdef __GNUC__ | ||||
| RAPIDJSON_DIAG_POP | ||||
| #endif | ||||
|  | ||||
|   | ||||
							
								
								
									
										37
									
								
								external/rapidjson/internal/regex.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								external/rapidjson/internal/regex.h
									
									
									
									
										vendored
									
									
								
							| @@ -24,16 +24,17 @@ RAPIDJSON_DIAG_PUSH | ||||
| RAPIDJSON_DIAG_OFF(padded) | ||||
| RAPIDJSON_DIAG_OFF(switch-enum) | ||||
| RAPIDJSON_DIAG_OFF(implicit-fallthrough) | ||||
| #elif defined(_MSC_VER) | ||||
| RAPIDJSON_DIAG_PUSH | ||||
| RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated | ||||
| #endif | ||||
|  | ||||
| #ifdef __GNUC__ | ||||
| RAPIDJSON_DIAG_PUSH | ||||
| RAPIDJSON_DIAG_OFF(effc++) | ||||
| #if __GNUC__ >= 7 | ||||
| RAPIDJSON_DIAG_OFF(implicit-fallthrough) | ||||
| #endif | ||||
|  | ||||
| #ifdef _MSC_VER | ||||
| RAPIDJSON_DIAG_PUSH | ||||
| RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated | ||||
| #endif | ||||
|  | ||||
| #ifndef RAPIDJSON_REGEX_VERBOSE | ||||
| @@ -117,7 +118,8 @@ public: | ||||
|     template <typename, typename> friend class GenericRegexSearch; | ||||
|  | ||||
|     GenericRegex(const Ch* source, Allocator* allocator = 0) :  | ||||
|         states_(allocator, 256), ranges_(allocator, 256), root_(kRegexInvalidState), stateCount_(), rangeCount_(),  | ||||
|         ownAllocator_(allocator ? 0 : RAPIDJSON_NEW(Allocator)()), allocator_(allocator ? allocator : ownAllocator_),  | ||||
|         states_(allocator_, 256), ranges_(allocator_, 256), root_(kRegexInvalidState), stateCount_(), rangeCount_(),  | ||||
|         anchorBegin_(), anchorEnd_() | ||||
|     { | ||||
|         GenericStringStream<Encoding> ss(source); | ||||
| @@ -125,7 +127,10 @@ public: | ||||
|         Parse(ds); | ||||
|     } | ||||
|  | ||||
|     ~GenericRegex() {} | ||||
|     ~GenericRegex() | ||||
|     { | ||||
|         RAPIDJSON_DELETE(ownAllocator_); | ||||
|     } | ||||
|  | ||||
|     bool IsValid() const { | ||||
|         return root_ != kRegexInvalidState; | ||||
| @@ -187,10 +192,9 @@ private: | ||||
|  | ||||
|     template <typename InputStream> | ||||
|     void Parse(DecodedStream<InputStream, Encoding>& ds) { | ||||
|         Allocator allocator; | ||||
|         Stack<Allocator> operandStack(&allocator, 256);     // Frag | ||||
|         Stack<Allocator> operatorStack(&allocator, 256);    // Operator | ||||
|         Stack<Allocator> atomCountStack(&allocator, 256);   // unsigned (Atom per parenthesis) | ||||
|         Stack<Allocator> operandStack(allocator_, 256);    // Frag | ||||
|         Stack<Allocator> operatorStack(allocator_, 256);   // Operator | ||||
|         Stack<Allocator> atomCountStack(allocator_, 256);  // unsigned (Atom per parenthesis) | ||||
|  | ||||
|         *atomCountStack.template Push<unsigned>() = 0; | ||||
|  | ||||
| @@ -391,8 +395,7 @@ private: | ||||
|                 } | ||||
|                 return false; | ||||
|  | ||||
|             default:  | ||||
|                 RAPIDJSON_ASSERT(op == kOneOrMore); | ||||
|             case kOneOrMore: | ||||
|                 if (operandStack.GetSize() >= sizeof(Frag)) { | ||||
|                     Frag e = *operandStack.template Pop<Frag>(1); | ||||
|                     SizeType s = NewState(kRegexInvalidState, e.start, 0); | ||||
| @@ -401,6 +404,10 @@ private: | ||||
|                     return true; | ||||
|                 } | ||||
|                 return false; | ||||
|  | ||||
|             default:  | ||||
|                 // syntax error (e.g. unclosed kLeftParenthesis) | ||||
|                 return false; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -581,6 +588,8 @@ private: | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     Allocator* ownAllocator_; | ||||
|     Allocator* allocator_; | ||||
|     Stack<Allocator> states_; | ||||
|     Stack<Allocator> ranges_; | ||||
|     SizeType root_; | ||||
| @@ -720,11 +729,11 @@ typedef GenericRegexSearch<Regex> RegexSearch; | ||||
| } // namespace internal | ||||
| RAPIDJSON_NAMESPACE_END | ||||
|  | ||||
| #ifdef __clang__ | ||||
| #ifdef __GNUC__ | ||||
| RAPIDJSON_DIAG_POP | ||||
| #endif | ||||
|  | ||||
| #ifdef _MSC_VER | ||||
| #if defined(__clang__) || defined(_MSC_VER) | ||||
| RAPIDJSON_DIAG_POP | ||||
| #endif | ||||
|  | ||||
|   | ||||
							
								
								
									
										7
									
								
								external/rapidjson/internal/stack.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								external/rapidjson/internal/stack.h
									
									
									
									
										vendored
									
									
								
							| @@ -17,6 +17,7 @@ | ||||
|  | ||||
| #include "../allocators.h" | ||||
| #include "swap.h" | ||||
| #include <cstddef> | ||||
|  | ||||
| #if defined(__clang__) | ||||
| RAPIDJSON_DIAG_PUSH | ||||
| @@ -100,7 +101,7 @@ public: | ||||
|     void ShrinkToFit() {  | ||||
|         if (Empty()) { | ||||
|             // If the stack is empty, completely deallocate the memory. | ||||
|             Allocator::Free(stack_); | ||||
|             Allocator::Free(stack_); // NOLINT (+clang-analyzer-unix.Malloc) | ||||
|             stack_ = 0; | ||||
|             stackTop_ = 0; | ||||
|             stackEnd_ = 0; | ||||
| @@ -114,7 +115,7 @@ public: | ||||
|     template<typename T> | ||||
|     RAPIDJSON_FORCEINLINE void Reserve(size_t count = 1) { | ||||
|          // Expand the stack if needed | ||||
|         if (RAPIDJSON_UNLIKELY(stackTop_ + sizeof(T) * count > stackEnd_)) | ||||
|         if (RAPIDJSON_UNLIKELY(static_cast<std::ptrdiff_t>(sizeof(T) * count) > (stackEnd_ - stackTop_))) | ||||
|             Expand<T>(count); | ||||
|     } | ||||
|  | ||||
| @@ -127,7 +128,7 @@ public: | ||||
|     template<typename T> | ||||
|     RAPIDJSON_FORCEINLINE T* PushUnsafe(size_t count = 1) { | ||||
|         RAPIDJSON_ASSERT(stackTop_); | ||||
|         RAPIDJSON_ASSERT(stackTop_ + sizeof(T) * count <= stackEnd_); | ||||
|         RAPIDJSON_ASSERT(static_cast<std::ptrdiff_t>(sizeof(T) * count) <= (stackEnd_ - stackTop_)); | ||||
|         T* ret = reinterpret_cast<T*>(stackTop_); | ||||
|         stackTop_ += sizeof(T) * count; | ||||
|         return ret; | ||||
|   | ||||
							
								
								
									
										11
									
								
								external/rapidjson/internal/strfunc.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								external/rapidjson/internal/strfunc.h
									
									
									
									
										vendored
									
									
								
							| @@ -16,6 +16,7 @@ | ||||
| #define RAPIDJSON_INTERNAL_STRFUNC_H_ | ||||
|  | ||||
| #include "../stream.h" | ||||
| #include <cwchar> | ||||
|  | ||||
| RAPIDJSON_NAMESPACE_BEGIN | ||||
| namespace internal { | ||||
| @@ -34,6 +35,16 @@ inline SizeType StrLen(const Ch* s) { | ||||
|     return SizeType(p - s); | ||||
| } | ||||
|  | ||||
| template <> | ||||
| inline SizeType StrLen(const char* s) { | ||||
|     return SizeType(std::strlen(s)); | ||||
| } | ||||
|  | ||||
| template <> | ||||
| inline SizeType StrLen(const wchar_t* s) { | ||||
|     return SizeType(std::wcslen(s)); | ||||
| } | ||||
|  | ||||
| //! Returns number of code points in a encoded string. | ||||
| template<typename Encoding> | ||||
| bool CountStringCodePoint(const typename Encoding::Ch* s, SizeType length, SizeType* outCount) { | ||||
|   | ||||
							
								
								
									
										97
									
								
								external/rapidjson/internal/strtod.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										97
									
								
								external/rapidjson/internal/strtod.h
									
									
									
									
										vendored
									
									
								
							| @@ -19,6 +19,8 @@ | ||||
| #include "biginteger.h" | ||||
| #include "diyfp.h" | ||||
| #include "pow10.h" | ||||
| #include <climits> | ||||
| #include <limits> | ||||
|  | ||||
| RAPIDJSON_NAMESPACE_BEGIN | ||||
| namespace internal { | ||||
| @@ -126,20 +128,20 @@ inline bool StrtodFast(double d, int p, double* result) { | ||||
| } | ||||
|  | ||||
| // Compute an approximation and see if it is within 1/2 ULP | ||||
| inline bool StrtodDiyFp(const char* decimals, size_t length, size_t decimalPosition, int exp, double* result) { | ||||
| inline bool StrtodDiyFp(const char* decimals, int dLen, int dExp, double* result) { | ||||
|     uint64_t significand = 0; | ||||
|     size_t i = 0;   // 2^64 - 1 = 18446744073709551615, 1844674407370955161 = 0x1999999999999999     | ||||
|     for (; i < length; i++) { | ||||
|     int i = 0;   // 2^64 - 1 = 18446744073709551615, 1844674407370955161 = 0x1999999999999999     | ||||
|     for (; i < dLen; i++) { | ||||
|         if (significand  >  RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || | ||||
|             (significand == RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) && decimals[i] > '5')) | ||||
|             break; | ||||
|         significand = significand * 10u + static_cast<unsigned>(decimals[i] - '0'); | ||||
|     } | ||||
|      | ||||
|     if (i < length && decimals[i] >= '5') // Rounding | ||||
|     if (i < dLen && decimals[i] >= '5') // Rounding | ||||
|         significand++; | ||||
|  | ||||
|     size_t remaining = length - i; | ||||
|     int remaining = dLen - i; | ||||
|     const int kUlpShift = 3; | ||||
|     const int kUlp = 1 << kUlpShift; | ||||
|     int64_t error = (remaining == 0) ? 0 : kUlp / 2; | ||||
| @@ -148,24 +150,24 @@ inline bool StrtodDiyFp(const char* decimals, size_t length, size_t decimalPosit | ||||
|     v = v.Normalize(); | ||||
|     error <<= -v.e; | ||||
|  | ||||
|     const int dExp = static_cast<int>(decimalPosition) - static_cast<int>(i) + exp; | ||||
|     dExp += remaining; | ||||
|  | ||||
|     int actualExp; | ||||
|     DiyFp cachedPower = GetCachedPower10(dExp, &actualExp); | ||||
|     if (actualExp != dExp) { | ||||
|         static const DiyFp kPow10[] = { | ||||
|             DiyFp(RAPIDJSON_UINT64_C2(0xa0000000, 00000000), -60),  // 10^1 | ||||
|             DiyFp(RAPIDJSON_UINT64_C2(0xc8000000, 00000000), -57),  // 10^2 | ||||
|             DiyFp(RAPIDJSON_UINT64_C2(0xfa000000, 00000000), -54),  // 10^3 | ||||
|             DiyFp(RAPIDJSON_UINT64_C2(0x9c400000, 00000000), -50),  // 10^4 | ||||
|             DiyFp(RAPIDJSON_UINT64_C2(0xc3500000, 00000000), -47),  // 10^5 | ||||
|             DiyFp(RAPIDJSON_UINT64_C2(0xf4240000, 00000000), -44),  // 10^6 | ||||
|             DiyFp(RAPIDJSON_UINT64_C2(0x98968000, 00000000), -40)   // 10^7 | ||||
|             DiyFp(RAPIDJSON_UINT64_C2(0xa0000000, 0x00000000), -60),  // 10^1 | ||||
|             DiyFp(RAPIDJSON_UINT64_C2(0xc8000000, 0x00000000), -57),  // 10^2 | ||||
|             DiyFp(RAPIDJSON_UINT64_C2(0xfa000000, 0x00000000), -54),  // 10^3 | ||||
|             DiyFp(RAPIDJSON_UINT64_C2(0x9c400000, 0x00000000), -50),  // 10^4 | ||||
|             DiyFp(RAPIDJSON_UINT64_C2(0xc3500000, 0x00000000), -47),  // 10^5 | ||||
|             DiyFp(RAPIDJSON_UINT64_C2(0xf4240000, 0x00000000), -44),  // 10^6 | ||||
|             DiyFp(RAPIDJSON_UINT64_C2(0x98968000, 0x00000000), -40)   // 10^7 | ||||
|         }; | ||||
|         int  adjustment = dExp - actualExp - 1; | ||||
|         RAPIDJSON_ASSERT(adjustment >= 0 && adjustment < 7); | ||||
|         v = v * kPow10[adjustment]; | ||||
|         if (length + static_cast<unsigned>(adjustment)> 19u) // has more digits than decimal digits in 64-bit | ||||
|         int adjustment = dExp - actualExp; | ||||
|         RAPIDJSON_ASSERT(adjustment >= 1 && adjustment < 8); | ||||
|         v = v * kPow10[adjustment - 1]; | ||||
|         if (dLen + adjustment > 19) // has more digits than decimal digits in 64-bit | ||||
|             error += kUlp / 2; | ||||
|     } | ||||
|  | ||||
| @@ -203,9 +205,9 @@ inline bool StrtodDiyFp(const char* decimals, size_t length, size_t decimalPosit | ||||
|     return halfWay - static_cast<unsigned>(error) >= precisionBits || precisionBits >= halfWay + static_cast<unsigned>(error); | ||||
| } | ||||
|  | ||||
| inline double StrtodBigInteger(double approx, const char* decimals, size_t length, size_t decimalPosition, int exp) { | ||||
|     const BigInteger dInt(decimals, length); | ||||
|     const int dExp = static_cast<int>(decimalPosition) - static_cast<int>(length) + exp; | ||||
| inline double StrtodBigInteger(double approx, const char* decimals, int dLen, int dExp) { | ||||
|     RAPIDJSON_ASSERT(dLen >= 0); | ||||
|     const BigInteger dInt(decimals, static_cast<unsigned>(dLen)); | ||||
|     Double a(approx); | ||||
|     int cmp = CheckWithinHalfULP(a.Value(), dInt, dExp); | ||||
|     if (cmp < 0) | ||||
| @@ -225,42 +227,61 @@ inline double StrtodFullPrecision(double d, int p, const char* decimals, size_t | ||||
|     RAPIDJSON_ASSERT(d >= 0.0); | ||||
|     RAPIDJSON_ASSERT(length >= 1); | ||||
|  | ||||
|     double result; | ||||
|     double result = 0.0; | ||||
|     if (StrtodFast(d, p, &result)) | ||||
|         return result; | ||||
|  | ||||
|     RAPIDJSON_ASSERT(length <= INT_MAX); | ||||
|     int dLen = static_cast<int>(length); | ||||
|  | ||||
|     RAPIDJSON_ASSERT(length >= decimalPosition); | ||||
|     RAPIDJSON_ASSERT(length - decimalPosition <= INT_MAX); | ||||
|     int dExpAdjust = static_cast<int>(length - decimalPosition); | ||||
|  | ||||
|     RAPIDJSON_ASSERT(exp >= INT_MIN + dExpAdjust); | ||||
|     int dExp = exp - dExpAdjust; | ||||
|  | ||||
|     // Make sure length+dExp does not overflow | ||||
|     RAPIDJSON_ASSERT(dExp <= INT_MAX - dLen); | ||||
|  | ||||
|     // Trim leading zeros | ||||
|     while (*decimals == '0' && length > 1) { | ||||
|         length--; | ||||
|     while (dLen > 0 && *decimals == '0') { | ||||
|         dLen--; | ||||
|         decimals++; | ||||
|         decimalPosition--; | ||||
|     } | ||||
|  | ||||
|     // Trim trailing zeros | ||||
|     while (decimals[length - 1] == '0' && length > 1) { | ||||
|         length--; | ||||
|         decimalPosition--; | ||||
|         exp++; | ||||
|     while (dLen > 0 && decimals[dLen - 1] == '0') { | ||||
|         dLen--; | ||||
|         dExp++; | ||||
|     } | ||||
|  | ||||
|     if (dLen == 0) { // Buffer only contains zeros. | ||||
|         return 0.0; | ||||
|     } | ||||
|  | ||||
|     // Trim right-most digits | ||||
|     const int kMaxDecimalDigit = 780; | ||||
|     if (static_cast<int>(length) > kMaxDecimalDigit) { | ||||
|         int delta = (static_cast<int>(length) - kMaxDecimalDigit); | ||||
|         exp += delta; | ||||
|         decimalPosition -= static_cast<unsigned>(delta); | ||||
|         length = kMaxDecimalDigit; | ||||
|     const int kMaxDecimalDigit = 767 + 1; | ||||
|     if (dLen > kMaxDecimalDigit) { | ||||
|         dExp += dLen - kMaxDecimalDigit; | ||||
|         dLen = kMaxDecimalDigit; | ||||
|     } | ||||
|  | ||||
|     // If too small, underflow to zero | ||||
|     if (int(length) + exp < -324) | ||||
|     // If too small, underflow to zero. | ||||
|     // Any x <= 10^-324 is interpreted as zero. | ||||
|     if (dLen + dExp <= -324) | ||||
|         return 0.0; | ||||
|  | ||||
|     if (StrtodDiyFp(decimals, length, decimalPosition, exp, &result)) | ||||
|     // If too large, overflow to infinity. | ||||
|     // Any x >= 10^309 is interpreted as +infinity. | ||||
|     if (dLen + dExp > 309) | ||||
|         return std::numeric_limits<double>::infinity(); | ||||
|  | ||||
|     if (StrtodDiyFp(decimals, dLen, dExp, &result)) | ||||
|         return result; | ||||
|  | ||||
|     // Use approximation from StrtodDiyFp and make adjustment with BigInteger comparison | ||||
|     return StrtodBigInteger(result, decimals, length, decimalPosition, exp); | ||||
|     return StrtodBigInteger(result, decimals, dLen, dExp); | ||||
| } | ||||
|  | ||||
| } // namespace internal | ||||
|   | ||||
		Reference in New Issue
	
	Block a user