changeset 260:b5773ccab07d lifetime

closer
author maxter
date Fri, 18 Sep 2009 18:52:03 +0000
parents 515d6e1c7b10
children 8f7bb7fc3123
files generator/abstractmetabuilder.cpp generator/abstractmetalang.cpp generator/abstractmetalang.h generator/cppheadergenerator.cpp generator/cppimplgenerator.cpp generator/dgenerator.cpp generator/generatorsetd.cpp generator/typesystem.h include/QObjectEntity.h qt/QGlobal.d qt/core/QMetaObject.d qt/d1/qt/QtdObject.d
diffstat 12 files changed, 140 insertions(+), 159 deletions(-) [+]
line wrap: on
line diff
--- a/generator/abstractmetabuilder.cpp	Thu Sep 17 16:28:41 2009 +0000
+++ b/generator/abstractmetabuilder.cpp	Fri Sep 18 18:52:03 2009 +0000
@@ -1312,18 +1312,8 @@
                 meta_class->setHasNonPrivateConstructor(true);
             }
 
-            if (meta_function->isDestructor())
-            {
-                if (meta_class->name() == "QFSFileEngine")
-                {
-                    std::cout << meta_function->isFinal() << std::endl;
-                    std::cout << qPrintable(meta_function->name()) << std::endl;
-                    qFatal("Gop");
-                }
-               
-                if (!meta_function->isFinal())
-                    meta_class->setHasVirtualDestructor(true);            
-            }
+            if (meta_function->isDestructor() && !meta_function->isFinal())
+                    meta_class->setHasVirtualDestructor(true);
 
             if (!meta_function->isDestructor()
                 && !meta_function->isInvalid()
--- a/generator/abstractmetalang.cpp	Thu Sep 17 16:28:41 2009 +0000
+++ b/generator/abstractmetalang.cpp	Fri Sep 18 18:52:03 2009 +0000
@@ -1111,9 +1111,7 @@
         m_functions << function;
         qSort(m_functions.begin(), m_functions.end(), function_sorter);
     }
-    else
-        qFatal("blah");
-
+    
     m_has_virtual_slots |= function->isVirtualSlot();
     m_has_virtuals |= !function->isFinal() || function->isVirtualSlot();
     m_has_nonpublic |= !function->isPublic();
--- a/generator/abstractmetalang.h	Thu Sep 17 16:28:41 2009 +0000
+++ b/generator/abstractmetalang.h	Fri Sep 18 18:52:03 2009 +0000
@@ -786,8 +786,10 @@
 
     bool hasVirtualSlots() const { return m_has_virtual_slots; }       
     bool hasVirtualFunctions() const { return !isFinal() && m_has_virtuals; }
-    bool hasVirtualDestructor() const { return m_has_virtual_destructor; }
+    bool hasVirtualDestructor() const { return m_has_virtual_destructor
+        || (m_base_class && m_base_class->hasVirtualDestructor()); }
     bool setHasVirtualDestructor(bool value) { m_has_virtual_destructor = value; }
+    bool isPolymorphic() const { return hasVirtualFunctions() || hasVirtualDestructor(); }
     bool hasProtectedFunctions() const;
 
     QList<TypeEntry *> templateArguments() const { return m_template_args; }
--- a/generator/cppheadergenerator.cpp	Thu Sep 17 16:28:41 2009 +0000
+++ b/generator/cppheadergenerator.cpp	Fri Sep 18 18:52:03 2009 +0000
@@ -176,19 +176,12 @@
         priGenerator->addHeader(java_class->package(), fileNameForClass(java_class));
         return ;
     }
-    
-    if (java_class->name() == "QFSFileEngine")
-    {
-        std::cout << java_class->typeEntry()->isObject() << std::endl;
-        std::cout << java_class->hasVirtualDestructor() << std::endl;
-        qFatal("Bo");
-    }
 
     s << "class " << shellClassName(java_class)
       << " : public " << java_class->qualifiedCppName();
     if (java_class->isQObject())
         s << ", public QtD_QObjectEntity";
