Manually merge the segfault fix from main branch and fix several unit tests about error code
This commit is contained in:
parent
b0059483c8
commit
69ca7487bc
@ -269,12 +269,16 @@ public:
|
|||||||
case '[': ParseArray<parseFlags>(is, handler); break;
|
case '[': ParseArray<parseFlags>(is, handler); break;
|
||||||
default: RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentRootNotObjectOrArray, is.Tell());
|
default: RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentRootNotObjectOrArray, is.Tell());
|
||||||
}
|
}
|
||||||
|
if (HasParseError())
|
||||||
|
goto out;
|
||||||
|
|
||||||
SkipWhitespace(is);
|
SkipWhitespace(is);
|
||||||
|
|
||||||
if (is.Peek() != '\0')
|
if (is.Peek() != '\0')
|
||||||
RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentRootNotSingular, is.Tell());
|
RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentRootNotSingular, is.Tell());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
stack_.Clear();
|
stack_.Clear();
|
||||||
return !HasParseError();
|
return !HasParseError();
|
||||||
}
|
}
|
||||||
@ -440,6 +444,8 @@ private:
|
|||||||
if (parseFlags & kParseInsituFlag) {
|
if (parseFlags & kParseInsituFlag) {
|
||||||
Ch *head = s.PutBegin();
|
Ch *head = s.PutBegin();
|
||||||
ParseStringToStream<parseFlags, SourceEncoding, SourceEncoding>(s, s);
|
ParseStringToStream<parseFlags, SourceEncoding, SourceEncoding>(s, s);
|
||||||
|
if (HasParseError())
|
||||||
|
return;
|
||||||
size_t length = s.PutEnd(head) - 1;
|
size_t length = s.PutEnd(head) - 1;
|
||||||
RAPIDJSON_ASSERT(length <= 0xFFFFFFFF);
|
RAPIDJSON_ASSERT(length <= 0xFFFFFFFF);
|
||||||
handler.String((typename TargetEncoding::Ch*)head, SizeType(length), false);
|
handler.String((typename TargetEncoding::Ch*)head, SizeType(length), false);
|
||||||
@ -447,6 +453,8 @@ private:
|
|||||||
else {
|
else {
|
||||||
StackStream stackStream(stack_);
|
StackStream stackStream(stack_);
|
||||||
ParseStringToStream<parseFlags, SourceEncoding, TargetEncoding>(s, stackStream);
|
ParseStringToStream<parseFlags, SourceEncoding, TargetEncoding>(s, stackStream);
|
||||||
|
if (HasParseError())
|
||||||
|
return;
|
||||||
handler.String(stack_.template Pop<typename TargetEncoding::Ch>(stackStream.length_), stackStream.length_ - 1, true);
|
handler.String(stack_.template Pop<typename TargetEncoding::Ch>(stackStream.length_), stackStream.length_ - 1, true);
|
||||||
}
|
}
|
||||||
is = s; // Restore is
|
is = s; // Restore is
|
||||||
|
@ -335,8 +335,8 @@ TEST(Reader, ParseString_Error) {
|
|||||||
TEST_STRING_ERROR(kParseErrorStringUnicodeEscapeInvalidHex, "[\"\\uABCG\"]");
|
TEST_STRING_ERROR(kParseErrorStringUnicodeEscapeInvalidHex, "[\"\\uABCG\"]");
|
||||||
|
|
||||||
// The surrogate pair in string is invalid.
|
// The surrogate pair in string is invalid.
|
||||||
TEST_STRING_ERROR(kParseErrorStringUnicodeEscapeInvalidHex, "[\"\\uD800X\"]");
|
TEST_STRING_ERROR(kParseErrorStringUnicodeSurrogateInvalid, "[\"\\uD800X\"]");
|
||||||
TEST_STRING_ERROR(kParseErrorStringUnicodeEscapeInvalidHex, "[\"\\uD800\\uFFFF\"]");
|
TEST_STRING_ERROR(kParseErrorStringUnicodeSurrogateInvalid, "[\"\\uD800\\uFFFF\"]");
|
||||||
|
|
||||||
// Missing a closing quotation mark in string.
|
// Missing a closing quotation mark in string.
|
||||||
TEST_STRING_ERROR(kParseErrorStringMissQuotationMark, "[\"Test]");
|
TEST_STRING_ERROR(kParseErrorStringMissQuotationMark, "[\"Test]");
|
||||||
@ -352,7 +352,7 @@ TEST(Reader, ParseString_Error) {
|
|||||||
e[2] = c;
|
e[2] = c;
|
||||||
ParseErrorCode error = TestString(e);
|
ParseErrorCode error = TestString(e);
|
||||||
EXPECT_EQ(kParseErrorStringInvalidEncoding, error);
|
EXPECT_EQ(kParseErrorStringInvalidEncoding, error);
|
||||||
if (error != kParseErrorNone)
|
if (error != kParseErrorStringInvalidEncoding)
|
||||||
std::cout << (unsigned)(unsigned char)c << std::endl;
|
std::cout << (unsigned)(unsigned char)c << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -443,8 +443,8 @@ TEST(Reader, ParseArray_Error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Missing a comma or ']' after an array element.
|
// Missing a comma or ']' after an array element.
|
||||||
TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[");
|
TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1");
|
||||||
TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[}");
|
TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1}");
|
||||||
TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1 2]");
|
TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1 2]");
|
||||||
|
|
||||||
#undef TEST_ARRAY_ERROR
|
#undef TEST_ARRAY_ERROR
|
||||||
@ -590,8 +590,6 @@ TEST(Reader, ParseObject_Error) {
|
|||||||
TEST_ERROR(kParseErrorObjectMissColon, "{\"a\",1}");
|
TEST_ERROR(kParseErrorObjectMissColon, "{\"a\",1}");
|
||||||
|
|
||||||
// Must be a comma or '}' after an object member
|
// Must be a comma or '}' after an object member
|
||||||
TEST_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, "{");
|
|
||||||
TEST_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, "{]");
|
|
||||||
TEST_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, "{\"a\":1]");
|
TEST_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, "{\"a\":1]");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user