aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2013-04-15 10:31:35 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2013-04-15 11:01:05 +0200
commit3167bc7ed6e3e30e8716dfe8a2a1fa4355dd27d6 (patch)
treefab2b2903510aa02ad8bfcb4e6291e9113b2a176 /src
parent56fc95f0242e30d3a93fa46fd4160f7a1789b1be (diff)
Add some inline property data to Object
This avoids malloc'ing the memberData array in most cases, and speed up the V8 benchmark by another 10% Change-Id: Id5976a9f9b389ee2d1568211b486c2896d818dd3 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/v4/qv4object.cpp10
-rw-r--r--src/v4/qv4object.h5
2 files changed, 11 insertions, 4 deletions
diff --git a/src/v4/qv4object.cpp b/src/v4/qv4object.cpp
index f82b8bfae2..5091ceb095 100644
--- a/src/v4/qv4object.cpp
+++ b/src/v4/qv4object.cpp
@@ -69,7 +69,7 @@ DEFINE_MANAGED_VTABLE(Object);
Object::Object(ExecutionEngine *engine)
: prototype(0)
, internalClass(engine->emptyClass)
- , memberDataAlloc(0), memberData(0)
+ , memberDataAlloc(InlinePropertySize), memberData(inlineProperties)
, arrayOffset(0), arrayDataLen(0), arrayAlloc(0), arrayAttributes(0), arrayData(0), sparseArray(0)
, externalResource(0)
{
@@ -80,7 +80,7 @@ Object::Object(ExecutionEngine *engine)
Object::Object(ExecutionContext *context)
: prototype(0)
, internalClass(context->engine->emptyClass)
- , memberDataAlloc(0), memberData(0)
+ , memberDataAlloc(InlinePropertySize), memberData(inlineProperties)
, arrayOffset(0), arrayDataLen(0), arrayAlloc(0), arrayAttributes(0), arrayData(0), sparseArray(0)
, externalResource(0)
{
@@ -91,7 +91,8 @@ Object::Object(ExecutionContext *context)
Object::~Object()
{
delete externalResource;
- delete [] memberData;
+ if (memberData != inlineProperties)
+ delete [] memberData;
delete [] (arrayData - (sparseArray ? 0 : arrayOffset));
if (arrayAttributes)
delete [] (arrayAttributes - (sparseArray ? 0 : arrayOffset));
@@ -229,7 +230,8 @@ Property *Object::insertMember(String *s, PropertyAttributes attributes)
memberDataAlloc = qMax((uint)8, 2*memberDataAlloc);
Property *newMemberData = new Property[memberDataAlloc];
memcpy(newMemberData, memberData, sizeof(Property)*idx);
- delete [] memberData;
+ if (memberData != inlineProperties)
+ delete [] memberData;
memberData = newMemberData;
}
return memberData + idx;
diff --git a/src/v4/qv4object.h b/src/v4/qv4object.h
index 226c00566b..d1bac5f03f 100644
--- a/src/v4/qv4object.h
+++ b/src/v4/qv4object.h
@@ -124,6 +124,11 @@ struct Q_V4_EXPORT Object: Managed {
SparseArray *sparseArray;
ExternalResource *externalResource;
+ enum {
+ InlinePropertySize = 4
+ };
+ Property inlineProperties[InlinePropertySize];
+
Object(ExecutionEngine *engine);
Object(ExecutionContext *context);
~Object();