/* * Copyright (c) 2023, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include namespace JS { template class HeapFunction final : public CellImpl { JS_CELL(HeapFunction, CellImpl); public: static NonnullGCPtr create(Heap& heap, Function function) { return heap.allocate(move(function)); } virtual ~HeapFunction() override = default; [[nodiscard]] Function const& function() const { return m_function; } private: HeapFunction(Function function) : m_function(move(function)) { } virtual void visit_edges(Visitor& visitor) override { Base::visit_edges(visitor); visitor.visit_possible_values(m_function.raw_capture_range()); } Function m_function; }; template> static NonnullGCPtr> create_heap_function(Heap& heap, Callable&& function) { return HeapFunction::create(heap, Function { forward(function) }); } }