diff options
author | Lars Knoll <lars.knoll@theqtcompany.com> | 2014-11-13 21:38:25 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2014-11-21 19:32:23 +0100 |
commit | 2784a68d64519ccc5d01b6c1378207572cf1ebcd (patch) | |
tree | b66287687e7311a24253d60e18bcba829fb475ad /src/qml/jsruntime | |
parent | 2cb6d1bf32e017026f618dcfdbef3980f5363656 (diff) |
Cleanup destruction of heap objects
Generate the code from a macro instead of duplicating boiler
plate code. Operate on Heap::Base instead of Managed.
Change-Id: I84c5a705980899be3e5b931a093645e50d3923bf
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jsruntime')
-rw-r--r-- | src/qml/jsruntime/qv4arraybuffer.cpp | 14 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4arraybuffer_p.h | 3 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4arraydata.cpp | 6 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4arraydata_p.h | 9 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4errorobject_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4functionobject_p.h | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4managed_p.h | 7 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4mm.cpp | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4qobjectwrapper.cpp | 10 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4qobjectwrapper_p.h | 16 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4regexp.cpp | 5 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4regexp_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4script.cpp | 7 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4sequenceobject.cpp | 5 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4string.cpp | 5 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4string_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4variantobject.cpp | 6 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4variantobject_p.h | 2 |
18 files changed, 38 insertions, 71 deletions
diff --git a/src/qml/jsruntime/qv4arraybuffer.cpp b/src/qml/jsruntime/qv4arraybuffer.cpp index a74e5c6299..b8b9971635 100644 --- a/src/qml/jsruntime/qv4arraybuffer.cpp +++ b/src/qml/jsruntime/qv4arraybuffer.cpp @@ -96,6 +96,12 @@ Heap::ArrayBuffer::ArrayBuffer(ExecutionEngine *e, int length) memset(data->data(), 0, length + 1); } +Heap::ArrayBuffer::~ArrayBuffer() +{ + if (!data->ref.deref()) + QTypedArrayData<char>::deallocate(data); +} + QByteArray ArrayBuffer::asByteArray() const { QByteArrayDataPtr ba = { d()->data }; @@ -103,14 +109,6 @@ QByteArray ArrayBuffer::asByteArray() const return QByteArray(ba); } -void ArrayBuffer::destroy(Managed *m) -{ - ArrayBuffer *b = static_cast<ArrayBuffer *>(m); - if (!b->d()->data->ref.deref()) - QTypedArrayData<char>::deallocate(b->d()->data); -} - - void ArrayBufferPrototype::init(ExecutionEngine *engine, Object *ctor) { Scope scope(engine); diff --git a/src/qml/jsruntime/qv4arraybuffer_p.h b/src/qml/jsruntime/qv4arraybuffer_p.h index e99ad8fe09..b2d24f76bc 100644 --- a/src/qml/jsruntime/qv4arraybuffer_p.h +++ b/src/qml/jsruntime/qv4arraybuffer_p.h @@ -48,6 +48,7 @@ struct ArrayBufferCtor : FunctionObject { struct ArrayBuffer : Object { ArrayBuffer(ExecutionEngine *e, int length); + ~ArrayBuffer(); QTypedArrayData<char> *data; uint byteLength() const { return data->size; } @@ -69,6 +70,7 @@ struct ArrayBufferCtor: FunctionObject struct ArrayBuffer : Object { V4_OBJECT2(ArrayBuffer, Object) + V4_NEEDS_DESTROY QByteArray asByteArray() const; uint byteLength() const { return d()->byteLength(); } @@ -81,7 +83,6 @@ struct ArrayBuffer : Object return d()->data->data(); } - static void destroy(Managed *m); }; struct ArrayBufferPrototype: Object diff --git a/src/qml/jsruntime/qv4arraydata.cpp b/src/qml/jsruntime/qv4arraydata.cpp index e4a8772cb6..26dce28470 100644 --- a/src/qml/jsruntime/qv4arraydata.cpp +++ b/src/qml/jsruntime/qv4arraydata.cpp @@ -357,12 +357,6 @@ void SparseArrayData::free(ArrayData *d, uint idx) } -void SparseArrayData::destroy(Managed *d) -{ - SparseArrayData *dd = static_cast<SparseArrayData *>(d); - delete dd->sparse(); -} - void SparseArrayData::markObjects(Heap::Base *d, ExecutionEngine *e) { Heap::SparseArrayData *dd = static_cast<Heap::SparseArrayData *>(d); diff --git a/src/qml/jsruntime/qv4arraydata_p.h b/src/qml/jsruntime/qv4arraydata_p.h index df6c3de8cb..1b0589ed95 100644 --- a/src/qml/jsruntime/qv4arraydata_p.h +++ b/src/qml/jsruntime/qv4arraydata_p.h @@ -106,6 +106,7 @@ struct SimpleArrayData : public ArrayData { struct SparseArrayData : public ArrayData { inline SparseArrayData(ExecutionEngine *engine); + inline ~SparseArrayData(); }; } @@ -196,6 +197,7 @@ struct Q_QML_EXPORT SimpleArrayData : public ArrayData struct Q_QML_EXPORT SparseArrayData : public ArrayData { V4_ARRAYDATA(SparseArrayData) + V4_NEEDS_DESTROY uint &freeList() { return d()->freeList; } uint freeList() const { return d()->freeList; } @@ -219,7 +221,6 @@ struct Q_QML_EXPORT SparseArrayData : public ArrayData return n->value; } - static void destroy(Managed *d); static void markObjects(Heap::Base *d, ExecutionEngine *e); static ArrayData *reallocate(Object *o, uint n, bool enforceAttributes); @@ -241,6 +242,12 @@ inline SparseArrayData::SparseArrayData(ExecutionEngine *engine) { setVTable(QV4::SparseArrayData::staticVTable()); } + +inline SparseArrayData::~SparseArrayData() +{ + delete sparse; +} + } inline Property *ArrayData::getProperty(uint index) diff --git a/src/qml/jsruntime/qv4errorobject_p.h b/src/qml/jsruntime/qv4errorobject_p.h index 2585c3e639..589d466429 100644 --- a/src/qml/jsruntime/qv4errorobject_p.h +++ b/src/qml/jsruntime/qv4errorobject_p.h @@ -130,12 +130,12 @@ struct ErrorObject: Object { V4_OBJECT2(ErrorObject, Object) Q_MANAGED_TYPE(ErrorObject) + V4_NEEDS_DESTROY SyntaxErrorObject *asSyntaxError(); static ReturnedValue method_get_stack(CallContext *ctx); static void markObjects(Heap::Base *that, ExecutionEngine *e); - static void destroy(Managed *that) { static_cast<ErrorObject *>(that)->d()->~Data(); } }; template<> diff --git a/src/qml/jsruntime/qv4functionobject_p.h b/src/qml/jsruntime/qv4functionobject_p.h index 6a629f6a49..1621e52b4f 100644 --- a/src/qml/jsruntime/qv4functionobject_p.h +++ b/src/qml/jsruntime/qv4functionobject_p.h @@ -115,6 +115,7 @@ struct Q_QML_EXPORT FunctionObject: Object { }; V4_OBJECT2(FunctionObject, Object) Q_MANAGED_TYPE(FunctionObject) + V4_NEEDS_DESTROY Heap::ExecutionContext *scope() { return d()->scope; } Function *function() { return d()->function; } @@ -131,9 +132,6 @@ struct Q_QML_EXPORT FunctionObject: Object { using Object::call; static ReturnedValue construct(Managed *that, CallData *); static ReturnedValue call(Managed *that, CallData *d); - static void destroy(Managed *m) { - static_cast<FunctionObject *>(m)->d()->~Data(); - } static FunctionObject *cast(const Value &v) { return v.asFunctionObject(); diff --git a/src/qml/jsruntime/qv4managed_p.h b/src/qml/jsruntime/qv4managed_p.h index ab7580f106..8ba6597d0f 100644 --- a/src/qml/jsruntime/qv4managed_p.h +++ b/src/qml/jsruntime/qv4managed_p.h @@ -57,6 +57,9 @@ inline void qYouForgotTheQ_MANAGED_Macro(T1, T2) {} #define V4_MANAGED_SIZE_TEST #endif +#define V4_NEEDS_DESTROY static void destroy(QV4::Heap::Base *b) { static_cast<Data *>(b)->~Data(); } + + #define V4_MANAGED(DataClass, superClass) \ public: \ Q_MANAGED_CHECK \ @@ -117,7 +120,7 @@ struct ManagedVTable uint unused : 18; uint type : 8; const char *className; - void (*destroy)(Managed *); + void (*destroy)(Heap::Base *); void (*markObjects)(Heap::Base *, ExecutionEngine *e); bool (*isEqualTo)(Managed *m, Managed *other); }; @@ -310,7 +313,7 @@ public: bool inUse() const { return d()->inUse; } bool markBit() const { return d()->markBit; } - static void destroy(Managed *) {} + static void destroy(Heap::Base *) {} private: friend class MemoryManager; friend struct Identifiers; diff --git a/src/qml/jsruntime/qv4mm.cpp b/src/qml/jsruntime/qv4mm.cpp index cfaa6044f5..d8e3f3d468 100644 --- a/src/qml/jsruntime/qv4mm.cpp +++ b/src/qml/jsruntime/qv4mm.cpp @@ -377,7 +377,7 @@ void MemoryManager::sweep(bool lastSweep) continue; } if (m->internalClass()->vtable->destroy) - m->internalClass()->vtable->destroy(m); + m->internalClass()->vtable->destroy(m->d()); *last = i->next; free(Q_V4_PROFILE_DEALLOC(m_d->engine, i, i->size + sizeof(Data::LargeItem), @@ -419,7 +419,7 @@ void MemoryManager::sweep(char *chunkStart, std::size_t chunkSize, size_t size) VALGRIND_ENABLE_ERROR_REPORTING; #endif if (m->internalClass()->vtable->destroy) - m->internalClass()->vtable->destroy(m); + m->internalClass()->vtable->destroy(m->d()); memset(m, 0, size); m->setNextFree(*f); diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp index d96595af21..4a671f3219 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper.cpp +++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp @@ -1034,12 +1034,12 @@ namespace { }; } -void QObjectWrapper::destroy(Managed *that) +void QObjectWrapper::destroy(Heap::Base *that) { - QObjectWrapper *This = static_cast<QObjectWrapper*>(that); - QPointer<QObject> object = This->d()->object; - ExecutionEngine *engine = This->engine(); - This->d()->~Data(); + Heap::QObjectWrapper *This = static_cast<Heap::QObjectWrapper*>(that); + QPointer<QObject> object = This->object; + ExecutionEngine *engine = This->internalClass->engine; + This->~Data(); This = 0; if (!object) return; diff --git a/src/qml/jsruntime/qv4qobjectwrapper_p.h b/src/qml/jsruntime/qv4qobjectwrapper_p.h index f30a98ef43..7f271a8680 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper_p.h +++ b/src/qml/jsruntime/qv4qobjectwrapper_p.h @@ -127,7 +127,7 @@ private: static PropertyAttributes query(const Managed *, String *name); static void advanceIterator(Managed *m, ObjectIterator *it, String *&name, uint *index, Property *p, PropertyAttributes *attributes); static void markObjects(Heap::Base *that, QV4::ExecutionEngine *e); - static void destroy(Managed *that); + static void destroy(Heap::Base *that); static ReturnedValue method_connect(CallContext *ctx); static ReturnedValue method_disconnect(CallContext *ctx); @@ -136,6 +136,7 @@ private: struct Q_QML_EXPORT QObjectMethod : public QV4::FunctionObject { V4_OBJECT2(QObjectMethod, QV4::FunctionObject) + V4_NEEDS_DESTROY enum { DestroyMethod = -1, ToStringMethod = -2 }; @@ -152,26 +153,15 @@ struct Q_QML_EXPORT QObjectMethod : public QV4::FunctionObject ReturnedValue callInternal(CallData *callData); static void markObjects(Heap::Base *that, QV4::ExecutionEngine *e); - static void destroy(Managed *that) - { - static_cast<QObjectMethod *>(that)->d()->~Data(); - } }; struct QmlSignalHandler : public QV4::Object { V4_OBJECT2(QmlSignalHandler, QV4::Object) - + V4_NEEDS_DESTROY int signalIndex() const { return d()->signalIndex; } QObject *object() const { return d()->object.data(); } - -private: - - static void destroy(Managed *that) - { - static_cast<QmlSignalHandler *>(that)->d()->~Data(); - } }; class MultiplyWrappedQObjectMap : public QObject, diff --git a/src/qml/jsruntime/qv4regexp.cpp b/src/qml/jsruntime/qv4regexp.cpp index 631003cbe1..349a0b21b0 100644 --- a/src/qml/jsruntime/qv4regexp.cpp +++ b/src/qml/jsruntime/qv4regexp.cpp @@ -114,11 +114,6 @@ Heap::RegExp::~RegExp() } } -void RegExp::destroy(Managed *that) -{ - static_cast<RegExp*>(that)->d()->~Data(); -} - void RegExp::markObjects(Heap::Base *that, ExecutionEngine *e) { Q_UNUSED(that); diff --git a/src/qml/jsruntime/qv4regexp_p.h b/src/qml/jsruntime/qv4regexp_p.h index a91d1331c8..3219d56da7 100644 --- a/src/qml/jsruntime/qv4regexp_p.h +++ b/src/qml/jsruntime/qv4regexp_p.h @@ -80,6 +80,7 @@ struct RegExp : public Managed { V4_MANAGED(RegExp, Managed) Q_MANAGED_TYPE(RegExp) + V4_NEEDS_DESTROY QString pattern() const { return d()->pattern; } OwnPtr<JSC::Yarr::BytecodePattern> &byteCode() { return d()->byteCode; } @@ -99,7 +100,6 @@ struct RegExp : public Managed int captureCount() const { return subPatternCount() + 1; } - static void destroy(Managed *that); static void markObjects(Heap::Base *that, QV4::ExecutionEngine *e); friend class RegExpCache; diff --git a/src/qml/jsruntime/qv4script.cpp b/src/qml/jsruntime/qv4script.cpp index 8ae4b0e0d8..a838b23d9d 100644 --- a/src/qml/jsruntime/qv4script.cpp +++ b/src/qml/jsruntime/qv4script.cpp @@ -67,12 +67,7 @@ struct CompilationUnitHolder : Object { struct CompilationUnitHolder : public Object { V4_OBJECT2(CompilationUnitHolder, Object) - - static void destroy(Managed *that) - { - static_cast<CompilationUnitHolder*>(that)->d()->~Data(); - } - + V4_NEEDS_DESTROY }; inline diff --git a/src/qml/jsruntime/qv4sequenceobject.cpp b/src/qml/jsruntime/qv4sequenceobject.cpp index a2de296e88..738de8b03d 100644 --- a/src/qml/jsruntime/qv4sequenceobject.cpp +++ b/src/qml/jsruntime/qv4sequenceobject.cpp @@ -179,6 +179,7 @@ struct QQmlSequence : public QV4::Object { V4_OBJECT2(QQmlSequence<Container>, QV4::Object) Q_MANAGED_TYPE(QmlSequence) + V4_NEEDS_DESTROY public: void init() @@ -494,10 +495,6 @@ public: static void advanceIterator(Managed *that, ObjectIterator *it, String *&name, uint *index, Property *p, PropertyAttributes *attrs) { return static_cast<QQmlSequence<Container> *>(that)->containerAdvanceIterator(it, name, index, p, attrs); } - static void destroy(Managed *that) - { - static_cast<QQmlSequence<Container> *>(that)->d()->~Data(); - } }; diff --git a/src/qml/jsruntime/qv4string.cpp b/src/qml/jsruntime/qv4string.cpp index a06a36d7fd..5c020ddc8e 100644 --- a/src/qml/jsruntime/qv4string.cpp +++ b/src/qml/jsruntime/qv4string.cpp @@ -117,11 +117,6 @@ const ObjectVTable String::static_vtbl = 0 /*advanceIterator*/, }; -void String::destroy(Managed *that) -{ - static_cast<String*>(that)->d()->~Data(); -} - void String::markObjects(Heap::Base *that, ExecutionEngine *e) { String::Data *s = static_cast<String::Data *>(that); diff --git a/src/qml/jsruntime/qv4string_p.h b/src/qml/jsruntime/qv4string_p.h index 989398883e..86b8f2bdd5 100644 --- a/src/qml/jsruntime/qv4string_p.h +++ b/src/qml/jsruntime/qv4string_p.h @@ -119,6 +119,7 @@ struct Q_QML_PRIVATE_EXPORT String : public Managed { // ### FIXME: Should this be a V4_OBJECT V4_OBJECT2(String, Managed) Q_MANAGED_TYPE(String) + V4_NEEDS_DESTROY enum { IsString = true }; @@ -170,7 +171,6 @@ struct Q_QML_PRIVATE_EXPORT String : public Managed { Identifier *identifier() const { return d()->identifier; } protected: - static void destroy(Managed *); static void markObjects(Heap::Base *that, ExecutionEngine *e); static ReturnedValue get(Managed *m, String *name, bool *hasProperty); static ReturnedValue getIndexed(Managed *m, uint index, bool *hasProperty); diff --git a/src/qml/jsruntime/qv4variantobject.cpp b/src/qml/jsruntime/qv4variantobject.cpp index 1a76839e59..fe23b8aa15 100644 --- a/src/qml/jsruntime/qv4variantobject.cpp +++ b/src/qml/jsruntime/qv4variantobject.cpp @@ -84,12 +84,6 @@ bool VariantObject::Data::isScarce() const return t == QVariant::Pixmap || t == QVariant::Image; } -void VariantObject::destroy(Managed *that) -{ - VariantObject *v = static_cast<VariantObject *>(that); - v->d()->~Data(); -} - bool VariantObject::isEqualTo(Managed *m, Managed *other) { Q_ASSERT(m->as<QV4::VariantObject>()); diff --git a/src/qml/jsruntime/qv4variantobject_p.h b/src/qml/jsruntime/qv4variantobject_p.h index 5d68de1be3..c231db44a6 100644 --- a/src/qml/jsruntime/qv4variantobject_p.h +++ b/src/qml/jsruntime/qv4variantobject_p.h @@ -75,13 +75,13 @@ struct VariantObject : Object, public ExecutionEngine::ScarceResourceData struct VariantObject : Object { V4_OBJECT2(VariantObject, Object) + V4_NEEDS_DESTROY static QVariant toVariant(const ValueRef v); void addVmePropertyReference(); void removeVmePropertyReference(); - static void destroy(Managed *that); static bool isEqualTo(Managed *m, Managed *other); }; |