diff generator/dgenerator.cpp @ 259:515d6e1c7b10 lifetime

another iteration
author maxter
date Thu, 17 Sep 2009 16:28:41 +0000
parents 17b5e13364b7
children b5773ccab07d
line wrap: on
line diff
--- a/generator/dgenerator.cpp	Wed Sep 16 14:16:33 2009 +0000
+++ b/generator/dgenerator.cpp	Thu Sep 17 16:28:41 2009 +0000
@@ -899,9 +899,7 @@
             s << return_type->name() << ".__wrap(ret);" << endl;
         
 
-        if (return_type->isValue() && !return_type->typeEntry()->isStructInD()
-            || return_type->isNativePointer() && return_type->typeEntry()->isValue()
-            || return_type->name() == "QVariant")
+        if (return_type->isValue() && !return_type->typeEntry()->isStructInD())
             s << "new " << return_type->name() << "(ret);" << endl;
         
         if (return_type->isObject()) {
@@ -1790,7 +1788,7 @@
     auxFile.isDone = true;
     auxFile.stream << "module " << auxModName << ";" << endl << endl;
 
-    bool staticInit = (d_class->typeEntry()->isObject() && d_class->hasVirtualFunctions()) || (cpp_shared && d_class->generateShellClass() && !d_class->isInterface());
+    bool staticInit = (d_class->typeEntry()->isObject() && d_class->hasVirtualDestructor()) || (cpp_shared && d_class->generateShellClass() && !d_class->isInterface());
     if (staticInit)
     {
         auxFile.isDone = false;
@@ -2200,19 +2198,27 @@
             writeFieldAccessors(s, field);
     }
 
-    if (d_class->typeEntry()->isObject() && d_class->hasVirtualFunctions())
+    if (d_class->typeEntry()->isObject())
     {
         if (d_class->isQObject())
             writeQObjectFunctions(s, d_class);
         else
             writeObjectFunctions(s, d_class);
-    
-        s << "    static QtdObjectBase __createWrapper(void* nativeId, QtdObjectFlags flags) {" << endl
-          << "        return new(flags) " << d_class->name() << "(nativeId, flags);" << endl
-          << "    }" << endl << endl;
+        
+        if (d_class->hasVirtualDestructor())
+        {    
+          s << "    static QtdObjectBase __createWrapper(void* nativeId, QtdObjectFlags flags) {" << endl
+            << "        auto obj = new(flags) " << d_class->name() << "(nativeId, flags);" << endl;
+            
+            if (d_class->isQObject())
+               s << "        qtd_" << d_class->name() << "_createEntity(nativeId, cast(void*)obj);" << endl;
+            
+          s << "        return obj;" << endl
+            << "    }" << endl << endl;
+        }
     }
     
-    if (d_class->hasPublicDestructor() && (!d_class->baseClass() || !d_class->hasVirtualFunctions()))
+    if (d_class->hasPublicDestructor() && (!d_class->baseClass() || !d_class->hasVirtualDestructor()))
         writeDestructor(s, d_class);
 
     // Add dummy constructor for use when constructing subclasses
@@ -2224,18 +2230,10 @@
 
         Indentation indent(INDENT);
         
-       
         QString flags = d_class->hasVirtualFunctions() && d_class->typeEntry()->isObject() ? "QtdObjectFlags.hasDId" : "QtdObjectFlags.none";
         s << "(void* nativeId, QtdObjectFlags flags = " << flags << ") {" << endl
         << INDENT << "super(nativeId, flags);" << endl;
         
-        if (d_class->name() == "QObject")
-        {
-            s << INDENT << "if (!(__flags & QtdObjectFlags.hasDId))" << endl
-            << INDENT << "    __createEntity;" << endl;
-        }
-        
-        
         /*
         if (cpp_shared) {
             if (d_class->generateShellClass() && !d_class->isInterface())
@@ -2460,7 +2458,7 @@
         s  << INDENT << "}" << endl << endl;
     }
 
-    if (d_class->typeEntry()->isObject() && d_class->hasVirtualFunctions())
+    if (d_class->typeEntry()->isObject() && d_class->hasVirtualDestructor())
     {
         if (!d_class->typeEntry()->isQObject())
         {
@@ -2533,7 +2531,7 @@
 
         s << "extern(C) void static_init_" << d_class->name() << "() {" << endl;
 
-        if (d_class->typeEntry()->isObject() && d_class->hasVirtualFunctions()) {
+        if (d_class->typeEntry()->isObject() && d_class->hasVirtualDestructor()) {
             s << INDENT << "if (!" << d_class->name() << "._staticMetaObject) " << endl
             << INDENT << "    " << d_class->name() << ".createStaticMetaObject;" << endl << endl;
         }
@@ -2632,57 +2630,57 @@
 }
 */
 
-// Polymorphic non-QObject
 void DGenerator::writeObjectFunctions(QTextStream &s, const AbstractMetaClass *d_class)
 {   
-    QString rootClassName = d_class->rootClass()->name();
-    QString concreteArg;
-    if (d_class->isAbstract())
-        concreteArg += ", " + d_class->name() + "_ConcreteWrapper";      
-
-  s << "    private static QtdMetaObject _staticMetaObject;" << endl
-    //<< "    private static QtdMetaObject[void*] _nativeToTargetMap;" << endl
-    
-    << "    protected static void createStaticMetaObject() {" << endl
-    << "        assert(!_staticMetaObject);" << endl
-    << "        QtdMetaObject base;" << endl;
-
-    if (d_class->baseClass())
+    // polymorphic
+    if (d_class->hasVirtualDestructor())
     {
-        QString baseName = d_class->baseClassName();
-        s << "        if (!" << baseName << "._staticMetaObject)" << endl
-        << "            " << baseName << ".createStaticMetaObject;" << endl
-        << "        base = " << baseName << "._staticMetaObject;" << endl;
+        QString rootClassName = d_class->rootClass()->name();
+        QString concreteArg;
+        if (d_class->isAbstract())
+            concreteArg += ", " + d_class->name() + "_ConcreteWrapper";      
+
+    s << "    private static QtdMetaObject _staticMetaObject;" << endl
+        //<< "    private static QtdMetaObject[void*] _nativeToTargetMap;" << endl
+        
+        << "    protected static void createStaticMetaObject() {" << endl
+        << "        assert(!_staticMetaObject);" << endl
+        << "        QtdMetaObject base;" << endl;
+
+        if (d_class->baseClass())
+        {
+            QString baseName = d_class->baseClassName();
+            s << "        if (!" << baseName << "._staticMetaObject)" << endl
+            << "            " << baseName << ".createStaticMetaObject;" << endl
+            << "        base = " << baseName << "._staticMetaObject;" << endl;
+        }
+        
+        s << "        _staticMetaObject = new QtdMetaObject(qtd_" << d_class->name() << "_staticTypeId, base);"   << endl
+        << "        _staticMetaObject.construct!(" << d_class->name() << concreteArg << ");" << endl
+        << "    }" << endl << endl
+
+        << "    QtdMetaObject metaObject() {" << endl
+        << "        return _staticMetaObject;" << endl
+        << "    }" << endl << endl
+        
+        << "    static QtdMetaObject staticMetaObject() {" << endl
+        << "        return _staticMetaObject;" << endl
+        << "    }" << endl << endl
+
+        << "    static " << d_class->name() << " __wrap(void* nativeId, QtdObjectFlags flags = QtdObjectFlags.skipNativeDelete) {" << endl
+        << "        auto obj = cast("  << d_class->name() << ") qtd_" << rootClassName << "_dId(nativeId);" << endl
+        << "        if (!obj)" << endl
+        << "            obj = static_cast!(" << d_class->name() << ")(_staticMetaObject.wrap(nativeId,"
+                            "qtd_" << rootClassName << "_typeId(nativeId), flags));" << endl
+        << "        return obj;" << endl                   
+        << "    }" << endl << endl;   
     }
-    
-    s << "        _staticMetaObject = new QtdMetaObject(qtd_" << d_class->name() << "_staticTypeId, base);"   << endl
-    << "        _staticMetaObject.construct!(" << d_class->name() << concreteArg << ");" << endl
-    << "    }" << endl << endl
-
-    << "    QtdMetaObject metaObject() {" << endl
-    << "        return _staticMetaObject;" << endl
-    << "    }" << endl << endl
-    
-    << "    static QtdMetaObject staticMetaObject() {" << endl
-    << "        return _staticMetaObject;" << endl
-    << "    }" << endl << endl
-
-    << "    static " << d_class->name() << " __wrap(void* nativeId, QtdObjectFlags flags = QtdObjectFlags.skipNativeDelete) {" << endl
-    << "        auto obj = cast("  << d_class->name() << ") qtd_" << rootClassName << "_dId(nativeId);" << endl
-    << "        if (!obj)" << endl
-    << "            obj = static_cast!(" << d_class->name() << ")(_staticMetaObject.wrap(nativeId,"
-                        "qtd_" << rootClassName << "_typeId(nativeId), flags));" << endl
-    << "        return obj;" << endl                   
-    << "    }" << endl << endl;
-    /*
-    << "    overrive protected void __addMapping() {" << endl
-    << "        _nativeToTargetMap[__nativeId] = this;" << endl
-    << "    }" << endl << endl
-    
-    << "    override protected void __removeMapping() {" << endl
-    << "        _nativeToTargetMap.remove(__nativeId);" << endl
-    << "    }" << endl << endl
-    */  
+    else
+    {
+      s << "    static " << d_class->name() << " __wrap(void* nativeId, QtdObjectFlags flags = QtdObjectFlags.skipNativeDelete) {" << endl
+        << "        return new " << d_class->name() << "(nativeId, flags);"
+        << "    }" << endl << endl;
+    }
 }
 
 void DGenerator::writeQObjectFunctions(QTextStream &s, const AbstractMetaClass *d_class)
@@ -2718,11 +2716,7 @@
 
     << "    static " << d_class->name() << " __wrap(void* nativeId, QtdObjectFlags flags = QtdObjectFlags.none) {" << endl
     << "        return static_cast!(" << d_class->name() << ")(_staticMetaObject.wrap(nativeId, flags));" << endl
-    << "    }" << endl << endl
-
-    << "    void __createEntity() {" << endl
-    << "        return qtd_" << d_class->name() << "_createEntity(__nativeId, cast(void*)this);" << endl
-    << "    }" << endl << endl;
+    << "    }" << endl << endl;    
 }
 
 /*
@@ -2732,61 +2726,23 @@
 }
 */
 
