[SCM] WebKit Debian packaging branch, webkit-1.3, updated. upstream/1.3.7-4207-g178b198

antonm at chromium.org antonm at chromium.org
Sun Feb 20 23:44:33 UTC 2011


The following commit has been merged in the webkit-1.3 branch:
commit ea255cbc126672188b4950958d373b7d1b90bfb5
Author: antonm at chromium.org <antonm at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Mon Jan 24 20:22:28 2011 +0000

    2011-01-24  Anton Muhin  <antonm at chromium.org>
    
            Reviewed by Nate Chapin.
    
            [v8] Refactoring: extract IntrusiveDOMWrapperMap into a seprate class and files.
            https://bugs.webkit.org/show_bug.cgi?id=52911
    
            Plain refactoring, covered by the existing tests.
    
            * WebCore.gypi: IntrusiveDOMWrapperMap.h added.
            * bindings/v8/DOMDataStore.cpp: IntrusiveDOMWrapperMap is moved out of DOMDataStore class.
            * bindings/v8/DOMDataStore.h: IntrusiveDOMWrapperMap is moved out of DOMDataStore class.
            * bindings/v8/IntrusiveDOMWrapperMap.h: Added.
            (WebCore::ChunkedTable::ChunkedTable):
            (WebCore::ChunkedTable::add):
            (WebCore::ChunkedTable::remove):
            (WebCore::ChunkedTable::clear):
            (WebCore::ChunkedTable::visit):
            (WebCore::ChunkedTable::Chunk::Chunk):
            (WebCore::ChunkedTable::clearEntries):
            (WebCore::ChunkedTable::visitEntries):
            (WebCore::IntrusiveDOMWrapperMap::IntrusiveDOMWrapperMap):
            (WebCore::IntrusiveDOMWrapperMap::get):
            (WebCore::IntrusiveDOMWrapperMap::set):
            (WebCore::IntrusiveDOMWrapperMap::contains):
            (WebCore::IntrusiveDOMWrapperMap::visit):
            (WebCore::IntrusiveDOMWrapperMap::removeIfPresent):
            (WebCore::IntrusiveDOMWrapperMap::clear):
            (WebCore::IntrusiveDOMWrapperMap::ChunkedTableTraits::move):
            (WebCore::IntrusiveDOMWrapperMap::ChunkedTableTraits::clear):
            (WebCore::IntrusiveDOMWrapperMap::ChunkedTableTraits::visit):
            * bindings/v8/StaticDOMDataStore.h: include added.
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@76541 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 0c8311c..92435f6 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,36 @@
+2011-01-24  Anton Muhin  <antonm at chromium.org>
+
+        Reviewed by Nate Chapin.
+
+        [v8] Refactoring: extract IntrusiveDOMWrapperMap into a seprate class and files.
+        https://bugs.webkit.org/show_bug.cgi?id=52911
+
+        Plain refactoring, covered by the existing tests.
+
+        * WebCore.gypi: IntrusiveDOMWrapperMap.h added.
+        * bindings/v8/DOMDataStore.cpp: IntrusiveDOMWrapperMap is moved out of DOMDataStore class.
+        * bindings/v8/DOMDataStore.h: IntrusiveDOMWrapperMap is moved out of DOMDataStore class.
+        * bindings/v8/IntrusiveDOMWrapperMap.h: Added.
+        (WebCore::ChunkedTable::ChunkedTable):
+        (WebCore::ChunkedTable::add):
+        (WebCore::ChunkedTable::remove):
+        (WebCore::ChunkedTable::clear):
+        (WebCore::ChunkedTable::visit):
+        (WebCore::ChunkedTable::Chunk::Chunk):
+        (WebCore::ChunkedTable::clearEntries):
+        (WebCore::ChunkedTable::visitEntries):
+        (WebCore::IntrusiveDOMWrapperMap::IntrusiveDOMWrapperMap):
+        (WebCore::IntrusiveDOMWrapperMap::get):
+        (WebCore::IntrusiveDOMWrapperMap::set):
+        (WebCore::IntrusiveDOMWrapperMap::contains):
+        (WebCore::IntrusiveDOMWrapperMap::visit):
+        (WebCore::IntrusiveDOMWrapperMap::removeIfPresent):
+        (WebCore::IntrusiveDOMWrapperMap::clear):
+        (WebCore::IntrusiveDOMWrapperMap::ChunkedTableTraits::move):
+        (WebCore::IntrusiveDOMWrapperMap::ChunkedTableTraits::clear):
+        (WebCore::IntrusiveDOMWrapperMap::ChunkedTableTraits::visit):
+        * bindings/v8/StaticDOMDataStore.h: include added.
+
 2011-01-24  Shane Stephens  <shanestephens at google.com>
 
         Reviewed by Chris Marrin.
