propertyType = propertyMetaObject.className();
}
} else if (value.userType() != QVariant::Invalid) {
- valueType = QMetaType::typeName(value.userType());
+ if (value.userType() == QMetaType::VoidStar)
+ valueType = "null";
+ else
+ valueType = QMetaType::typeName(value.userType());
}
if (!valueType)
- valueType = "null";
+ valueType = "undefined";
if (!propertyType)
propertyType = QMetaType::typeName(type);
if (!propertyType)
case QMetaType::UnknownType:
case QMetaType::Void:
return QV4::Encode::undefined();
+ case QMetaType::VoidStar:
+ return QV4::Encode::null();
case QMetaType::Bool:
return QV4::Encode(*reinterpret_cast<const bool*>(ptr));
case QMetaType::Int:
// [Any other object] -> QVariantMap(...)
QVariant QV8Engine::toBasicVariant(const QV4::ValueRef value)
{
- if (value->isNullOrUndefined())
+ if (value->isUndefined())
return QVariant();
+ if (value->isNull())
+ return QVariant(QMetaType::VoidStar, (void *)0);
if (value->isBoolean())
return value->booleanValue();
if (value->isInteger())
case QMetaType::UnknownType:
case QMetaType::Void:
return QV4::Encode::undefined();
+ case QMetaType::VoidStar:
+ return QV4::Encode::null();
case QMetaType::Bool:
return QV4::Encode(*reinterpret_cast<const bool*>(data));
case QMetaType::Int:
}
function releaseScarceResource() {
- root.scarceResourceCopy = null;
+ root.scarceResourceCopy = undefined;
}
}
}
function releaseScarceResource() {
- root.scarceResourceCopy = null;
+ root.scarceResourceCopy = undefined;
}
}
--- /dev/null
+import QtQuick 2.2
+
+ListView
+{
+ property variant undefinedVariant: undefined
+ property variant nullVariant: null
+ property variant intVariant: 1
+ property variant doubleVariant: 1.2
+
+ property var testVar
+ property variant testVariant
+
+ function checkNull() {
+ var result = [{'test': null}];
+ model = result;
+ if (model[0].test !== null)
+ return false;
+ testVar = null;
+ testVariant = testVar;
+ if (testVariant !== null)
+ return false;
+ testVar = testVariant;
+ if (testVar !== null)
+ return false;
+ return true;
+ }
+ function checkUndefined() {
+ var result = [{'test': undefined}];
+ model = result;
+ if (model[0].test !== undefined)
+ return false;
+ testVar = undefined;
+ testVariant = testVar;
+ if (testVariant !== undefined)
+ return false;
+ testVar = testVariant;
+ if (testVar !== undefined)
+ return false;
+ return true;
+ }
+ function checkNumber() {
+ var result = [{'test': 1}];
+ model = result;
+ if (model[0].test !== 1)
+ return false;
+ testVar = 1;
+ testVariant = testVar;
+ if (testVariant !== 1)
+ return false;
+ testVar = testVariant;
+ if (testVar !== 1)
+ return false;
+ return true;
+ }
+}
void deletedEngine();
void libraryScriptAssert();
void variantsAssignedUndefined();
+ void variants();
void qtbug_9792();
void qtcreatorbug_1289();
void noSpuriousWarningsAtShutdown();
delete object;
}
+void tst_qqmlecmascript::variants()
+{
+ QQmlComponent component(&engine, testFileUrl("variants.qml"));
+
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+
+ QVERIFY(object->property("undefinedVariant").type() == QVariant::Invalid);
+ QVERIFY(object->property("nullVariant").type() == (int)QMetaType::VoidStar);
+ QVERIFY(object->property("intVariant").type() == QVariant::Int);
+ QVERIFY(object->property("doubleVariant").type() == QVariant::Double);
+
+ QVariant result;
+ QMetaObject::invokeMethod(object, "checkNull", Q_RETURN_ARG(QVariant, result));
+ QCOMPARE(result.toBool(), true);
+
+ QMetaObject::invokeMethod(object, "checkUndefined", Q_RETURN_ARG(QVariant, result));
+ QCOMPARE(result.toBool(), true);
+
+ QMetaObject::invokeMethod(object, "checkNumber", Q_RETURN_ARG(QVariant, result));
+ QCOMPARE(result.toBool(), true);
+}
+
void tst_qqmlecmascript::qtbug_9792()
{
QQmlComponent component(&engine, testFileUrl("qtbug_9792.qml"));