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()