diff --git a/Source/WebCore/WebCore.gypi b/Source/WebCore/WebCore.gypi
index bc1254a..6198c1f 100644
--- a/Source/WebCore/WebCore.gypi
+++ b/Source/WebCore/WebCore.gypi
@@ -893,6 +893,7 @@
             'bindings/v8/DOMDataStore.h',
             'bindings/v8/DOMWrapperWorld.cpp',
             'bindings/v8/DOMWrapperWorld.h',
+            'bindings/v8/IntrusiveDOMWrapperMap.h',
             'bindings/v8/IsolatedWorld.cpp',
             'bindings/v8/IsolatedWorld.h',
             'bindings/v8/JavaScriptCallFrame.cpp',
diff --git a/Source/WebCore/bindings/v8/DOMDataStore.cpp b/Source/WebCore/bindings/v8/DOMDataStore.cpp
index 5393bd9..21b47a4 100644
--- a/Source/WebCore/bindings/v8/DOMDataStore.cpp
+++ b/Source/WebCore/bindings/v8/DOMDataStore.cpp
@@ -173,20 +173,6 @@ void DOMDataStore::weakNodeCallback(v8::Persistent<v8::Value> value, void* domOb
     node->deref(); // Nobody overrides Node::deref so it's safe
 }
 
-bool DOMDataStore::IntrusiveDOMWrapperMap::removeIfPresent(Node* obj, v8::Persistent<v8::Object> value)
-{
-    ASSERT(obj);
-    v8::Persistent<v8::Object>* entry = obj->wrapper();
-    if (!entry)
-        return false;
-    if (*entry != value)
-        return false;
-    obj->clearWrapper();
-    m_table.remove(entry);
-    value.Dispose();
-    return true;
-}
-
 #if ENABLE(SVG)
 
 void DOMDataStore::weakSVGElementInstanceCallback(v8::Persistent<v8::Value> v8Object, void* domObject)
