mirror of
https://github.com/LadybirdBrowser/ladybird
synced 2026-04-26 01:35:08 +02:00
Replace the custom AK JSON parser with simdjson for parsing JSON in LibJS. This eliminates the intermediate AK::JsonValue object graph, going directly from JSON text to JS::Value. simdjson's on-demand API parses at ~4GB/s and only materializes values as they are accessed, making this both faster and more memory efficient than the previous approach. The AK JSON parser is still used elsewhere (WebDriver protocol, config files, etc.) but LibJS now uses simdjson exclusively for JSON.parse() and JSON.rawJSON().
55 lines
1.7 KiB
C++
55 lines
1.7 KiB
C++
/*
|
|
* Copyright (c) 2020, Matthew Olsson <mattco@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <LibJS/Export.h>
|
|
#include <LibJS/Runtime/Object.h>
|
|
|
|
namespace JS {
|
|
|
|
class JS_API JSONObject final : public Object {
|
|
JS_OBJECT(JSONObject, Object);
|
|
GC_DECLARE_ALLOCATOR(JSONObject);
|
|
|
|
public:
|
|
virtual void initialize(Realm&) override;
|
|
virtual ~JSONObject() override = default;
|
|
|
|
// The base implementation of stringify is exposed because it is used by
|
|
// test-js to communicate between the JS tests and the C++ test runner.
|
|
static ThrowCompletionOr<Optional<String>> stringify_impl(VM&, Value value, Value replacer, Value space);
|
|
|
|
static ThrowCompletionOr<Value> parse_json(VM&, StringView text);
|
|
|
|
private:
|
|
explicit JSONObject(Realm&);
|
|
|
|
struct StringifyState {
|
|
GC::Ptr<FunctionObject> replacer_function;
|
|
HashTable<GC::Ptr<Object>> seen_objects;
|
|
String indent;
|
|
String gap;
|
|
Optional<Vector<Utf16String>> property_list;
|
|
};
|
|
|
|
// Stringify helpers
|
|
static ThrowCompletionOr<Optional<String>> serialize_json_property(VM&, StringifyState&, PropertyKey const& key, Object* holder);
|
|
static ThrowCompletionOr<String> serialize_json_object(VM&, StringifyState&, Object&);
|
|
static ThrowCompletionOr<String> serialize_json_array(VM&, StringifyState&, Object&);
|
|
static String quote_json_string(Utf16View const&);
|
|
|
|
// Parse helpers
|
|
static ThrowCompletionOr<Value> internalize_json_property(VM&, Object* holder, PropertyKey const& name, FunctionObject& reviver);
|
|
|
|
JS_DECLARE_NATIVE_FUNCTION(stringify);
|
|
JS_DECLARE_NATIVE_FUNCTION(parse);
|
|
JS_DECLARE_NATIVE_FUNCTION(raw_json);
|
|
JS_DECLARE_NATIVE_FUNCTION(is_raw_json);
|
|
};
|
|
|
|
}
|