فهرست منبع

LibWeb: Add GC finalizer to DOM::NodeIterator

It's potentially unsafe to access `m_root` in the destructor since it
may have been swept, so move unregistration of the NodeIterator into a
GC finalizer instead.
Andreas Kling 2 سال پیش
والد
کامیت
eda566d112
2فایلهای تغییر یافته به همراه5 افزوده شده و 1 حذف شده
  1. 4 1
      Userland/Libraries/LibWeb/DOM/NodeIterator.cpp
  2. 1 0
      Userland/Libraries/LibWeb/DOM/NodeIterator.h

+ 4 - 1
Userland/Libraries/LibWeb/DOM/NodeIterator.cpp

@@ -19,8 +19,11 @@ NodeIterator::NodeIterator(Node& root)
     root.document().register_node_iterator({}, *this);
     root.document().register_node_iterator({}, *this);
 }
 }
 
 
-NodeIterator::~NodeIterator()
+NodeIterator::~NodeIterator() = default;
+
+void NodeIterator::finalize()
 {
 {
+    Base::finalize();
     m_root->document().unregister_node_iterator({}, *this);
     m_root->document().unregister_node_iterator({}, *this);
 }
 }
 
 

+ 1 - 0
Userland/Libraries/LibWeb/DOM/NodeIterator.h

@@ -38,6 +38,7 @@ private:
     explicit NodeIterator(Node& root);
     explicit NodeIterator(Node& root);
 
 
     virtual void visit_edges(Cell::Visitor&) override;
     virtual void visit_edges(Cell::Visitor&) override;
+    virtual void finalize() override;
 
 
     enum class Direction {
     enum class Direction {
         Next,
         Next,