summaryrefslogtreecommitdiffstats
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
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>
-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 f82b8bfa..5091ceb0 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 226c0056..d1bac5f0 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();