aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2014-05-06 08:44:30 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2014-07-22 13:49:10 +0200
commite391b6f08405a6a9d3470297fc5667f5c7a0c4a8 (patch)
treedfc2e00937ab6b7f121c2ec7cf7576ebe693a002
parentc9081fab7c63e50d2a3b7cfe3e78110a5922dc29 (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.cpp2
-rw-r--r--src/qml/jsruntime/qv4managed_p.h11
-rw-r--r--src/qml/jsruntime/qv4memberdata.cpp6
-rw-r--r--src/qml/jsruntime/qv4memberdata_p.h21
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();