diff generator/containergenerator.cpp @ 357:9784459f0750

An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables Q_CLASSINFO implementation Now Qtd can be built on Windows
author Max Samukha <maxter@spambox.com>
date Wed, 02 Jun 2010 19:38:05 +0300
parents 08c1ca7975ab
children a032df77b6ab
line wrap: on
line diff
--- a/generator/containergenerator.cpp	Tue May 25 20:14:04 2010 +0300
+++ b/generator/containergenerator.cpp	Wed Jun 02 19:38:05 2010 +0300
@@ -220,50 +220,29 @@
       << "#include \"qtd_core.h\"" << endl
       << "#include \"ArrayOps_" << package << ".h\"" << endl
       << "#include \"ArrayOps_qt_core.h\"" << endl
-      << "#include \"ArrayOpsPrimitive.h\"" << endl << endl
-      << "#ifdef CPP_SHARED" << endl << endl;
-
+      << "#include \"ArrayOpsPrimitive.h\"" << endl << endl;
 
     foreach (const TypeEntry *te, containerTypes) {
         if (te->javaPackage() == cls->package()) {
             const ComplexTypeEntry *centry = static_cast<const ComplexTypeEntry *>(te);
             QString cls_name = centry->name();
 
+            QString module = packageToQtModule(cls->package());
             setFuncNames(cls_name);
-            s << "QTD_EXPORT_VAR(" << all_name << ")" << endl
-              << "QTD_EXPORT_VAR(" << ass_name << ")" << endl
-              << "QTD_EXPORT_VAR(" << get_name << ")" << endl << endl;
+            s << "QTD_EXPORT(" << module << ", " << all_name << ")" << endl
+              << "QTD_EXPORT(" << module << ", " << ass_name << ")" << endl
+              << "QTD_EXPORT(" << module << ", " << get_name << ")" << endl << endl;
         }
     }
 
-    s << endl
-      << "extern \"C\" DLL_PUBLIC void qtd_" << cls->package().replace(".", "_") << "_ArrayOps_initCallBacks(pfunc_abstr *callbacks)" << endl
-      << "{" << endl;
-
-    int num_funcs = 0;
-    foreach (const TypeEntry *te, containerTypes) {
-        if (te->javaPackage() == cls->package()) {
-            const ComplexTypeEntry *centry = static_cast<const ComplexTypeEntry *>(te);
-            QString cls_name = centry->name();
-
-            setFuncNames(cls_name);
-            s << "    QTD_EXPORT_VAR_SET(" << all_name << ", callbacks[" << num_funcs + 0 << "]);" << endl
-              << "    QTD_EXPORT_VAR_SET(" << ass_name << ", callbacks[" << num_funcs + 1 << "]);" << endl
-              << "    QTD_EXPORT_VAR_SET(" << get_name << ", callbacks[" << num_funcs + 2 << "]);" << endl << endl;
-
-            num_funcs += NUM_ARRAY_FUNCS;
-        }
-    }
-    s << "}" << endl
-      << "#endif" << endl;
-/*
+    /*
     QMap<const TypeEntry*, AbstractMetaType*> typeList = signalEntries[cls->package()];
 
     QMapIterator<const TypeEntry*, AbstractMetaType*> i(typeList);
     while (i.hasNext()) {
         i.next();
         s << "// " << i.key()->targetLangName() << endl
-          << "extern \"C\" DLL_PUBLIC void qtd_" << package << "_" << i.key()->targetLangName() << "_to_d_array(void *cpp_ptr, DArray* __d_container) {" << endl;
+          << "QTD_EXTERN QTD_DLL_PUBLIC void qtd_" << package << "_" << i.key()->targetLangName() << "_to_d_array(void *cpp_ptr, DArray* __d_container) {" << endl;
 
         AbstractMetaType *arg_type = i.value();
         m_cpp_impl_generator->writeTypeInfo(s, arg_type, NoOption);
@@ -280,7 +259,7 @@
     foreach(AbstractMetaType* arg_type, signalEntries[cls->package()]) {
         const TypeEntry *te = arg_type->instantiations().first()->typeEntry();
         s << "// " << te->targetLangName() << endl
-          << "extern \"C\" DLL_PUBLIC void " << cppContainerConversionName(cls, arg_type, FromCpp) << "(void *cpp_ptr, DArray* __d_container) {" << endl;
+          << "QTD_EXTERN QTD_DLL_PUBLIC void " << cppContainerConversionName(cls, arg_type, FromCpp) << "(void *cpp_ptr, DArray* __d_container) {" << endl;
 
         m_cpp_impl_generator->writeTypeInfo(s, arg_type, NoOption);
         s << "container = (*reinterpret_cast< ";
@@ -316,9 +295,9 @@
 
 void ContainerGenerator::setFuncNames(const QString& cls_name)
 {
-    all_name = QString("qtd_allocate_%1_array").arg(cls_name);
-    ass_name = QString("qtd_assign_%1_array_element").arg(cls_name);
-    get_name = QString("qtd_get_%1_from_array").arg(cls_name);
+    all_name = QString("allocate_%1_array").arg(cls_name);
+    ass_name = QString("assign_%1_array_element").arg(cls_name);
+    get_name = QString("get_%1_from_array").arg(cls_name);
 }
 
 void ContainerGenerator::writeHeaderArrayFunctions(QTextStream &s, const ComplexTypeEntry *centry)
@@ -337,17 +316,14 @@
 
     setFuncNames(cls_name);
 
-    s << "QTD_EXPORT(void, " << all_name << ", (void* arr, size_t len))" << endl
-      << "QTD_EXPORT(void, " << ass_name << ", (void* arr, size_t pos, " << cpp_type << " elem))" << endl
-      << "QTD_EXPORT(void, " << get_name << ", (void* arr, size_t pos, " << cpp_type << " elem))" << endl;
+    QString module = packageToQtModule(centry->javaPackage());
 
-    s << "#ifdef CPP_SHARED" << endl
-      << "#define " << all_name << " qtd_get_" << all_name << "()" << endl
-      << "#define " << ass_name << " qtd_get_" << ass_name << "()" << endl
-      << "#define " << get_name << " qtd_get_" << get_name << "()" << endl
-      << "#endif" << endl;
+    s << "QTD_EXPORT_DECL(" << module << ", void, " << all_name << ", (void* arr, size_t len))" << endl
+      << "QTD_EXPORT_DECL(" << module << ", void, " << ass_name << ", (void* arr, size_t pos, " << cpp_type << " elem))" << endl
+      << "QTD_EXPORT_DECL(" << module << ", void, " << get_name << ", (void* arr, size_t pos, " << cpp_type << " elem))" << endl;
 
     s << endl;
+
 }
 
 void ContainerGenerator::writeDContent(QTextStream &s, AbstractMetaClass *cls)
@@ -371,33 +347,6 @@
     }
     if (num_funcs == 0)
         return;
-
-    s << "version (cpp_shared) {" << endl
-      << "    private extern (C) void qtd_" << cls->package().replace(".", "_") << "_ArrayOps_initCallBacks(void* callbacks);" << endl << endl
-      << "    static this() {" << endl
-      << "        void*[" << num_funcs << "] callbacks; " << endl << endl;
-
-    num_funcs = 0;
-    foreach (const TypeEntry *te, containerTypes) {
-        if (te->javaPackage() == cls->package()) {
-            const ComplexTypeEntry *centry = static_cast<const ComplexTypeEntry *>(te);
-
-            QString cls_name = centry->name();
-            setFuncNames(cls_name);
-
-            s << "        callbacks[" << num_funcs + 0 << "] = &" << all_name << ";" << endl
-              << "        callbacks[" << num_funcs + 1 << "] = &" << ass_name << ";" << endl
-              << "        callbacks[" << num_funcs + 2 << "] = &" << get_name << ";" << endl;
-
-            s << endl;
-            num_funcs += NUM_ARRAY_FUNCS;
-        }
-    }
-    s << "        qtd_" << cls->package().replace(".", "_") << "_ArrayOps_initCallBacks(callbacks.ptr);" << endl
-      << "    }" << endl
-      << "}" << endl;
-
-
 }
 
 void ContainerGenerator::writeDContent2(QTextStream &s, AbstractMetaClass *cls)
@@ -422,6 +371,8 @@
       << "****************************************************************************/" << endl << endl;
 }
 
