Commit 1c760705 authored by Milo Yip's avatar Milo Yip

Merge pull request #439 from pah/fix/437-keep-value-on-error

Keep Document value unchanged on parse error, fixes #437
parents 221887d6 41dd68f0
...@@ -1886,14 +1886,13 @@ public: ...@@ -1886,14 +1886,13 @@ public:
*/ */
template <unsigned parseFlags, typename SourceEncoding, typename InputStream> template <unsigned parseFlags, typename SourceEncoding, typename InputStream>
GenericDocument& ParseStream(InputStream& is) { GenericDocument& ParseStream(InputStream& is) {
ValueType::SetNull(); // Remove existing root if exist
GenericReader<SourceEncoding, Encoding, StackAllocator> reader( GenericReader<SourceEncoding, Encoding, StackAllocator> reader(
stack_.HasAllocator() ? &stack_.GetAllocator() : 0); stack_.HasAllocator() ? &stack_.GetAllocator() : 0);
ClearStackOnExit scope(*this); ClearStackOnExit scope(*this);
parseResult_ = reader.template Parse<parseFlags>(is, *this); parseResult_ = reader.template Parse<parseFlags>(is, *this);
if (parseResult_) { if (parseResult_) {
RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object
this->RawAssign(*stack_.template Pop<ValueType>(1)); // Add this-> to prevent issue 13. ValueType::operator=(*stack_.template Pop<ValueType>(1));// Move value from stack to document
} }
return *this; return *this;
} }
......
...@@ -95,6 +95,21 @@ TEST(Document, Parse) { ...@@ -95,6 +95,21 @@ TEST(Document, Parse) {
ParseTest<CrtAllocator, CrtAllocator>(); ParseTest<CrtAllocator, CrtAllocator>();
} }
TEST(Document, UnchangedOnParseError) {
Document doc;
doc.SetArray().PushBack(0, doc.GetAllocator());
doc.Parse("{]");
EXPECT_TRUE(doc.HasParseError());
EXPECT_TRUE(doc.IsArray());
EXPECT_EQ(doc.Size(), 1u);
doc.Parse("{}");
EXPECT_FALSE(doc.HasParseError());
EXPECT_TRUE(doc.IsObject());
EXPECT_EQ(doc.MemberCount(), 0u);
}
static FILE* OpenEncodedFile(const char* filename) { static FILE* OpenEncodedFile(const char* filename) {
const char *paths[] = { const char *paths[] = {
"encodings/%s", "encodings/%s",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment