diff options
author | Lars Knoll <lars.knoll@digia.com> | 2014-05-06 08:44:30 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2014-07-22 13:49:10 +0200 |
commit | e391b6f08405a6a9d3470297fc5667f5c7a0c4a8 (patch) | |
tree | dfc2e00937ab6b7f121c2ec7cf7576ebe693a002 | |
parent | c9081fab7c63e50d2a3b7cfe3e78110a5922dc29 (diff) |
Move MemberData over to new storage layout
Change-Id: I971b614d471e49d1be2e9474c985cb93ed7e2117
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
-rw-r--r-- | src/qml/jsruntime/qv4functionobject.cpp | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4managed_p.h | 11 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4memberdata.cpp | 6 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4memberdata_p.h | 21 |
4 files changed, 29 insertions, 11 deletions
diff --git a/src/qml/jsruntime/qv4functionobject.cpp b/src/qml/jsruntime/qv4functionobject.cpp index f6bd4d37c4..198138aab9 100644 --- a/src/qml/jsruntime/qv4functionobject.cpp +++ b/src/qml/jsruntime/qv4functionobject.cpp @@ -348,7 +348,7 @@ ReturnedValue FunctionPrototype::method_bind(CallContext *ctx) boundArgs.reset(); if (ctx->callData->argc > 1) { boundArgs.ensureIndex(scope.engine, ctx->callData->argc - 1); - boundArgs.d()->size = ctx->callData->argc - 1; + boundArgs.d()->d()->size = ctx->callData->argc - 1; memcpy(boundArgs.data(), ctx->callData->args + 1, (ctx->callData->argc - 1)*sizeof(Value)); } ScopedValue protectBoundArgs(scope, boundArgs.d()); diff --git a/src/qml/jsruntime/qv4managed_p.h b/src/qml/jsruntime/qv4managed_p.h index 52c44895bf..3f16b0784a 100644 --- a/src/qml/jsruntime/qv4managed_p.h +++ b/src/qml/jsruntime/qv4managed_p.h @@ -70,6 +70,17 @@ inline void qYouForgotTheQ_MANAGED_Macro(T1, T2) {} template <typename T> \ QV4::Returned<T> *asReturned() { return QV4::Returned<T>::create(this); } \ +#define V4_MANAGED_NEW \ + public: \ + Q_MANAGED_CHECK \ + static const QV4::ManagedVTable static_vtbl; \ + static inline const QV4::ManagedVTable *staticVTable() { return &static_vtbl; } \ + template <typename T> \ + QV4::Returned<T> *asReturned() { return QV4::Returned<T>::create(this); } \ + void __dataTest() { Q_STATIC_ASSERT(sizeof(*this) == sizeof(Data)); } \ + const Data *d() const { return &static_cast<const Data &>(Managed::data); } \ + Data *d() { return &static_cast<Data &>(Managed::data); } + #define V4_OBJECT \ public: \ Q_MANAGED_CHECK \ diff --git a/src/qml/jsruntime/qv4memberdata.cpp b/src/qml/jsruntime/qv4memberdata.cpp index 005e29691e..80b01b8b32 100644 --- a/src/qml/jsruntime/qv4memberdata.cpp +++ b/src/qml/jsruntime/qv4memberdata.cpp @@ -49,8 +49,8 @@ DEFINE_MANAGED_VTABLE(MemberData); void MemberData::markObjects(Managed *that, ExecutionEngine *e) { MemberData *m = static_cast<MemberData *>(that); - for (uint i = 0; i < m->size; ++i) - m->data[i].mark(e); + for (uint i = 0; i < m->d()->size; ++i) + m->d()->data[i].mark(e); } void Members::ensureIndex(QV4::ExecutionEngine *e, uint idx) @@ -64,7 +64,7 @@ void Members::ensureIndex(QV4::ExecutionEngine *e, uint idx) memcpy(newMemberData, d(), sizeof(MemberData) + s*sizeof(Value)); else new (newMemberData) MemberData(e->memberDataClass); - newMemberData->size = newAlloc; + newMemberData->d()->size = newAlloc; m = newMemberData; } } diff --git a/src/qml/jsruntime/qv4memberdata_p.h b/src/qml/jsruntime/qv4memberdata_p.h index e0f632b1ed..5f63be84b4 100644 --- a/src/qml/jsruntime/qv4memberdata_p.h +++ b/src/qml/jsruntime/qv4memberdata_p.h @@ -50,12 +50,19 @@ namespace QV4 { struct MemberData : Managed { - V4_MANAGED - uint size; - Value data[1]; + struct Data : Managed::Data { + uint size; + Value data[1]; + }; + struct { + uint size; + Value data[1]; + } __data; + + V4_MANAGED_NEW MemberData(QV4::InternalClass *ic) : Managed(ic) {} - Value &operator[] (uint idx) { return data[idx]; } + Value &operator[] (uint idx) { return d()->data[idx]; } static void markObjects(Managed *that, ExecutionEngine *e); }; @@ -64,10 +71,10 @@ struct Members : Value { void reset() { m = 0; } void ensureIndex(QV4::ExecutionEngine *e, uint idx); - Value &operator[] (uint idx) const { return static_cast<MemberData *>(managed())->data[idx]; } - inline uint size() const { return d() ? d()->size : 0; } + Value &operator[] (uint idx) const { return static_cast<MemberData *>(managed())->d()->data[idx]; } + inline uint size() const { return d() ? d()->d()->size : 0; } inline MemberData *d() const { return static_cast<MemberData *>(managed()); } - Value *data() const { return static_cast<MemberData *>(managed())->data; } + Value *data() const { return static_cast<MemberData *>(managed())->d()->data; } void mark(ExecutionEngine *e) const { MemberData *m = d(); |