+
+// TODO: rewrite
 void ContainerGenerator::writeArrayFunctions(QTextStream &s, const ComplexTypeEntry *centry)
 {
     QString cls_name = centry->name();
@@ -457,22 +408,16 @@
         nativeId = ".__ptr_" + type_name;
     }
 
-    s << "private extern(C) void qtd_allocate_" << cls_name << "_array(" << type_name << "[]* arr, size_t len)" << endl
-      << "{" << endl
-      << INDENT << "*arr = new " << type_name << "[len];" << endl
-      << "}" << endl << endl;
+    DGenerator::writeDExport(s, "void", QString("allocate_%1_array").arg(cls_name), QString("%1[]* arr, size_t len").arg(type_name),
+        QString(" *arr = new %1[len]; ").arg(type_name));
 
-    s << "private extern(C) void qtd_assign_" << cls_name << "_array_element(" << type_name << "[]* arr, size_t pos, " << cpp_type << " elem)" << endl
-      << "{" << endl
-      << INDENT << "(*arr)[pos] = " << convert << ";" << endl
-      << "}" << endl << endl
+    DGenerator::writeDExport(s, "void", QString("assign_%1_array_element").arg(cls_name), QString("%1[]* arr, size_t pos, %2 elem").arg(type_name, cpp_type),
+        QString(" (*arr)[pos] = %1; ").arg(convert));
 
-      << "private extern(C) void qtd_get_" << cls_name << "_from_array(" << type_name << "* arr, size_t pos, " << cpp_assign_type << " elem)" << endl
-      << "{" << endl
-      << INDENT << "*elem = arr[pos]" << nativeId << ";" << endl
-      << "}" << endl << endl
+    DGenerator::writeDExport(s, "void", QString("get_%1_from_array").arg(cls_name), QString("%1* arr, size_t pos, %2 elem").arg(type_name, cpp_assign_type),
+        QString(" *elem = arr[pos]%1; ").arg(nativeId));
 
-      << "package " << d_type << " qtd_" << cls_name << "_cpp_to_d(" << cpp_type << " ret)" << endl
+    s << "package " << d_type << " qtd_" << cls_name << "_cpp_to_d(" << cpp_type << " ret)" << endl
       << "{" << endl;
 
     marshalFromCppToD(s, centry);