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 *,
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user