-// Returns the name of the resulting variable
-QString DGenerator::marshalToD(QTextStream &s, QString argName, const TypeEntry* type, MarshalFlags flags)
+void DGenerator::marshalToD(QTextStream &s, const ComplexTypeEntry *ctype)
 {
-    if (type->isBasicValue())
-        return argName;
-         
-    QString qtdObjFlags = "QtdObjectFlags.none";    
-    const ObjectTypeEntry *ctype = 0;
-    bool stackObject = false;   
-    
-    if (type->isObject())
-        ctype = static_cast<const ObjectTypeEntry *>(ctype);
-    
-    if (type->isValue())
-        flags |= MarshalScope;  
-    
-    if (flags & MarshalScope)
-    {
-        if (type->isObject() && type->hasVirtualDestructor())
-        {
-            qtdObjectFlags += " | QtdObjectFlags.stackAllocated";
-            bool stackObject = true;
-        }
-        else
-            s << INDENT << "scope ";
-        
-        qtdObjectFlags += "| QtdObjectFlags.skipNativeDelete";
-    }
-    else
-        s << INDENT << "auto ";
-    
-    s << resultName << " = ";        
-    
-            
-    if (ctype->isObject() && type->hasVirtualDestructor()) {        
-        exp = type->name() + ".__wrap(ret);" + endl;
-    }
-    else if (type->isValue())
-    {
-        if (type->actualIndirections() == 0)
-            s << "new " << type->name() << "(" << argName << ");" << endl;
-        else if (type->actualIndirections() == 1)
-            s << "new "         
-    }
-            
-    
+    if(ctype->isQObject()) {
+        QString type_name = ctype->name();
+        if (ctype->isAbstract())
+            type_name += "_ConcreteWrapper";
+        s << "return " << type_name << ".__getObject(ret);" << endl;
+    } else if (ctype->isValue() && !ctype->isStructInD()) {
+        s << INDENT << "return new " << ctype->name() << "(ret);" << endl;
+    } else if (ctype->isVariant()) {
+        s << INDENT << "return new QVariant(ret);" << endl;
     } else if (ctype->name() == "QModelIndex" || ctype->isStructInD()) {
         s << INDENT << "return ret;" << endl;
+    } else if (ctype->isObject()) {
+        QString type_name = ctype->name();
+        s << "return qtd_" << type_name << "_from_ptr(ret);" << endl;
     }
-    
-    if (stackObject)
-    {
-        s << ""
-    }
-    
 }
 
 void DGenerator::writeNativeField(QTextStream &s, const AbstractMetaField *field)
