Direct call to next continuation in some cases

This commit is contained in:
2025-06-24 14:46:20 -04:00
parent 67e63dc611
commit 575b6e5c62

View File

@@ -19,6 +19,17 @@ namespace parser3 {
typedef PRESERVE_NONE WeaselJsonStatus (*Continuation)(struct Parser3 *, typedef PRESERVE_NONE WeaselJsonStatus (*Continuation)(struct Parser3 *,
char *buf, char *bufEnd); 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 // These appear in the stack of the pushdown
// automata // automata
enum Symbol : uint8_t { 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})) { if (auto s = self->push({N_OBJECT2})) {
return s; return s;
} }
break; if (buf == bufEnd) {
return WeaselJson_AGAIN;
}
MUSTTAIL return n_object2(self, buf, bufEnd);
case '[': case '[':
self->callbacks->on_begin_array(self->userdata); self->callbacks->on_begin_array(self->userdata);
++buf; ++buf;
@@ -262,7 +276,10 @@ inline PRESERVE_NONE WeaselJsonStatus n_value(Parser3 *self, char *buf,
if (auto s = self->push({N_ARRAY2})) { if (auto s = self->push({N_ARRAY2})) {
return s; return s;
} }
break; if (buf == bufEnd) {
return WeaselJson_AGAIN;
}
MUSTTAIL return n_array2(self, buf, bufEnd);
case '"': case '"':
++buf; ++buf;
self->dataBegin = self->writeBuf = 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})) { if (auto s2 = self->push({N_STRING2})) {
return s2; return s2;
} }
break; if (buf == bufEnd) {
return WeaselJson_AGAIN;
}
MUSTTAIL return n_string2(self, buf, bufEnd);
case '0': case '0':
case '1': case '1':
case '2': case '2':
@@ -289,7 +309,10 @@ inline PRESERVE_NONE WeaselJsonStatus n_value(Parser3 *self, char *buf,
if (auto s2 = self->push({N_NUMBER})) { if (auto s2 = self->push({N_NUMBER})) {
return s2; return s2;
} }
break; if (buf == bufEnd) {
return WeaselJson_AGAIN;
}
MUSTTAIL return n_number(self, buf, bufEnd);
case 't': case 't':
++buf; ++buf;
self->pop(); self->pop();
@@ -375,7 +398,7 @@ inline PRESERVE_NONE WeaselJsonStatus n_object2(Parser3 *self, char *buf,
if (buf == bufEnd) { if (buf == bufEnd) {
return WeaselJson_AGAIN; return WeaselJson_AGAIN;
} }
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd); MUSTTAIL return n_string2(self, buf, bufEnd);
default: default:
[[unlikely]] return WeaselJson_REJECT; [[unlikely]] return WeaselJson_REJECT;
} }
@@ -407,7 +430,7 @@ inline PRESERVE_NONE WeaselJsonStatus n_object3(Parser3 *self, char *buf,
if (buf == bufEnd) { if (buf == bufEnd) {
return WeaselJson_AGAIN; return WeaselJson_AGAIN;
} }
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd); MUSTTAIL return n_string(self, buf, bufEnd);
default: default:
[[unlikely]] return WeaselJson_REJECT; [[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})) { if (auto s = self->push({N_VALUE, N_ARRAY3})) {
return s; 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) { if (buf == bufEnd) {
return WeaselJson_AGAIN; return WeaselJson_AGAIN;
} }
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd); MUSTTAIL return n_value(self, buf, bufEnd);
default: default:
[[unlikely]] return WeaselJson_REJECT; [[unlikely]] return WeaselJson_REJECT;
} }
@@ -492,7 +515,7 @@ inline PRESERVE_NONE WeaselJsonStatus n_string(Parser3 *self, char *buf,
if (buf == bufEnd) { if (buf == bufEnd) {
return WeaselJson_AGAIN; 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) { 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, inline PRESERVE_NONE WeaselJsonStatus Parser3::keepGoing(Parser3 *self,
char *buf, char *buf,
char *bufEnd) { char *bufEnd) {
// printf("%s\n", symbolTables.symbolNames[self->top()]);
MUSTTAIL return symbolTables.continuations[self->top()](self, buf, bufEnd); MUSTTAIL return symbolTables.continuations[self->top()](self, buf, bufEnd);
} }