[SCM] WebKit Debian packaging branch, webkit-1.1, updated. upstream/1.1.20-204-g221d8e8

senorblanco at chromium.org senorblanco at chromium.org
Wed Feb 10 22:14:30 UTC 2010


The following commit has been merged in the webkit-1.1 branch:
commit 83f16fd224772688af047f550150ca9d0386e9fe
Author: senorblanco at chromium.org <senorblanco at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Thu Feb 4 20:05:50 2010 +0000

    2010-02-04  Stephen White  <senorblanco at chromium.org>
    
            Unreviewed, build fix for Chromium.
    
            Revert r54341 ("[v8] Remove clear method from DOM object maps"),
            since it causes the worker tests to fail on Chromium.
    
            * bindings/v8/DOMData.h:
            (WebCore::DOMData::removeObjectsFromWrapperMap):
            * bindings/v8/DOMDataStore.h:
            (WebCore::ChunkedTable::clear):
            (WebCore::ChunkedTable::clearEntries):
            (WebCore::DOMDataStore::IntrusiveDOMWrapperMap::clear):
            (WebCore::DOMDataStore::IntrusiveDOMWrapperMap::ChunkedTableTraits::clear):
            * bindings/v8/V8DOMMap.cpp:
            (WebCore::removeAllDOMObjectsInCurrentThreadHelper):
            (WebCore::removeAllDOMObjectsInCurrentThread):
            * bindings/v8/V8DOMMap.h:
            (WebCore::WeakReferenceMap::clear):
            * bindings/v8/WorkerScriptController.cpp:
            (WebCore::WorkerScriptController::~WorkerScriptController):
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@54361 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 7f1416d..655d521 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,25 @@
+2010-02-04  Stephen White  <senorblanco at chromium.org>
+
+        Unreviewed, build fix for Chromium.
+
+        Revert r54341 ("[v8] Remove clear method from DOM object maps"),
+        since it causes the worker tests to fail on Chromium.
+
+        * bindings/v8/DOMData.h:
+        (WebCore::DOMData::removeObjectsFromWrapperMap):
+        * bindings/v8/DOMDataStore.h:
+        (WebCore::ChunkedTable::clear):
+        (WebCore::ChunkedTable::clearEntries):
+        (WebCore::DOMDataStore::IntrusiveDOMWrapperMap::clear):
+        (WebCore::DOMDataStore::IntrusiveDOMWrapperMap::ChunkedTableTraits::clear):
+        * bindings/v8/V8DOMMap.cpp:
+        (WebCore::removeAllDOMObjectsInCurrentThreadHelper):
+        (WebCore::removeAllDOMObjectsInCurrentThread):
+        * bindings/v8/V8DOMMap.h:
+        (WebCore::WeakReferenceMap::clear):
+        * bindings/v8/WorkerScriptController.cpp:
+        (WebCore::WorkerScriptController::~WorkerScriptController):
+
 2010-02-04  Gustavo Noronha Silva  <gustavo.noronha at collabora.co.uk>
 
         Reviewed by Xan Lopez.
diff --git a/WebCore/bindings/v8/DOMData.h b/WebCore/bindings/v8/DOMData.h
index 6aee519..7fa9e7d 100644
--- a/WebCore/bindings/v8/DOMData.h
+++ b/WebCore/bindings/v8/DOMData.h
@@ -112,6 +112,14 @@ namespace WebCore {
         }
     }
 
+    template<typename T>
+    void DOMData::removeObjectsFromWrapperMap(AbstractWeakReferenceMap<T, v8::Object>& domMap)
+    {
+        WrapperMapObjectRemover<T> remover;
+        domMap.visit(&remover);
+        domMap.clear();
+    }
+
 } // namespace WebCore
 
 #endif // DOMData_h
diff --git a/WebCore/bindings/v8/DOMDataStore.h b/WebCore/bindings/v8/DOMDataStore.h
index f175fbf..54a49e7 100644
--- a/WebCore/bindings/v8/DOMDataStore.h
+++ b/WebCore/bindings/v8/DOMDataStore.h
@@ -84,6 +84,27 @@ namespace WebCore {
             ASSERT(!m_chunks || ((m_chunks->m_entries < m_current) && (m_current <= m_last)));
         }
 
