Skip to content

Commit 230ba0a

Browse files
committed
Move current_string_buf_loc to json_iterator
1 parent 54f86ce commit 230ba0a

File tree

8 files changed

+14
-25
lines changed

8 files changed

+14
-25
lines changed

benchmark/bench_sax.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,13 +121,13 @@ simdjson_really_inline void read_tweets(ondemand::parser &parser, padded_string
121121
twitter::tweet tweet;
122122

123123
if (!iter.start_object() || !iter.find_field_raw("created_at")) { throw; }
124-
tweet.created_at = iter.get_raw_json_string().value().unescape(parser);
124+
tweet.created_at = iter.get_raw_json_string().value().unescape(iter);
125125

126126
if (!iter.has_next_field() || !iter.find_field_raw("id")) { throw; }
127127
tweet.id = iter.get_uint64();
128128

129129
if (!iter.has_next_field() || !iter.find_field_raw("text")) { throw; }
130-
tweet.text = iter.get_raw_json_string().value().unescape(parser);
130+
tweet.text = iter.get_raw_json_string().value().unescape(iter);
131131

132132
if (!iter.has_next_field() || !iter.find_field_raw("in_reply_to_status_id")) { throw; }
133133
if (!iter.is_null()) {
@@ -140,7 +140,7 @@ simdjson_really_inline void read_tweets(ondemand::parser &parser, padded_string
140140
tweet.user.id = iter.get_uint64();
141141

142142
if (!iter.has_next_field() || !iter.find_field_raw("screen_name")) { throw; }
143-
tweet.user.screen_name = iter.get_raw_json_string().value().unescape(parser);
143+
tweet.user.screen_name = iter.get_raw_json_string().value().unescape(iter);
144144

145145
iter.skip_container(); // Skip the rest of the user object
146146
}

src/generic/ondemand/json_iterator-inl.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@ namespace ondemand {
55
simdjson_really_inline json_iterator::json_iterator() noexcept = default;
66
simdjson_really_inline json_iterator::json_iterator(json_iterator &&other) noexcept
77
: token_iterator(std::forward<token_iterator>(other)),
8-
parser{other.parser}
8+
parser{other.parser},
9+
current_string_buf_loc{other.current_string_buf_loc}
910
{
1011
other.parser = nullptr;
1112
}
1213
simdjson_really_inline json_iterator &json_iterator::operator=(json_iterator &&other) noexcept {
1314
buf = other.buf;
1415
index = other.index;
1516
parser = other.parser;
17+
current_string_buf_loc = other.current_string_buf_loc;
1618
other.parser = nullptr;
1719
return *this;
1820
}
@@ -21,13 +23,9 @@ simdjson_really_inline json_iterator::json_iterator(ondemand::parser *_parser) n
2123
{
2224
// Release the string buf so it can be reused by the next document
2325
logger::log_headers();
24-
parser->current_string_buf_loc = parser->string_buf.get();
25-
}
26-
simdjson_really_inline json_iterator::~json_iterator() noexcept {
27-
if (parser) {
28-
parser->current_string_buf_loc = nullptr;
29-
}
26+
current_string_buf_loc = parser->string_buf.get();
3027
}
28+
simdjson_really_inline json_iterator::~json_iterator() noexcept = default;
3129

3230
SIMDJSON_WARN_UNUSED simdjson_really_inline simdjson_result<bool> json_iterator::start_object() noexcept {
3331
if (*advance() != '{') { logger::log_error(*this, "Not an object"); return INCORRECT_TYPE; }

src/generic/ondemand/json_iterator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ class json_iterator : public token_iterator {
134134
simdjson_really_inline bool is_alive() const noexcept;
135135
protected:
136136
ondemand::parser *parser{};
137+
uint8_t *current_string_buf_loc{};
137138

138139
simdjson_really_inline json_iterator(ondemand::parser *parser) noexcept;
139140
template<int N>
@@ -143,6 +144,7 @@ class json_iterator : public token_iterator {
143144
friend class object;
144145
friend class array;
145146
friend class value;
147+
friend class raw_json_string;
146148
friend simdjson_really_inline void logger::log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta) noexcept;
147149
};
148150

src/generic/ondemand/parser-inl.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,6 @@ SIMDJSON_WARN_UNUSED simdjson_really_inline error_code parser::allocate(size_t n
1919
}
2020

2121
SIMDJSON_WARN_UNUSED simdjson_really_inline simdjson_result<document> parser::parse(const padded_string &buf) noexcept {
22-
if (current_string_buf_loc) {
23-
return { this, PARSER_IN_USE };
24-
}
25-
2622
// Allocate if needed
2723
error_code error;
2824
if (_capacity < buf.size()) {

src/generic/ondemand/parser.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,7 @@ class parser {
2828
size_t _capacity{0};
2929
size_t _max_depth{0};
3030
std::unique_ptr<uint8_t[]> string_buf{};
31-
uint8_t *current_string_buf_loc{};
3231

33-
friend class raw_json_string;
34-
friend class value;
3532
friend class json_iterator;
3633
};
3734

src/generic/ondemand/raw_json_string-inl.h

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,8 @@ simdjson_really_inline SIMDJSON_WARN_UNUSED simdjson_result<std::string_view> ra
1515
return result;
1616
}
1717

18-
simdjson_really_inline SIMDJSON_WARN_UNUSED simdjson_result<std::string_view> raw_json_string::unescape(parser &parser) const noexcept {
19-
uint8_t *end = stage2::stringparsing::parse_string(buf, parser.current_string_buf_loc);
20-
if (!end) { return STRING_ERROR; }
21-
std::string_view result((const char *)parser.current_string_buf_loc, end-parser.current_string_buf_loc);
22-
parser.current_string_buf_loc = end;
23-
return result;
18+
simdjson_really_inline SIMDJSON_WARN_UNUSED simdjson_result<std::string_view> raw_json_string::unescape(json_iterator &iter) const noexcept {
19+
return unescape(iter.current_string_buf_loc);
2420
}
2521

2622
SIMDJSON_UNUSED simdjson_really_inline bool operator==(const raw_json_string &a, std::string_view b) noexcept {

src/generic/ondemand/raw_json_string.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class raw_json_string {
2020
simdjson_really_inline raw_json_string &operator=(const raw_json_string &other) noexcept;
2121
simdjson_really_inline const char * raw() const noexcept;
2222
simdjson_really_inline SIMDJSON_WARN_UNUSED simdjson_result<std::string_view> unescape(uint8_t *&dst) const noexcept;
23-
simdjson_really_inline SIMDJSON_WARN_UNUSED simdjson_result<std::string_view> unescape(parser &parser) const noexcept;
23+
simdjson_really_inline SIMDJSON_WARN_UNUSED simdjson_result<std::string_view> unescape(json_iterator &iter) const noexcept;
2424
private:
2525
const uint8_t * buf;
2626
friend class object;

src/generic/ondemand/value-inl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ simdjson_really_inline simdjson_result<std::string_view> value::get_string() noe
6363
error_code error;
6464
raw_json_string str;
6565
if ((error = get_raw_json_string().get(str))) { return error; }
66-
return str.unescape(iter->parser->current_string_buf_loc);
66+
return str.unescape(iter->current_string_buf_loc);
6767
}
6868
simdjson_really_inline simdjson_result<double> value::get_double() noexcept {
6969
log_value("double");

0 commit comments

Comments
 (0)