Commit 1aa1d4d6 authored by Dominik Charousset's avatar Dominik Charousset

Fix bookkeeping of the field name

parent df975797
...@@ -166,6 +166,7 @@ void json_reader::revert() { ...@@ -166,6 +166,7 @@ void json_reader::revert() {
err_.reset(); err_.reset();
st_->clear(); st_->clear();
st_->emplace_back(root_); st_->emplace_back(root_);
field_.clear();
} }
} }
...@@ -173,6 +174,7 @@ void json_reader::reset() { ...@@ -173,6 +174,7 @@ void json_reader::reset() {
buf_.reclaim(); buf_.reclaim();
st_ = nullptr; st_ = nullptr;
err_.reset(); err_.reset();
field_.clear();
} }
// -- interface functions ------------------------------------------------------ // -- interface functions ------------------------------------------------------
...@@ -273,10 +275,10 @@ bool json_reader::begin_field(std::string_view name) { ...@@ -273,10 +275,10 @@ bool json_reader::begin_field(std::string_view name) {
bool json_reader::begin_field(std::string_view name, bool& is_present) { bool json_reader::begin_field(std::string_view name, bool& is_present) {
SCOPE(position::object); SCOPE(position::object);
field_.push_back(name);
if (auto member = find_member(top<position::object>(), name); if (auto member = find_member(top<position::object>(), name);
member != nullptr member != nullptr
&& member->val->data.index() != detail::json::value::null_index) { && member->val->data.index() != detail::json::value::null_index) {
field_.push_back(name);
push(member->val); push(member->val);
is_present = true; is_present = true;
} else { } else {
...@@ -297,6 +299,8 @@ bool json_reader::begin_field(std::string_view name, ...@@ -297,6 +299,8 @@ bool json_reader::begin_field(std::string_view name,
return false; return false;
} }
} else { } else {
// Always push since we'll do a .pop_back() in end_field().
field_.push_back(name);
return false; return false;
} }
} }
...@@ -304,6 +308,7 @@ bool json_reader::begin_field(std::string_view name, ...@@ -304,6 +308,7 @@ bool json_reader::begin_field(std::string_view name,
bool json_reader::begin_field(std::string_view name, bool& is_present, bool json_reader::begin_field(std::string_view name, bool& is_present,
span<const type_id_t> types, size_t& index) { span<const type_id_t> types, size_t& index) {
SCOPE(position::object); SCOPE(position::object);
field_.push_back(name);
if (auto member = find_member(top<position::object>(), name); if (auto member = find_member(top<position::object>(), name);
member != nullptr member != nullptr
&& member->val->data.index() != detail::json::value::null_index) { && member->val->data.index() != detail::json::value::null_index) {
...@@ -327,7 +332,8 @@ bool json_reader::end_field() { ...@@ -327,7 +332,8 @@ bool json_reader::end_field() {
SCOPE(position::object); SCOPE(position::object);
// Note: no pop() here, because the value(s) were already consumed. Only // Note: no pop() here, because the value(s) were already consumed. Only
// update the field_ for debugging. // update the field_ for debugging.
field_.pop_back(); if (!field_.empty())
field_.pop_back();
return true; return true;
} }
......
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