@@ -2922,50 +2878,41 @@
                 }
                 else if (type->typeEntry()->isStructInD())
                     continue;
-                else if ((type->typeEntry()->isValue() && type->isNativePointer())
-                    || type->isValue() || type->isVariant()){
-                    s << INDENT << "scope " << arg_name << "_d_ref = new " << type->typeEntry()->name() << "(" << arg_name << ");" << endl;
-                
-                    (*logstream) << type->name() << ", " << argument->argumentIndex() + 1 << ", "
-                            << implementor->name() << "::" <<  d_function->name();
-                
-                    if (type->typeEntry()->isValue())                    
-                        (*logstream) << ", type entry value";
-                    
-                    if (type->typeEntry()->isValue())                    
-                        (*logstream) << ", value";
-                    
-                    if (type->isNativePointer())                    
-                        (*logstream) << ", native pointer";
-                    
-                    const ComplexTypeEntry* ctype = dynamic_cast<const ComplexTypeEntry*>(type->typeEntry());
-                    if (ctype && ctype->hasVirtualFunctions())                    
-                        (*logstream) << ", polymorphic";
-                    
-                    (*logstream) << endl;
+                else if (type->typeEntry()->isValue()){
+                    s << INDENT << "scope " << arg_name << "_d_ref = new " << type->typeEntry()->name() << "(" << arg_name << ", QtdObjectFlags.skipNativeDelete);" << endl;
                 }                
                 else if (!type->hasNativeId())
                     continue;
                 else if (type->isObject() || type->isQObject())
-                {
-                    if (!type->isQObject())
-                    {
-                        (*logstream) << type->name() << ", " << argument->argumentIndex() + 1 << ", "
-                            << implementor->name() << "::" <<  d_function->name();
+                {            
+                    bool resetAfterUse = !type->isQObject() && d_function->resetObjectAfterUse(argument->argumentIndex() + 1);
                     
-                        (*logstream) << ", object";
-                            
-                        const ComplexTypeEntry* ctype = dynamic_cast<const ComplexTypeEntry*>(type->typeEntry());
-                        if (ctype && ctype->hasVirtualFunctions())                    
-                            (*logstream) << ", polymorphic";
+                    if ((static_cast<const ComplexTypeEntry*>(type->typeEntry()))->hasVirtualDestructor())
+                    {   
+                        QString flags;
+                        if (resetAfterUse)
+                            flags += "QtdObjectFlags.stackAllocated | QtdObjectFlags.skipNativeDelete";
+                        else if (type->isQObject())
+                            flags += "QtdObjectFlags.none";
+                        else
+                            flags = "QtdObjectFlags.skipNativeDelete";
+                        
+                        s << INDENT << "auto " << arg_name << "_d_ref = " << type->typeEntry()->name() << ".__wrap(" << arg_name
+                            << ", " << flags << ");" << endl;
                         
-                        (*logstream) << endl;
+                        if (resetAfterUse)
+                        {
+                            s << INDENT << "scope(exit) {" << endl
+                              << INDENT << "    if (" << arg_name << "_d_ref.__flags & QtdObjectFlags.stackAllocated)" << endl
+                              << INDENT << "        delete " << arg_name << ";" << endl
+                              << INDENT << "}" << endl;
+                        }
+                    }                                       
+                    else
+                    {
+                        s << INDENT << (resetAfterUse ? "scope " : "auto ")
+                          << arg_name << "_d_ref = new " << type->typeEntry()->name() << "(" << arg_name << ", QtdObjectFlags.skipNativeDelete);";
                     }
-                
-                    if (((ComplexTypeEntry*)type->typeEntry())->hasVirtualFunctions() || !d_function->resetObjectAfterUse(argument->argumentIndex() + 1))
-                        s << INDENT << "auto " << arg_name << "_d_ref = " << type->typeEntry()->name() << ".__wrap(" << arg_name << ");";
-                    else
-                        s << INDENT << "scope " << arg_name << "_d_ref = new " << type->typeEntry()->name() << "(" << arg_name << ", QtdObjectFlags.skipNativeDelete);";
                 }
                 else
                     qFatal(qPrintable(type->typeEntry()->name()));
@@ -3073,24 +3020,6 @@
     log = new QFile("arglog.txt");
     log->open(QFile::ReadWrite);
     logstream = new QTextStream(log);
-    // qtd
-    // code for including classses in 1 module for avoiding circular imports
-    foreach (AbstractMetaClass *cls, m_classes) {
-        ComplexTypeEntry *ctype = const_cast<ComplexTypeEntry *>(cls->typeEntry());
-
-        if (!cls->isInterface() && cls->isAbstract())            
-            ctype->setAbstract(true);
-                
-        ctype->setHasVirtualFunctions(cls->hasVirtualFunctions());
-
-        foreach(QString child, ctype->includedClasses) {
-            ComplexTypeEntry *ctype_child = TypeDatabase::instance()->findComplexType(child);
-            ctype_child->addedTo = cls->name();
-        }
-
-        foreach (AbstractMetaFunction *function, cls->functions())
-            function->checkStoreResult();
-    }
 
     Generator::generate();