
This is a continuation of the previous commit. Calling initialize() is the first thing that's done after allocating a cell on the JS heap - and in the common case of allocating an object, that's where properties are assigned and intrinsics occasionally accessed. Since those are supposed to live on the realm eventually, this is another step into that direction.
51 lines
1.7 KiB
C++
51 lines
1.7 KiB
C++
/*
|
|
* Copyright (c) 2020, Matthew Olsson <mattco@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <LibJS/Runtime/Object.h>
|
|
|
|
namespace JS {
|
|
|
|
class JSONObject final : public Object {
|
|
JS_OBJECT(JSONObject, Object);
|
|
|
|
public:
|
|
explicit JSONObject(Realm&);
|
|
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<String> stringify_impl(GlobalObject&, Value value, Value replacer, Value space);
|
|
|
|
static Value parse_json_value(GlobalObject&, JsonValue const&);
|
|
|
|
private:
|
|
struct StringifyState {
|
|
FunctionObject* replacer_function { nullptr };
|
|
HashTable<Object*> seen_objects;
|
|
String indent { String::empty() };
|
|
String gap;
|
|
Optional<Vector<String>> property_list;
|
|
};
|
|
|
|
// Stringify helpers
|
|
static ThrowCompletionOr<String> serialize_json_property(GlobalObject&, StringifyState&, PropertyKey const& key, Object* holder);
|
|
static ThrowCompletionOr<String> serialize_json_object(GlobalObject&, StringifyState&, Object&);
|
|
static ThrowCompletionOr<String> serialize_json_array(GlobalObject&, StringifyState&, Object&);
|
|
static String quote_json_string(String);
|
|
|
|
// Parse helpers
|
|
static Object* parse_json_object(GlobalObject&, JsonObject const&);
|
|
static Array* parse_json_array(GlobalObject&, JsonArray const&);
|
|
static ThrowCompletionOr<Value> internalize_json_property(GlobalObject&, Object* holder, PropertyKey const& name, FunctionObject& reviver);
|
|
|
|
JS_DECLARE_NATIVE_FUNCTION(stringify);
|
|
JS_DECLARE_NATIVE_FUNCTION(parse);
|
|
};
|
|
|
|
}
|