8000 Advance immediately upon evaluating a character · JavaScriptExpert/simdjson@e6762f9 · GitHub
[go: up one dir, main page]

Skip to content

Commit e6762f9

Browse files
committed
Advance immediately upon evaluating a character
1 parent 099bb1a commit e6762f9

File tree

3 files changed

+41
-27
lines changed

3 files changed

+41
-27
lines changed

src/generic/stage2/logger.h

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ namespace logger {
77
static constexpr const char * DASHES = "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------";
88

99
static constexpr const bool LOG_ENABLED = false;
10-
static constexpr const int LOG_EVENT_LEN = 30;
11-
static constexpr const int LOG_BUFFER_LEN = 20;
12-
static constexpr const int LOG_DETAIL_LEN = 50;
13-
static constexpr const int LOG_INDEX_LEN = 10;
10+
static constexpr const int LOG_EVENT_LEN = 20;
11+
static constexpr const int LOG_BUFFER_LEN = 10;
12+
static constexpr const int LOG_SMALL_BUFFER_LEN = 10;
13+
static constexpr const int LOG_INDEX_LEN = 5;
1414

1515
static int log_depth; // Not threadsafe. Log only.
1616

@@ -28,8 +28,8 @@ namespace logger {
2828
if (LOG_ENABLED) {
2929
log_depth = 0;
3030
printf("\n");
31-
printf("| %-*s | %-*s | %*s | %*s | %*s | %-*s | %-*s | %-*s |\n", LOG_EVENT_LEN, "Event", LOG_BUFFER_LEN, "Buffer", 4, "Curr", 4, "Next", 5, "Next#", 5, "Tape#", LOG_DETAIL_LEN, "Detail", LOG_INDEX_LEN, "index");
32-
printf("|%.*s|%.*s|%.*s|%.*s|%.*s|%.*s|%.*s|%.*s|\n", LOG_EVENT_LEN+2, DASHES, LOG_BUFFER_LEN+2, DASHES, 4+2, DASHES, 4+2, DASHES, 5+2, DASHES, 5+2, DASHES, LOG_DETAIL_LEN+2, DASHES, LOG_INDEX_LEN+2, DASHES);
31+
printf("| %-*s | %-*s | %-*s | %-*s | %-*s | Detail |\n", LOG_EVENT_LEN, "Event", LOG_BUFFER_LEN, "Buffer", LOG_SMALL_BUFFER_LEN, "Next", 5, "Next#", 5, "Tape#");
32+
printf("|%.*s|%.*s|%.*s|%.*s|%.*s|--------|\n", LOG_EVENT_LEN+2, DASHES, LOG_BUFFER_LEN+2, DASHES, LOG_SMALL_BUFFER_LEN+2, DASHES, 5+2, DASHES, 5+2, DASHES);
3333
}
3434
}
3535

@@ -44,22 +44,35 @@ namespace logger {
4444
static really_inline void log_line(S &structurals, const char *title_prefix, const char *title, const char *detail) {
4545
if (LOG_ENABLED) {
4646
printf("| %*s%s%-*s ", log_depth*2, "", title_prefix, LOG_EVENT_LEN - log_depth*2 - int(strlen(title_prefix)), title);
47+
auto current_index = structurals.at_beginning() ? nullptr : structurals.next_structural-1;
48+
auto next_index = structurals.next_structural;
49+
auto current = current_index ? &structurals.buf[*current_index] : (const uint8_t*)" ";
50+
auto next = &structurals.buf[*next_index];
4751
{
4852
// Print the next N characters in the buffer.
4953
printf("| ");
5054
// Otherwise, print the characters starting from the buffer position.
5155
// Print spaces for unprintable or newline characters.
5256
for (int i=0;i<LOG_BUFFER_LEN;i++) {
53-
printf("%c", printable_char(structurals.current()[i]));
57+
printf("%c", printable_char(current[i]));
5458
}
5559
printf(" ");
60+
// Print the next N characters in the buffer.
61+
printf("| ");
62+
// Otherwise, print the characters starting from the buffer position.
63+
// Print spaces for unprintable or newline characters.
64+
for (int i=0;i<LOG_SMALL_BUFFER_LEN;i++) {
65+
printf("%c", printable_char(next[i]));
66+
}
67+
printf(" ");
68+
}
69+
if (current_index) {
70+
printf("| %*u ", LOG_INDEX_LEN, *current_index);
71+
} else {
72+
printf("| %-*s ", LOG_INDEX_LEN, "");
5673
}
57-
printf("| %c ", printable_char(structurals.current_char()));
58-
printf("| %c ", printable_char(structurals.peek_next_char()));
59-
printf("| %5u ", structurals.parser.structural_indexes[*(structurals.current_structural+1)]);
60-
printf("| %5u ", structurals.next_tape_index());
61-
printf("| %-*s ", LOG_DETAIL_LEN, detail);
62-
printf("| %*u ", LOG_INDEX_LEN, *structurals.current_structural);
74+
printf("| %*u ", LOG_INDEX_LEN, structurals.next_tape_index());
75+
printf("| %-s ", detail);
6376
printf("|\n");
6477
}
6578
}

src/generic/stage2/structural_iterator.h

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,44 +5,45 @@ namespace stage2 {
55
class structural_iterator {
66
public:
77
const uint8_t* const buf;
8-
uint32_t *current_structural;
8+
uint32_t *next_structural;
99
dom_parser_implementation &parser;
1010

1111
// Start a structural
1212
really_inline structural_iterator(dom_parser_implementation &_parser, size_t start_structural_index)
1313
: buf{_parser.buf},
14-
current_structural{&_parser.structural_indexes[start_structural_index]},
14+
next_structural{&_parser.structural_indexes[start_structural_index]},
1515
parser{_parser} {
1616
}
1717
// Get the buffer position of the current structural character
1818
really_inline const uint8_t* current() {
19-
return &buf[*current_structural];
19+
return &buf[*(next_structural-1)];
2020
}
2121
// Get the current structural character
2222
really_inline char current_char() {
23-
return buf[*current_structural];
23+
return buf[*(next_structural-1)];
2424
}
2525
// Get the next structural character without advancing
2626
really_inline char peek_next_char() {
27-
return buf[*(current_structural+1)];
27+
return buf[*next_structural];
28+
}
29+
really_inline const uint8_t* peek() {
30+
return &buf[*next_structural];
2831
}
2932
really_inline const uint8_t* advance() {
30-
current_structural++;
31-
return &buf[*current_structural];
33+
return &buf[*(next_structural++)];
3234
}
3335
really_inline char advance_char() {
34-
current_structural++;
35-
return buf[*current_structural];
36+
return buf[*(next_structural++)];
3637
}
3738
really_inline size_t remaining_len() {
38-
return parser.len - *current_structural;
39+
return parser.len - *(next_structural-1);
3940
}
4041

4142
really_inline bool at_end() {
42-
return current_structural == &parser.structural_indexes[parser.n_structural_indexes];
43+
return next_structural == &parser.structural_indexes[parser.n_structural_indexes];
4344
}
4445
really_inline bool at_beginning() {
45-
return current_structural == parser.structural_indexes.get();
46+
return next_structural == parser.structural_indexes.get();
4647
}
4748
};
4849

src/generic/stage2/structural_parser.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ struct structural_parser : structural_iterator {
238238

239239
WARN_UNUSED really_inline error_code finish() {
240240
end_document();
241-
parser.next_structural_index = uint32_t(current_structural + 1 - &parser.structural_indexes[0]);
241+
parser.next_structural_index = uint32_t(next_structural - &parser.structural_indexes[0]);
242242

243243
if (depth != 0) {
244244
log_error("Unclosed objects or arrays!");
@@ -279,7 +279,7 @@ WARN_UNUSED static really_inline error_code parse_structurals(dom_parser_impleme
279279
// Read first value
280280
//
281281
{
282-
switch (parser.current_char()) {
282+
switch (parser.advance_char()) {
283283
case '{': {
284284
if (parser.empty_object()) { goto document_end; }
285285
SIMDJSON_TRY( parser.start_object() );

0 commit comments

Comments
 (0)
0