Compare commits

..
2 Commits
2 changed files with 19 additions and 5 deletions
+14 -2
View File
@@ -446,13 +446,25 @@ inline PRESERVE_NONE WeaselJsonStatus n_object3(Parser3 *self, char *buf,
assert(!self->inKey); assert(!self->inKey);
self->inKey = true; self->inKey = true;
self->pop(); self->pop();
if (auto s = self->push({N_STRING, T_COLON, N_VALUE, N_OBJECT3})) { if (auto s = skipWhitespace(buf, bufEnd)) {
if (auto s2 = self->push({N_STRING, T_COLON, N_VALUE, N_OBJECT3})) {
return s2;
}
return s;
}
if (*buf != '"') [[unlikely]] {
return WeaselJson_REJECT;
}
++buf;
self->dataBegin = self->writeBuf = buf;
self->strDfa.reset();
if (auto s = self->push({N_STRING2, T_COLON, N_VALUE, N_OBJECT3})) {
return s; return s;
} }
if (buf == bufEnd) { if (buf == bufEnd) {
return WeaselJson_AGAIN; return WeaselJson_AGAIN;
} }
MUSTTAIL return n_string(self, buf, bufEnd); MUSTTAIL return n_string2(self, buf, bufEnd);
default: default:
[[unlikely]] return WeaselJson_REJECT; [[unlikely]] return WeaselJson_REJECT;
} }
+5 -3
View File
@@ -270,9 +270,10 @@ TEST_CASE("bench3") {
bench.batch(json.size()); bench.batch(json.size());
bench.unit("byte"); bench.unit("byte");
auto *parser = WeaselJsonParser_create(1024, &c, nullptr, 0); auto *parser = WeaselJsonParser_create(1024, &c, nullptr, 0);
std::string copy;
for (size_t stride = 128; stride <= json.size(); stride *= 2) { for (size_t stride = 128; stride <= json.size(); stride *= 2) {
bench.run("parser3 (stride: " + std::to_string(stride) + ")", [&]() { bench.run("parser3 (stride: " + std::to_string(stride) + ")", [&]() {
auto copy = json; copy = json;
WeaselJsonParser_reset(parser); WeaselJsonParser_reset(parser);
for (size_t i = 0; i < copy.size(); i += stride) { for (size_t i = 0; i < copy.size(); i += stride) {
if (WeaselJsonParser_parse(parser, copy.data() + i, if (WeaselJsonParser_parse(parser, copy.data() + i,
@@ -383,10 +384,11 @@ TEST_CASE("bench input types") {
bench.doNotOptimizeAway(doc); bench.doNotOptimizeAway(doc);
}); });
std::string copy;
{ {
auto *parser = WeaselJsonParser_create(1024, &c, nullptr, 0); auto *parser = WeaselJsonParser_create(1024, &c, nullptr, 0);
bench.run("parser3 " + name, [&]() { bench.run("parser3 " + name, [&]() {
auto copy = json; copy = json;
WeaselJsonParser_reset(parser); WeaselJsonParser_reset(parser);
if (WeaselJsonParser_parse(parser, copy.data(), copy.size()) != if (WeaselJsonParser_parse(parser, copy.data(), copy.size()) !=
WeaselJson_AGAIN) { WeaselJson_AGAIN) {
@@ -401,7 +403,7 @@ TEST_CASE("bench input types") {
{ {
auto *parser = WeaselJsonParser_create(1024, &c, nullptr, WeaselJsonRaw); auto *parser = WeaselJsonParser_create(1024, &c, nullptr, WeaselJsonRaw);
bench.run("parser3 (raw) " + name, [&]() { bench.run("parser3 (raw) " + name, [&]() {
auto copy = json; copy = json;
WeaselJsonParser_reset(parser); WeaselJsonParser_reset(parser);
if (WeaselJsonParser_parse(parser, copy.data(), copy.size()) != if (WeaselJsonParser_parse(parser, copy.data(), copy.size()) !=
WeaselJson_AGAIN) { WeaselJson_AGAIN) {