aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@theqtcompany.com>2014-11-13 21:38:25 +0100
committerSimon Hausmann <simon.hausmann@digia.com>2014-11-21 19:32:23 +0100
commit2784a68d64519ccc5d01b6c1378207572cf1ebcd (patch)
treeb66287687e7311a24253d60e18bcba829fb475ad /src/qml/jsruntime
parent2cb6d1bf32e017026f618dcfdbef3980f5363656 (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.cpp14
-rw-r--r--src/qml/jsruntime/qv4arraybuffer_p.h3
-rw-r--r--src/qml/jsruntime/qv4arraydata.cpp6
-rw-r--r--src/qml/jsruntime/qv4arraydata_p.h9
-rw-r--r--src/qml/jsruntime/qv4errorobject_p.h2
-rw-r--r--src/qml/jsruntime/qv4functionobject_p.h4
-rw-r--r--src/qml/jsruntime/qv4managed_p.h7
-rw-r--r--src/qml/jsruntime/qv4mm.cpp4
-rw-r--r--src/qml/jsruntime/qv4qobjectwrapper.cpp10
-rw-r--r--src/qml/jsruntime/qv4qobjectwrapper_p.h16
-rw-r--r--src/qml/jsruntime/qv4regexp.cpp5
-rw-r--r--src/qml/jsruntime/qv4regexp_p.h2
-rw-r--r--src/qml/jsruntime/qv4script.cpp7
-rw-r--r--src/qml/jsruntime/qv4sequenceobject.cpp5
-rw-r--r--src/qml/jsruntime/qv4string.cpp5
-rw-r--r--src/qml/jsruntime/qv4string_p.h2
-rw-r--r--src/qml/jsruntime/qv4variantobject.cpp6
-rw-r--r--src/qml/jsruntime/qv4variantobject_p.h2
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);
};