-    else if (java_class->hasVirtualDestructor())
+    else if (java_class->isPolymorphic())
         s << ", public QtD_Entity";
     s << endl  << "{" << endl;
 
@@ -216,10 +209,9 @@
             writeFunction(s, function);
     }
     
-    if (java_class->typeEntry()->isObject() && java_class->hasVirtualDestructor())
-        s << "    ~" << shellClassName(java_class) << "();" << endl << endl;
+    if (java_class->isPolymorphic())
+        s << "    ~" << shellClassName(java_class) << "();" << endl << endl;    
     
-
     // All functions in original class that should be reimplemented in shell class
     AbstractMetaFunctionList shell_functions = java_class->functionsInShellClass();
     foreach (const AbstractMetaFunction *function, shell_functions) {
@@ -255,8 +247,12 @@
 */
     writeInjectedCode(s, java_class);
 
-    s  << "};" << endl << endl
-       << "#endif // " << include_block << endl;
+    s  << "};" << endl << endl;
+    
+    if (!java_class->isQObject() && java_class->isPolymorphic() && java_class->baseClass())
+        s << "extern \"C\" DLL_PUBLIC void* qtd_" << java_class->rootClass()->name() << "_dId(void *nativeId);" << endl;
+   
+    s << "#endif // " << include_block << endl;
 
     priGenerator->addHeader(java_class->package(), fileNameForClass(java_class));
     priGenerator->addClass(java_class->package(), java_class->name());
--- a/generator/cppimplgenerator.cpp	Thu Sep 17 16:28:41 2009 +0000
+++ b/generator/cppimplgenerator.cpp	Fri Sep 18 18:52:03 2009 +0000
@@ -601,7 +601,7 @@
                 writeShellConstructor(s, function);
         }
         
-        if (java_class->hasVirtualDestructor())
+        if (java_class->isPolymorphic())
             writeShellDestructor(s, java_class);
 
         if (java_class->isQObject())
@@ -1391,7 +1391,7 @@
     
     if (cls->isQObject())
         s << "," << endl << "      QtD_QObjectEntity(this, d_ptr)";