diff --git a/Source/WebCore/bindings/v8/DOMDataStore.h b/Source/WebCore/bindings/v8/DOMDataStore.h
index dbead9c..ffb9df5 100644
--- a/Source/WebCore/bindings/v8/DOMDataStore.h
+++ b/Source/WebCore/bindings/v8/DOMDataStore.h
@@ -51,95 +51,6 @@ namespace WebCore {
 
     typedef WTF::Vector<DOMDataStore*> DOMDataList;
 
-    template <class T, int CHUNK_SIZE, class Traits>
-    class ChunkedTable {
-      public:
-        ChunkedTable() : m_chunks(0), m_current(0), m_last(0) { }
-
-        T* add(T element)
-        {
-            if (m_current == m_last) {
-                m_chunks = new Chunk(m_chunks);
-                m_current = m_chunks->m_entries;
-                m_last = m_current + CHUNK_SIZE;
-            }
-            ASSERT((m_chunks->m_entries <= m_current) && (m_current < m_last));
-            T* p = m_current++;
-            *p = element;
-            return p;
-        }
-
-        void remove(T* element)
-        {
-            ASSERT(element);
-            ASSERT(m_current > m_chunks->m_entries);
-            m_current--;
-            if (element != m_current)
-                Traits::move(element, m_current);
-            if (m_current == m_chunks->m_entries) {
-                Chunk* toDelete = m_chunks;
-                m_chunks = toDelete->m_previous;
-                m_current = m_last = m_chunks ? m_chunks->m_entries + CHUNK_SIZE : 0;
-                delete toDelete;
-            }
-            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(DOMDataStore* store, typename Traits::Visitor* visitor)
-        {
-            if (!m_chunks)
-                return;
-
-            visitEntries(store, m_chunks->m_entries, m_current, visitor);
-            for (Chunk* chunk = m_chunks->m_previous; chunk; chunk = chunk->m_previous)
-                visitEntries(store, chunk->m_entries, chunk->m_entries + CHUNK_SIZE, visitor);
-        }
-
-      private:
-        struct Chunk {
-            explicit Chunk(Chunk* previous) : m_previous(previous) { }
-            Chunk* const m_previous;
-            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(DOMDataStore* store, T* first, T* last, typename Traits::Visitor* visitor)
-        {
-            for (T* entry = first; entry < last; entry++)
-                Traits::visit(store, entry, visitor);
-        }
-
-        Chunk* m_chunks;
-        T* m_current;
-        T* m_last;
-    };
-
     // DOMDataStore
     //
     // DOMDataStore is the backing store that holds the maps between DOM objects
@@ -161,79 +72,6 @@ namespace WebCore {
 #endif
         };
 
-        class IntrusiveDOMWrapperMap : public AbstractWeakReferenceMap<Node, v8::Object> {
-        public:
-            IntrusiveDOMWrapperMap(v8::WeakReferenceCallback callback)
-                : AbstractWeakReferenceMap<Node, v8::Object>(callback) { }
-
-            virtual v8::Persistent<v8::Object> get(Node* obj)
-            {
-                v8::Persistent<v8::Object>* wrapper = obj->wrapper();
-                return wrapper ? *wrapper : v8::Persistent<v8::Object>();
-            }
-
-            virtual void set(Node* obj, v8::Persistent<v8::Object> wrapper)
-            {
-                ASSERT(obj);
-                ASSERT(!obj->wrapper());
-                v8::Persistent<v8::Object>* entry = m_table.add(wrapper);
-                obj->setWrapper(entry);
-                wrapper.MakeWeak(obj, weakReferenceCallback());
-            }
-
-            virtual bool contains(Node* obj)
-            {
-                return obj->wrapper();
-            }
-
-            virtual void visit(DOMDataStore* store, Visitor* visitor)
-            {
-                m_table.visit(store, visitor);
-            }
-
-            virtual bool removeIfPresent(Node*, v8::Persistent<v8::Object>);
-
-            virtual void clear()
-            {
-                m_table.clear();
-            }
-
-        private:
-            static int const numberOfEntries = (1 << 10) - 1;
-
-            struct ChunkedTableTraits {
-                typedef IntrusiveDOMWrapperMap::Visitor Visitor;
-
-                static void move(v8::Persistent<v8::Object>* target, v8::Persistent<v8::Object>* source)
-                {
-                    *target = *source;
-                    Node* node = V8Node::toNative(*target);
-                    ASSERT(node);
-                    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(DOMDataStore* store, v8::Persistent<v8::Object>* entry, Visitor* visitor)
-                {
-                    Node* node = V8Node::toNative(*entry);
-                    ASSERT(node->wrapper() == entry);
-
-                    visitor->visitDOMWrapper(store, node, *entry);
-                }
-            };
-
-            typedef ChunkedTable<v8::Persistent<v8::Object>, numberOfEntries, ChunkedTableTraits> Table;
-            Table m_table;
-        };
-
         DOMDataStore(DOMData*);
         virtual ~DOMDataStore();
 
diff --git a/Source/WebCore/bindings/v8/IntrusiveDOMWrapperMap.h b/Source/WebCore/bindings/v8/IntrusiveDOMWrapperMap.h
new file mode 100644
index 0000000..5c066f0
--- /dev/null
+++ b/Source/WebCore/bindings/v8/IntrusiveDOMWrapperMap.h
@@ -0,0 +1,217 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef IntrusiveDOMWrapperMap_h
+#define IntrusiveDOMWrapperMap_h
+
+#include "DOMDataStore.h"
+#include "V8Node.h"
+
+namespace WebCore {
+
+template <class T, int CHUNK_SIZE, class Traits>
+class ChunkedTable {
+  public:
+    ChunkedTable() : m_chunks(0), m_current(0), m_last(0) { }
+
+    T* add(T element)
+    {
+        if (m_current == m_last) {
+            m_chunks = new Chunk(m_chunks);
+            m_current = m_chunks->m_entries;
+            m_last = m_current + CHUNK_SIZE;
+        }
+        ASSERT((m_chunks->m_entries <= m_current) && (m_current < m_last));
+        T* p = m_current++;
+        *p = element;
+        return p;
+    }
+
+    void remove(T* element)
+    {
+        ASSERT(element);
+        ASSERT(m_current > m_chunks->m_entries);
+        m_current--;
+        if (element != m_current)
+            Traits::move(element, m_current);
+        if (m_current == m_chunks->m_entries) {
+            Chunk* toDelete = m_chunks;
+            m_chunks = toDelete->m_previous;
+            m_current = m_last = m_chunks ? m_chunks->m_entries + CHUNK_SIZE : 0;
+            delete toDelete;
+        }
+        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(DOMDataStore* store, typename Traits::Visitor* visitor)
+    {
+        if (!m_chunks)
+            return;
+
+        visitEntries(store, m_chunks->m_entries, m_current, visitor);
+        for (Chunk* chunk = m_chunks->m_previous; chunk; chunk = chunk->m_previous)
+            visitEntries(store, chunk->m_entries, chunk->m_entries + CHUNK_SIZE, visitor);
+    }
+
+  private:
+    struct Chunk {
+        explicit Chunk(Chunk* previous) : m_previous(previous) { }
+        Chunk* const m_previous;
+        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(DOMDataStore* store, T* first, T* last, typename Traits::Visitor* visitor)
+    {
+        for (T* entry = first; entry < last; entry++)
+            Traits::visit(store, entry, visitor);
+    }
+
+    Chunk* m_chunks;
+    T* m_current;
+    T* m_last;
+};
+
+
+class IntrusiveDOMWrapperMap : public AbstractWeakReferenceMap<Node, v8::Object> {
+public:
+    IntrusiveDOMWrapperMap(v8::WeakReferenceCallback callback)
+        : AbstractWeakReferenceMap<Node, v8::Object>(callback) { }
+
+    virtual v8::Persistent<v8::Object> get(Node* obj)
+    {
+        v8::Persistent<v8::Object>* wrapper = obj->wrapper();
+        return wrapper ? *wrapper : v8::Persistent<v8::Object>();
+    }
+
+    virtual void set(Node* obj, v8::Persistent<v8::Object> wrapper)
+    {
+        ASSERT(obj);
+        ASSERT(!obj->wrapper());
+        v8::Persistent<v8::Object>* entry = m_table.add(wrapper);
+        obj->setWrapper(entry);
+        wrapper.MakeWeak(obj, weakReferenceCallback());
+    }
+
+    virtual bool contains(Node* obj)
+    {
+        return obj->wrapper();
+    }
+
+    virtual void visit(DOMDataStore* store, Visitor* visitor)
+    {
+        m_table.visit(store, visitor);
+    }
+
+    virtual bool removeIfPresent(Node* obj, v8::Persistent<v8::Object> value)
+    {
+        ASSERT(obj);
+        v8::Persistent<v8::Object>* entry = obj->wrapper();
+        if (!entry)
+            return false;
+        if (*entry != value)
+            return false;
+        obj->clearWrapper();
+        m_table.remove(entry);
+        value.Dispose();
+        return true;
+    }
+
+
+    virtual void clear()
+    {
+        m_table.clear();
+    }
+
+private:
+    static int const numberOfEntries = (1 << 10) - 1;
+
+    struct ChunkedTableTraits {
+        typedef IntrusiveDOMWrapperMap::Visitor Visitor;
+
+        static void move(v8::Persistent<v8::Object>* target, v8::Persistent<v8::Object>* source)
+        {
+            *target = *source;
+            Node* node = V8Node::toNative(*target);
+            ASSERT(node);
+            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(DOMDataStore* store, v8::Persistent<v8::Object>* entry, Visitor* visitor)
+        {
+            Node* node = V8Node::toNative(*entry);
+            ASSERT(node->wrapper() == entry);
+
+            visitor->visitDOMWrapper(store, node, *entry);
+        }
+    };
+
+    typedef ChunkedTable<v8::Persistent<v8::Object>, numberOfEntries, ChunkedTableTraits> Table;
+    Table m_table;
+};
+
+} // namespace WebCore
+
+#endif
diff --git a/Source/WebCore/bindings/v8/StaticDOMDataStore.h b/Source/WebCore/bindings/v8/StaticDOMDataStore.h
index fb6aa42..940646e 100644
--- a/Source/WebCore/bindings/v8/StaticDOMDataStore.h
+++ b/Source/WebCore/bindings/v8/StaticDOMDataStore.h
@@ -32,6 +32,7 @@
 #define StaticDOMDataStore_h
 
 #include "DOMDataStore.h"
+#include "IntrusiveDOMWrapperMap.h"
 
 namespace WebCore {
 

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list