aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2014-04-29 16:46:12 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2014-07-22 13:49:05 +0200
commitf78e0a52c46fd79794e3b2c04361babc2f06761a (patch)
treea4fba8a910a67c2c9201bf82c15f61aa72a713cf /src
parent6d0dc43ee9c4b1bd337ef56503d4de35d8fff40d (diff)
Move VariantObject over to new storage layout
Change-Id: I96a4ce5d3a3e4fdd29ba0aac1bd3361588457580 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/qml/jsruntime/qv4engine_p.h2
-rw-r--r--src/qml/jsruntime/qv4variantobject.cpp37
-rw-r--r--src/qml/jsruntime/qv4variantobject_p.h16
-rw-r--r--src/qml/qml/qqmlvaluetypewrapper.cpp2
-rw-r--r--src/qml/qml/v8/qv8engine.cpp10
5 files changed, 36 insertions, 31 deletions
diff --git a/src/qml/jsruntime/qv4engine_p.h b/src/qml/jsruntime/qv4engine_p.h
index 070aec7f6a..aa0825de7b 100644
--- a/src/qml/jsruntime/qv4engine_p.h
+++ b/src/qml/jsruntime/qv4engine_p.h
@@ -286,7 +286,7 @@ public:
// calling preserve() on the object which removes it from this scarceResource list.
class ScarceResourceData {
public:
- ScarceResourceData(const QVariant &data) : data(data) {}
+ ScarceResourceData(const QVariant &data = QVariant()) : data(data) {}
QVariant data;
QIntrusiveListNode node;
};
diff --git a/src/qml/jsruntime/qv4variantobject.cpp b/src/qml/jsruntime/qv4variantobject.cpp
index 6937368f87..269a2b4b48 100644
--- a/src/qml/jsruntime/qv4variantobject.cpp
+++ b/src/qml/jsruntime/qv4variantobject.cpp
@@ -53,18 +53,15 @@ DEFINE_OBJECT_VTABLE(VariantObject);
VariantObject::VariantObject(InternalClass *ic)
: Object(ic)
- , ExecutionEngine::ScarceResourceData(QVariant())
- , m_vmePropertyReferenceCount(0)
{
}
VariantObject::VariantObject(ExecutionEngine *engine, const QVariant &value)
: Object(engine->variantClass)
- , ExecutionEngine::ScarceResourceData(value)
- , m_vmePropertyReferenceCount(0)
{
+ d()->data = value;
if (isScarce())
- engine->scarceResources.insert(this);
+ engine->scarceResources.insert(d());
}
QVariant VariantObject::toVariant(const QV4::ValueRef v)
@@ -91,7 +88,7 @@ QVariant VariantObject::toVariant(const QV4::ValueRef v)
bool VariantObject::isScarce() const
{
- QVariant::Type t = ExecutionEngine::ScarceResourceData::data.type();
+ QVariant::Type t = d()->data.type();
return t == QVariant::Pixmap || t == QVariant::Image;
}
@@ -99,7 +96,7 @@ void VariantObject::destroy(Managed *that)
{
VariantObject *v = static_cast<VariantObject *>(that);
if (v->isScarce())
- v->node.remove();
+ v->d()->node.remove();
v->~VariantObject();
}
@@ -109,31 +106,31 @@ bool VariantObject::isEqualTo(Managed *m, Managed *other)
assert(lv);
if (QV4::VariantObject *rv = other->as<QV4::VariantObject>())
- return lv->ExecutionEngine::ScarceResourceData::data == rv->ExecutionEngine::ScarceResourceData::data;
+ return lv->d()->data == rv->d()->data;
if (QV4::QmlValueTypeWrapper *v = other->as<QmlValueTypeWrapper>())
- return v->isEqual(lv->ExecutionEngine::ScarceResourceData::data);
+ return v->isEqual(lv->d()->data);
return false;
}
void VariantObject::addVmePropertyReference()
{
- if (isScarce() && ++m_vmePropertyReferenceCount == 1) {
+ if (isScarce() && ++d()->vmePropertyReferenceCount == 1) {
// remove from the ep->scarceResources list
// since it is now no longer eligible to be
// released automatically by the engine.
- node.remove();
+ d()->node.remove();
}
}
void VariantObject::removeVmePropertyReference()
{
- if (isScarce() && --m_vmePropertyReferenceCount == 0) {
+ if (isScarce() && --d()->vmePropertyReferenceCount == 0) {
// and add to the ep->scarceResources list
// since it is now eligible to be released
// automatically by the engine.
- internalClass()->engine->scarceResources.insert(this);
+ internalClass()->engine->scarceResources.insert(d());
}
}
@@ -156,7 +153,7 @@ QV4::ReturnedValue VariantPrototype::method_preserve(CallContext *ctx)
Scope scope(ctx);
Scoped<VariantObject> o(scope, ctx->callData->thisObject.as<QV4::VariantObject>());
if (o && o->isScarce())
- o->node.remove();
+ o->d()->node.remove();
return Encode::undefined();
}
@@ -166,8 +163,8 @@ QV4::ReturnedValue VariantPrototype::method_destroy(CallContext *ctx)
Scoped<VariantObject> o(scope, ctx->callData->thisObject.as<QV4::VariantObject>());
if (o) {
if (o->isScarce())
- o->node.remove();
- o->ExecutionEngine::ScarceResourceData::data = QVariant();
+ o->d()->node.remove();
+ o->d()->data = QVariant();
}
return Encode::undefined();
}
@@ -178,9 +175,9 @@ QV4::ReturnedValue VariantPrototype::method_toString(CallContext *ctx)
Scoped<VariantObject> o(scope, ctx->callData->thisObject.as<QV4::VariantObject>());
if (!o)
return Encode::undefined();
- QString result = o->ExecutionEngine::ScarceResourceData::data.toString();
- if (result.isEmpty() && !o->ExecutionEngine::ScarceResourceData::data.canConvert(QVariant::String))
- result = QString::fromLatin1("QVariant(%0)").arg(QString::fromLatin1(o->ExecutionEngine::ScarceResourceData::data.typeName()));
+ QString result = o->d()->data.toString();
+ if (result.isEmpty() && !o->d()->data.canConvert(QVariant::String))
+ result = QString::fromLatin1("QVariant(%0)").arg(QString::fromLatin1(o->d()->data.typeName()));
return Encode(ctx->engine->newString(result));
}
@@ -189,7 +186,7 @@ QV4::ReturnedValue VariantPrototype::method_valueOf(CallContext *ctx)
Scope scope(ctx);
Scoped<VariantObject> o(scope, ctx->callData->thisObject.as<QV4::VariantObject>());
if (o) {
- QVariant v = o->ExecutionEngine::ScarceResourceData::data;
+ QVariant v = o->d()->data;
switch (v.type()) {
case QVariant::Invalid:
return Encode::undefined();
diff --git a/src/qml/jsruntime/qv4variantobject_p.h b/src/qml/jsruntime/qv4variantobject_p.h
index 656608d49b..ab2ef55e15 100644
--- a/src/qml/jsruntime/qv4variantobject_p.h
+++ b/src/qml/jsruntime/qv4variantobject_p.h
@@ -64,10 +64,19 @@ QT_BEGIN_NAMESPACE
namespace QV4 {
-struct VariantObject : Object, public ExecutionEngine::ScarceResourceData
+struct VariantObject : Object
{
- V4_OBJECT
-public:
+ struct Data : Object::Data, public ExecutionEngine::ScarceResourceData
+ {
+ int vmePropertyReferenceCount;
+ };
+ struct __Data : public ExecutionEngine::ScarceResourceData
+ {
+ int vmePropertyReferenceCount;
+ } __data;
+
+ V4_OBJECT_NEW
+
VariantObject(InternalClass *ic);
VariantObject(ExecutionEngine *engine, const QVariant &value);
@@ -76,7 +85,6 @@ public:
void addVmePropertyReference();
void removeVmePropertyReference();
bool isScarce() const;
- int m_vmePropertyReferenceCount;
static void destroy(Managed *that);
static bool isEqualTo(Managed *m, Managed *other);
diff --git a/src/qml/qml/qqmlvaluetypewrapper.cpp b/src/qml/qml/qqmlvaluetypewrapper.cpp
index db35171528..b56b379488 100644
--- a/src/qml/qml/qqmlvaluetypewrapper.cpp
+++ b/src/qml/qml/qqmlvaluetypewrapper.cpp
@@ -197,7 +197,7 @@ bool QmlValueTypeWrapper::isEqualTo(Managed *m, Managed *other)
assert(lv);
if (QV4::VariantObject *rv = other->as<VariantObject>())
- return lv->isEqual(rv->ExecutionEngine::ScarceResourceData::data);
+ return lv->isEqual(rv->d()->data);
if (QV4::QmlValueTypeWrapper *v = other->as<QmlValueTypeWrapper>())
return lv->isEqual(v->toVariant());
diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp
index e5189202c5..178eeb2c64 100644
--- a/src/qml/qml/v8/qv8engine.cpp
+++ b/src/qml/qml/v8/qv8engine.cpp
@@ -130,7 +130,7 @@ QVariant QV8Engine::toVariant(const QV4::ValueRef value, int typeHint)
QV4::Scope scope(m_v4Engine);
if (QV4::VariantObject *v = value->as<QV4::VariantObject>())
- return v->QV4::ExecutionEngine::ScarceResourceData::data;
+ return v->d()->data;
if (typeHint == QVariant::Bool)
return QVariant(value->toBoolean());
@@ -882,7 +882,7 @@ bool QV8Engine::metaTypeFromJS(const QV4::ValueRef value, int type, void *data)
return true;
if (value->as<QV4::VariantObject>() && name.endsWith('*')) {
int valueType = QMetaType::type(name.left(name.size()-1));
- QVariant &var = value->as<QV4::VariantObject>()->QV4::ExecutionEngine::ScarceResourceData::data;
+ QVariant &var = value->as<QV4::VariantObject>()->d()->data;
if (valueType == var.userType()) {
// We have T t, T* is requested, so return &t.
*reinterpret_cast<void* *>(data) = var.data();
@@ -893,7 +893,7 @@ bool QV8Engine::metaTypeFromJS(const QV4::ValueRef value, int type, void *data)
while (proto) {
bool canCast = false;
if (QV4::VariantObject *vo = proto->as<QV4::VariantObject>()) {
- const QVariant &v = vo->QV4::ExecutionEngine::ScarceResourceData::data;
+ const QVariant &v = vo->d()->data;
canCast = (type == v.userType()) || (valueType && (valueType == v.userType()));
}
else if (proto->as<QV4::QObjectWrapper>()) {
@@ -969,7 +969,7 @@ QVariant QV8Engine::variantFromJS(const QV4::ValueRef value,
if (QV4::RegExpObject *re = value->as<QV4::RegExpObject>())
return re->toQRegExp();
if (QV4::VariantObject *v = value->as<QV4::VariantObject>())
- return v->QV4::ExecutionEngine::ScarceResourceData::data;
+ return v->d()->data;
if (value->as<QV4::QObjectWrapper>())
return qVariantFromValue(qtObjectFromJS(value));
if (QV4::QmlValueTypeWrapper *v = value->as<QV4::QmlValueTypeWrapper>())
@@ -1003,7 +1003,7 @@ QObject *QV8Engine::qtObjectFromJS(const QV4::ValueRef value)
QV4::Scoped<QV4::VariantObject> v(scope, value);
if (v) {
- QVariant variant = v->QV4::ExecutionEngine::ScarceResourceData::data;
+ QVariant variant = v->d()->data;
int type = variant.userType();
if (type == QMetaType::QObjectStar)
return *reinterpret_cast<QObject* const *>(variant.constData());