diff options
author | Lars Knoll <lars.knoll@digia.com> | 2014-03-26 15:11:48 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-03-27 20:39:59 +0100 |
commit | 7ae796cb141b73a1b215b2b0fd64b7ffbbd1e510 (patch) | |
tree | 9f9b45d8f2036cc50b4298f8a3fdbe33d4d1eeda | |
parent | b9bf708bf85ba062d009ccf5e13e3494dc88a5d1 (diff) |
Get rid of collectDeletables
The method is only required for the QObjectWrapper, but
there we can instead simply register the deletable in the
destroy method.
Change-Id: I944319d327859cce33ac31a174e8d56fc4babfc1
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
-rw-r--r-- | src/qml/jsruntime/qv4managed_p.h | 23 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4mm.cpp | 21 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4mm_p.h | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4qobjectwrapper.cpp | 14 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4qobjectwrapper_p.h | 6 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4string.cpp | 1 |
6 files changed, 24 insertions, 45 deletions
diff --git a/src/qml/jsruntime/qv4managed_p.h b/src/qml/jsruntime/qv4managed_p.h index 8c6f2daf9b..5ad4c28970 100644 --- a/src/qml/jsruntime/qv4managed_p.h +++ b/src/qml/jsruntime/qv4managed_p.h @@ -111,7 +111,6 @@ struct ObjectVTable ManagedVTable managedVTable; ReturnedValue (*call)(Managed *, CallData *data); ReturnedValue (*construct)(Managed *, CallData *data); - void (*collectDeletables)(Managed *, GCDeletable **deletable); ReturnedValue (*get)(Managed *, const StringRef name, bool *hasProperty); ReturnedValue (*getIndexed)(Managed *, uint index, bool *hasProperty); void (*put)(Managed *, const StringRef name, const ValueRef value); @@ -153,7 +152,6 @@ const QV4::ObjectVTable classname::static_vtbl = \ DEFINE_MANAGED_VTABLE_INT(classname), \ call, \ construct, \ - 0, \ get, \ getIndexed, \ put, \ @@ -174,7 +172,6 @@ const QV4::ObjectVTable classname::static_vtbl = \ DEFINE_MANAGED_VTABLE_INT(name), \ call, \ construct, \ - 0, \ get, \ getIndexed, \ put, \ @@ -189,26 +186,6 @@ const QV4::ObjectVTable classname::static_vtbl = \ advanceIterator \ } -#define DEFINE_MANAGED_VTABLE_WITH_DELETABLES(classname) \ -const QV4::ObjectVTable classname::static_vtbl = \ -{ \ - DEFINE_MANAGED_VTABLE_INT(classname), \ - call, \ - construct, \ - collectDeletables, \ - get, \ - getIndexed, \ - put, \ - putIndexed, \ - query, \ - queryIndexed, \ - deleteProperty, \ - deleteIndexedProperty, \ - getLookup, \ - setLookup, \ - getLength, \ - advanceIterator \ -} struct Q_QML_EXPORT Managed { diff --git a/src/qml/jsruntime/qv4mm.cpp b/src/qml/jsruntime/qv4mm.cpp index 421cc2cf82..95d105c993 100644 --- a/src/qml/jsruntime/qv4mm.cpp +++ b/src/qml/jsruntime/qv4mm.cpp @@ -114,6 +114,7 @@ struct MemoryManager::Data LargeItem *largeItems; + GCDeletable *deletable; // statistics: #ifdef DETAILED_MM_STATS @@ -127,6 +128,7 @@ struct MemoryManager::Data , totalAlloc(0) , maxShift(10) , largeItems(0) + , deletable(0) { memset(smallItems, 0, sizeof(smallItems)); memset(nChunks, 0, sizeof(nChunks)); @@ -347,11 +349,8 @@ void MemoryManager::sweep(bool lastSweep) } } - GCDeletable *deletable = 0; - GCDeletable **firstDeletable = &deletable; - for (QVector<Data::Chunk>::iterator i = m_d->heapChunks.begin(), ei = m_d->heapChunks.end(); i != ei; ++i) - sweep(reinterpret_cast<char*>(i->memory.base()), i->memory.size(), i->chunkSize, &deletable); + sweep(reinterpret_cast<char*>(i->memory.base()), i->memory.size(), i->chunkSize); Data::LargeItem *i = m_d->largeItems; Data::LargeItem **last = &m_d->largeItems; @@ -370,16 +369,17 @@ void MemoryManager::sweep(bool lastSweep) i = *last; } - deletable = *firstDeletable; + GCDeletable *deletable = m_d->deletable; while (deletable) { GCDeletable *next = deletable->next; deletable->lastCall = lastSweep; delete deletable; deletable = next; } + m_d->deletable = 0; } -void MemoryManager::sweep(char *chunkStart, std::size_t chunkSize, size_t size, GCDeletable **deletable) +void MemoryManager::sweep(char *chunkStart, std::size_t chunkSize, size_t size) { // qDebug("chunkStart @ %p, size=%x, pos=%x (%x)", chunkStart, size, size>>4, m_d->smallItems[size >> 4]); Managed **f = &m_d->smallItems[size >> 4]; @@ -402,9 +402,6 @@ void MemoryManager::sweep(char *chunkStart, std::size_t chunkSize, size_t size, #ifdef V4_USE_VALGRIND VALGRIND_ENABLE_ERROR_REPORTING; #endif - Object *o = m->asObject(); - if (o && o->vtable()->collectDeletables) - o->vtable()->collectDeletables(m, deletable); m->internalClass->vtable->destroy(m); memset(m, 0, size); @@ -525,6 +522,12 @@ void MemoryManager::dumpStats() const #endif // DETAILED_MM_STATS } +void MemoryManager::registerDeletable(GCDeletable *d) +{ + d->next = m_d->deletable; + m_d->deletable = d; +} + ExecutionEngine *MemoryManager::engine() const { return m_d->engine; diff --git a/src/qml/jsruntime/qv4mm_p.h b/src/qml/jsruntime/qv4mm_p.h index 5ab59b857b..47020c12f0 100644 --- a/src/qml/jsruntime/qv4mm_p.h +++ b/src/qml/jsruntime/qv4mm_p.h @@ -111,6 +111,8 @@ public: void dumpStats() const; + void registerDeletable(GCDeletable *d); + protected: /// expects size to be aligned // TODO: try to inline @@ -126,7 +128,7 @@ private: void collectFromJSStack() const; void mark(); void sweep(bool lastSweep = false); - void sweep(char *chunkStart, std::size_t chunkSize, size_t size, GCDeletable **deletable); + void sweep(char *chunkStart, std::size_t chunkSize, size_t size); uint getUsedMem(); protected: diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp index dd58e0609b..67801f39b7 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper.cpp +++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp @@ -64,6 +64,7 @@ #include <private/qv4jsonobject_p.h> #include <private/qv4regexpobject_p.h> #include <private/qv4scopedvalue_p.h> +#include <private/qv4mm_p.h> #include <QtQml/qjsvalue.h> #include <QtCore/qjsonarray.h> @@ -1004,9 +1005,9 @@ namespace { }; } -void QObjectWrapper::collectDeletables(Managed *m, GCDeletable **deletable) +void QObjectWrapper::destroy(Managed *that) { - QObjectWrapper *This = static_cast<QObjectWrapper*>(m); + QObjectWrapper *This = static_cast<QObjectWrapper*>(that); QPointer<QObject> &object = This->m_object; if (!object) return; @@ -1019,12 +1020,13 @@ void QObjectWrapper::collectDeletables(Managed *m, GCDeletable **deletable) return; QObjectDeleter *deleter = new QObjectDeleter(object); - object = 0; - deleter->next = *deletable; - *deletable = deleter; + This->engine()->memoryManager->registerDeletable(deleter); + + This->~QObjectWrapper(); } -DEFINE_MANAGED_VTABLE_WITH_DELETABLES(QObjectWrapper); + +DEFINE_OBJECT_VTABLE(QObjectWrapper); // XXX TODO: Need to review all calls to QQmlEngine *engine() to confirm QObjects work // correctly in a worker thread diff --git a/src/qml/jsruntime/qv4qobjectwrapper_p.h b/src/qml/jsruntime/qv4qobjectwrapper_p.h index b11f0af93f..0af01c5614 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper_p.h +++ b/src/qml/jsruntime/qv4qobjectwrapper_p.h @@ -117,11 +117,7 @@ private: static PropertyAttributes query(const Managed *, StringRef name); static void advanceIterator(Managed *m, ObjectIterator *it, StringRef name, uint *index, Property *p, PropertyAttributes *attributes); static void markObjects(Managed *that, QV4::ExecutionEngine *e); - static void collectDeletables(Managed *m, GCDeletable **deletable); - static void destroy(Managed *that) - { - static_cast<QObjectWrapper *>(that)->~QObjectWrapper(); - } + static void destroy(Managed *that); static ReturnedValue method_connect(CallContext *ctx); static ReturnedValue method_disconnect(CallContext *ctx); diff --git a/src/qml/jsruntime/qv4string.cpp b/src/qml/jsruntime/qv4string.cpp index 1c915914b5..575f605e45 100644 --- a/src/qml/jsruntime/qv4string.cpp +++ b/src/qml/jsruntime/qv4string.cpp @@ -106,7 +106,6 @@ const ObjectVTable String::static_vtbl = DEFINE_MANAGED_VTABLE_INT(String), 0, 0, - 0 /*collectDeletables*/, get, getIndexed, put, |