Title: [119584] trunk/Source/WebCore
Revision
119584
Author
[email protected]
Date
2012-06-06 04:34:45 -0700 (Wed, 06 Jun 2012)

Log Message

[Qt] REGRESSION(r118616): It made all tests crash in debug mode
https://bugs.webkit.org/show_bug.cgi?id=87701

Reviewed by Csaba Osztrogonác.

Replace WriteBarrier<JSObject> to Weak<JSObject> by introducing a new
QtWeakObjectReference sub class. Rewrite all affected type definitions.

All existing test in debug mode cover this issue.

* bridge/qt/qt_class.cpp:
(JSC::Bindings::QtClass::fallbackObject):
* bridge/qt/qt_instance.cpp:
(QtRuntimeObject):
(JSC::Bindings::QtInstance::removeUnusedMethods):
* bridge/qt/qt_instance.h:
(QtInstance):
(QtWeakObjectReference):
(JSC::Bindings::QtInstance::QtWeakObjectReference::QtWeakObjectReference):
(JSC::Bindings::QtInstance::QtWeakObjectReference::operator=):
(JSC::Bindings::QtInstance::QtWeakObjectReference::get):
* bridge/qt/qt_runtime.cpp:
(JSC::Bindings::QtRuntimeMethodData::finalize):
* bridge/qt/qt_runtime_qt4.cpp:
(JSC::Bindings::QtRuntimeMethodData::finalize):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (119583 => 119584)


--- trunk/Source/WebCore/ChangeLog	2012-06-06 11:27:56 UTC (rev 119583)
+++ trunk/Source/WebCore/ChangeLog	2012-06-06 11:34:45 UTC (rev 119584)
@@ -1,3 +1,31 @@
+2012-06-06  Zoltan Herczeg  <[email protected]>
+
+        [Qt] REGRESSION(r118616): It made all tests crash in debug mode
+        https://bugs.webkit.org/show_bug.cgi?id=87701
+
+        Reviewed by Csaba Osztrogonác.
+
+        Replace WriteBarrier<JSObject> to Weak<JSObject> by introducing a new
+        QtWeakObjectReference sub class. Rewrite all affected type definitions.
+
+        All existing test in debug mode cover this issue.
+
+        * bridge/qt/qt_class.cpp:
+        (JSC::Bindings::QtClass::fallbackObject):
+        * bridge/qt/qt_instance.cpp:
+        (QtRuntimeObject):
+        (JSC::Bindings::QtInstance::removeUnusedMethods):
+        * bridge/qt/qt_instance.h:
+        (QtInstance):
+        (QtWeakObjectReference):
+        (JSC::Bindings::QtInstance::QtWeakObjectReference::QtWeakObjectReference):
+        (JSC::Bindings::QtInstance::QtWeakObjectReference::operator=):
+        (JSC::Bindings::QtInstance::QtWeakObjectReference::get):
+        * bridge/qt/qt_runtime.cpp:
+        (JSC::Bindings::QtRuntimeMethodData::finalize):
+        * bridge/qt/qt_runtime_qt4.cpp:
+        (JSC::Bindings::QtRuntimeMethodData::finalize):
+
 2012-06-06  Eugene Klyuchnikov  <[email protected]>
 
         Web Inspector: help/settings screen does not overlay console in split screen mode

Modified: trunk/Source/WebCore/bridge/qt/qt_class.cpp (119583 => 119584)


--- trunk/Source/WebCore/bridge/qt/qt_class.cpp	2012-06-06 11:27:56 UTC (rev 119583)
+++ trunk/Source/WebCore/bridge/qt/qt_class.cpp	2012-06-06 11:34:45 UTC (rev 119584)
@@ -87,7 +87,7 @@
         QMetaMethod m = m_metaObject->method(index);
         if (m.access() != QMetaMethod::Private) {
             QtRuntimeMetaMethod* val = QtRuntimeMetaMethod::create(exec, ustring, static_cast<QtInstance*>(inst), index, normal, false);
-            qtinst->m_methods.insert(name, WriteBarrier<JSObject>(exec->globalData(), qtinst->createRuntimeObject(exec), val));
+            qtinst->m_methods.insert(name, val);
             return val;
         }
     }
