aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLars Knoll <[email protected]>2014-11-17 21:08:13 +0100
committerSimon Hausmann <[email protected]>2014-12-10 11:00:25 +0100
commit2e6e49f829d53fa4a08587bcd38f8db7903810e1 (patch)
tree4a1eadaf9b86bba4f8fd677de477dac7af62b00f /src
parentd5b43dc8479f5a75ba2e3108d6454ff3f046a36e (diff)
Move readonly accessors into Heap::ArrayData
these methods don't modify the object, so it's safe to have them there and this simplifies quite a bit of the code. Change-Id: I2f591758efba9cb8d17b956bc7c02e2d7a468ea4 Reviewed-by: Simon Hausmann <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/qml/jsruntime/qv4arraydata.cpp25
-rw-r--r--src/qml/jsruntime/qv4arraydata_p.h100
2 files changed, 69 insertions, 56 deletions
diff --git a/src/qml/jsruntime/qv4arraydata.cpp b/src/qml/jsruntime/qv4arraydata.cpp
index 5c3f3e1adc..a4f11b2b5a 100644
--- a/src/qml/jsruntime/qv4arraydata.cpp
+++ b/src/qml/jsruntime/qv4arraydata.cpp
@@ -64,7 +64,6 @@ const ArrayVTable SimpleArrayData::static_vtbl =
SimpleArrayData::putArray,
SimpleArrayData::del,
SimpleArrayData::setAttribute,
- SimpleArrayData::attribute,
SimpleArrayData::push_front,
SimpleArrayData::pop_front,
SimpleArrayData::truncate,
@@ -81,7 +80,6 @@ const ArrayVTable SparseArrayData::static_vtbl =
SparseArrayData::putArray,
SparseArrayData::del,
SparseArrayData::setAttribute,
- SparseArrayData::attribute,
SparseArrayData::push_front,
SparseArrayData::pop_front,
SparseArrayData::truncate,
@@ -222,10 +220,10 @@ void SimpleArrayData::markObjects(Heap::Base *d, ExecutionEngine *e)
dd->arrayData[i].mark(e);
}
-ReturnedValue SimpleArrayData::get(const ArrayData *d, uint index)
+ReturnedValue SimpleArrayData::get(const Heap::ArrayData *d, uint index)
{
- const SimpleArrayData *dd = static_cast<const SimpleArrayData *>(d);
- if (index >= dd->len())
+ const Heap::SimpleArrayData *dd = static_cast<const Heap::SimpleArrayData *>(d);
+ if (index >= dd->len)
return Primitive::emptyValue().asReturnedValue();
return dd->data(index).asReturnedValue();
}
@@ -266,11 +264,6 @@ void SimpleArrayData::setAttribute(Object *o, uint index, PropertyAttributes att
o->arrayData()->attrs()[index] = attrs;
}
-PropertyAttributes SimpleArrayData::attribute(const ArrayData *d, uint index)
-{
- return d->attrs()[index];
-}
-
void SimpleArrayData::push_front(Object *o, Value *values, uint n)
{
Heap::SimpleArrayData *dd = static_cast<Heap::SimpleArrayData *>(o->d()->arrayData);
@@ -412,9 +405,9 @@ uint SparseArrayData::allocate(Object *o, bool doubleSlot)
}
}
-ReturnedValue SparseArrayData::get(const ArrayData *d, uint index)
+ReturnedValue SparseArrayData::get(const Heap::ArrayData *d, uint index)
{
- const Heap::SparseArrayData *s = static_cast<const SparseArrayData *>(d)->d();
+ const Heap::SparseArrayData *s = static_cast<const Heap::SparseArrayData *>(d);
index = s->mappedIndex(index);
if (index == UINT_MAX)
return Primitive::emptyValue().asReturnedValue();
@@ -491,14 +484,6 @@ void SparseArrayData::setAttribute(Object *o, uint index, PropertyAttributes att
d->attrs[n->value] = attrs;
}
-PropertyAttributes SparseArrayData::attribute(const ArrayData *d, uint index)
-{
- SparseArrayNode *n = d->d()->sparse->findNode(index);
- if (!n)
- return PropertyAttributes();
- return d->d()->attrs[n->value];
-}
-
void SparseArrayData::push_front(Object *o, Value *values, uint n)
{
Heap::SparseArrayData *d = static_cast<Heap::SparseArrayData *>(o->d()->arrayData);
diff --git a/src/qml/jsruntime/qv4arraydata_p.h b/src/qml/jsruntime/qv4arraydata_p.h
index fea57f4690..d07f4e0708 100644
--- a/src/qml/jsruntime/qv4arraydata_p.h
+++ b/src/qml/jsruntime/qv4arraydata_p.h
@@ -59,12 +59,11 @@ struct ArrayVTable
ManagedVTable managedVTable;
uint type;
ArrayData *(*reallocate)(Object *o, uint n, bool enforceAttributes);
- ReturnedValue (*get)(const ArrayData *d, uint index);
+ ReturnedValue (*get)(const Heap::ArrayData *d, uint index);
bool (*put)(Object *o, uint index, ValueRef value);
bool (*putArray)(Object *o, uint index, Value *values, uint n);
bool (*del)(Object *o, uint index);
void (*setAttribute)(Object *o, uint index, PropertyAttributes attrs);
- PropertyAttributes (*attribute)(const ArrayData *d, uint index);
void (*push_front)(Object *o, Value *values, uint n);
ReturnedValue (*pop_front)(Object *o);
uint (*truncate)(Object *o, uint newLen);
@@ -96,6 +95,21 @@ struct ArrayData : public Base {
SparseArray *sparse;
};
Value arrayData[1];
+
+ bool isSparse() const { return type == Sparse; }
+
+ const ArrayVTable *vtable() const { return reinterpret_cast<const ArrayVTable *>(internalClass->vtable); }
+
+ inline ReturnedValue get(uint i) const {
+ return vtable()->get(this, i);
+ }
+ inline Property *getProperty(uint index);
+ inline PropertyAttributes attributes(uint i) const;
+
+ bool isEmpty(uint i) const {
+ return get(i) == Primitive::emptyValue().asReturnedValue();
+ }
+
};
struct SimpleArrayData : public ArrayData {
@@ -106,6 +120,19 @@ struct SimpleArrayData : public ArrayData {
uint mappedIndex(uint index) const { return (index + offset) % alloc; }
Value data(uint index) const { return arrayData[mappedIndex(index)]; }
Value &data(uint index) { return arrayData[mappedIndex(index)]; }
+
+ Property *getProperty(uint index) {
+ if (index >= len)
+ return 0;
+ index = mappedIndex(index);
+ if (arrayData[index].isEmpty())
+ return 0;
+ return reinterpret_cast<Property *>(arrayData + index);
+ }
+
+ PropertyAttributes attributes(uint i) const {
+ return attrs ? attrs[i] : Attr_Data;
+ }
};
struct SparseArrayData : public ArrayData {
@@ -118,6 +145,20 @@ struct SparseArrayData : public ArrayData {
return UINT_MAX;
return n->value;
}
+
+ Property *getProperty(uint index) {
+ SparseArrayNode *n = sparse->findNode(index);
+ if (!n)
+ return 0;
+ return reinterpret_cast<Property *>(arrayData + n->value);
+ }
+
+ PropertyAttributes attributes(uint i) const {
+ if (!attrs)
+ return Attr_Data;
+ uint index = mappedIndex(i);
+ return index < UINT_MAX ? attrs[index] : Attr_Data;
+ }
};
}
@@ -147,19 +188,20 @@ struct Q_QML_EXPORT ArrayData : public Managed
bool hasAttributes() const {
return attrs();
}
- PropertyAttributes attributes(int i) const {
- Q_ASSERT(this);
- return attrs() ? vtable()->attribute(this, i) : Attr_Data;
+ PropertyAttributes attributes(uint i) const {
+ return d()->attributes(i);
}
bool isEmpty(uint i) const {
- return (vtable()->get(this, i) == Primitive::emptyValue().asReturnedValue());
+ return d()->isEmpty(i);
}
ReturnedValue get(uint i) const {
- return vtable()->get(this, i);
+ return d()->get(i);
+ }
+ inline Property *getProperty(uint index) {
+ return d()->getProperty(index);
}
- inline Property *getProperty(uint index);
static void ensureAttributes(Object *o);
static void realloc(Object *o, Type newType, uint alloc, bool enforceAttributes);
@@ -177,15 +219,6 @@ struct Q_QML_EXPORT SimpleArrayData : public ArrayData
Value data(uint index) const { return d()->data(index); }
Value &data(uint index) { return d()->data(index); }
- Property *getProperty(uint index) {
- if (index >= len())
- return 0;
- index = mappedIndex(index);
- if (d()->arrayData[index].isEmpty())
- return 0;
- return reinterpret_cast<Property *>(d()->arrayData + index);
- }
-
uint &len() { return d()->len; }
uint len() const { return d()->len; }
@@ -193,12 +226,11 @@ struct Q_QML_EXPORT SimpleArrayData : public ArrayData
static void markObjects(Heap::Base *d, ExecutionEngine *e);
- static ReturnedValue get(const ArrayData *d, uint index);
+ static ReturnedValue get(const Heap::ArrayData *d, uint index);
static bool put(Object *o, uint index, ValueRef value);
static bool putArray(Object *o, uint index, Value *values, uint n);
static bool del(Object *o, uint index);
static void setAttribute(Object *o, uint index, PropertyAttributes attrs);
- static PropertyAttributes attribute(const ArrayData *d, uint index);
static void push_front(Object *o, Value *values, uint n);
static ReturnedValue pop_front(Object *o);
static uint truncate(Object *o, uint newLen);
@@ -218,24 +250,16 @@ struct Q_QML_EXPORT SparseArrayData : public ArrayData
static uint allocate(Object *o, bool doubleSlot = false);
static void free(ArrayData *d, uint idx);
- Property *getProperty(uint index) {
- SparseArrayNode *n = sparse()->findNode(index);
- if (!n)
- return 0;
- return reinterpret_cast<Property *>(arrayData() + n->value);
- }
-
uint mappedIndex(uint index) const { return d()->mappedIndex(index); }
static void markObjects(Heap::Base *d, ExecutionEngine *e);
static ArrayData *reallocate(Object *o, uint n, bool enforceAttributes);
- static ReturnedValue get(const ArrayData *d, uint index);
+ static ReturnedValue get(const Heap::ArrayData *d, uint index);
static bool put(Object *o, uint index, ValueRef value);
static bool putArray(Object *o, uint index, Value *values, uint n);
static bool del(Object *o, uint index);
static void setAttribute(Object *o, uint index, PropertyAttributes attrs);
- static PropertyAttributes attribute(const ArrayData *d, uint index);
static void push_front(Object *o, Value *values, uint n);
static ReturnedValue pop_front(Object *o);
static uint truncate(Object *o, uint newLen);
@@ -254,17 +278,21 @@ inline SparseArrayData::~SparseArrayData()
delete sparse;
}
+inline Property *ArrayData::getProperty(uint index)
+{
+ if (isSparse())
+ return static_cast<SparseArrayData *>(this)->getProperty(index);
+ return static_cast<SimpleArrayData *>(this)->getProperty(index);
}
-inline Property *ArrayData::getProperty(uint index)
+inline PropertyAttributes ArrayData::attributes(uint i) const
{
- if (type() != Heap::ArrayData::Sparse) {
- SimpleArrayData *that = static_cast<SimpleArrayData *>(this);
- return that->getProperty(index);
- } else {
- SparseArrayData *that = static_cast<SparseArrayData *>(this);
- return that->getProperty(index);
- }
+ if (isSparse())
+ return static_cast<const SparseArrayData *>(this)->attributes(i);
+ return static_cast<const SimpleArrayData *>(this)->attributes(i);
+}
+
+
}
}