diff generator/cppimplgenerator.cpp @ 252:37eed70de029

More things broken than fixed. Rolling back to 263
author maxter
date Sat, 22 Aug 2009 12:50:58 +0000
parents 7664de4a55e5
children 073b9153ed8a
line wrap: on
line diff
--- a/generator/cppimplgenerator.cpp	Thu Aug 20 19:08:32 2009 +0000
+++ b/generator/cppimplgenerator.cpp	Sat Aug 22 12:50:58 2009 +0000
@@ -465,6 +465,26 @@
     return !java_class->isQObject() && !java_class->typeEntry()->isValue();
 }
 
+void writeQtdEntityFunction(QTextStream &s, const AbstractMetaClass *java_class)
+{
+//    if (!(java_class->typeEntry()->isObject() || java_class->typeEntry()->isQObject()))
+//        return;
+    if (!java_class->hasVirtualFunctions())
+        return;
+
+    s << "extern \"C\" DLL_PUBLIC void *__" << java_class->name() << "_entity(void *q_ptr)" << endl;
+    s << "{" << endl;
+    {
+        Indentation indent(INDENT);
+            s << INDENT << "Qtd_QObjectEntity* a = dynamic_cast<Qtd_QObjectEntity*>((" << java_class->qualifiedCppName() << "*)q_ptr);" << endl
+              << INDENT << "if (a != NULL)" << endl
+              << INDENT << "    return a->d_entity();" << endl
+              << INDENT << "else" << endl
+              << INDENT << "    return NULL;" << endl;
+    }
+    s << "}" << endl << endl;
+}
+
 void CppImplGenerator::writeInterfaceCasts(QTextStream &s, const AbstractMetaClass *java_class)
 {
         // pointers to native interface objects for classes that implement interfaces
@@ -512,6 +532,11 @@
         s << "    emit_callbacks_" << java_class->name() << "[" << i << "] = (EmitCallback)"
              "sigs[" << i << "];" << endl;
 
+    if (java_class->isQObject())
+        s << "    qtd_D_" << java_class->name() << "_delete = "
+             "(qtd_pf_D_" << java_class->name() << "_delete)qobj_del;" << endl;
+
+
     s << "}" << endl;
 }
 
@@ -583,8 +608,7 @@
     writeDefaultConstructedValues(s, java_class);
 
     if (hasCustomDestructor(java_class)) */
-    if (!java_class->isQObject())
-        writeFinalDestructor(s, java_class);
+    writeFinalDestructor(s, java_class);
 
     if (java_class->isQObject())
         writeSignalsHandling(s, java_class);
@@ -596,8 +620,7 @@
         }
         writeShellDestructor(s, java_class);
 
-        if (!java_class->isQObject() && java_class->hasVirtualFunctions())
-            writeQtdEntityFunction(s, java_class);
+        writeQtdEntityFunction(s, java_class);
 
         if (java_class->isQObject())
             writeQObjectFunctions(s, java_class);
@@ -700,14 +723,6 @@
 */
 // qtd    writeJavaLangObjectOverrideFunctions(s, java_class);
 
-    if (java_class->isQObject())
-    {
-        s << endl << endl
-          << "extern \"C\" DLL_PUBLIC void* qtd_" << java_class->name() << "_staticMetaObject() {" << endl
-          << "    return (void*)&" << java_class->name() << "::staticMetaObject;" << endl
-          << "}" << endl;
-    }
-
     s << endl << endl;
 
     priGenerator->addSource(java_class->package(), fileNameForClass(java_class));
@@ -823,7 +838,7 @@
                 }
 
                 s << function->marshalledName() << "_dispatch("
-                  << "this->dId";
+                  << "this->d_entity()";
 
                 if (f_type) {
                     if (f_type->isTargetLangString())
@@ -846,7 +861,7 @@
                     if (f_type->name() == "QModelIndex") {
                         s << INDENT << "QModelIndex __qt_return_value = qtd_to_QModelIndex( __d_return_value );" << endl;
 #ifdef Q_OS_WIN32
-s << "qtd_dummy();" << endl; // hack!!!
+s << "__qtd_dummy();" << endl; // hack!!!
 #endif
                         s << INDENT << "return __qt_return_value;" << endl;
                     } else if (f_type->typeEntry()->isStructInD())
@@ -1242,16 +1257,21 @@
       << "  return " << java_class->qualifiedCppName() << "::qt_metacast(_clname);" << endl
       << "}" << endl << endl;
 */
-    
+
+//    writeSignalsHandling(s, java_class);
+/*
+    // QObject_Link::qt_metacall()
     s << "int " << shellClassName(java_class) << "::qt_metacall(QMetaObject::Call _c, int _id, void **_a)" << endl
       << "{" << endl;
 
     s << "    _id = " << java_class->qualifiedCppName() << "::qt_metacall(_c, _id, _a);" << endl
       << "    if (_id < 0 || _c != QMetaObject::InvokeMetaMethod)" << endl
       << "        return _id;" << endl
-      << "    emit_callbacks_" << java_class->name() << "[_id](this->dId, _a);" << endl
+//      << "    Q_ASSERT(_id < 2);" << endl
+      << "    emit_callbacks_" << java_class->name() << "[_id](this->d_entity(), _a);" << endl
       << "    return -1;" << endl
       << "}" << endl << endl;
+*/
 }
 
 void CppImplGenerator::writeSignalHandler(QTextStream &s, const AbstractMetaClass *d_class, AbstractMetaFunction *function)
