/* * Copyright (c) 2020, Matthew Olsson * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include namespace JS { class JSONObject final : public Object { JS_OBJECT(JSONObject, Object); public: virtual ThrowCompletionOr 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 stringify_impl(VM&, Value value, Value replacer, Value space); static Value parse_json_value(VM&, JsonValue const&); private: explicit JSONObject(Realm&); struct StringifyState { FunctionObject* replacer_function { nullptr }; HashTable seen_objects; DeprecatedString indent { DeprecatedString::empty() }; DeprecatedString gap; Optional> property_list; }; // Stringify helpers static ThrowCompletionOr serialize_json_property(VM&, StringifyState&, PropertyKey const& key, Object* holder); static ThrowCompletionOr serialize_json_object(VM&, StringifyState&, Object&); static ThrowCompletionOr serialize_json_array(VM&, StringifyState&, Object&); static DeprecatedString quote_json_string(DeprecatedString); // Parse helpers static Object* parse_json_object(VM&, JsonObject const&); static Array* parse_json_array(VM&, JsonArray const&); static ThrowCompletionOr internalize_json_property(VM&, Object* holder, PropertyKey const& name, FunctionObject& reviver); JS_DECLARE_NATIVE_FUNCTION(stringify); JS_DECLARE_NATIVE_FUNCTION(parse); }; }