From 575b6e5c627f64bb739e8de0532d98ef4b285ce9 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Tue, 24 Jun 2025 14:46:20 -0400 Subject: [PATCH] Direct call to next continuation in some cases --- src/parser3.h | 42 ++++++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/src/parser3.h b/src/parser3.h index bbbcde6..0390571 100644 --- a/src/parser3.h +++ b/src/parser3.h @@ -19,6 +19,17 @@ namespace parser3 { typedef PRESERVE_NONE WeaselJsonStatus (*Continuation)(struct Parser3 *, char *buf, char *bufEnd); +inline PRESERVE_NONE WeaselJsonStatus n_object2(Parser3 *self, char *buf, + char *bufEnd); +inline PRESERVE_NONE WeaselJsonStatus n_array2(Parser3 *self, char *buf, + char *bufEnd); +inline PRESERVE_NONE WeaselJsonStatus n_string2(Parser3 *self, char *buf, + char *bufEnd); +inline PRESERVE_NONE WeaselJsonStatus n_string(Parser3 *self, char *buf, + char *bufEnd); +inline PRESERVE_NONE WeaselJsonStatus n_number(Parser3 *self, char *buf, + char *bufEnd); + // These appear in the stack of the pushdown // automata enum Symbol : uint8_t { @@ -254,7 +265,10 @@ inline PRESERVE_NONE WeaselJsonStatus n_value(Parser3 *self, char *buf, if (auto s = self->push({N_OBJECT2})) { return s; } - break; + if (buf == bufEnd) { + return WeaselJson_AGAIN; + } + MUSTTAIL return n_object2(self, buf, bufEnd); case '[': self->callbacks->on_begin_array(self->userdata); ++buf; @@ -262,7 +276,10 @@ inline PRESERVE_NONE WeaselJsonStatus n_value(Parser3 *self, char *buf, if (auto s = self->push({N_ARRAY2})) { return s; } - break; + if (buf == bufEnd) { + return WeaselJson_AGAIN; + } + MUSTTAIL return n_array2(self, buf, bufEnd); case '"': ++buf; self->dataBegin = self->writeBuf = buf; @@ -271,7 +288,10 @@ inline PRESERVE_NONE WeaselJsonStatus n_value(Parser3 *self, char *buf, if (auto s2 = self->push({N_STRING2})) { return s2; } - break; + if (buf == bufEnd) { + return WeaselJson_AGAIN; + } + MUSTTAIL return n_string2(self, buf, bufEnd); case '0': case '1': case '2': @@ -289,7 +309,10 @@ inline PRESERVE_NONE WeaselJsonStatus n_value(Parser3 *self, char *buf, if (auto s2 = self->push({N_NUMBER})) { return s2; } - break; + if (buf == bufEnd) { + return WeaselJson_AGAIN; + } + MUSTTAIL return n_number(self, buf, bufEnd); case 't': ++buf; self->pop(); @@ -375,7 +398,7 @@ inline PRESERVE_NONE WeaselJsonStatus n_object2(Parser3 *self, char *buf, if (buf == bufEnd) { return WeaselJson_AGAIN; } - MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd); + MUSTTAIL return n_string2(self, buf, bufEnd); default: [[unlikely]] return WeaselJson_REJECT; } @@ -407,7 +430,7 @@ inline PRESERVE_NONE WeaselJsonStatus n_object3(Parser3 *self, char *buf, if (buf == bufEnd) { return WeaselJson_AGAIN; } - MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd); + MUSTTAIL return n_string(self, buf, bufEnd); default: [[unlikely]] return WeaselJson_REJECT; } @@ -435,7 +458,7 @@ inline PRESERVE_NONE WeaselJsonStatus n_array2(Parser3 *self, char *buf, if (auto s = self->push({N_VALUE, N_ARRAY3})) { return s; } - MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd); + MUSTTAIL return n_value(self, buf, bufEnd); } } @@ -465,7 +488,7 @@ inline PRESERVE_NONE WeaselJsonStatus n_array3(Parser3 *self, char *buf, if (buf == bufEnd) { return WeaselJson_AGAIN; } - MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd); + MUSTTAIL return n_value(self, buf, bufEnd); default: [[unlikely]] return WeaselJson_REJECT; } @@ -492,7 +515,7 @@ inline PRESERVE_NONE WeaselJsonStatus n_string(Parser3 *self, char *buf, if (buf == bufEnd) { return WeaselJson_AGAIN; } - MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd); + MUSTTAIL return n_string2(self, buf, bufEnd); } inline int32_t read4_hex(const char *buf) { @@ -960,7 +983,6 @@ inline WeaselJsonStatus Parser3::parse(char *buf, int len) { inline PRESERVE_NONE WeaselJsonStatus Parser3::keepGoing(Parser3 *self, char *buf, char *bufEnd) { - // printf("%s\n", symbolTables.symbolNames[self->top()]); MUSTTAIL return symbolTables.continuations[self->top()](self, buf, bufEnd); }