From f2c6e10ad59c0660b772bff7715fb232cdbe394c Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Mon, 23 Jan 2017 10:31:16 +0100 Subject: QVariants of null pointers should be null Changes the QVariant::isNull() implementation for pointer types so they return true if null. [ChangeLog][QVariant] QVariants containing pointers will now return true on isNull() if the contained pointer is null. Change-Id: I8aa0dab482403837073fb2f376a46126cc3bc6b2 Reviewed-by: Thiago Macieira --- src/corelib/kernel/qvariant.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'src/corelib/kernel/qvariant.cpp') diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index b73c83bc49..a6b92f9f8f 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -1177,7 +1177,17 @@ static void customClear(QVariant::Private *d) static bool customIsNull(const QVariant::Private *d) { - return d->is_null; + if (d->is_null) + return true; + const char *const typeName = QMetaType::typeName(d->type); + if (Q_UNLIKELY(!typeName) && Q_LIKELY(!QMetaType::isRegistered(d->type))) + qFatal("QVariant::isNull: type %d unknown to QVariant.", d->type); + uint typeNameLen = qstrlen(typeName); + if (typeNameLen > 0 && typeName[typeNameLen - 1] == '*') { + const void *d_ptr = d->is_shared ? d->data.shared->ptr : &(d->data.ptr); + return *static_cast(d_ptr) == nullptr; + } + return false; } static bool customCompare(const QVariant::Private *a, const QVariant::Private *b) @@ -3740,9 +3750,10 @@ void* QVariant::data() /*! Returns \c true if this is a null variant, false otherwise. A variant is - considered null if it contains no initialized value or it contains an instance - of built-in type that has an isNull method, in which case the result would be - the same as calling isNull on the wrapped object. + considered null if it contains no initialized value, or the contained value + is a null pointer or is an instance of a built-in type that has an isNull + method, in which case the result would be the same as calling isNull on the + wrapped object. \warning Null variants is not a single state and two null variants may easily return \c false on the == operator if they do not contain similar null values. -- cgit v1.2.3