diff --git a/Libraries/LibGC/Cell.h b/Libraries/LibGC/Cell.h index 8172276c4a..087a2577b6 100644 --- a/Libraries/LibGC/Cell.h +++ b/Libraries/LibGC/Cell.h @@ -16,6 +16,7 @@ #include #include #include +#include #include namespace GC { @@ -103,6 +104,13 @@ public: visit(value); } + template + void visit(ReadonlySpan span) + requires(IsBaseOf) + { + visit_impl(ReadonlySpan(span.data(), span.size())); + } + template void visit(Span span) { @@ -110,6 +118,13 @@ public: visit(value); } + template + void visit(Span span) + requires(IsBaseOf) + { + visit_impl(ReadonlySpan(span.data(), span.size())); + } + template void visit(Vector const& vector) { @@ -117,6 +132,13 @@ public: visit(value); } + template + void visit(Vector const& vector) + requires(IsBaseOf) + { + visit_impl(ReadonlySpan(vector.span().data(), vector.size())); + } + template void visit(HashTable const& table) { @@ -173,6 +195,7 @@ public: protected: virtual void visit_impl(Cell&) = 0; + virtual void visit_impl(ReadonlySpan) = 0; virtual ~Visitor() = default; } SWIFT_UNSAFE_REFERENCE; diff --git a/Libraries/LibGC/Heap.cpp b/Libraries/LibGC/Heap.cpp index 9764b229f7..828057b7d9 100644 --- a/Libraries/LibGC/Heap.cpp +++ b/Libraries/LibGC/Heap.cpp @@ -150,6 +150,12 @@ public: m_work_queue.append(cell); } + virtual void visit_impl(ReadonlySpan values) override + { + for (auto const& value : values) + visit(value); + } + virtual void visit_possible_values(ReadonlyBytes bytes) override { HashMap possible_pointers; @@ -490,6 +496,23 @@ public: m_work_queue.append(cell); } + virtual void visit_impl(ReadonlySpan values) override + { + m_work_queue.ensure_capacity(m_work_queue.size() + values.size()); + + for (auto value : values) { + if (!value.is_cell()) + continue; + auto& cell = value.as_cell(); + if (cell.is_marked()) + continue; + dbgln_if(HEAP_DEBUG, " ! {}", &cell); + + cell.set_marked(true); + m_work_queue.unchecked_append(cell); + } + } + virtual void visit_possible_values(ReadonlyBytes bytes) override { HashMap possible_pointers; diff --git a/Libraries/LibJS/Runtime/VM.cpp b/Libraries/LibJS/Runtime/VM.cpp index c94c80bc1b..6d7c39be10 100644 --- a/Libraries/LibJS/Runtime/VM.cpp +++ b/Libraries/LibJS/Runtime/VM.cpp @@ -260,6 +260,14 @@ struct ExecutionContextRootsCollector : public Cell::Visitor { roots.set(&cell); } + virtual void visit_impl(ReadonlySpan values) override + { + for (auto const& value : values) { + if (value.is_cell()) + roots.set(value.as_cell()); + } + } + virtual void visit_possible_values(ReadonlyBytes) override { VERIFY_NOT_REACHED();