diff options
author | Lars Knoll <lars.knoll@theqtcompany.com> | 2015-01-09 22:02:40 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2015-01-12 11:04:32 +0100 |
commit | 431458b685fa9f7355f50d21a09ee9f93bcb42d5 (patch) | |
tree | e6cd799e7d8d56f39bb017f560e5bc32de1ab2bc /src/qml/jsruntime/qv4mm.cpp | |
parent | 53e144ae8dec84f70870a5e315c3043b16b57d92 (diff) |
Fold the markBit into the internalClass pointer
Change-Id: I79f9286275f833dd01a3193042976d1f86ed5019
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jsruntime/qv4mm.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4mm.cpp | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/src/qml/jsruntime/qv4mm.cpp b/src/qml/jsruntime/qv4mm.cpp index ff84e47ef9..4ddb544cba 100644 --- a/src/qml/jsruntime/qv4mm.cpp +++ b/src/qml/jsruntime/qv4mm.cpp @@ -188,9 +188,9 @@ void sweepChunk(const MemoryManager::Data::Chunk &chunk, ChunkSweepData *sweepDa Q_ASSERT((qintptr) item % 16 == 0); - if (m->markBit) { + if (m->isMarked()) { Q_ASSERT(m->inUse()); - m->markBit = 0; + m->clearMarkBit(); sweepData->isEmpty = false; ++(*itemsInUse); } else { @@ -199,8 +199,8 @@ void sweepChunk(const MemoryManager::Data::Chunk &chunk, ChunkSweepData *sweepDa #ifdef V4_USE_VALGRIND VALGRIND_ENABLE_ERROR_REPORTING; #endif - if (m->internalClass->vtable->destroy) - m->internalClass->vtable->destroy(m); + if (m->gcGetInternalClass()->vtable->destroy) + m->gcGetInternalClass()->vtable->destroy(m); memset(m, 0, itemSize); #ifdef V4_USE_VALGRIND @@ -326,8 +326,8 @@ static void drainMarkStack(QV4::ExecutionEngine *engine, Value *markBase) { while (engine->jsStackTop > markBase) { Heap::Base *h = engine->popForGC(); - Q_ASSERT (h->internalClass->vtable->markObjects); - h->internalClass->vtable->markObjects(h, engine); + Q_ASSERT (h->gcGetInternalClass()->vtable->markObjects); + h->gcGetInternalClass()->vtable->markObjects(h, engine); } } @@ -364,7 +364,9 @@ void MemoryManager::mark() for (PersistentValuePrivate *weak = m_weakValues; weak; weak = weak->next) { if (!weak->refcount || !weak->value.isManaged()) continue; - QObjectWrapper *qobjectWrapper = weak->value.managed()->as<QObjectWrapper>(); + if (weak->value.asManaged()->d()->gcGetInternalClass()->vtable != QObjectWrapper::staticVTable()) + continue; + QObjectWrapper *qobjectWrapper = static_cast<QObjectWrapper*>(weak->value.managed()); if (!qobjectWrapper) continue; QObject *qobject = qobjectWrapper->object(); @@ -481,14 +483,14 @@ void MemoryManager::sweep(bool lastSweep) while (i) { Heap::Base *m = i->heapObject(); Q_ASSERT(m->inUse()); - if (m->markBit) { - m->markBit = 0; + if (m->isMarked()) { + m->clearMarkBit(); last = &i->next; i = i->next; continue; } - if (m->internalClass->vtable->destroy) - m->internalClass->vtable->destroy(m); + if (m->gcGetInternalClass()->vtable->destroy) + m->gcGetInternalClass()->vtable->destroy(m); *last = i->next; free(Q_V4_PROFILE_DEALLOC(m_d->engine, i, i->size + sizeof(Data::LargeItem), @@ -504,6 +506,15 @@ void MemoryManager::sweep(bool lastSweep) delete deletable; deletable = next; } + + // some execution contexts are allocated on the stack, make sure we clear their markBit as well + if (!lastSweep) { + Heap::ExecutionContext *ctx = engine()->current; + while (ctx) { + ctx->clearMarkBit(); + ctx = ctx->parent; + } + } } bool MemoryManager::isGCBlocked() const |