mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-25 00:50:22 +00:00
4e004a664f
Keep a 256-entry string cache during parse to avoid creating some new strings when possible. This cache is far from perfect but very cheap. Since none of the strings are transient, this only costs us a couple of pointers and a bit of ref-count manipulation. The cache hit rate on 4chan_catalog.json is ~33% and the speedup on the load_4chan_catalog benchmark is ~7%.
49 lines
917 B
C++
49 lines
917 B
C++
#pragma once
|
|
|
|
#include <AK/JsonValue.h>
|
|
|
|
namespace AK {
|
|
|
|
class JsonParser {
|
|
public:
|
|
explicit JsonParser(const StringView& input)
|
|
: m_input(input)
|
|
{
|
|
}
|
|
~JsonParser()
|
|
{
|
|
}
|
|
|
|
JsonValue parse();
|
|
|
|
private:
|
|
char peek() const;
|
|
char consume();
|
|
void consume_whitespace();
|
|
void consume_specific(char expected_ch);
|
|
void consume_string(const char*);
|
|
String consume_quoted_string();
|
|
JsonArray parse_array();
|
|
JsonObject parse_object();
|
|
JsonValue parse_number();
|
|
JsonValue parse_string();
|
|
JsonValue parse_false();
|
|
JsonValue parse_true();
|
|
JsonValue parse_null();
|
|
JsonValue parse_undefined();
|
|
|
|
template<typename C>
|
|
void consume_while(C);
|
|
|
|
template<typename C>
|
|
Vector<char, 128> extract_while(C);
|
|
|
|
StringView m_input;
|
|
int m_index { 0 };
|
|
|
|
String m_last_string_starting_with_character[256];
|
|
};
|
|
|
|
}
|
|
|
|
using AK::JsonParser;
|