# HG changeset patch
# User eldar_ins@eldar-laptop
# Date 1260615715 -18000
# Node ID 98b211f3ee34430dd12945c8f2e8dd50828821b2
# Parent 55ee4603365d67a0a1e2561b87dcbef66ab7a691
fix for #19
diff -r 55ee4603365d -r 98b211f3ee34 generator/cppheadergenerator.cpp
--- a/generator/cppheadergenerator.cpp Sat Dec 12 03:22:54 2009 +0500
+++ b/generator/cppheadergenerator.cpp Sat Dec 12 16:01:55 2009 +0500
@@ -198,6 +198,7 @@
// << " QT_TR_FUNCTIONS" << end
<< " virtual int qt_metacall(QMetaObject::Call, int, void **);" << endl
<< " int __override_qt_metacall(QMetaObject::Call _c, int _id, void **_a);" << endl
+ << " virtual const QMetaObject *metaObject() const;" << endl
<< "private:" << endl;
}
diff -r 55ee4603365d -r 98b211f3ee34 generator/cppimplgenerator.cpp
--- a/generator/cppimplgenerator.cpp Sat Dec 12 03:22:54 2009 +0500
+++ b/generator/cppimplgenerator.cpp Sat Dec 12 16:01:55 2009 +0500
@@ -506,8 +506,10 @@
}
}
// D-side signal callbacks
- if (java_class->isQObject())
- s << " qtd_" << java_class->name() << "_qt_metacall_dispatch = (QtMetacallCallback)sigs[0];" << endl;
+ if (java_class->isQObject()) {
+ s << " qtd_" << java_class->name() << "_qt_metacall_dispatch = (QtMetacallCallback)sigs[0];" << endl
+ << " qtd_" << java_class->name() << "_metaObject_dispatch = (MetaObjectCallback)sigs[1];" << endl;
+ }
s << "}" << endl;
}
@@ -1350,11 +1352,18 @@
*/
if(cpp_shared)
- s << "QtMetacallCallback qtd_" << java_class->name() << "_qt_metacall_dispatch;" << endl;
+ s << "MetaObjectCallback qtd_" << java_class->name() << "_metaObject_dispatch;" << endl
+ << "QtMetacallCallback qtd_" << java_class->name() << "_qt_metacall_dispatch;" << endl;
else
- s << "extern \"C\" int qtd_" << java_class->name() << "_qt_metacall_dispatch(void *d_entity, QMetaObject::Call _c, int _id, void **_a);" << endl << endl;
-
- s << "int " << shellClassName(java_class) << "::qt_metacall(QMetaObject::Call _c, int _id, void **_a)" << endl
+ s << "extern \"C\" const QMetaObject* qtd_" << java_class->name() << "_metaObject_dispatch(void *d_entity);" << endl
+ << "extern \"C\" int qtd_" << java_class->name() << "_qt_metacall_dispatch(void *d_entity, QMetaObject::Call _c, int _id, void **_a);" << endl;
+
+ s << endl
+ << "const QMetaObject * " << shellClassName(java_class) << "::metaObject() const" << endl
+ << "{" << endl
+ << " return qtd_" << java_class->name() << "_metaObject_dispatch(this->dId);" << endl
+ << "}" << endl << endl
+ << "int " << shellClassName(java_class) << "::qt_metacall(QMetaObject::Call _c, int _id, void **_a)" << endl
<< "{" << endl
<< " return qtd_" << java_class->name() << "_qt_metacall_dispatch(this->dId, _c, _id, _a);" << endl
<< "}" << endl << endl
diff -r 55ee4603365d -r 98b211f3ee34 generator/dgenerator.cpp
--- a/generator/dgenerator.cpp Sat Dec 12 03:22:54 2009 +0500
+++ b/generator/dgenerator.cpp Sat Dec 12 16:01:55 2009 +0500
@@ -2573,9 +2573,10 @@
initArgs = "virt_arr.ptr";
if (d_class->isQObject()) {
- // qt_metacalls
- s << endl << INDENT << "void*[1] sign_arr;" << endl;
+ // qt_metacall, metaObject
+ s << endl << INDENT << "void*[2] sign_arr;" << endl;
s << INDENT << "sign_arr[0] = &qtd_" << d_class->name() << "_qt_metacall_dispatch;" << endl;
+ s << INDENT << "sign_arr[1] = &qtd_" << d_class->name() << "_metaObject_dispatch;" << endl;
initArgs += ", sign_arr.ptr";
}
@@ -2682,8 +2683,13 @@
<< "private extern(C) int qtd_" << d_class->name() << "_qt_metacall_dispatch(void *d_entity, QMetaObject.Call _c, int _id, void **_a) {"
<< " auto d_object = cast(" << d_class->name() << ") d_entity;"
<< " return d_object.qt_metacall(_c, _id, _a);"
+ << "}" << endl << endl
+
+ << "private extern(C) void* qtd_" << d_class->name() << "_metaObject_dispatch(void *d_entity) {"
+ << " auto d_object = cast(" << d_class->name() << ") d_entity;"
+ << " return d_object.metaObject().nativeId();"
<< "}" << endl << endl;
-}
+ }
void writeMetaMethodSignatures(QTextStream &s, const QString &var_name, AbstractMetaFunctionList meta_funcs)
{
diff -r 55ee4603365d -r 98b211f3ee34 generator/typesystem_core.xml
--- a/generator/typesystem_core.xml Sat Dec 12 03:22:54 2009 +0500
+++ b/generator/typesystem_core.xml Sat Dec 12 16:01:55 2009 +0500
@@ -559,7 +559,6 @@
-
diff -r 55ee4603365d -r 98b211f3ee34 include/qtd_core.h
--- a/include/qtd_core.h Sat Dec 12 03:22:54 2009 +0500
+++ b/include/qtd_core.h Sat Dec 12 16:01:55 2009 +0500
@@ -83,6 +83,7 @@
extern "C" typedef void (*EmitCallback)(void*, void**);
extern "C" typedef int (*QtMetacallCallback)(void *d_entity, QMetaObject::Call _c, int _id, void **_a);
+extern "C" typedef const QMetaObject* (*MetaObjectCallback)(void *d_entity);
template
void call_destructor(T *a)
diff -r 55ee4603365d -r 98b211f3ee34 qt/qtd/MetaMarshall.d
--- a/qt/qtd/MetaMarshall.d Sat Dec 12 03:22:54 2009 +0500
+++ b/qt/qtd/MetaMarshall.d Sat Dec 12 16:01:55 2009 +0500
@@ -58,7 +58,7 @@
// converts an argumnent from C++ to D in qt_metacall
string metaCallArgument(T)(string ptr)
{
- static if (isQObjectType!T)
+ static if (isQObjectType!T || isObjectType!T)
return T.stringof ~ ".__getObject(*cast(void**)(" ~ ptr ~ "))";
else static if (isNativeType!T)
return "*(cast(" ~ T.stringof ~ "*)" ~ ptr ~ ")";
@@ -72,7 +72,7 @@
// converts a D argument type to C++ for registering in Qt meta system
string qtDeclArg(T)()
{
- static if (isQObjectType!T)
+ static if (isQObjectType!T || isObjectType!T)
return T.stringof ~ "*";
else static if (isStringType!T)
return "QString";
@@ -85,7 +85,7 @@
// converts an argument from D to C++ in a signal emitter
string convertSignalArgument(T)(string arg)
{
- static if (isQObjectType!T)
+ static if (isQObjectType!T || isObjectType!T)
return arg ~ ".__nativeId";
else static if (isStringType!T)
return "_qt" ~ arg;