+        void clear()
+        {
+            if (!m_chunks)
+                return;
+
+            clearEntries(m_chunks->m_entries, m_current);
+            Chunk* last = m_chunks;
+            while (true) {
+                Chunk* previous = last->m_previous;
+                if (!previous)
+                    break;
+                delete last;
+                clearEntries(previous->m_entries, previous->m_entries + CHUNK_SIZE);
+                last = previous;
+            }
+
+            m_chunks = last;
+            m_current = m_chunks->m_entries;
+            m_last = m_current + CHUNK_SIZE;
+        }
+
         void visit(typename Traits::Visitor* visitor)
         {
             if (!m_chunks)
@@ -101,6 +122,12 @@ namespace WebCore {
             T m_entries[CHUNK_SIZE];
         };
 
+        static void clearEntries(T* first, T* last)
+        {
+            for (T* entry = first; entry < last; entry++)
+                Traits::clear(entry);
+        }
+
         static void visitEntries(T* first, T* last, typename Traits::Visitor* visitor)
         {
             for (T* entry = first; entry < last; entry++)
@@ -181,6 +208,11 @@ namespace WebCore {
 
             virtual bool removeIfPresent(Node* key, v8::Persistent<v8::Data> value);
 
+            virtual void clear()
+            {
+                m_table.clear();
+            }
+
         private:
             static int const numberOfEntries = (1 << 10) - 1;
 
@@ -195,6 +227,15 @@ namespace WebCore {
                     node->setWrapper(target);
                 }
 
+                static void clear(v8::Persistent<v8::Object>* entry)
+                {
+                    Node* node = V8Node::toNative(*entry);
+                    ASSERT(node->wrapper() == entry);
+
+                    node->clearWrapper();
+                    entry->Dispose();
+                }
+
                 static void visit(v8::Persistent<v8::Object>* entry, Visitor* visitor)
                 {
                     Node* node = V8Node::toNative(*entry);
diff --git a/WebCore/bindings/v8/V8DOMMap.cpp b/WebCore/bindings/v8/V8DOMMap.cpp
index 81372fb..fa2fba3 100644
--- a/WebCore/bindings/v8/V8DOMMap.cpp
+++ b/WebCore/bindings/v8/V8DOMMap.cpp
@@ -95,6 +95,45 @@ DOMWrapperMap<void>& getDOMSVGObjectWithContextMap()
 
 #endif // ENABLE(SVG)
 
+static void removeAllDOMObjectsInCurrentThreadHelper()
+{
+    v8::HandleScope scope;
+
+    // Deref all objects in the delayed queue.
+    DOMData::getCurrent()->derefDelayedObjects();
+
+    // The DOM objects with the following types only exist on the main thread.
+    if (WTF::isMainThread()) {
+        // Remove all DOM nodes.
+        DOMData::removeObjectsFromWrapperMap<Node>(getDOMNodeMap());
+
+#if ENABLE(SVG)
+        // Remove all SVG element instances in the wrapper map.
+        DOMData::removeObjectsFromWrapperMap<SVGElementInstance>(getDOMSVGElementInstanceMap());
+
+        // Remove all SVG objects with context in the wrapper map.
+        DOMData::removeObjectsFromWrapperMap<void>(getDOMSVGObjectWithContextMap());
+#endif
+    }
+
+    // Remove all DOM objects in the wrapper map.
+    DOMData::removeObjectsFromWrapperMap<void>(getDOMObjectMap());
+
+    // Remove all active DOM objects in the wrapper map.
+    DOMData::removeObjectsFromWrapperMap<void>(getActiveDOMObjectMap());
+}
+
+void removeAllDOMObjectsInCurrentThread()
+{
+    // Use the locker only if it has already been invoked before, as by worker thread.
+    if (v8::Locker::IsActive()) {
+        v8::Locker locker;
+        removeAllDOMObjectsInCurrentThreadHelper();
+    } else
+        removeAllDOMObjectsInCurrentThreadHelper();
+}
+
+
 void visitDOMNodesInCurrentThread(DOMWrapperMap<Node>::Visitor* visitor)
 {
     v8::HandleScope scope;
diff --git a/WebCore/bindings/v8/V8DOMMap.h b/WebCore/bindings/v8/V8DOMMap.h
index 6ecb488..a7e03a0 100644
--- a/WebCore/bindings/v8/V8DOMMap.h
+++ b/WebCore/bindings/v8/V8DOMMap.h
@@ -58,6 +58,7 @@ namespace WebCore {
         virtual bool contains(KeyType* obj) = 0;
         virtual void visit(Visitor* visitor) = 0;
         virtual bool removeIfPresent(KeyType* key, v8::Persistent<v8::Data> value) = 0;
+        virtual void clear() = 0;
 
         v8::WeakReferenceCallback weakReferenceCallback() { return m_weakReferenceCallback; }
     private:
@@ -118,6 +119,11 @@ namespace WebCore {
             return true;
         }
 
+        void clear()
+        {
+            m_map.clear();
+        }
+
         bool contains(KeyType* obj) { return m_map.contains(obj); }
 
         virtual void visit(typename Parent::Visitor* visitor)
@@ -164,6 +170,9 @@ namespace WebCore {
     DOMWrapperMap<void>& getActiveDOMObjectMap();
     void visitActiveDOMObjectsInCurrentThread(DOMWrapperMap<void>::Visitor*);
 
+    // This should be called to remove all DOM objects associated with the current thread when it is tearing down.
+    void removeAllDOMObjectsInCurrentThread();
+
 #if ENABLE(SVG)
     // A map for SVGElementInstances to its JS wrapper.
     DOMWrapperMap<SVGElementInstance>& getDOMSVGElementInstanceMap();
diff --git a/WebCore/bindings/v8/WorkerScriptController.cpp b/WebCore/bindings/v8/WorkerScriptController.cpp
index d10705a..f2311bf 100644
--- a/WebCore/bindings/v8/WorkerScriptController.cpp
+++ b/WebCore/bindings/v8/WorkerScriptController.cpp
@@ -57,6 +57,7 @@ WorkerScriptController::WorkerScriptController(WorkerContext* workerContext)
 
 WorkerScriptController::~WorkerScriptController()
 {
+    removeAllDOMObjectsInCurrentThread();
 }
 
 ScriptValue WorkerScriptController::evaluate(const ScriptSourceCode& sourceCode)

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list