FinalizationRegistry.h 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. /*
  2. * Copyright (c) 2021, Idan Horowitz <idan.horowitz@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/SinglyLinkedList.h>
  8. #include <LibJS/Runtime/FunctionObject.h>
  9. #include <LibJS/Runtime/GlobalObject.h>
  10. #include <LibJS/Runtime/Object.h>
  11. #include <LibJS/Runtime/Value.h>
  12. #include <LibJS/Runtime/WeakContainer.h>
  13. namespace JS {
  14. class FinalizationRegistry final
  15. : public Object
  16. , public WeakContainer {
  17. JS_OBJECT(FinalizationRegistry, Object);
  18. public:
  19. static FinalizationRegistry* create(GlobalObject&, FunctionObject&);
  20. explicit FinalizationRegistry(FunctionObject&, Object& prototype);
  21. virtual ~FinalizationRegistry() override;
  22. void add_finalization_record(Cell& target, Value held_value, Object* unregister_token);
  23. bool remove_by_token(Object& unregister_token);
  24. void cleanup(FunctionObject* callback = nullptr);
  25. virtual void remove_dead_cells(Badge<Heap>) override;
  26. private:
  27. virtual void visit_edges(Visitor& visitor) override;
  28. #ifdef JS_TRACK_ZOMBIE_CELLS
  29. virtual void did_become_zombie() override
  30. {
  31. deregister();
  32. }
  33. #endif
  34. FunctionObject* m_cleanup_callback { nullptr };
  35. struct FinalizationRecord {
  36. Cell* target { nullptr };
  37. Value held_value;
  38. Object* unregister_token { nullptr };
  39. };
  40. SinglyLinkedList<FinalizationRecord> m_records;
  41. };
  42. }