[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