[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdelibs/kjsembed/kjsembed
From:       Sebastian Sauer <mail () dipe ! org>
Date:       2008-06-13 0:52:57
Message-ID: 1213318377.225340.5221.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 820045 by sebsauer:

* fixed handling of QObject/QWidget within QVariant's, second part of r819739 - so, \
                it's fixed now. Thanks goes to Ludger Sprenker for pointing me at \
                this issue.
* fixed mem-leak on throwing an exception.
* fixed deleting arguments to early what results in probs if the same instances we \
                pass as argument got returned.
* fixed handling of empty arrays which where wrongly detected as maps.
* fixed missing break in the switch that was resulting in funny results :-/



 M  +42 -34    qobject_binding.cpp  
 M  +31 -16    variant_binding.cpp  


--- trunk/KDE/kdelibs/kjsembed/kjsembed/qobject_binding.cpp #820044:820045
@@ -651,56 +651,64 @@
     QList<QByteArray> types = metaMember.parameterTypes();
 
     QVariant::Type returnTypeId = QVariant::nameToType( metaMember.typeName() );
-    QVariant returnValue( returnTypeId );
+    int tp = QMetaType::type( metaMember.typeName() );
+    PointerBase *qtRet = new Value<void*>(0);
+    QVariant returnValue(returnTypeId);
     QGenericReturnArgument returnArgument(metaMember.typeName(), &returnValue);
-    param[0] = returnArgument.data();
+    param[0] = returnTypeId == QVariant::UserType ? qtRet->voidStar() : \
returnArgument.data(); +
     QString errorText;
     for( int idx = 0; idx < 10; ++idx)
     {
         qtArgs[idx] = getArg(exec, types, args, idx, errorText);
-        if (!qtArgs[0])
+        if (!qtArgs[idx]) {
+            for( int i = 0; i < idx; ++i)
+                delete qtArgs[i];
+            delete qtRet;
             return KJS::throwError(exec, KJS::GeneralError, i18n("Call to method \
'%1' failed, unable to get argument %2: %3",  m_memberName.constData(), idx, \
errorText)); +        }
         param[idx+1] = qtArgs[idx]->voidStar();
     }
 
-    //qDebug("param ptr %0x", *(void**)param[1]);
     success = object->qt_metacall(QMetaObject::InvokeMetaMethod, offset, param) < 0;
-    //qDebug("after param ptr %0x", *(void**)param[1]);
 
-    for( int idx = 0; idx < 10; ++idx)
-    {
-        delete qtArgs[idx];
+    KJS::JSValue *jsReturnValue = 0;
+    if( success ) {
+        switch( returnTypeId ) {
+            case QVariant::Invalid: // fall through
+            case QVariant::UserType: {
+                switch( tp ) {
+                    case QMetaType::QWidgetStar: {
+                        QVariant v(tp, param[0]);
+                        QWidget* widget = v.value< QWidget* >();
+                        if( widget )
+                            jsReturnValue = KJSEmbed::createQObject(exec, widget, \
KJSEmbed::ObjectBinding::CPPOwned); +                    } break;
+                    case QMetaType::QObjectStar: {
+                        QVariant v(tp,param[0]);
+                        QObject* obj = v.value< QObject* >();
+                        if( obj )
+                            jsReturnValue = KJSEmbed::createQObject(exec, obj, \
KJSEmbed::ObjectBinding::CPPOwned); +                    } break;
+                    default:
+                        break;
+                }
+            } // fall through
+            default:
+                break;
+        }
+        if(! jsReturnValue)
+            jsReturnValue = KJSEmbed::convertToValue(exec, returnValue);
     }
 
     if( !success )
-    {
         return KJS::throwError(exec, KJS::GeneralError, i18n("Call to '%1' failed.", \
                m_memberName.constData()));
-        //return KJSEmbed::throwError(exec, i18n("Call to '%1' \
                failed.").arg(m_memberName.constData()));
-    }
 
-    switch( returnTypeId ) {
-        case QVariant::Invalid: // fall through
-        case QVariant::UserType: {
-            int tp = QMetaType::type( metaMember.typeName() );
-            switch( tp ) {
-                case QMetaType::QWidgetStar: {
-                    QVariant v(tp, param[0]);
-                    QWidget* widget = v.value< QWidget* >();
-                    if( widget )
-                        return KJSEmbed::createQObject(exec, widget, \
                KJSEmbed::ObjectBinding::QObjOwned);
-                } // fall through
-                case QMetaType::QObjectStar: {
-                    QVariant v(tp, param[0]);
-                    QObject* obj = v.value< QObject* >();
-                    if( obj )
-                        return KJSEmbed::createQObject(exec, obj, \
                KJSEmbed::ObjectBinding::QObjOwned);
-                } break;
-                default: break;
-            }
-        } // fall through
-        default:
-            return KJSEmbed::convertToValue(exec, returnValue);
-    }
+    for( int idx = 0; idx < 10; ++idx)
+        delete qtArgs[idx];
+    delete qtRet;
+
+    return jsReturnValue;
 }
 
 SlotBinding::SlotBinding(KJS::ExecState *exec, const QMetaMethod &member )
--- trunk/KDE/kdelibs/kjsembed/kjsembed/variant_binding.cpp #820044:820045
@@ -139,15 +139,19 @@
     KJS::JSObject *obj = val->toObject( exec );
     if ( toQString(obj->className()) == "Array" )
     {
-        KJS::JSValue *len = obj->get(exec, KJS::Identifier("length"));
-        QByteArray buff;
-        buff.setNum(int(len->toNumber(exec))-1);
-        if( !obj->hasProperty(exec, KJS::Identifier("length")) )
+        if( !obj->hasProperty(exec, KJS::Identifier("length")) ) {
             return Map;
-        else if( !obj->hasProperty(exec, KJS::Identifier( buff.data() ) ) )
-            return Map;
-        else
-            return List;
+        }
+        KJS::JSValue *jslen = obj->get(exec, KJS::Identifier("length"));
+        const int len = jslen->toNumber(exec);
+        if ( len > 0 ) {
+            QByteArray buff;
+            buff.setNum(len-1);
+            if( !obj->hasProperty(exec, KJS::Identifier( buff.data() ) ) ) {
+                return Map;
+            }
+        }
+        return List;
     }
     else
         return None;
@@ -263,8 +267,7 @@
 
 QVariant KJSEmbed::convertToVariant( KJS::ExecState *exec, KJS::JSValue *value )
 {
-    //qDebug() << "Cast " << value.type();
-
+    //qDebug()<<"KJSEmbed::convertToVariant";
     QVariant returnValue;
     switch( value->type() )
     {
@@ -287,13 +290,15 @@
         case KJS::ObjectType:
         {
             KJS::JSObject *obj = value->toObject(exec);
-            //qDebug() << "Object type: " << toQString(obj.className());
+            //qDebug() << "Object type: " << toQString(obj->className());
             if ( toQString(obj->className()) == "Array" )
             {
-                if ( checkArray( exec, value ) == List )
+                if ( checkArray( exec, value ) == List ) {
                     returnValue = convertArrayToList( exec, value );
-                else
+                }
+                else {
                     returnValue = convertArrayToMap(exec, value);
+                }
             }
             else if ( toQString(obj->className()) == "Date" )
             {
@@ -307,7 +312,7 @@
             {
                 returnValue = toQString(value->toString(exec));
             }
-        }
+        } break;
         default:
             returnValue = extractVariant(exec,value);
             if( returnValue.isNull() )
@@ -409,10 +414,12 @@
         {
             if( qVariantCanConvert< QWidget* >(value) ) {
                 QWidget* widget = qvariant_cast< QWidget* >(value);
+                Q_ASSERT(widget);
                 returnValue = createQObject(exec, widget, \
KJSEmbed::ObjectBinding::CPPOwned);  }
             else if( qVariantCanConvert< QObject* >(value) ) {
                 QObject* object = qvariant_cast< QObject* >(value);
+                Q_ASSERT(object);
                 returnValue = createQObject(exec, object, \
KJSEmbed::ObjectBinding::CPPOwned);  }
             else {
@@ -428,6 +435,7 @@
 
 QVariant KJSEmbed::extractVariant( KJS::ExecState *exec, KJS::JSValue *value )
 {
+    //qDebug()<<"KJSEmbed::extractVariant";
     KJSEmbed::VariantBinding *imp = \
KJSEmbed::extractBindingImp<KJSEmbed::VariantBinding>(exec,  value );  if( imp )
         return imp->variant();
@@ -439,8 +447,15 @@
         return QVariant(value->toBoolean(exec));
 
     KJS::JSObject *obj = value->toObject( exec );
-    if ( obj && toQString(obj->className()) == "Array" )
-        return convertArrayToList( exec, value );
+    if ( obj ) {
+        if(QObjectBinding *objImp = \
KJSEmbed::extractBindingImp<QObjectBinding>(exec, value)) { +            QVariant v;
+            v.setValue( (QObject*) objImp->qobject<QObject>() );
+            return v;
+        }
+        if( toQString(obj->className()) == "Array" )
+            return convertArrayToList( exec, value );
+    }
 
     return QVariant();
 }


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic