[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