/* * Copyright (c) 2021, Idan Horowitz * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include namespace JS { class FinalizationRegistry final : public Object , public WeakContainer { JS_OBJECT(FinalizationRegistry, Object); public: explicit FinalizationRegistry(Realm&, JobCallback, Object& prototype); virtual ~FinalizationRegistry() override = default; void add_finalization_record(Cell& target, Value held_value, Object* unregister_token); bool remove_by_token(Object& unregister_token); ThrowCompletionOr cleanup(Optional = {}); virtual void remove_dead_cells(Badge) override; Realm& realm() { return *m_realm.cell(); } Realm const& realm() const { return *m_realm.cell(); } JobCallback& cleanup_callback() { return m_cleanup_callback; } JobCallback const& cleanup_callback() const { return m_cleanup_callback; } private: virtual void visit_edges(Visitor& visitor) override; Handle m_realm; JobCallback m_cleanup_callback; struct FinalizationRecord { Cell* target { nullptr }; Value held_value; Object* unregister_token { nullptr }; }; SinglyLinkedList m_records; }; }