diff options
author | Lars Knoll <lars.knoll@digia.com> | 2013-04-15 10:31:35 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2013-04-15 11:01:05 +0200 |
commit | 3167bc7ed6e3e30e8716dfe8a2a1fa4355dd27d6 (patch) | |
tree | fab2b2903510aa02ad8bfcb4e6291e9113b2a176 /src | |
parent | 56fc95f0242e30d3a93fa46fd4160f7a1789b1be (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.cpp | 10 | ||||
-rw-r--r-- | src/v4/qv4object.h | 5 |
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(); |