aboutsummaryrefslogtreecommitdiffstats
path: root/src/v4/qv4arrayobject.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2013-04-10 10:46:23 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2013-04-12 15:19:02 +0200
commitd0af8986b32aa4cccdc2ff7d8dc5e66e9d53ed77 (patch)
tree1385c3f8bad78b71d0f2c83518976bc86bc7f3cb /src/v4/qv4arrayobject.cpp
parent9bd0895c277150aa51ee0ce55ce492c41346b18e (diff)
Move property attributes out of the property arrays
Rather large change that fully separates the property attributes from the property data. This saves quite some memory. Since the property data for members is saves in the class structure it'll also allow optimizations to the lookup code. Change-Id: I9ba1d372bb756695bef8188d1b86275562a1b219 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/v4/qv4arrayobject.cpp')
-rw-r--r--src/v4/qv4arrayobject.cpp34
1 files changed, 17 insertions, 17 deletions
diff --git a/src/v4/qv4arrayobject.cpp b/src/v4/qv4arrayobject.cpp
index 1ca9cf947c..39492ef099 100644
--- a/src/v4/qv4arrayobject.cpp
+++ b/src/v4/qv4arrayobject.cpp
@@ -69,7 +69,7 @@ Value ArrayCtor::construct(Managed *, ExecutionContext *ctx, Value *argv, int ar
len = argc;
a->arrayReserve(len);
for (unsigned int i = 0; i < len; ++i)
- fillDescriptor(a->arrayData + i, argv[i]);
+ a->arrayData[i].value = argv[i];
a->arrayDataLen = len;
}
a->setArrayLengthUnchecked(len);
@@ -270,7 +270,9 @@ Value ArrayPrototype::method_push(SimpleCallContext *ctx)
if (!instance->sparseArray) {
if (len >= instance->arrayAlloc)
instance->arrayReserve(len + 1);
- fillDescriptor(instance->arrayData + len, v);
+ instance->arrayData[len].value = v;
+ if (instance->arrayAttributes)
+ instance->arrayAttributes[len] = Attr_Data;
instance->arrayDataLen = len + 1;
} else {
uint i = instance->allocArrayValue(v);
@@ -328,19 +330,12 @@ Value ArrayPrototype::method_shift(SimpleCallContext *ctx)
return Value::undefinedValue();
}
- PropertyDescriptor *front = 0;
- if (!instance->sparseArray) {
- if (instance->arrayDataLen)
- front = instance->arrayData;
- } else {
- SparseArrayNode *n = instance->sparseArray->findNode(0);
- if (n)
- front = instance->arrayDecriptor(n->value);
- }
- if (front && front->attrs.type() == PropertyAttributes::Generic)
- front = 0;
+ Property *front = 0;
+ uint pidx = instance->propertyIndexFromArrayIndex(0);
+ if (pidx < UINT_MAX && (!instance->arrayAttributes || !instance->arrayAttributes[0].isGeneric()))
+ front = instance->arrayData + pidx;
- Value result = instance->getValueChecked(ctx, front);
+ Value result = front ? instance->getValue(ctx, front, instance->arrayAttributes ? instance->arrayAttributes[pidx] : Attr_Data) : Value::undefinedValue();
bool protoHasArray = false;
Object *p = instance;
@@ -355,6 +350,8 @@ Value ArrayPrototype::method_shift(SimpleCallContext *ctx)
++instance->arrayData;
--instance->arrayDataLen;
--instance->arrayAlloc;
+ if (instance->arrayAttributes)
+ ++instance->arrayAttributes;
}
} else {
uint idx = instance->sparseArray->pop_front();
@@ -445,9 +442,8 @@ Value ArrayPrototype::method_splice(SimpleCallContext *ctx)
uint deleteCount = (uint)qMin(qMax(ctx->argument(1).toInteger(ctx), 0.), (double)(len - start));
newArray->arrayReserve(deleteCount);
- PropertyDescriptor *pd = newArray->arrayData;
+ Property *pd = newArray->arrayData;
for (uint i = 0; i < deleteCount; ++i) {
- pd->attrs = Attr_Data;
pd->value = instance->getIndexed(ctx, start + i);
++pd;
}
@@ -511,7 +507,11 @@ Value ArrayPrototype::method_unshift(SimpleCallContext *ctx)
--instance->arrayOffset;
--instance->arrayData;
++instance->arrayDataLen;
- fillDescriptor(instance->arrayData, v);
+ if (instance->arrayAttributes) {
+ --instance->arrayAttributes;
+ *instance->arrayAttributes = Attr_Data;
+ }
+ instance->arrayData->value = v;
} else {
uint idx = instance->allocArrayValue(v);
instance->sparseArray->push_front(idx);