Direct call to next continuation in some cases
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user