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