@@ -1296,6 +1316,65 @@
 
 }
 
+void CppImplGenerator::writeQObjectLink(QTextStream &s, const AbstractMetaClass *java_class)
+{
+    QString linkName = java_class->name() + "_Link";
+    QString className = java_class->name();
+
+    if (cpp_shared)
+        s << "extern \"C\" typedef void (*qtd_pf_D_" << java_class->name() << "_delete)(void *d_ptr);" << endl
+          << "qtd_pf_D_" << java_class->name() << "_delete qtd_D_" << java_class->name() << "_delete;" << endl << endl;
+    else
+        s << "extern \"C\" void qtd_D_" << java_class->name() << "_delete(void *d_ptr);" << endl << endl;
+
+    s << "class " << linkName << " : public QObject, public QObjectUserData" << endl
+      << "{" << endl
+      << "public:" << endl
+      << "    Q_OBJECT_CHECK" << endl
+      << "    virtual int qt_metacall(QMetaObject::Call, int, void **);" << endl << endl
+
+      << "    " << linkName << "(QObject *parent, void *d_ptr) : QObject() { _d_ptr = d_ptr; }" << endl
+      << "    ~" << linkName << "() { qtd_D_" << className << "_delete(_d_ptr); }" << endl
+      << "    void *d_entity() const { return _d_ptr; }" << endl << endl
+
+      << "private:" << endl
+      << "    void *_d_ptr;" << endl
+      << "};" << endl << endl;
+
+    // QObject_Link::qt_metacall()
+    s << "int " << linkName << "::qt_metacall(QMetaObject::Call _c, int _id, void **_a)" << endl
+      << "{" << endl
+      << "    _id = QObject::qt_metacall(_c, _id, _a);" << endl
+      << "    if (_id < 0 || _c != QMetaObject::InvokeMetaMethod)" << endl
+      << "        return _id;" << endl
+//      << "    Q_ASSERT(_id < 2);" << endl
+      << "    emit_callbacks_" << java_class->name() << "[_id](this->d_entity(), _a);" << endl
+      << "    return -1;" << endl
+      << "}" << endl << endl;
+
+    s << QString("inline %1_Link *get_%1_link(%1 *obj)").arg(className) << endl
+      << "{" << endl
+      << "    return static_cast<" << linkName << "*>(obj->userData(USER_DATA_ID));" << endl
+      << "}" << endl << endl;
+
+    s << QString("extern \"C\" DLL_PUBLIC void* qtd_%1_d_pointer(%1 *obj)").arg(className) << endl
+      << "{" << endl
+      << "    if (obj->userData(USER_DATA_ID)) {" << endl
+      << "        " << QString("%1_Link *qobj_helper = get_%1_link(obj);").arg(className) << endl
+      << "        return qobj_helper->d_entity();" << endl
+      << "    } else" << endl
+      << "        return NULL;" << endl
+      << "}" << endl << endl;
+
+    s << QString("extern \"C\" DLL_PUBLIC void qtd_%1_create_link(%1 *obj, void* d_obj)").arg(className) << endl
+      << "{" << endl
+      << "    if(obj->userData(USER_DATA_ID))" << endl
+      << "        return;" << endl
+      << "    " << QString("%1 *qobj_link = new %1(obj, d_obj);").arg(linkName) << endl
+      << "    obj->setUserData(USER_DATA_ID, qobj_link);" << endl
+      << "}" << endl << endl;
+}
+
 void CppImplGenerator::writeSignalsHandling(QTextStream &s, const AbstractMetaClass *java_class)
 {
     s << "extern \"C\" typedef void (*EmitCallback)(void*, void**);" << endl;
@@ -1327,6 +1406,8 @@
         s << endl << "};" << endl << endl;
     }
 
