mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-29 11:00:29 +00:00
LibJS: Add Handle specialisation for Value
This allows you to keep an arbitrary JS::Value alive without having to hook visit_edges somewhere, e.g. by being a NativeFunction that overrides visit_edges. For example, this allows you to store JS::Handle<JS::Value> as the key of a HashMap. This will be used to keep arbitrary Values alive in the key of a temporary HashMap in Array.prototype.groupByToMap. Co-authored-by: Ali Mohammad Pur <mpfard@serenityos.org>
This commit is contained in:
parent
1f1383fe1e
commit
c97244d3a5
Notes:
sideshowbarker
2024-07-17 21:38:04 +09:00
Author: https://github.com/Lubrsi Commit: https://github.com/SerenityOS/serenity/commit/c97244d3a54 Pull-request: https://github.com/SerenityOS/serenity/pull/11412 Reviewed-by: https://github.com/linusg
1 changed files with 39 additions and 0 deletions
|
@ -12,6 +12,7 @@
|
||||||
#include <AK/RefCounted.h>
|
#include <AK/RefCounted.h>
|
||||||
#include <AK/RefPtr.h>
|
#include <AK/RefPtr.h>
|
||||||
#include <LibJS/Forward.h>
|
#include <LibJS/Forward.h>
|
||||||
|
#include <LibJS/Runtime/Value.h>
|
||||||
|
|
||||||
namespace JS {
|
namespace JS {
|
||||||
|
|
||||||
|
@ -77,4 +78,42 @@ inline Handle<T> make_handle(T& cell)
|
||||||
return Handle<T>::create(&cell);
|
return Handle<T>::create(&cell);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
class Handle<Value> {
|
||||||
|
public:
|
||||||
|
Handle() = default;
|
||||||
|
|
||||||
|
static Handle create(Value value)
|
||||||
|
{
|
||||||
|
if (value.is_cell())
|
||||||
|
return Handle(value, &value.as_cell());
|
||||||
|
return Handle(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto cell() { return m_handle.cell(); }
|
||||||
|
auto cell() const { return m_handle.cell(); }
|
||||||
|
auto value() const { return m_value; }
|
||||||
|
bool is_null() const { return m_handle.is_null(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
explicit Handle(Value value)
|
||||||
|
: m_value(value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
explicit Handle(Value value, Cell* cell)
|
||||||
|
: m_value(value)
|
||||||
|
, m_handle(Handle<Cell>::create(cell))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Value m_value;
|
||||||
|
Handle<Cell> m_handle;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline Handle<Value> make_handle(Value value)
|
||||||
|
{
|
||||||
|
return Handle<Value>::create(value);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue