HeapFunction.h 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. /*
  2. * Copyright (c) 2023, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Function.h>
  8. #include <LibJS/Heap/Cell.h>
  9. #include <LibJS/Heap/Heap.h>
  10. namespace JS {
  11. template<typename T>
  12. class HeapFunction final : public JS::Cell {
  13. JS_CELL(HeapFunction, Cell);
  14. public:
  15. static NonnullGCPtr<HeapFunction> create(Heap& heap, Function<T> function)
  16. {
  17. return heap.allocate_without_realm<HeapFunction>(move(function));
  18. }
  19. virtual ~HeapFunction() override = default;
  20. [[nodiscard]] Function<T> const& function() const { return m_function; }
  21. private:
  22. HeapFunction(Function<T> function)
  23. : m_function(move(function))
  24. {
  25. }
  26. virtual void visit_edges(Visitor& visitor) override
  27. {
  28. Base::visit_edges(visitor);
  29. visitor.visit_possible_values(m_function.raw_capture_range());
  30. }
  31. Function<T> m_function;
  32. };
  33. template<typename Callable, typename T = EquivalentFunctionType<Callable>>
  34. static NonnullGCPtr<HeapFunction<T>> create_heap_function(Heap& heap, Callable&& function)
  35. {
  36. return HeapFunction<T>::create(heap, Function<T> { forward<Callable>(function) });
  37. }
  38. }