+    writeQObjectLink(s, java_class);
+
     // Functions connecting/disconnecting shell's slots
     for(int i = 0; i < signal_funcs.size(); i++) {
         AbstractMetaFunction *signal = signal_funcs.at(i);
@@ -1336,16 +1417,18 @@
           << "(void* native_id)" << endl << "{" << endl
           << "    " << shellClassName(java_class) << " *qobj = (" << shellClassName(java_class) << "*) native_id;" << endl
           << "    const QMetaObject &mo = " << java_class->name() << "::staticMetaObject;" << endl
+          << "    const QMetaObject &mo2 = " << java_class->name() << "_Link::staticMetaObject;" << endl
           << "    int signalId = mo.indexOfSignal(\"" << signal->minimalSignature() << "\");" << endl
-          << "    mo.connect(qobj, signalId, qobj, mo.methodCount() + " << i << ");" << endl
+          << "    mo.connect(qobj, signalId, get_" << java_class->name() << "_link(qobj), mo2.methodCount() + " << i << ");" << endl
           << "}" << endl;
 
         s << "extern \"C\" DLL_PUBLIC void " << sigExternName << "_disconnect"
           << "(void* native_id)" << endl << "{" << endl
           << "    " << shellClassName(java_class) << " *qobj = (" << shellClassName(java_class) << "*) native_id;" << endl
           << "    const QMetaObject &mo = " << shellClassName(java_class) << "::staticMetaObject;" << endl
+          << "    const QMetaObject &mo2 = " << java_class->name() << "_Link::staticMetaObject;" << endl
           << "    int signalId = mo.indexOfSignal(\"" << signal->minimalSignature() << "\");" << endl
-          << "    mo.disconnect(qobj, signalId, qobj, mo.methodCount() + " << i << ");" << endl
+          << "    mo.disconnect(qobj, signalId, get_" << java_class->name() << "_link(qobj), mo2.methodCount() + " << i << ");" << endl
           << "}" << endl << endl;
     }
 }
@@ -1369,10 +1452,8 @@
             s << ", ";
     }
     s << ")";
-    if (cls->isQObject())
-        s << "," << endl << "      QtD_QObjectEntity(this, d_ptr)";
-    else if (cls->hasVirtualFunctions())
-        s << "," << endl << "      QtD_Entity(d_ptr)";
+    if (cls->hasVirtualFunctions())
+        s << "," << endl << "      Qtd_QObjectEntity(d_ptr)";
 /* qtd        s << "    m_meta_object(0)," << endl;
     s << "      m_vtable(0)," << endl
       << "      m_link(0)" << endl;
@@ -1381,7 +1462,6 @@
     s << "{" << endl;
     {
         Indentation indent(INDENT);
-
         writeCodeInjections(s, java_function, cls, CodeSnip::Beginning, TypeSystem::ShellCode);
         writeCodeInjections(s, java_function, cls, CodeSnip::End, TypeSystem::ShellCode);
     }
@@ -1394,8 +1474,35 @@
       << shellClassName(java_class) << "()" << endl
       << "{" << endl;
     {
-        if (java_class->isQObject())
-            s << "    setUserData(userDataId, NULL);";
+/* qtd
+        Indentation indent(INDENT);
+
+        s << "#ifdef QT_DEBUG" << endl
+          << INDENT << "if (m_vtable)" << endl
+          << INDENT << "    m_vtable->deref();" << endl
+          << "#endif" << endl
+          << INDENT << "if (m_link) {" << endl;
+
+        AbstractMetaClassList interfaces = java_class->interfaces();
+        if (interfaces.size() + (java_class->baseClass() != 0 ? 1 : 0) > 1) {
+            if (java_class->baseClass() != 0)
+                interfaces += java_class->baseClass();
+            foreach (AbstractMetaClass *iface, interfaces) {
+                AbstractMetaClass *impl = iface->isInterface() ? iface->primaryInterfaceImplementor() : iface;
+                s << INDENT << "    m_link->unregisterSubObject((" << impl->qualifiedCppName() << " *) this);" << endl;
+            }
+        }
+
+        if (!java_class->isQObject()) {
+            s << INDENT << "    JNIEnv *__jni_env = qtjambi_current_environment();" << endl
+              << INDENT << "    if (__jni_env != 0) m_link->nativeShellObjectDestroyed(__jni_env);" << endl;
+        }
+
+#if defined(QTJAMBI_DEBUG_TOOLS)
+        s << INDENT << "    qtjambi_increase_shellDestructorCalledCount(QString::fromLatin1(\"" << java_class->name() << "\"));" << endl;
+#endif
+
+         s << INDENT << "}" << endl; */
     }
     s << "}" << endl << endl;
 }
@@ -1711,20 +1818,6 @@
     s << "}" << endl << endl;
 }
 
