Fuse whitespace into object2, object3, array2, array3, colon

This commit is contained in:
2025-05-22 11:38:42 -04:00
parent dff2120867
commit 297d6b48f7

View File

@@ -230,13 +230,20 @@ inline WeaselJsonStatus n_object(Parser3 *self) {
self->callbacks->on_begin_object(self->data); self->callbacks->on_begin_object(self->data);
++self->buf; ++self->buf;
self->pop(); self->pop();
if (auto s = self->push({N_WHITESPACE, N_OBJECT2})) { if (auto s = self->push({N_OBJECT2})) {
return s; return s;
} }
MUSTTAIL return Parser3::keepGoing(self); MUSTTAIL return Parser3::keepGoing(self);
} }
inline WeaselJsonStatus n_object2(Parser3 *self) { inline WeaselJsonStatus n_object2(Parser3 *self) {
assert(self->len() != 0);
while (tables.whitespace[uint8_t(*self->buf)]) {
++self->buf;
if (self->buf == self->bufEnd) {
return WeaselJson_AGAIN;
}
}
switch (*self->buf) { switch (*self->buf) {
case '}': case '}':
++self->buf; ++self->buf;
@@ -245,8 +252,7 @@ inline WeaselJsonStatus n_object2(Parser3 *self) {
MUSTTAIL return Parser3::keepGoing(self); MUSTTAIL return Parser3::keepGoing(self);
case '"': case '"':
self->pop(); self->pop();
if (auto s = self->push({N_STRING, N_WHITESPACE, T_COLON, N_VALUE, if (auto s = self->push({N_STRING, T_COLON, N_VALUE, N_OBJECT3})) {
N_WHITESPACE, N_OBJECT3})) {
return s; return s;
} }
MUSTTAIL return Parser3::keepGoing(self); MUSTTAIL return Parser3::keepGoing(self);
@@ -256,6 +262,13 @@ inline WeaselJsonStatus n_object2(Parser3 *self) {
} }
inline WeaselJsonStatus n_object3(Parser3 *self) { inline WeaselJsonStatus n_object3(Parser3 *self) {
assert(self->len() != 0);
while (tables.whitespace[uint8_t(*self->buf)]) {
++self->buf;
if (self->buf == self->bufEnd) {
return WeaselJson_AGAIN;
}
}
switch (*self->buf) { switch (*self->buf) {
case '}': case '}':
++self->buf; ++self->buf;
@@ -265,8 +278,8 @@ inline WeaselJsonStatus n_object3(Parser3 *self) {
case ',': case ',':
++self->buf; ++self->buf;
self->pop(); self->pop();
if (auto s = self->push({N_WHITESPACE, N_STRING, N_WHITESPACE, T_COLON, if (auto s =
N_VALUE, N_WHITESPACE, N_OBJECT3})) { self->push({N_WHITESPACE, N_STRING, T_COLON, N_VALUE, N_OBJECT3})) {
return s; return s;
} }
MUSTTAIL return Parser3::keepGoing(self); MUSTTAIL return Parser3::keepGoing(self);
@@ -282,13 +295,20 @@ inline WeaselJsonStatus n_array(Parser3 *self) {
self->callbacks->on_begin_array(self->data); self->callbacks->on_begin_array(self->data);
++self->buf; ++self->buf;
self->pop(); self->pop();
if (auto s = self->push({N_WHITESPACE, N_ARRAY2})) { if (auto s = self->push({N_ARRAY2})) {
return s; return s;
} }
MUSTTAIL return Parser3::keepGoing(self); MUSTTAIL return Parser3::keepGoing(self);
} }
inline WeaselJsonStatus n_array2(Parser3 *self) { inline WeaselJsonStatus n_array2(Parser3 *self) {
assert(self->len() != 0);
while (tables.whitespace[uint8_t(*self->buf)]) {
++self->buf;
if (self->buf == self->bufEnd) {
return WeaselJson_AGAIN;
}
}
switch (*self->buf) { switch (*self->buf) {
case ']': case ']':
++self->buf; ++self->buf;
@@ -297,7 +317,7 @@ inline WeaselJsonStatus n_array2(Parser3 *self) {
MUSTTAIL return Parser3::keepGoing(self); MUSTTAIL return Parser3::keepGoing(self);
default: default:
self->pop(); self->pop();
if (auto s = self->push({N_VALUE, N_WHITESPACE, N_ARRAY3})) { if (auto s = self->push({N_VALUE, N_ARRAY3})) {
return s; return s;
} }
MUSTTAIL return Parser3::keepGoing(self); MUSTTAIL return Parser3::keepGoing(self);
@@ -305,6 +325,13 @@ inline WeaselJsonStatus n_array2(Parser3 *self) {
} }
inline WeaselJsonStatus n_array3(Parser3 *self) { inline WeaselJsonStatus n_array3(Parser3 *self) {
assert(self->len() != 0);
while (tables.whitespace[uint8_t(*self->buf)]) {
++self->buf;
if (self->buf == self->bufEnd) {
return WeaselJson_AGAIN;
}
}
switch (*self->buf) { switch (*self->buf) {
case ']': case ']':
++self->buf; ++self->buf;
@@ -314,7 +341,7 @@ inline WeaselJsonStatus n_array3(Parser3 *self) {
case ',': case ',':
++self->buf; ++self->buf;
self->pop(); self->pop();
if (auto s = self->push({N_VALUE, N_WHITESPACE, N_ARRAY3})) { if (auto s = self->push({N_VALUE, N_ARRAY3})) {
return s; return s;
} }
MUSTTAIL return Parser3::keepGoing(self); MUSTTAIL return Parser3::keepGoing(self);
@@ -814,7 +841,17 @@ inline WeaselJsonStatus n_null(Parser3 *self) {
return WeaselJson_REJECT; return WeaselJson_REJECT;
} }
template <char kChar> inline WeaselJsonStatus singleChar(Parser3 *self) { template <char kChar, bool kSkipWhitespace = false>
inline WeaselJsonStatus singleChar(Parser3 *self) {
if constexpr (kSkipWhitespace) {
assert(self->len() != 0);
while (tables.whitespace[uint8_t(*self->buf)]) {
++self->buf;
if (self->buf == self->bufEnd) {
return WeaselJson_AGAIN;
}
}
}
if (*self->buf == kChar) { if (*self->buf == kChar) {
++self->buf; ++self->buf;
self->pop(); self->pop();
@@ -873,7 +910,7 @@ constexpr inline struct ContinuationTable {
continuations[T_A] = singleChar<'a'>; continuations[T_A] = singleChar<'a'>;
continuations[T_L] = singleChar<'l'>; continuations[T_L] = singleChar<'l'>;
continuations[T_S] = singleChar<'s'>; continuations[T_S] = singleChar<'s'>;
continuations[T_COLON] = singleChar<':'>; continuations[T_COLON] = singleChar<':', true>;
continuations[T_UTF8_CONTINUATION_BYTE] = t_utf8_continuation_byte; continuations[T_UTF8_CONTINUATION_BYTE] = t_utf8_continuation_byte;
continuations[T_UTF8_LAST_CONTINUATION_BYTE] = continuations[T_UTF8_LAST_CONTINUATION_BYTE] =
t_utf8_last_continuation_byte; t_utf8_last_continuation_byte;