GenericDocument: simplify error handling in ParseStream
* unconditionally store error state of reader after parsing * clear stack after parsing by using a ClearStackOnExit scope guard
This commit is contained in:
parent
3c1d4bc21d
commit
4475521177
@ -1226,17 +1226,13 @@ public:
|
|||||||
GenericDocument& ParseStream(InputStream& is) {
|
GenericDocument& ParseStream(InputStream& is) {
|
||||||
ValueType::SetNull(); // Remove existing root if exist
|
ValueType::SetNull(); // Remove existing root if exist
|
||||||
GenericReader<SourceEncoding, Encoding, Allocator> reader(&GetAllocator());
|
GenericReader<SourceEncoding, Encoding, Allocator> reader(&GetAllocator());
|
||||||
|
ClearStackOnExit scope(*this);
|
||||||
if (reader.template Parse<parseFlags>(is, *this)) {
|
if (reader.template Parse<parseFlags>(is, *this)) {
|
||||||
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.
|
this->RawAssign(*stack_.template Pop<ValueType>(1)); // Add this-> to prevent issue 13.
|
||||||
parseErrorCode_ = kParseErrorNone;
|
|
||||||
errorOffset_ = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
parseErrorCode_ = reader.GetParseErrorCode();
|
|
||||||
errorOffset_ = reader.GetErrorOffset();
|
|
||||||
ClearStack();
|
|
||||||
}
|
}
|
||||||
|
parseErrorCode_ = reader.GetParseErrorCode();
|
||||||
|
errorOffset_ = reader.GetErrorOffset();
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1349,6 +1345,14 @@ public:
|
|||||||
size_t GetStackCapacity() const { return stack_.GetCapacity(); }
|
size_t GetStackCapacity() const { return stack_.GetCapacity(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
// clear stack on any exit from ParseStream, e.g. due to exception
|
||||||
|
struct ClearStackOnExit {
|
||||||
|
explicit ClearStackOnExit(GenericDocument& d) : d_(d) {}
|
||||||
|
~ClearStackOnExit() { d_.ClearStack(); }
|
||||||
|
private:
|
||||||
|
GenericDocument& d_;
|
||||||
|
};
|
||||||
|
|
||||||
// callers of the following private Handler functions
|
// callers of the following private Handler functions
|
||||||
template <typename,typename,typename> friend class GenericReader; // for parsing
|
template <typename,typename,typename> friend class GenericReader; // for parsing
|
||||||
friend class GenericValue<Encoding,Allocator>; // for deep copying
|
friend class GenericValue<Encoding,Allocator>; // for deep copying
|
||||||
|
Loading…
x
Reference in New Issue
Block a user