diff options
author | Lars Knoll <lars.knoll@digia.com> | 2014-01-20 16:01:26 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-01-23 21:47:27 +0100 |
commit | 9fb297a54bd0226b4827b5d7ca093a7f9c4922fa (patch) | |
tree | b53967ff783246a094ccd136f8f8acc2bb511949 /src/qml/jsruntime/qv4arraydata.cpp | |
parent | 07429ea2a581dbf25d36e51375918e4cdb0962c9 (diff) |
Turn ArrayData into a Managed object
Memory manage ArrayData. Once the ArrayData is moved
to be inline inside the object, this will save quite
some time for allocating and freeing arrays.
Change-Id: I19a520161d41bfe3d83f377af0b41db4ac5b99e4
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jsruntime/qv4arraydata.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4arraydata.cpp | 42 |
1 files changed, 20 insertions, 22 deletions
diff --git a/src/qml/jsruntime/qv4arraydata.cpp b/src/qml/jsruntime/qv4arraydata.cpp index 933449b96e..a71aa12310 100644 --- a/src/qml/jsruntime/qv4arraydata.cpp +++ b/src/qml/jsruntime/qv4arraydata.cpp @@ -46,9 +46,8 @@ using namespace QV4; const ArrayVTable SimpleArrayData::static_vtbl = { + DEFINE_MANAGED_VTABLE_INT(SimpleArrayData), SimpleArrayData::Simple, - SimpleArrayData::destroy, - SimpleArrayData::markObjects, SimpleArrayData::reserve, SimpleArrayData::get, SimpleArrayData::put, @@ -64,9 +63,8 @@ const ArrayVTable SimpleArrayData::static_vtbl = const ArrayVTable SparseArrayData::static_vtbl = { + DEFINE_MANAGED_VTABLE_INT(SparseArrayData), ArrayData::Sparse, - SparseArrayData::destroy, - SparseArrayData::markObjects, SparseArrayData::reserve, SparseArrayData::get, SparseArrayData::put, @@ -141,20 +139,20 @@ void ArrayData::ensureAttributes() } -void SimpleArrayData::destroy(ArrayData *d) +void SimpleArrayData::destroy(Managed *d) { SimpleArrayData *dd = static_cast<SimpleArrayData *>(d); delete [] (dd->data - dd->offset); if (dd->attrs) delete [] (dd->attrs - dd->offset); - delete dd; } -void SimpleArrayData::markObjects(ArrayData *d, ExecutionEngine *e) +void SimpleArrayData::markObjects(Managed *d, ExecutionEngine *e) { - uint l = static_cast<SimpleArrayData *>(d)->len; + SimpleArrayData *dd = static_cast<SimpleArrayData *>(d); + uint l = dd->len; for (uint i = 0; i < l; ++i) - d->data[i].mark(e); + dd->data[i].mark(e); } ReturnedValue SimpleArrayData::get(const ArrayData *d, uint index) @@ -298,20 +296,21 @@ void SparseArrayData::free(ArrayData *d, uint idx) } -void SparseArrayData::destroy(ArrayData *d) +void SparseArrayData::destroy(Managed *d) { - delete static_cast<SparseArrayData *>(d)->sparse; - delete [] d->data; - if (d->attrs) - delete [] d->attrs; - delete d; + SparseArrayData *dd = static_cast<SparseArrayData *>(d); + delete dd->sparse; + delete [] dd->data; + if (dd->attrs) + delete [] dd->attrs; } -void SparseArrayData::markObjects(ArrayData *d, ExecutionEngine *e) +void SparseArrayData::markObjects(Managed *d, ExecutionEngine *e) { - uint l = d->alloc; + SparseArrayData *dd = static_cast<SparseArrayData *>(d); + uint l = dd->alloc; for (uint i = 0; i < l; ++i) - d->data[i].mark(e); + dd->data[i].mark(e); } void SparseArrayData::reserve(ArrayData *d, uint n) @@ -603,9 +602,9 @@ void ArrayData::sort(ExecutionContext *context, ObjectRef thisObject, const Valu if (!sparse->sparse->nEntries()) return; - SimpleArrayData *d = new SimpleArrayData; + SimpleArrayData *d = new (context->engine->memoryManager) SimpleArrayData(context->engine); thisObject->arrayData = d; - d->vtable->reserve(d, sparse->sparse->nEntries()); + d->vtable()->reserve(d, sparse->sparse->nEntries()); SparseArrayNode *n = sparse->sparse->begin(); uint i = 0; @@ -645,8 +644,7 @@ void ArrayData::sort(ExecutionContext *context, ObjectRef thisObject, const Valu } } - - sparse->ArrayData::destroy(); + // ### explicitly delete sparse } else { SimpleArrayData *d = static_cast<SimpleArrayData *>(thisObject->arrayData); if (len > d->len) |