mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-01-22 17:24:48 -05:00
2f38c83caf
Whenever we create a GC function, it should always be so that we can pass it to a platform event loop spin, HTML event loop spin, or some queued task on the HTML event loop. For every use case, any local variables will be out of scope by the time the function executes.
50 lines
1.1 KiB
C++
50 lines
1.1 KiB
C++
/*
|
|
* Copyright (c) 2023, Andreas Kling <andreas@ladybird.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/Function.h>
|
|
#include <LibGC/Cell.h>
|
|
#include <LibGC/Heap.h>
|
|
|
|
namespace GC {
|
|
|
|
template<typename T>
|
|
class Function final : public Cell {
|
|
GC_CELL(Function, Cell);
|
|
|
|
public:
|
|
static Ref<Function> create(Heap& heap, ESCAPING AK::Function<T> function)
|
|
{
|
|
return heap.allocate<Function>(move(function));
|
|
}
|
|
|
|
virtual ~Function() override = default;
|
|
|
|
[[nodiscard]] AK::Function<T> const& function() const { return m_function; }
|
|
|
|
private:
|
|
Function(AK::Function<T> 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());
|
|
}
|
|
|
|
AK::Function<T> m_function;
|
|
};
|
|
|
|
template<typename Callable, typename T = EquivalentFunctionType<Callable>>
|
|
static Ref<Function<T>> create_function(Heap& heap, ESCAPING Callable&& function)
|
|
{
|
|
return Function<T>::create(heap, AK::Function<T> { forward<Callable>(function) });
|
|
}
|
|
|
|
}
|