-    else if (cls->hasVirtualDestructor())
+    else if (cls->isPolymorphic())
         s << "," << endl << "      QtD_Entity(d_ptr)";
 /* qtd        s << "    m_meta_object(0)," << endl;
     s << "      m_vtable(0)," << endl
@@ -1736,7 +1736,7 @@
 
 void CppImplGenerator::writeObjectFunctions(QTextStream &s, const AbstractMetaClass *java_class)
 {
-    if (java_class->hasVirtualDestructor())
+    if (java_class->isPolymorphic())
     {
         s << "extern \"C\" DLL_PUBLIC const void* qtd_" << java_class->name() << "_staticTypeId()" << endl;
         s << "{" << endl;
@@ -1747,26 +1747,17 @@
         s << "}" << endl << endl;
         
         if (!java_class->baseClass())
-        {      
-            s << "extern \"C\" DLL_PUBLIC void* qtd_" << java_class->name() << "_dId(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;
+        {
+            s << "extern \"C\" DLL_PUBLIC void* qtd_" << java_class->name() << "_dId(void *nativeId)" << endl
+              << "{" << endl
+              << "    QtD_Entity *a = dynamic_cast<QtD_Entity*>((" << java_class->qualifiedCppName() << "*)nativeId);" << endl
+              << "    return a ? a->dId : NULL;" << endl
+              << "}" << endl << endl
             
-            s << "extern \"C\" DLL_PUBLIC const void* qtd_" << java_class->name() << "_typeId(void *nativeId)" << endl;
-            s << "{" << endl;
-            {
-                Indentation indent(INDENT);
-                    s << INDENT << "return &typeid((" << java_class->qualifiedCppName() << "*)nativeId);" << endl;
-            }
-            s << "}" << endl << endl;
+              << "extern \"C\" DLL_PUBLIC const void* qtd_" << java_class->name() << "_typeId(void *nativeId)" << endl
+              << "{" << endl
+              << "    return &typeid((" << java_class->qualifiedCppName() << "*)nativeId);" << endl
+              << "}" << endl << endl;
         }       
     }
 }
@@ -1892,7 +1883,7 @@
     const AbstractMetaClass *cls = java_function->ownerClass();
           
     if (java_function->isConstructor() &&
-        cls->typeEntry()->isObject())
+        cls->isPolymorphic())
     {
         s << "void *d_ptr";
         nativeArgCount++;
@@ -3540,7 +3531,7 @@
 
     int written_arguments = 0;
     const AbstractMetaClass *cls = java_function->ownerClass();
-    if (java_function->isConstructor() && cls->typeEntry()->isObject()) {
+    if (java_function->isConstructor() && cls->isPolymorphic()) {
         s << "d_ptr";
         written_arguments++;
     }
--- a/generator/dgenerator.cpp	Thu Sep 17 16:28:41 2009 +0000
+++ b/generator/dgenerator.cpp	Fri Sep 18 18:52:03 2009 +0000
@@ -774,7 +774,7 @@
     }
 
     if (d_function->isConstructor() &&
-        ( d_function->implementingClass()->hasVirtualFunctions()
+        ( d_function->implementingClass()->isPolymorphic()
         || d_function->implementingClass()->typeEntry()->isObject() ) ) { // qtd
         s << "cast(void*) this";
         if (arguments.count() > 0)
@@ -898,9 +898,10 @@
         if(return_type->isQObject())
             s << return_type->name() << ".__wrap(ret);" << endl;
         
-
-        if (return_type->isValue() && !return_type->typeEntry()->isStructInD())
-            s << "new " << return_type->name() << "(ret);" << endl;
+        if ((return_type->isValue() && !return_type->typeEntry()->isStructInD()) || return_type->isVariant())
+            s << "new " << return_type->name() << "(ret);" << endl;        
+        else if (return_type->typeEntry()->isValue() && return_type->isNativePointer())
+            s << "new " << return_type->name() << "(ret, QtdObjectFlags.skipNativeDelete);" << endl;
         
         if (return_type->isObject()) {
             if(d_function->storeResult())
@@ -1697,6 +1698,7 @@
     }
 }
 
+
 void DGenerator::writeSignalHandlers(QTextStream &s, const AbstractMetaClass *d_class)
 {
     AbstractMetaFunctionList signal_funcs = signalFunctions(d_class);
@@ -1728,7 +1730,8 @@
             Indentation indent(INDENT);
             s << INDENT << "auto d_object = cast(" << d_class->name() << ") d_entity;" << endl;
             int sz = arguments.count();
-
+            
+            //TODO: This mostly duplicates virtual function argument generation. Should be merged
             for (int j=0; j<sz; ++j) {
                 AbstractMetaArgument *argument = arguments.at(j);
                 QString arg_name = argument->indexedName();
@@ -1748,16 +1751,42 @@
                     if (type->isFlags())
                         type_name = "int";
                     s << INDENT << "auto " << arg_name << " = *(cast(" << type_name << "*)" << arg_ptr << ");";
-                } else if(type->isObject() || type->isQObject()
-                        || (type->typeEntry()->isValue() && type->isNativePointer())
-                        || type->isValue()) {
-                    QString type_name = type->name();
-                    const ComplexTypeEntry *ctype = static_cast<const ComplexTypeEntry *>(type->typeEntry());
-                    if(ctype->isAbstract())
-                        type_name = type_name + "_ConcreteWrapper";
-                    s << INDENT << "scope " << arg_name << " = new " << type_name
+                } else if (type->isValue() || (type->typeEntry()->isValue() && type->isNativePointer())) {
+                    s << INDENT << "scope " << arg_name << " = new " <<  argument->type()->typeEntry()->name()
                                 << "(cast(void*)(" << arg_ptr << "), QtdObjectFlags.skipNativeDelete);" << endl;
                 }
+                else if (type->isObject() || type->isQObject())
+                {            
+                    bool resetAfterUse = !type->isQObject() && signal->resetObjectAfterUse(argument->argumentIndex() + 1);
+                    
+                    if ((static_cast<const ComplexTypeEntry*>(type->typeEntry()))->isPolymorphic())
+                    {   
+                        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 << " = " << type->typeEntry()->name() << ".__wrap(" << arg_name
+                            << ", cast(QtdObjectFlags)(" << flags << "));" << 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);";
+                    }
+                }
+                    
                 s << endl;
             }
 //            s << INDENT << "Stdout(\"" << d_class->name() << "\", \"" << signal->name() << "\").newline;" << endl;
@@ -1788,7 +1817,7 @@
     auxFile.isDone = true;
     auxFile.stream << "module " << auxModName << ";" << endl << endl;
 
-    bool staticInit = (d_class->typeEntry()->isObject() && d_class->hasVirtualDestructor()) || (cpp_shared && d_class->generateShellClass() && !d_class->isInterface());
+    bool staticInit = (d_class->typeEntry()->isObject() && d_class->isPolymorphic()) || (cpp_shared && d_class->generateShellClass() && !d_class->isInterface());
     if (staticInit)
     {
         auxFile.isDone = false;
@@ -1898,13 +1927,11 @@
           << "private import qt.core.QString;" << endl
           << "private import qt.qtd.Array;" << endl;
         if (d_class->isQObject()) {
+            s << "public import qt.core.QMetaObject;" << endl;
             s << "public import qt.Signal;" << endl;
             if (d_class->name() != "QObject")
                 s << "public import qt.core.QObject;" << endl;
-        }
-        
-        if (d_class->typeEntry()->isObject() && d_class->hasVirtualFunctions())
-            s << "public import qt.core.QMetaObject;" << endl;
+        }   
 
         // qtd2 hack!
         if (d_class->name() == "QCoreApplication")
@@ -2205,10 +2232,15 @@
         else
             writeObjectFunctions(s, d_class);
         
-        if (d_class->hasVirtualDestructor())
+        if (d_class->isPolymorphic())
         {    
-          s << "    static QtdObjectBase __createWrapper(void* nativeId, QtdObjectFlags flags) {" << endl
-            << "        auto obj = new(flags) " << d_class->name() << "(nativeId, flags);" << endl;
+            s << "    static QtdObjectBase __createWrapper(void* nativeId, QtdObjectFlags flags) {" << endl;
+            
+            QString className = d_class->name();
+            if (d_class->isAbstract())
+                className += "_ConcreteWrapper";        
+          
+            s << "        auto obj = new(flags) " << className << "(nativeId, flags);" << endl;
             
             if (d_class->isQObject())
                s << "        qtd_" << d_class->name() << "_createEntity(nativeId, cast(void*)obj);" << endl;
@@ -2218,7 +2250,7 @@
         }
     }
     
-    if (d_class->hasPublicDestructor() && (!d_class->baseClass() || !d_class->hasVirtualDestructor()))
+    if (d_class->hasPublicDestructor() && (!d_class->baseClass() || !d_class->isPolymorphic()))
         writeDestructor(s, d_class);
 
     // Add dummy constructor for use when constructing subclasses
@@ -2458,7 +2490,7 @@
         s  << INDENT << "}" << endl << endl;
     }
 
-    if (d_class->typeEntry()->isObject() && d_class->hasVirtualDestructor())
+    if (d_class->typeEntry()->isObject() && d_class->isPolymorphic())
     {
         if (!d_class->typeEntry()->isQObject())
         {
@@ -2531,7 +2563,7 @@
 
         s << "extern(C) void static_init_" << d_class->name() << "() {" << endl;
 
-        if (d_class->typeEntry()->isObject() && d_class->hasVirtualDestructor()) {
+        if (d_class->typeEntry()->isObject() && d_class->isPolymorphic()) {
             s << INDENT << "if (!" << d_class->name() << "._staticMetaObject) " << endl
             << INDENT << "    " << d_class->name() << ".createStaticMetaObject;" << endl << endl;
         }
@@ -2633,7 +2665,7 @@
 void DGenerator::writeObjectFunctions(QTextStream &s, const AbstractMetaClass *d_class)
 {   
     // polymorphic
-    if (d_class->hasVirtualDestructor())
+    if (d_class->isPolymorphic())
     {
         QString rootClassName = d_class->rootClass()->name();
         QString concreteArg;
@@ -2670,7 +2702,7 @@
         << "    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,"
+        << "            obj = static_cast!(" << d_class->name() << ")(_staticMetaObject.wrap(nativeId, "
                             "qtd_" << rootClassName << "_typeId(nativeId), flags));" << endl
         << "        return obj;" << endl                   
         << "    }" << endl << endl;   
@@ -2728,20 +2760,17 @@
 
 void DGenerator::marshalToD(QTextStream &s, const ComplexTypeEntry *ctype)
 {
-    if(ctype->isQObject()) {
-        QString type_name = ctype->name();
-        if (ctype->isAbstract())
-            type_name += "_ConcreteWrapper";
-        s << "return " << type_name << ".__getObject(ret);" << endl;
+    if(ctype->isObject()) {
+        if (ctype->isPolymorphic())
+            s << "return " << ctype->name() << ".__wrap(ret);" << endl;
+        else
+            s << "return new " << ctype->name() << "(ret, QtdObjectFlags.skipNativeDelete);" << 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;
     }
 }
 
@@ -2878,7 +2907,7 @@
                 }
                 else if (type->typeEntry()->isStructInD())
                     continue;
-                else if (type->typeEntry()->isValue()){
+                else if (type->typeEntry()->isValue() || (type->typeEntry()->isValue() && type->isNativePointer())){
                     s << INDENT << "scope " << arg_name << "_d_ref = new " << type->typeEntry()->name() << "(" << arg_name << ", QtdObjectFlags.skipNativeDelete);" << endl;
                 }                
                 else if (!type->hasNativeId())
@@ -2887,18 +2916,18 @@
                 {            
                     bool resetAfterUse = !type->isQObject() && d_function->resetObjectAfterUse(argument->argumentIndex() + 1);
                     
-                    if ((static_cast<const ComplexTypeEntry*>(type->typeEntry()))->hasVirtualDestructor())
+                    if ((static_cast<const ComplexTypeEntry*>(type->typeEntry()))->isPolymorphic())
                     {   
                         QString flags;
                         if (resetAfterUse)
-                            flags += "QtdObjectFlags.stackAllocated | QtdObjectFlags.skipNativeDelete";
+                            flags = "QtdObjectFlags.stackAllocated | QtdObjectFlags.skipNativeDelete";
                         else if (type->isQObject())
-                            flags += "QtdObjectFlags.none";
+                            flags = "QtdObjectFlags.none";
                         else
                             flags = "QtdObjectFlags.skipNativeDelete";
                         
                         s << INDENT << "auto " << arg_name << "_d_ref = " << type->typeEntry()->name() << ".__wrap(" << arg_name
-                            << ", " << flags << ");" << endl;
+                            << ", cast(QtdObjectFlags)(" << flags << "));" << endl;
                         
                         if (resetAfterUse)
                         {
@@ -2928,6 +2957,7 @@
         && (!new_return_type.isEmpty() || return_type != 0);
     if(has_return_type) {
         AbstractMetaType *f_type = d_function->type();
+        
         if(f_type && (f_type->isObject() || f_type->isQObject() || f_type->isVariant() ||
                       (f_type->isValue() && !f_type->typeEntry()->isStructInD())))
         {
--- a/generator/generatorsetd.cpp	Thu Sep 17 16:28:41 2009 +0000
+++ b/generator/generatorsetd.cpp	Fri Sep 18 18:52:03 2009 +0000
@@ -217,6 +217,26 @@
 
     generators << cointainerGenerator;
     contexts << "cointainerGenerator";
+    
+    // qtd
+    // code for including classses in 1 module for avoiding circular imports
+    foreach (AbstractMetaClass *cls, builder.classes()) {
+       ComplexTypeEntry *ctype = const_cast<ComplexTypeEntry*>(cls->typeEntry());
+
+        if (!cls->isInterface() && cls->isAbstract())
+            ctype->setAbstract(true);
+        
+        ctype->setIsPolymorphic(cls->isPolymorphic());
+        
+
+        foreach(QString child, ctype->includedClasses) {
+            ComplexTypeEntry *ctype_child = TypeDatabase::instance()->findComplexType(child);
+            ctype_child->addedTo = cls->name();
+        }
+
+        foreach (AbstractMetaFunction *function, cls->functions())
+            function->checkStoreResult();
+    }
 
     for (int i=0; i<generators.size(); ++i) {
         Generator *generator = generators.at(i);
--- a/generator/typesystem.h	Thu Sep 17 16:28:41 2009 +0000
+++ b/generator/typesystem.h	Fri Sep 18 18:52:03 2009 +0000
@@ -757,7 +757,8 @@
           m_generic_class(false),
           m_type_flags(0),
           m_isStructInD(false),
-          m_isAbstract(false)
+          m_isAbstract(false),          
+          m_isPolymorphic(false)
     {
         Include inc;
         inc.name = "QVariant";
@@ -884,11 +885,8 @@
     bool isAbstract() const { return m_isAbstract; }
     void setAbstract(bool isAbstract) { m_isAbstract = isAbstract; }
 
-    bool hasVirtualFunctions() const { return m_hasVirtualFunctions; }
-    void setHasVirtualFunctions(bool value) { m_hasVirtualFunctions = value; }
-    
-    bool hasVirtualDestructor() const { return m_hasVirtualDestructor; }
-    void setHasVirtualDestructor(bool value) { m_hasVirtualDestructor = value; }
+    bool isPolymorphic() const { return m_isPolymorphic; }
+    void setIsPolymorphic(bool value) { m_isPolymorphic = value; }
 
 
     void setDepends(const QStringList &depends) {m_depends = depends; }
@@ -914,7 +912,7 @@
     uint m_polymorphic_base : 1;
     uint m_generic_class : 1;
 
-    QString m_polymorphic_id_value;
+    QString m_polymorphic_id_value;e
     QString m_lookup_name;
     QString m_target_type;
     ExpensePolicy m_expense_policy;
@@ -923,8 +921,7 @@
     // qtd
     bool m_isStructInD;
     bool m_isAbstract;
-    bool m_hasVirtualFunctions;
-    bool m_hasVirtualDestructor;
+    bool m_isPolymorphic;
     QStringList m_depends;
 };
 
--- a/include/QObjectEntity.h	Thu Sep 17 16:28:41 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-#ifndef QQOBJECTENTITY_H
-#define QQOBJECTENTITY_H
-
-#include "qtd_core.h"
-#include <qobject.h>
-#include <iostream>
-
-QTD_EXPORT(void, qtd_delete_d_qobject, (void* dPtr))
-
-#ifdef CPP_SHARED
-#define qtd_delete_d_qobject qtd_get_qtd_delete_d_qobject()
-#endif
-
-//TODO: user data ID must be registered with QObject::registerUserData;
-#define userDataId 0
-
-class QtD_QObjectEntity : public QtD_Entity, public QObjectUserData
-{
-public:
-
-    QtD_QObjectEntity(QObject *qObject, void *dId) : QtD_Entity(dId)
-    {
-        qObject->setUserData(userDataId, this);
-    }
-
-    virtual ~QtD_QObjectEntity()
-    {        
-        if (dId)
-            destroyEntity();     
-    }
-    
-    inline void destroyEntity(QObject *qObject = NULL)
-    {
-        Q_ASSERT(dId);
-        qtd_delete_d_qobject(dId);
-        if (qObject)
-        {
-            qObject->setUserData(userDataId, NULL);
-            dId = NULL;
-        }
-    }
-
-    inline static QtD_QObjectEntity* getQObjectEntity(const QObject *qObject)
-    {
-        return static_cast<QtD_QObjectEntity*>(qObject->userData(userDataId));
-    }
-};
-
-#endif // QQOBJECTENTITY_H
--- a/qt/QGlobal.d	Thu Sep 17 16:28:41 2009 +0000
+++ b/qt/QGlobal.d	Fri Sep 18 18:52:03 2009 +0000
@@ -54,7 +54,7 @@
  
 version (D_Version2)
 {
-    void StackAlloc __stackAlloc()
+    StackAlloc __stackAlloc()
     {
         static StackAlloc instance; // thread-local instance
         // COMPILER BUG: No thread-local static constructors, Using lazy construction
@@ -77,7 +77,7 @@
         auto res = stackAllocInst.val;
         if (!res)
         {
-            res = new This(stackSize);
+            res = new StackAlloc(stackSize);
             stackAllocInst.val = res;
         }
         return res;
--- a/qt/core/QMetaObject.d	Thu Sep 17 16:28:41 2009 +0000
+++ b/qt/core/QMetaObject.d	Fri Sep 18 18:52:03 2009 +0000
@@ -7,7 +7,7 @@
 /++
     Meta-object for QObject classes.
 +/
-final class QMetaObject : MetaObject
+final class QMetaObject : QtdMetaObjectBase
 {
     alias typeof(this) This;
     
@@ -57,7 +57,7 @@
             {
                 auto moId = qtd_QObject_metaObject(nativeObjId);
                 if (_nativeId == moId)
-                     result = _createWrapper(nativeObjId, flags);
+                     result =  static_cast!(QObject)(_createWrapper(nativeObjId, flags));
                 else
                 {
                     // get native metaobjects for the entire derivation lattice
@@ -81,7 +81,8 @@
                     while (moCount > 0)
                         moIds[--moCount] = moId = qtd_QMetaObject_superClass(moId);
                                     
-                    result = lookupDerived(moIds)._createWrapper(nativeObjId, flags);
+                    auto mo = lookupDerived(moIds);
+                    result = static_cast!(QObject)(mo._createWrapper(nativeObjId, flags));
                 }                
             }
         }
--- a/qt/d1/qt/QtdObject.d	Thu Sep 17 16:28:41 2009 +0000
+++ b/qt/d1/qt/QtdObject.d	Fri Sep 18 18:52:03 2009 +0000
@@ -99,10 +99,15 @@
 }
 
 
-abstract class QtdMetaObject : MetaObject
+abstract class QtdMetaObjectBase : MetaObject
 {
     QtdObjectBase function(void* nativeId, QtdObjectFlags flags) _createWrapper;
     
+    this(QtdMetaObjectBase base)
+    {
+        super(base);
+    }
+    
     void construct(T : QtdObject, Concrete = T)()
     {
         super.construct!(T);
@@ -113,7 +118,7 @@
 /++
     Meta-object for polymorphic Qt classes.
 +/
-final class QtdMetaObject : MetaObject
+final class QtdMetaObject : QtdMetaObjectBase
 {
     alias typeof(this) This;
     
@@ -143,7 +148,7 @@
             }
         }
         
-        return _createWrapper(nativeId, flags);
+        return static_cast!(QtdObject)(_createWrapper(nativeId, flags));
     }
 }
 
@@ -273,7 +278,7 @@
     {
         debug(QtdVerbose) __print("In QtdObject destructor");
         
-        if (__prev || __root is this)d
+        if (__prev || __root is this)
             __unpin;
     }    
 }