src/declarative/qml/qdeclarativeobjectscriptclass.cpp
changeset 37 758a864f9613
parent 33 3e2da88830cd
--- a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp	Fri Sep 17 08:34:18 2010 +0300
+++ b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp	Mon Oct 04 01:19:32 2010 +0300
@@ -192,7 +192,7 @@
     if (!(hints & ImplicitObject)) {
         local.coreIndex = -1;
         lastData = &local;
-        return QScriptClass::HandlesReadAccess | QScriptClass::HandlesWriteAccess;
+        return QScriptClass::HandlesWriteAccess;
     }
 
     return 0;
@@ -625,11 +625,12 @@
 
     char data[4 * sizeof(void *)];
     int type;
+    bool isObjectType;
 };
 }
 
 MetaCallArgument::MetaCallArgument()
-: type(QVariant::Invalid)
+: type(QVariant::Invalid), isObjectType(false)
 {
 }
 
@@ -744,12 +745,23 @@
         new (&data) QVariant();
         type = -1;
 
-        QVariant v = QDeclarativeEnginePrivate::get(engine)->scriptValueToVariant(value);
+        QDeclarativeEnginePrivate *priv = QDeclarativeEnginePrivate::get(engine);
+        QVariant v = priv->scriptValueToVariant(value);
         if (v.userType() == callType) {
             *((QVariant *)&data) = v;
         } else if (v.canConvert((QVariant::Type)callType)) {
             *((QVariant *)&data) = v;
             ((QVariant *)&data)->convert((QVariant::Type)callType);
+        } else if (const QMetaObject *mo = priv->rawMetaObjectForType(callType)) {
+            QObject *obj = priv->toQObject(v);
+            
+            if (obj) {
+                const QMetaObject *objMo = obj->metaObject();
+                while (objMo && objMo != mo) objMo = objMo->superClass();
+                if (!objMo) obj = 0;
+            }
+
+            *((QVariant *)&data) = QVariant(callType, &obj);
         } else {
             *((QVariant *)&data) = QVariant(callType, (void *)0);
         }