@@ -110,7 +110,7 @@
         if (normal == m.name()) {
 #endif
             QtRuntimeMetaMethod* val = QtRuntimeMetaMethod::create(exec, ustring, static_cast<QtInstance*>(inst), index, normal, false);
-            qtinst->m_methods.insert(name, WriteBarrier<JSObject>(exec->globalData(), qtinst->createRuntimeObject(exec), val));
+            qtinst->m_methods.insert(name, val);
             return val;
         }
     }

Modified: trunk/Source/WebCore/bridge/qt/qt_instance.cpp (119583 => 119584)


--- trunk/Source/WebCore/bridge/qt/qt_instance.cpp	2012-06-06 11:27:56 UTC (rev 119583)
+++ trunk/Source/WebCore/bridge/qt/qt_instance.cpp	2012-06-06 11:34:45 UTC (rev 119584)
@@ -61,15 +61,6 @@
     
     static const ClassInfo s_info;
 
-    static void visitChildren(JSCell* cell, SlotVisitor& visitor)
-    {
-        QtRuntimeObject* thisObject = jsCast<QtRuntimeObject*>(cell);
-        RuntimeObject::visitChildren(thisObject, visitor);
-        QtInstance* instance = static_cast<QtInstance*>(thisObject->getInternalInstance());
-        if (instance)
-            instance->visitAggregate(visitor);
-    }
-
     static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue prototype)
     {
         return Structure::create(globalData, globalObject, prototype, TypeInfo(ObjectType,  StructureFlags), &s_info);
@@ -158,13 +149,13 @@
     JSObject::put(object, exec, propertyName, value, slot);
 }
 
-void QtInstance::removeCachedMethod(JSObject* method)
+void QtInstance::removeUnusedMethods()
 {
-    for (QHash<QByteArray, WriteBarrier<JSObject> >::Iterator it = m_methods.begin(), end = m_methods.end(); it != end; ++it) {
-        if (it.value().get() == method) {
-            m_methods.erase(it);
-            return;
-        }
+    for (QHash<QByteArray, QtWeakObjectReference>::Iterator it = m_methods.begin(), end = m_methods.end(); it != end; ) {
+        if (!it.value().get())
+            it = m_methods.erase(it);
+        else
+            ++it;
     }
 }
 
@@ -194,12 +185,6 @@
     return QtRuntimeObject::create(exec, exec->lexicalGlobalObject(), this);
 }
 
-void QtInstance::visitAggregate(SlotVisitor& visitor)
-{
-    for (QHash<QByteArray, WriteBarrier<JSObject> >::Iterator it = m_methods.begin(), end = m_methods.end(); it != end; ++it)
-        visitor.append(&it.value());
-}
-
 void QtInstance::begin()
 {
     // Do nothing.

Modified: trunk/Source/WebCore/bridge/qt/qt_instance.h (119583 => 119584)


--- trunk/Source/WebCore/bridge/qt/qt_instance.h	2012-06-06 11:27:56 UTC (rev 119583)
+++ trunk/Source/WebCore/bridge/qt/qt_instance.h	2012-06-06 11:34:45 UTC (rev 119584)
@@ -21,10 +21,11 @@
 #define qt_instance_h
 
 #include "BridgeJSC.h"
-#include "runtime_root.h"
 #include <QStack>
 #include <QWeakPointer>
 #include <QtScript/qscriptengine.h>
+#include "Weak.h"
+#include "runtime_root.h"
 #include <qhash.h>
 #include <qset.h>
 
@@ -49,8 +50,6 @@
     virtual JSValue valueOf(ExecState*) const;
     virtual JSValue defaultValue(ExecState*, PreferredPrimitiveType) const;
 
-    void visitAggregate(SlotVisitor&);
-
     virtual JSValue getMethod(ExecState*, PropertyName);
     virtual JSValue invokeMethod(ExecState*, RuntimeMethod*);
 
@@ -68,7 +67,7 @@
     virtual bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&);
     virtual void put(JSObject*, ExecState*, PropertyName, JSValue, PutPropertySlot&);
 
