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

List:       kde-commits
Subject:    KDE/kdelibs/kjsembed/kjsembed
From:       Erik Lloyd Bunce <kde () bunce ! us>
Date:       2007-04-25 19:46:43
Message-ID: 1177530403.170565.19028.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 658047 by bunce:

Improved support for derived value based bindings. Improved SlotProxy handling of \
argument conversions. Make KJSEmbed::convertToValue() use an Object like it should \
for a Mapinstead of an Array.

 M  +1 -1      binding_support.h  
 M  +107 -9    slotproxy.cpp  
 M  +12 -0     value_binding.cpp  
 M  +21 -2     value_binding.h  
 M  +3 -3      variant_binding.cpp  
 M  +6 -1      variant_binding.h  


--- trunk/KDE/kdelibs/kjsembed/kjsembed/binding_support.h #658046:658047
@@ -21,7 +21,6 @@
 #ifndef BINDING_SUPPORT_H
 #define BINDING_SUPPORT_H
 
-
 #include <QDateTime>
 #include <QStringList>
 
@@ -87,6 +86,7 @@
 { \
     public: \
     NAME(KJS::ExecState *exec, const TYPE & val ); \
+    NAME(KJS::ExecState *exec, const char *typeName ); \
     static const KJSEmbed::Method p_methods[]; \
     static const KJSEmbed::Method p_statics[]; \
     static const KJSEmbed::Enumerator p_enums[]; \
--- trunk/KDE/kdelibs/kjsembed/kjsembed/slotproxy.cpp #658046:658047
@@ -19,12 +19,16 @@
 */
 #include <QMetaMethod>
 #include <QMetaType>
+#include <QtDebug>
 
 #include <kjs/interpreter.h>
 
 #include "slotproxy.h"
 #include "variant_binding.h"
+#include "qobject_binding.h"
 
+//#define DEBUG_SLOTPROXY 1
+
 using namespace KJSEmbed;
 using namespace KJS;
 
@@ -82,6 +86,9 @@
 
 KJS::JSValue *SlotProxy::callMethod( const QByteArray & methodName, void **_a )
 {
+#ifdef DEBUG_SLOTPROXY
+    qDebug() << "SlotProxy::callMethod(" << methodName << ",_a)";
+#endif
     KJS::ExecState *exec = m_interpreter->globalExec();
     // Crash
     // KJS::Interpreter::globalExec()->context().thisValue()
@@ -118,22 +125,110 @@
     QMetaMethod method = metaObject()->method(offset);
     QList<QByteArray> params = method.parameterTypes();
     int idx = 1;
+#ifdef DEBUG_SLOTPROXY
+    qDebug() << "SlotProxy::convertArguments(): m_signature" << m_signature << " \
offset=" << offset << " params=" << params; +#endif
     foreach( QByteArray param, params )
     {
-        // int type = QMetaType::type( param.constData() );
-        //qDebug("Got a %d - %s", type, param.data());
-
+#ifdef DEBUG_SLOTPROXY
+        int type = QMetaType::type( param.constData() );
+        qDebug("\tGot a %d - %s - _a[%d] = %p", type, param.data(), idx, _a[idx]);
+        qDebug("\t QMetaType::type()=%d", QMetaType::type(QByteArray("Pinya::") + \
param.constData())); +#endif
         int tp = QVariant::nameToType(param.constData());
-        //qDebug("Try to convert a %d", tp);
-        if(tp != QVariant::Invalid)
+        switch(tp)
         {
+        case QVariant::Int:
+            args.append(KJS::jsNumber(*(int*)_a[idx]));
+            break;
+        case QVariant::UInt:
+            args.append(KJS::jsNumber(*(uint*)_a[idx]));
+            break;
+        case QVariant::LongLong:
+            args.append(KJS::jsNumber(*(qlonglong*)_a[idx]));
+            break;
+        case QVariant::ULongLong:
+            args.append(KJS::jsNumber(*(qulonglong*)_a[idx]));
+            break;
+        case QVariant::Double:
+            args.append(KJS::jsNumber(*(double*)_a[idx]));
+            break;
+        case QVariant::Bool:
+            args.append(KJS::jsBoolean(*(bool*)_a[idx]));
+            break;
+        case QVariant::String:
+            args.append(KJS::jsString((*reinterpret_cast<QString(*)>(_a[2]))));
+            break;
+        case QVariant::UserType:
+        {
+            KJS::JSObject* returnValue;
+            KJS::JSObject* parent = exec->dynamicInterpreter()->globalObject();
+            QByteArray typeName = param.constData();
+            bool isPtr = typeName.contains("*");
+            if (isPtr)
+                typeName.replace("*", "");
+#ifdef DEBUG_SLOTPROXY
+            qDebug() << "\tQVariant::UserType: typeName=" << typeName << " param=" \
<< param.constData() << " isPtr" << isPtr; +#endif
+            if ( parent->hasProperty( exec, KJS::Identifier(toUString(typeName))) )
+            {
+                QObject* qObj;
+                if (isPtr &&
+                    ((qObj = *reinterpret_cast<QObject**>(_a[idx])) != 0))
+                {
+#ifdef DEBUG_SLOTPROXY
+                    qDebug() << "qObj=" << qObj;
+#endif
+                    Pointer<QObject> pov(*reinterpret_cast<QObject*(*)>(_a[idx]));
+                    returnValue = StaticConstructor::bind(exec, typeName, pov);
+                    if ( returnValue )
+                    {
+                        args.append(returnValue);
+                        break;
+                    }
+                    else
+                    {
+#ifdef DEBUG_SLOTPROXY
+                        qDebug("\t\tNo binding retrieved");
+#endif
+                        returnValue = StaticConstructor::construct( exec, parent, \
toUString(typeName) ); +                        if( returnValue )
+                        {
+                            if(QObjectBinding *objImp = \
KJSEmbed::extractBindingImp<QObjectBinding>(exec, returnValue)) +                     \
{ +#ifdef DEBUG_SLOTPROXY
+                                qDebug() << "\t\t\tFound QObjectBinding";
+#endif
+                                
+                                objImp->setOwnership( \
KJSEmbed::ObjectBinding::JSOwned ); +                                \
objImp->setObject(qObj); +                                if (qObj->parent() != 0)
+                                    \
objImp->setOwnership(KJSEmbed::ObjectBinding::QObjOwned); +                           \
else +                                    \
objImp->setOwnership(KJSEmbed::ObjectBinding::CPPOwned); +                            \
args.append(returnValue); +                                break;
+                            }
+                        }
+                    }
+                }
+            }
+            else
+            {
+#ifdef DEBUG_SLOTPROXY
+                qDebug("\t\tNo binding registered");
+#endif
+            }
+        }
+        case QVariant::StringList:
+        case QVariant::List:
+        case QVariant::Map:
+        default:
+            //qDebug("\t\tconverting to variant");
             QVariant variant(tp, _a[idx]);
             args.append( KJSEmbed::convertToValue(exec,variant) );
+            break;
         }
-        else
-        {
-            qDebug("not supported yet");
-        }
         ++idx;
     }
 
@@ -142,6 +237,9 @@
 
 int SlotProxy::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
 {
+#if defined(DEBUG_SLOTPROXY) && (DEBUG_SLOTPROXY > 1)
+    qDebug("SlotProxy::qt_metacall(_c=%d, _id=%d, _a=%p _a[0]=%p _a[1]=%p", _c, _id, \
_a, _a[0], _a[1]); +#endif
     _id = QObject::qt_metacall(_c, _id, _a);
     if (_id < 0)
             return _id;
--- trunk/KDE/kdelibs/kjsembed/kjsembed/value_binding.cpp #658046:658047
@@ -48,6 +48,18 @@
     return ValueMethods;
 }
 
+ValueBinding::ValueBinding( KJS::ExecState *exec, const char *typeName)
+    : ProxyBinding( exec ),
+      m_name(typeName)
+{
+    StaticBinding::publish( exec, this, ValueFactory::methods() );
+}
+
+ValueBinding::~ValueBinding() 
+{
+    delete m_value;
+}
+
 KJS::UString ValueBinding::toString(KJS::ExecState *exec) const
 {
     Q_UNUSED(exec);
--- trunk/KDE/kdelibs/kjsembed/kjsembed/value_binding.h #658046:658047
@@ -58,13 +58,31 @@
 }
 
 #define KJSO_VALUE_SIMPLE_BINDING_CTOR( NAME, JSNAME, TYPE, BASENAME )        \
+    NAME::NAME(KJS::ExecState *exec, const char* typeName ) \
+      : BASENAME( exec, typeName )                    \
+    { \
+      StaticBinding::publish( exec, this, NAME::methods() ); \
+    } \
     NAME::NAME(KJS::ExecState *exec, const TYPE & value) \
       : BASENAME( exec, #JSNAME , value )                    \
     { \
       StaticBinding::publish( exec, this, NAME::methods() ); \
     }
 
+#define KJSO_VALUE_DERIVED_BINDING_CTOR( NAME, JSNAME, TYPE, BASENAME )  \
+    NAME::NAME(KJS::ExecState *exec, const char* typeName ) \
+      : BASENAME( exec, typeName )                    \
+    { \
+      StaticBinding::publish( exec, this, NAME::methods() ); \
+    } \
+    NAME::NAME(KJS::ExecState *exec, const TYPE & value)                \
+    : BASENAME( exec, #JSNAME )                                         \
+    {                                                                   \
+        setValue(value);                                                \
+        StaticBinding::publish( exec, this, NAME::methods() );          \
+    }
 
+
 namespace KJSEmbed
 {
    /**
@@ -78,7 +96,7 @@
     };
 
    /**
-    * QVariant bindinging implementation.
+    * Value binding implementation.
     */
     class ValueBinding : public ProxyBinding
     {
@@ -91,7 +109,8 @@
                 m_value = new Value<T>(val);
                 StaticBinding::publish( exec, this, ValueFactory::methods() );
             }
-            virtual ~ValueBinding() {delete m_value;}
+            ValueBinding( KJS::ExecState *exec, const char *typeName);
+            virtual ~ValueBinding();
 
             KJS::UString toString(KJS::ExecState *exec) const;
             KJS::UString className() const { return m_name; }
--- trunk/KDE/kdelibs/kjsembed/kjsembed/variant_binding.cpp #658046:658047
@@ -366,12 +366,12 @@
         {
             QMap<QString,QVariant> map = value.toMap();
             QMap<QString,QVariant>::Iterator idx = map.begin();
-            KJS::JSObject *array = \
exec->lexicalInterpreter()->builtinArray()->construct( exec, KJS::List() ); +         \
KJS::JSObject *obj = exec->lexicalInterpreter()->builtinObject()->construct( exec, \
KJS::List() );  for ( ; idx != map.end(); ++idx )
             {
-                array->put(exec, KJS::Identifier( toUString(idx.key()) ), \
convertToValue( exec,  idx.value() ) ); +                obj->put(exec, \
KJS::Identifier( toUString(idx.key()) ), convertToValue( exec,  idx.value() ) );  }
-            returnValue =  array;
+            returnValue =  obj;
             break;
         }
         case QVariant::Date:
--- trunk/KDE/kdelibs/kjsembed/kjsembed/variant_binding.h #658046:658047
@@ -60,7 +60,12 @@
         return result; \
 }
 
-#define KJSO_VARIANT_SIMPLE_BINDING_CTOR( NAME, JSNAME, TYPE, BASENAME )        \
+#define KJSO_VARIANT_SIMPLE_BINDING_CTOR( NAME, JSNAME, TYPE, BASENAME ) \
+    NAME::NAME(KJS::ExecState *exec, const char* typeName ) \
+      : BASENAME( exec, typeName )                    \
+    { \
+      StaticBinding::publish( exec, this, NAME::methods() ); \
+    } \
     NAME::NAME(KJS::ExecState *exec, const TYPE & value) \
       : BASENAME( exec, QVariant::fromValue(value))							 \
     { \


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

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