diff --git a/Userland/Libraries/LibJS/Runtime/ExecutionContext.h b/Userland/Libraries/LibJS/Runtime/ExecutionContext.h index 5e0ce04953..a8a4ecaf41 100644 --- a/Userland/Libraries/LibJS/Runtime/ExecutionContext.h +++ b/Userland/Libraries/LibJS/Runtime/ExecutionContext.h @@ -24,7 +24,7 @@ struct ExecutionContext { [[nodiscard]] ExecutionContext copy() const { - ExecutionContext copy { arguments.copy() }; + ExecutionContext copy { arguments }; copy.function = function; copy.realm = realm; diff --git a/Userland/Libraries/LibJS/Runtime/MarkedValueList.cpp b/Userland/Libraries/LibJS/Runtime/MarkedValueList.cpp index bff5456072..1e770d831d 100644 --- a/Userland/Libraries/LibJS/Runtime/MarkedValueList.cpp +++ b/Userland/Libraries/LibJS/Runtime/MarkedValueList.cpp @@ -10,21 +10,42 @@ namespace JS { MarkedValueList::MarkedValueList(Heap& heap) - : m_heap(heap) + : m_heap(&heap) { - m_heap.did_create_marked_value_list({}, *this); + m_heap->did_create_marked_value_list({}, *this); +} + +MarkedValueList::MarkedValueList(MarkedValueList const& other) + : Vector(other) + , m_heap(other.m_heap) +{ + m_heap->did_create_marked_value_list({}, *this); } MarkedValueList::MarkedValueList(MarkedValueList&& other) : Vector(move(static_cast&>(other))) , m_heap(other.m_heap) { - m_heap.did_create_marked_value_list({}, *this); + m_heap->did_create_marked_value_list({}, *this); } MarkedValueList::~MarkedValueList() { - m_heap.did_destroy_marked_value_list({}, *this); + m_heap->did_destroy_marked_value_list({}, *this); +} + +MarkedValueList& MarkedValueList::operator=(JS::MarkedValueList const& other) +{ + Vector::operator=(other); + + if (m_heap != other.m_heap) { + m_heap = other.m_heap; + + // NOTE: IntrusiveList will remove this MarkedValueList from the old heap it was part of. + m_heap->did_create_marked_value_list({}, *this); + } + + return *this; } } diff --git a/Userland/Libraries/LibJS/Runtime/MarkedValueList.h b/Userland/Libraries/LibJS/Runtime/MarkedValueList.h index a3ec8bf9db..dbb5bdd49d 100644 --- a/Userland/Libraries/LibJS/Runtime/MarkedValueList.h +++ b/Userland/Libraries/LibJS/Runtime/MarkedValueList.h @@ -15,26 +15,18 @@ namespace JS { class MarkedValueList : public Vector { - AK_MAKE_NONCOPYABLE(MarkedValueList); - public: explicit MarkedValueList(Heap&); + MarkedValueList(MarkedValueList const&); MarkedValueList(MarkedValueList&&); ~MarkedValueList(); - MarkedValueList& operator=(MarkedValueList&&) = delete; - Vector& values() { return *this; } - MarkedValueList copy() const - { - MarkedValueList copy { m_heap }; - copy.extend(*this); - return copy; - } + MarkedValueList& operator=(JS::MarkedValueList const& other); private: - Heap& m_heap; + Heap* m_heap; IntrusiveListNode m_list_node;