summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJędrzej Nowacki <jedrzej.nowacki@nokia.com>2012-01-09 11:36:03 +0100
committerQt by Nokia <qt-info@nokia.com>2012-02-16 02:00:30 +0100
commit1b23336a297681dc12700880540a5a8d31f146fe (patch)
treea9b3b0ed63d3d14b1741644a38cd87c0510a89cf
parent214e031d56714ba69ef929f1e763e243b393e460 (diff)
Use static-less QMetaType API in QVariant.
This patch improves performance when constructing a custom type in a QVariant by ~ 7-20% (instructions count) depending on the type size and metatype attributes. Change-Id: Ic2707ff5abd689b66e23c1794f111504bf9b3b01 Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
-rw-r--r--src/corelib/kernel/qvariant.cpp9
-rw-r--r--tests/benchmarks/corelib/kernel/qvariant/tst_qvariant.cpp2
2 files changed, 7 insertions, 4 deletions
diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp
index 4197fe9093..d0470ff796 100644
--- a/src/corelib/kernel/qvariant.cpp
+++ b/src/corelib/kernel/qvariant.cpp
@@ -787,7 +787,8 @@ const QVariant::Handler qt_dummy_variant_handler = {
static void customConstruct(QVariant::Private *d, const void *copy)
{
- const uint size = QMetaType::sizeOf(d->type);
+ const QMetaType type(d->type);
+ const uint size = type.sizeOf();
if (!size) {
d->type = QVariant::Invalid;
return;
@@ -795,11 +796,11 @@ static void customConstruct(QVariant::Private *d, const void *copy)
// this logic should match with QVariantIntegrator::CanUseInternalSpace
if (size <= sizeof(QVariant::Private::Data)
- && (QMetaType::typeFlags(d->type) & QMetaType::MovableType)) {
- QMetaType::construct(d->type, &d->data.ptr, copy);
+ && (type.flags() & QMetaType::MovableType)) {
+ type.construct(&d->data.ptr, copy);
d->is_shared = false;
} else {
- void *ptr = QMetaType::create(d->type, copy);
+ void *ptr = type.create(copy);
d->is_shared = true;
d->data.shared = new QVariant::PrivateShared(ptr);
}
diff --git a/tests/benchmarks/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/benchmarks/corelib/kernel/qvariant/tst_qvariant.cpp
index e842e18d52..f6b4d88311 100644
--- a/tests/benchmarks/corelib/kernel/qvariant/tst_qvariant.cpp
+++ b/tests/benchmarks/corelib/kernel/qvariant/tst_qvariant.cpp
@@ -90,6 +90,7 @@ struct BigClass
double n,i,e,r,o,b;
};
Q_STATIC_ASSERT(sizeof(BigClass) > sizeof(QVariant::Private::Data));
+Q_DECLARE_TYPEINFO(BigClass, Q_MOVABLE_TYPE);
Q_DECLARE_METATYPE(BigClass);
struct SmallClass
@@ -97,6 +98,7 @@ struct SmallClass
char s;
};
Q_STATIC_ASSERT(sizeof(SmallClass) <= sizeof(QVariant::Private::Data));
+Q_DECLARE_TYPEINFO(SmallClass, Q_MOVABLE_TYPE);
Q_DECLARE_METATYPE(SmallClass);
void tst_qvariant::testBound()