-    void removeCachedMethod(JSObject*);
+    void removeUnusedMethods();
 
     static QtInstance* getInstance(JSObject*);
 
@@ -85,6 +84,39 @@
     static QtSenderStack* qtSenderStack();
 
 private:
+
+    class QtWeakObjectReference {
+    public:
+        QtWeakObjectReference(JSObject* reference)
+            : m_reference(reference)
+        {
+        }
+
+        QtWeakObjectReference(const QtWeakObjectReference& source)
+            : m_reference(source.m_reference.get())
+        {
+        }
+
+        QtWeakObjectReference()
+            : m_reference()
+        {
+        }
+
+        QtWeakObjectReference& operator=(const QtWeakObjectReference& source)
+        {
+            m_reference = PassWeak<JSObject>(source.m_reference.get());
+            return *this;
+        }
+
+        JSObject* get() const
+        {
+            return m_reference.get();
+        }
+
+    private:
+        Weak<JSObject> m_reference;
+    };
+
     static PassRefPtr<QtInstance> create(QObject *instance, PassRefPtr<RootObject> rootObject, QScriptEngine::ValueOwnership ownership)
     {
         return adoptRef(new QtInstance(instance, rootObject, ownership));
@@ -96,7 +128,7 @@
     mutable QtClass* m_class;
     QWeakPointer<QObject> m_object;
     QObject* m_hashkey;
-    mutable QHash<QByteArray, WriteBarrier<JSObject> > m_methods;
+    mutable QHash<QByteArray, QtWeakObjectReference> m_methods;
     mutable QHash<QString, QtField*> m_fields;
     QScriptEngine::ValueOwnership m_ownership;
 };

Modified: trunk/Source/WebCore/bridge/qt/qt_runtime.cpp (119583 => 119584)


--- trunk/Source/WebCore/bridge/qt/qt_runtime.cpp	2012-06-06 11:27:56 UTC (rev 119583)
+++ trunk/Source/WebCore/bridge/qt/qt_runtime.cpp	2012-06-06 11:34:45 UTC (rev 119584)
@@ -998,9 +998,9 @@
 {
 }
 
-void QtRuntimeMethodData::finalize(Handle<Unknown> value, void*)
+void QtRuntimeMethodData::finalize(Handle<Unknown>, void*)
 {
-    m_instance->removeCachedMethod(static_cast<JSObject*>(value.get().asCell()));
+    m_instance->removeUnusedMethods();
 }
 
 QtRuntimeMetaMethodData::~QtRuntimeMetaMethodData()

Modified: trunk/Source/WebCore/bridge/qt/qt_runtime_qt4.cpp (119583 => 119584)


--- trunk/Source/WebCore/bridge/qt/qt_runtime_qt4.cpp	2012-06-06 11:27:56 UTC (rev 119583)
+++ trunk/Source/WebCore/bridge/qt/qt_runtime_qt4.cpp	2012-06-06 11:34:45 UTC (rev 119584)
@@ -998,9 +998,9 @@
 {
 }
 
-void QtRuntimeMethodData::finalize(Handle<Unknown> value, void*)
+void QtRuntimeMethodData::finalize(Handle<Unknown>, void*)
 {
-    m_instance->removeCachedMethod(static_cast<JSObject*>(value.get().asCell()));
+    m_instance->removeUnusedMethods();
 }
 
 QtRuntimeMetaMethodData::~QtRuntimeMetaMethodData()
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to