[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