aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4qobjectwrapper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/jsruntime/qv4qobjectwrapper.cpp')
-rw-r--r--src/qml/jsruntime/qv4qobjectwrapper.cpp60
1 files changed, 31 insertions, 29 deletions
diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp
index a4f676ef66..22c4863bde 100644
--- a/src/qml/jsruntime/qv4qobjectwrapper.cpp
+++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp
@@ -132,42 +132,43 @@ static QV4::ReturnedValue loadProperty(QV4::ExecutionEngine *v4, QObject *object
{
Q_ASSERT(!property.isFunction());
QV4::Scope scope(v4);
+ const int propType = property.propType().id();
if (property.isQObject()) {
QObject *rv = nullptr;
property.readProperty(object, &rv);
return QV4::QObjectWrapper::wrap(v4, rv);
} else if (property.isQList()) {
- return QmlListWrapper::create(v4, object, property.coreIndex(), property.propType());
- } else if (property.propType() == QMetaType::QReal) {
+ return QmlListWrapper::create(v4, object, property.coreIndex(), property.propType().id());
+ } else if (propType == QMetaType::QReal) {
qreal v = 0;
property.readProperty(object, &v);
return QV4::Encode(v);
- } else if (property.propType() == QMetaType::Int || property.isEnum()) {
+ } else if (propType == QMetaType::Int || property.isEnum()) {
int v = 0;
property.readProperty(object, &v);
return QV4::Encode(v);
- } else if (property.propType() == QMetaType::Bool) {
+ } else if (propType == QMetaType::Bool) {
bool v = false;
property.readProperty(object, &v);
return QV4::Encode(v);
- } else if (property.propType() == QMetaType::QString) {
+ } else if (propType == QMetaType::QString) {
QString v;
property.readProperty(object, &v);
return v4->newString(v)->asReturnedValue();
- } else if (property.propType() == QMetaType::UInt) {
+ } else if (propType == QMetaType::UInt) {
uint v = 0;
property.readProperty(object, &v);
return QV4::Encode(v);
- } else if (property.propType() == QMetaType::Float) {
+ } else if (propType == QMetaType::Float) {
float v = 0;
property.readProperty(object, &v);
return QV4::Encode(v);
- } else if (property.propType() == QMetaType::Double) {
+ } else if (propType == QMetaType::Double) {
double v = 0;
property.readProperty(object, &v);
return QV4::Encode(v);
- } else if (property.propType() == qMetaTypeId<QJSValue>()) {
+ } else if (propType == qMetaTypeId<QJSValue>()) {
QJSValue v;
property.readProperty(object, &v);
return QJSValuePrivate::convertToReturnedValue(v4, v);
@@ -181,26 +182,26 @@ static QV4::ReturnedValue loadProperty(QV4::ExecutionEngine *v4, QObject *object
}
return scope.engine->fromVariant(v);
- } else if (QQmlValueTypeFactory::isValueType(property.propType())) {
- if (const QMetaObject *valueTypeMetaObject = QQmlValueTypeFactory::metaObjectForMetaType(property.propType()))
- return QV4::QQmlValueTypeWrapper::create(v4, object, property.coreIndex(), valueTypeMetaObject, property.propType());
+ } else if (QQmlValueTypeFactory::isValueType(propType)) {
+ if (const QMetaObject *valueTypeMetaObject = QQmlValueTypeFactory::metaObjectForMetaType(propType))
+ return QV4::QQmlValueTypeWrapper::create(v4, object, property.coreIndex(), valueTypeMetaObject, propType);
} else {
#if QT_CONFIG(qml_sequence_object)
// see if it's a sequence type
bool succeeded = false;
- QV4::ScopedValue retn(scope, QV4::SequencePrototype::newSequence(v4, property.propType(), object, property.coreIndex(), !property.isWritable(), &succeeded));
+ QV4::ScopedValue retn(scope, QV4::SequencePrototype::newSequence(v4, propType, object, property.coreIndex(), !property.isWritable(), &succeeded));
if (succeeded)
return retn->asReturnedValue();
#endif
}
- if (property.propType() == QMetaType::UnknownType) {
+ if (propType == QMetaType::UnknownType) {
QMetaProperty p = object->metaObject()->property(property.coreIndex());
qWarning("QMetaProperty::read: Unable to handle unregistered datatype '%s' for property "
"'%s::%s'", p.typeName(), object->metaObject()->className(), p.name());
return QV4::Encode::undefined();
} else {
- QVariant v(QMetaType(property.propType()), (void *)nullptr);
+ QVariant v(property.propType(), (void *)nullptr);
property.readProperty(object, v.data());
return scope.engine->fromVariant(v);
}
@@ -461,7 +462,7 @@ void QObjectWrapper::setProperty(ExecutionEngine *engine, QObject *object, QQmlP
QV4::ScopedFunctionObject f(scope, value);
if (f) {
if (!f->isBinding()) {
- if (!property->isVarProperty() && property->propType() != qMetaTypeId<QJSValue>()) {
+ if (!property->isVarProperty() && property->propType().id() != qMetaTypeId<QJSValue>()) {
// assigning a JS function to a non var or QJSValue property or is not allowed.
QString error = QLatin1String("Cannot assign JavaScript function to ");
if (!QMetaType(property->propType()).name())
@@ -520,42 +521,43 @@ void QObjectWrapper::setProperty(ExecutionEngine *engine, QObject *object, QQmlP
void *argv[] = { &o, 0, &status, &flags }; \
QMetaObject::metacall(object, QMetaObject::WriteProperty, property->coreIndex(), argv);
+ const int propType = property->propType().id();
if (value.isNull() && property->isQObject()) {
PROPERTY_STORE(QObject*, nullptr);
} else if (value.isUndefined() && property->isResettable()) {
void *a[] = { nullptr };
QMetaObject::metacall(object, QMetaObject::ResetProperty, property->coreIndex(), a);
- } else if (value.isUndefined() && property->propType() == qMetaTypeId<QVariant>()) {
+ } else if (value.isUndefined() && propType == qMetaTypeId<QVariant>()) {
PROPERTY_STORE(QVariant, QVariant());
- } else if (value.isUndefined() && property->propType() == QMetaType::QJsonValue) {
+ } else if (value.isUndefined() && propType == QMetaType::QJsonValue) {
PROPERTY_STORE(QJsonValue, QJsonValue(QJsonValue::Undefined));
- } else if (!newBinding && property->propType() == qMetaTypeId<QJSValue>()) {
+ } else if (!newBinding && propType == qMetaTypeId<QJSValue>()) {
PROPERTY_STORE(QJSValue, QJSValuePrivate::fromReturnedValue(value.asReturnedValue()));
- } else if (value.isUndefined() && property->propType() != qMetaTypeId<QQmlScriptString>()) {
+ } else if (value.isUndefined() && propType != qMetaTypeId<QQmlScriptString>()) {
QString error = QLatin1String("Cannot assign [undefined] to ");
- if (!QMetaType(property->propType()).name())
+ if (!property->propType().name())
error += QLatin1String("[unknown property type]");
else
- error += QLatin1String(QMetaType(property->propType()).name());
+ error += QLatin1String(property->propType().name());
scope.engine->throwError(error);
return;
} else if (value.as<FunctionObject>()) {
// this is handled by the binding creation above
- } else if (property->propType() == QMetaType::Int && value.isNumber()) {
+ } else if (property->propType().id() == QMetaType::Int && value.isNumber()) {
PROPERTY_STORE(int, value.asDouble());
- } else if (property->propType() == QMetaType::QReal && value.isNumber()) {
+ } else if (propType == QMetaType::QReal && value.isNumber()) {
PROPERTY_STORE(qreal, qreal(value.asDouble()));
- } else if (property->propType() == QMetaType::Float && value.isNumber()) {
+ } else if (propType == QMetaType::Float && value.isNumber()) {
PROPERTY_STORE(float, float(value.asDouble()));
- } else if (property->propType() == QMetaType::Double && value.isNumber()) {
+ } else if (propType == QMetaType::Double && value.isNumber()) {
PROPERTY_STORE(double, double(value.asDouble()));
- } else if (property->propType() == QMetaType::QString && value.isString()) {
+ } else if (propType == QMetaType::QString && value.isString()) {
PROPERTY_STORE(QString, value.toQStringNoThrow());
} else if (property->isVarProperty()) {
QQmlVMEMetaObject *vmemo = QQmlVMEMetaObject::get(object);
Q_ASSERT(vmemo);
vmemo->setVMEProperty(property->coreIndex(), value);
- } else if (property->propType() == qMetaTypeId<QQmlScriptString>() && (value.isUndefined() || value.isPrimitive())) {
+ } else if (propType == qMetaTypeId<QQmlScriptString>() && (value.isUndefined() || value.isPrimitive())) {
QQmlScriptString ss(value.toQStringNoThrow(), nullptr /* context */, object);
if (value.isNumber()) {
ss.d->numberValue = value.toNumber();
@@ -570,7 +572,7 @@ void QObjectWrapper::setProperty(ExecutionEngine *engine, QObject *object, QQmlP
if (property->isQList())
v = scope.engine->toVariant(value, qMetaTypeId<QList<QObject *> >());
else
- v = scope.engine->toVariant(value, property->propType());
+ v = scope.engine->toVariant(value, propType);
QQmlRefPointer<QQmlContextData> callingQmlContext = scope.engine->callingQmlContext();
if (!QQmlPropertyPrivate::write(object, *property, v, callingQmlContext)) {