aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2014-03-26 15:11:48 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-27 20:39:59 +0100
commit7ae796cb141b73a1b215b2b0fd64b7ffbbd1e510 (patch)
tree9f9b45d8f2036cc50b4298f8a3fdbe33d4d1eeda
parentb9bf708bf85ba062d009ccf5e13e3494dc88a5d1 (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.h23
-rw-r--r--src/qml/jsruntime/qv4mm.cpp21
-rw-r--r--src/qml/jsruntime/qv4mm_p.h4
-rw-r--r--src/qml/jsruntime/qv4qobjectwrapper.cpp14
-rw-r--r--src/qml/jsruntime/qv4qobjectwrapper_p.h6
-rw-r--r--src/qml/jsruntime/qv4string.cpp1
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,