-void CppImplGenerator::writeQtdEntityFunction(QTextStream &s, const AbstractMetaClass *java_class)
-{
-    s << "extern \"C\" DLL_PUBLIC void *__" << java_class->name() << "_entity(void *q_ptr)" << endl;
-    s << "{" << endl;
-    {
-        Indentation indent(INDENT);
-            s << INDENT << "QtD_Entity* a = dynamic_cast<QtD_Entity*>((" << java_class->qualifiedCppName() << "*)q_ptr);" << endl
-              << INDENT << "if (a != NULL)" << endl
-              << INDENT << "    return a->dId;" << endl
-              << INDENT << "else" << endl
-              << INDENT << "    return NULL;" << endl;
-    }
-    s << "}" << endl << endl;
-}
 
 void CppImplGenerator::writeVirtualFunctionOverride(QTextStream &s,
                                                     const AbstractMetaFunction *java_function,
@@ -2063,11 +2156,8 @@
                 function_prefix = "__override_";
                 extra_param.append("__do_static_call");
                 s << INDENT
-                  << "bool __do_static_call = __this_nativeId ? ";
-                if (java_class->isQObject())
-                    s << "QtD_QObjectEntity::getQObjectEntity((QObject*)__this_nativeId) : false;" << endl;
-                else
-                    s << "__" << java_class->name() << "_entity(__this_nativeId) : false;" << endl;
+                  << "bool __do_static_call = __this_nativeId ? "
+                  << "__" << java_class->name() << "_entity(__this_nativeId) : false;" << endl;
             } else {
                 option = OriginalName;
             }
@@ -2124,7 +2214,7 @@
         AbstractMetaType *d_type = argument->type();
         const TypeEntry *te = d_type->typeEntry();
         if ((te && d_type->isNativePointer() && te->name() == "QString"))
-            s << QString("    qtd_toUtf8(__qt_%1.utf16(), __qt_%1.size(), &%1);").arg(argument->indexedName()) << endl;
+            s << QString("    _d_toUtf8(__qt_%1.utf16(), __qt_%1.size(), &%1);").arg(argument->indexedName()) << endl;
     }
 }
 
@@ -2276,7 +2366,25 @@
         s << INDENT << "extern \"C\" DLL_PUBLIC void qtd_" << cls->name() << "_destructor(void *ptr)" << endl
           << INDENT << "{" << endl;
         {
+            Indentation indent(INDENT);
+/* qtd
+            if (!cls->isQObject() && !cls->generateShellClass()) {
+                s << INDENT << "QtJambiLink *link = QtJambiLink::findLinkForUserObject(ptr);" << endl
+                  << INDENT << "if (link) link->resetObject(qtjambi_current_environment());" << endl;
+            }
+
+            // Code injectsions...
+            foreach (const CodeSnip &snip, cls->typeEntry()->codeSnips()) {
+                if (snip.language == TypeSystem::DestructorFunction) {
+                    s << snip.code();
+                }
+            }
+*/
             s << INDENT << "delete (" << shellClassName(cls) << " *)ptr;" << endl;
+
+#if defined(QTJAMBI_DEBUG_TOOLS)
+            s << INDENT << "qtjambi_increase_destructorFunctionCalledCount(QString::fromLatin1(\"" << cls->name() << "\"));" << endl;
+#endif
         }
 
         s << INDENT << "}" << endl << endl;
@@ -2972,13 +3080,13 @@
         if(java_type->typeEntry()->qualifiedCppName() == "QStringRef") {
             s << INDENT << "const QString *str_ref = " << qt_name << ".string();" << endl
               << INDENT << "if(str_ref)" << endl
-              << INDENT << "    qtd_toUtf8(str_ref->utf16(), str_ref->size(), " << java_name << ");" << endl
+              << INDENT << "    _d_toUtf8(str_ref->utf16(), str_ref->size(), " << java_name << ");" << endl
               << INDENT << "else {" << endl
               << INDENT << "    QString empty_str;" << endl
-              << INDENT << "    qtd_toUtf8(empty_str.utf16(), empty_str.size(), " << java_name << ");" << endl
+              << INDENT << "    _d_toUtf8(empty_str.utf16(), empty_str.size(), " << java_name << ");" << endl
               << INDENT << "}" << endl;
         } else {
-            s << INDENT << QString("qtd_toUtf8(%1.utf16(), %1.size(), %2);").arg(qt_name, java_name) << endl;
+            s << INDENT << QString("_d_toUtf8(%1.utf16(), %1.size(), %2);").arg(qt_name, java_name) << endl;
         }
     } else if (java_type->isTargetLangChar()) {
         s << INDENT << "jchar " << java_name << " = " << qt_name << ".unicode();" << endl;