changeset 262:90131f64c9c9 lifetime

looks like enabling/disabling GC is enough
author maxter
date Tue, 22 Sep 2009 15:19:04 +0000
parents 8f7bb7fc3123
children a7b313b8b149
files generator/abstractmetalang.h generator/cppimplgenerator.cpp generator/dgenerator.cpp qt/d1/qt/QtdObject.d
diffstat 4 files changed, 173 insertions(+), 194 deletions(-) [+]
line wrap: on
line diff
--- a/generator/abstractmetalang.h	Mon Sep 21 13:11:04 2009 +0000
+++ b/generator/abstractmetalang.h	Tue Sep 22 15:19:04 2009 +0000
@@ -785,11 +785,11 @@
     bool generateShellClass() const;
 
     bool hasVirtualSlots() const { return m_has_virtual_slots; }       
-    bool hasVirtualFunctions() const { return !isFinal() && m_has_virtuals; }
+    bool hasVirtualFunctions() const { return !isFinal() && (m_has_virtuals || hasVirtualDestructor()); }
     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 isPolymorphic() const { return typeEntry()->isObject() && (hasVirtualFunctions() || hasVirtualDestructor()); }
     bool hasProtectedFunctions() const;
 
     QList<TypeEntry *> templateArguments() const { return m_template_args; }
--- a/generator/cppimplgenerator.cpp	Mon Sep 21 13:11:04 2009 +0000
+++ b/generator/cppimplgenerator.cpp	Tue Sep 22 15:19:04 2009 +0000
@@ -601,7 +601,7 @@
                 writeShellConstructor(s, function);
         }
         
-        if (java_class->isPolymorphic())
+        if (java_class->hasVirtualFunctions())
             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->isPolymorphic())
+    else if (cls->hasVirtualFunctions())
         s << "," << endl << "      QtD_Entity(d_ptr)";
 /* qtd        s << "    m_meta_object(0)," << endl;
     s << "      m_vtable(0)," << endl
@@ -1883,7 +1883,7 @@
     const AbstractMetaClass *cls = java_function->ownerClass();
           
     if (java_function->isConstructor() &&
-        cls->isPolymorphic())
+        cls->hasVirtualFunctions())
     {
         s << "void *d_ptr";
         nativeArgCount++;
@@ -3531,7 +3531,7 @@
 
     int written_arguments = 0;
     const AbstractMetaClass *cls = java_function->ownerClass();
-    if (java_function->isConstructor() && cls->isPolymorphic()) {
+    if (java_function->isConstructor() && cls->hasVirtualFunctions()) {
         s << "d_ptr";
         written_arguments++;
     }
--- a/generator/dgenerator.cpp	Mon Sep 21 13:11:04 2009 +0000
+++ b/generator/dgenerator.cpp	Tue Sep 22 15:19:04 2009 +0000
@@ -61,7 +61,7 @@
       m_docs_enabled(false),
       m_native_jump_table(false),
       m_recursive(0),
-      m_isRecursive(false)      
+      m_isRecursive(false)
 {
     excludedTypes << "long long" << "bool" << "int" << "QString" << "char" << "WId"
                   << "unsigned char" << "uint" << "double" << "short" << "float"
@@ -477,18 +477,15 @@
 }
 
 static QString function_call_for_ownership(TypeSystem::Ownership owner)
-{  
+{
     if (owner == TypeSystem::CppOwnership) {
-        return "__nativeOwnership = true";
-    } else /* qtd 2 if (owner == TypeSystem::TargetLangOwnership) */ {
-        return "__nativeOwnership = false";
-    }/* else if (owner == TypeSystem::DefaultOwnership) {
-        return "__no_real_delete = false";
-
+        return "__pin";
+    } else if (owner == TypeSystem::TargetLangOwnership || owner == TypeSystem::TargetLangOwnership) {
+        return "__unpin";
     } else {
         Q_ASSERT(false);
         return "bogus()";
-    }*/
+    }
 }
 
 void DGenerator::writeOwnershipForContainer(QTextStream &s, TypeSystem::Ownership owner,
@@ -651,7 +648,7 @@
 
     referenceCounts = d_function->referenceCounts(d_function->implementingClass(), 0);
     */
-    
+
     AbstractMetaType *return_type = d_function->type();
     QString new_return_type = QString(d_function->typeReplaced(0)).replace('$', '.');
     bool has_return_type = new_return_type != "void"
@@ -897,12 +894,12 @@
 
         if(return_type->isQObject())
             s << return_type->name() << ".__wrap(ret);" << endl;
-        
+
         if ((return_type->isValue() && !return_type->typeEntry()->isStructInD()) || return_type->isVariant())
-            s << "new " << return_type->name() << "(ret);" << endl;        
+            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())
             {
@@ -1684,7 +1681,7 @@
         return;
 
     s << "    override void __deleteNative() {" << endl
-        << "        qtd_" << d_class->name() << "_destructor(__nativeId);" << endl          
+        << "        qtd_" << d_class->name() << "_destructor(__nativeId);" << endl
         << "    }" << endl;
 }
 
@@ -1730,7 +1727,7 @@
             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);
@@ -1755,23 +1752,21 @@
                     s << INDENT << "scope " << arg_name << " = new " <<  argument->type()->typeEntry()->name()
                                 << "(cast(void*)(" << arg_ptr << "), QtdObjectFlags.skipNativeDelete);" << endl;
                 }
-                else if (type->isObject() || type->isQObject())
-                {            
+                else if (type->typeEntry()->isObject())
+                {
                     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())
+                        else
                             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
@@ -1779,14 +1774,15 @@
                               << 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);";
+                          << arg_name << "_d_ref = new " << type->typeEntry()->name() << "(" << arg_name << ", QtdObjectFlags."
+                          << (resetAtferUse ? "skipNativeDelete" : "none") << ");" << endl;
                     }
                 }
-                    
+
                 s << endl;
             }
 //            s << INDENT << "Stdout(\"" << d_class->name() << "\", \"" << signal->name() << "\").newline;" << endl;
@@ -1807,7 +1803,7 @@
 
 void DGenerator::write(QTextStream &s, const AbstractMetaClass *d_class)
 {
-    ReportHandler::debugSparse("Generating class: " + d_class->fullName());    
+    ReportHandler::debugSparse("Generating class: " + d_class->fullName());
 
     bool fakeClass = d_class->attributes() & AbstractMetaAttributes::Fake;
 
@@ -1931,7 +1927,7 @@
             s << "public import qt.Signal;" << endl;
             if (d_class->name() != "QObject")
                 s << "public import qt.core.QObject;" << endl;
-        }   
+        }
 
         // qtd2 hack!
         if (d_class->name() == "QCoreApplication")
@@ -2024,14 +2020,14 @@
 
     if (!d_class->isNamespace() && !d_class->isInterface()) {
         s << " : ";
-        if (d_class->baseClass()) {            
+        if (d_class->baseClass()) {
             s << d_class->baseClass()->name();
-        } else {            
+        } else {
             if (d_class->typeEntry()->isValue())
                 s << "QtdObjectBase";
             else if (d_class->typeEntry()->isObject())
                 s << "QtdObject";
-                
+
         }
     }/* qtd else if (d_class->isInterface()) {
         s << " extends QtJambiInterface";
@@ -2045,7 +2041,7 @@
             s << ", ";
         else {
             implements = true;
-            s << ": ";
+            s << " : ";
         }
         for (int i=0; i<interfaces.size(); ++i) {
             AbstractMetaClass *iface = interfaces.at(i);
@@ -2094,7 +2090,7 @@
 
         foreach (QString variableName, variables.keys()) {
             int actions = variables.value(variableName) & ReferenceCount::ActionsMask;
-//            bool threadSafe = variables.value(variableName) & ReferenceCount::ThreadSafe;
+            bool threadSafe = variables.value(variableName) & ReferenceCount::ThreadSafe;
             bool isStatic = variables.value(variableName) & ReferenceCount::Static;
             bool declareVariable = variables.value(variableName) & ReferenceCount::DeclareVariable;
             int access = variables.value(variableName) & ReferenceCount::AccessMask;
@@ -2122,8 +2118,7 @@
                 s << "protected "; break;
             case ReferenceCount::Public:
                 s << "public "; break;
-            default:
-                s << "protected"; // friendly
+            default: // friendly
             }
 
             } // qtd2
@@ -2168,12 +2163,12 @@
     foreach (AbstractMetaEnum *d_enum, d_class->enums())
         writeEnumAlias(s, d_enum);
 
-    // Signals    
+    // Signals
     if (d_class->isQObject())
     {
         AbstractMetaFunctionList signal_funcs = signalFunctions(d_class, false);
         writeSignalSignatures(s, d_class, signal_funcs);
-   
+
         foreach (AbstractMetaFunction *signal, signal_funcs)
             writeSignal(s, signal);
     }
@@ -2231,26 +2226,26 @@
             writeQObjectFunctions(s, d_class);
         else
             writeObjectFunctions(s, d_class);
-        
+
         if (d_class->isPolymorphic())
-        {    
+        {
             s << "    static QtdObjectBase __createWrapper(void* nativeId, QtdObjectFlags flags) {" << endl;
-            
+
             QString className = d_class->name();
             if (d_class->isAbstract())
-                className += "_ConcreteWrapper";        
-          
+                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;
-            
+
           s << "        return obj;" << endl
             << "    }" << endl << endl;
         }
     }
-    
-    if (d_class->hasPublicDestructor() && (!d_class->baseClass() || !d_class->isPolymorphic()))
+
+    if (d_class->hasPublicDestructor() && (!d_class->baseClass() || !d_class->hasVirtualFunctions()))
         writeDestructor(s, d_class);
 
     // Add dummy constructor for use when constructing subclasses
@@ -2261,11 +2256,11 @@
 
 
         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 (cpp_shared) {
             if (d_class->generateShellClass() && !d_class->isInterface())
@@ -2274,7 +2269,7 @@
         }
         */
 
-        
+
         // customized store-result instances
         d_funcs = d_class->functionsInTargetLang();
         for (int i=0; i<d_funcs.size(); ++i) {
@@ -2294,7 +2289,7 @@
                 if(ctype->isAbstract())
                     type_name = type_name + "_ConcreteWrapper";
 
-                s << INDENT << "    __m_" << d_function->name() << ";" << endl;                
+                s << INDENT << "    __m_" << d_function->name() << ";" << endl;
             }
         }
 
@@ -2346,7 +2341,7 @@
                 s << INDENT << "private void* __m_ptr_" << iface->name() << ";" << endl
                   << INDENT << "public void* __ptr_" << iface->name() << "() { return __m_ptr_" << iface->name() << "; }" << endl << endl;
             }
-        }       
+        }
     }
 
 /* qtd
@@ -2386,17 +2381,17 @@
 */
     s << "}" << endl;
 
-    /* ---------------- injected free code ----------------*/ 
-    const ComplexTypeEntry *class_type = d_class->typeEntry(); 
-    Q_ASSERT(class_type); 
-
-    CodeSnipList code_snips = class_type->codeSnips(); 
-    foreach (const CodeSnip &snip, code_snips) { 
-        if (!d_class->isInterface() && snip.language == TypeSystem::TargetLangFreeCode) { 
-            s << endl; 
-            snip.formattedCode(s, INDENT); 
-        } 
-    } 
+    /* ---------------- injected free code ----------------*/
+    const ComplexTypeEntry *class_type = d_class->typeEntry();
+    Q_ASSERT(class_type);
+
+    CodeSnipList code_snips = class_type->codeSnips();
+    foreach (const CodeSnip &snip, code_snips) {
+        if (!d_class->isInterface() && snip.language == TypeSystem::TargetLangFreeCode) {
+            s << endl;
+            snip.formattedCode(s, INDENT);
+        }
+    }
     /* --------------------------------------------------- */
 
     interfaces = d_class->interfaces();
@@ -2415,10 +2410,10 @@
         s << INDENT << "public class " << d_class->name() << "_ConcreteWrapper : " << d_class->name() << " {" << endl;
 
         {
-            Indentation indent(INDENT);            
+            Indentation indent(INDENT);
             s << INDENT << "public this(void* native_id, QtdObjectFlags flags) {" << endl
               << INDENT << "    super(native_id, flags);" << endl << endl;
-            
+
             /******************!!!DUPLICATE!!!*********************/
             d_funcs = d_class->functionsInTargetLang();
             for (int i=0; i<d_funcs.size(); ++i) {
@@ -2435,7 +2430,7 @@
                     if(ctype->isAbstract())
                         type_name = type_name + "_ConcreteWrapper";
                     s << INDENT << "    __m_" << d_function->name() << " = new "
-                            << type_name << "(cast(void*)null);" << endl;                    
+                            << type_name << "(cast(void*)null);" << endl;
                 }
             }
 
@@ -2490,14 +2485,14 @@
         s  << INDENT << "}" << endl << endl;
     }
 
-    if (d_class->typeEntry()->isObject() && d_class->isPolymorphic())
+    if (d_class->isPolymorphic())
     {
         if (!d_class->typeEntry()->isQObject())
         {
             s << "extern(C) void* qtd_" << d_class->name() << "_dId(void *q_ptr);" << endl << endl;
             s << "extern(C) void* qtd_" << d_class->name() << "_typeId(void* nativeId);" << endl;
         }
-        
+
         s << "extern(C) void* qtd_" << d_class->name() << "_staticTypeId();" << endl;
     }
 
@@ -2563,7 +2558,7 @@
 
         s << "extern(C) void static_init_" << d_class->name() << "() {" << endl;
 
-        if (d_class->typeEntry()->isObject() && d_class->isPolymorphic()) {
+        if (d_class->isPolymorphic()) {
             s << INDENT << "if (!" << d_class->name() << "._staticMetaObject) " << endl
             << INDENT << "    " << d_class->name() << ".createStaticMetaObject;" << endl << endl;
         }
@@ -2663,18 +2658,18 @@
 */
 
 void DGenerator::writeObjectFunctions(QTextStream &s, const AbstractMetaClass *d_class)
-{   
+{
     // polymorphic
     if (d_class->isPolymorphic())
     {
         QString rootClassName = d_class->rootClass()->name();
         QString concreteArg;
         if (d_class->isAbstract())
-            concreteArg += ", " + d_class->name() + "_ConcreteWrapper";      
+            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;
@@ -2686,7 +2681,7 @@
             << "            " << 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
@@ -2694,22 +2689,22 @@
         << "    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
+        << "    static " << d_class->name() << " __wrap(void* nativeId, QtdObjectFlags flags = QtdObjectFlags.none) {" << 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;   
+        << "        return obj;" << endl
+        << "    }" << endl << endl;
     }
     else
     {
-      s << "    static " << d_class->name() << " __wrap(void* nativeId, QtdObjectFlags flags = QtdObjectFlags.skipNativeDelete) {" << endl
+      s << "    static " << d_class->name() << " __wrap(void* nativeId, QtdObjectFlags flags = QtdObjectFlags.none) {" << endl
         << "        return new " << d_class->name() << "(nativeId, flags);"
         << "    }" << endl << endl;
     }
@@ -2748,7 +2743,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;    
+    << "    }" << endl << endl;
 }
 
 /*
@@ -2761,10 +2756,7 @@
 void DGenerator::marshalToD(QTextStream &s, const ComplexTypeEntry *ctype)
 {
     if(ctype->isObject()) {
-        if (ctype->isPolymorphic())
-            s << "return " << ctype->name() << ".__wrap(ret);" << endl;
-        else
-            s << "return new " << ctype->name() << "(ret, QtdObjectFlags.skipNativeDelete);" << endl;            
+        s << "return " << ctype->name() << ".__wrap(ret);" << endl;
     } else if (ctype->isValue() && !ctype->isStructInD()) {
         s << INDENT << "return new " << ctype->name() << "(ret);" << endl;
     } else if (ctype->isVariant()) {
@@ -2817,9 +2809,9 @@
     {
         Indentation indent(INDENT);
         for (int i = 0; i < signal_funcs.size(); ++i)
-        {            
+        {
             if (i)
-                s << ", ";                
+                s << ", ";
             s << endl << INDENT << "    \"" << signal_funcs.at(i)->minimalSignature() << "\"";
         }
     }
@@ -2828,14 +2820,14 @@
     s << INDENT << "int signalSignature(int signalId, ref stringz signature) {" << endl;
     {
         Indentation indent(INDENT);
-        
+
         if (d_class->name() != "QObject")
         {
             s << INDENT << "signalId = super.signalSignature(signalId, signature);" << endl
               << INDENT << "if (signature)" << endl
-              << INDENT << "    return signalId;" << endl;            
+              << INDENT << "    return signalId;" << endl;
         }
-        
+
         s << INDENT << "if (signalId < __signalSignatures.length)" << endl
           << INDENT << "    signature = __signalSignatures[signalId].ptr;" << endl
           << INDENT << "else" << endl
@@ -2886,7 +2878,7 @@
 
     // the function arguments
     AbstractMetaArgumentList arguments = d_function->arguments();
-    foreach (const AbstractMetaArgument *argument, arguments)
+    foreach (const AbstractMetaArgument *argument, arguments) {
         if (!d_function->argumentRemoved(argument->argumentIndex() + 1)) {
             QString arg_name = argument->indexedName();
             AbstractMetaType *type = argument->type();
@@ -2909,26 +2901,24 @@
                     continue;
                 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())
                     continue;
-                else if (type->isObject() || type->isQObject())
-                {            
+                else if (type->typeEntry()->isObject())
+                {
                     bool resetAfterUse = !type->isQObject() && d_function->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())
+                        else
                             flags = "QtdObjectFlags.none";
-                        else
-                            flags = "QtdObjectFlags.skipNativeDelete";
                         
                         s << INDENT << "auto " << arg_name << "_d_ref = " << type->typeEntry()->name() << ".__wrap(" << arg_name
                             << ", cast(QtdObjectFlags)(" << flags << "));" << endl;
-                        
+
                         if (resetAfterUse)
                         {
                             s << INDENT << "scope(exit) {" << endl
@@ -2936,18 +2926,20 @@
                               << 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);";
+                          << arg_name << "_d_ref = new " << type->typeEntry()->name() << "(" << arg_name << ", QtdObjectFlags."
+                          << (resetAtferUse ? "skipNativeDelete" : "none") << ");" << endl;
                     }
                 }
                 else
                     qFatal(qPrintable(type->typeEntry()->name()));
-                
+               
                 s << endl;
             }
+        }
     }
 
     s << INDENT;
@@ -2957,7 +2949,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())))
         {
@@ -3124,7 +3116,7 @@
         }
         file.close();
     }
-    
+
     delete logstream;
     delete log;
 }
--- a/qt/d1/qt/QtdObject.d	Mon Sep 21 13:11:04 2009 +0000
+++ b/qt/d1/qt/QtdObject.d	Tue Sep 22 15:19:04 2009 +0000
@@ -151,6 +151,7 @@
     }
 }
 
+/*
 class IdMappings
 {
     private void* _data;
@@ -176,12 +177,26 @@
         free(_data);
     }
 }
+*/
 
 abstract class QtdObjectBase
-{    
+{
+}
+
+// Base class for by-reference objects
+abstract class QtdObject
+{   
     alias typeof(this) This;
     
+    private
+    {
+        typeof(this) __next, __prev;        
+        static typeof(this) __root;
+    } 
+    
+    /// Internal members. Do not change
     void* __nativeId;
+    /// ditto
     QtdObjectFlags __flags;
         
     new (size_t size, QtdObjectFlags flags = QtdObjectFlags.none)
@@ -198,12 +213,19 @@
             GC.free(p);
     }
     
-    this(void* nativeId, QtdObjectFlags flags = QtdObjectFlags.none)
+       
+    mixin SignalHandlerOps;
+
+    this(void* nativeId, QtdObjectFlags flags)
     {
         __nativeId = nativeId;
         __flags = flags;
-                
-        debug(QtdVerbose) __print("D wrapper constructed");
+        
+        debug(QtdVerbose) __print("D wrapper constructed");       
+        /*
+        if (!(flags & QtdObjectFlags.isQObject) && !(flags & QtdObjectFlags.hasDId))
+            __addIdMapping;
+        */
     }
     
     debug(QtdVerbose)
@@ -221,9 +243,48 @@
             ~ " because it has no public destructor");
     }
     
+    /*
+    void __addIdMapping() {}
+    void __removeIdMapping() {}
+    */
+    
+    final void __pin()
+    {
+        assert (!__prev && !__root is this);
+        __next = __root;
+        __root = this;
+        if (__next)
+            __next.__prev = this;        
+    
+        debug(QtdVerbose) __print("Wrapper GC disabled");
+    }
+    
+    final void __unpin()
+    {
+        assert (__prev || __root is this);
+               
+        if (__prev)
+        {
+            __prev.__next = __next;
+            __prev = null;
+        }
+        else
+            __root = __next;
+        
+        if (__next)      
+            __next.__prev = __prev;
+        
+        debug(QtdVerbose) __print("Wrapper GC reenabled");
+    }
+    
     ~this()
     {
-        debug(QtdVerbose) __print("In QtdObjectBase destructor");
+        /*
+        if (!(__flags & QtdObjectFlags.isQObject) && !(__flags & QtdObjectFlags.hasDId))
+            __removeMapping;
+        */
+        
+        debug(QtdVerbose) __print("In QtdObject destructor");
         
         if (!(__flags & QtdObjectFlags.skipNativeDelete))
         {
@@ -232,81 +293,9 @@
             debug(QtdVerbose) __print("About to call native delete");
             __deleteNative;
         }
-    }
-}
-
-// Base class for by-reference objects
-abstract class QtdObject : QtdObjectBase
-{        
-    private
-    {
-        typeof(this) __next, __prev;
-        ubyte __nativeRef_;
-        static typeof(this) __root;
-    }
-       
-    mixin SignalHandlerOps;
-
-    this(void* nativeId, QtdObjectFlags flags)
-    {
-        super (nativeId, flags);
         
-        if (!(flags & QtdObjectFlags.isQObject) && !(flags & QtdObjectFlags.hasDId))
-            __addIdMapping;
-    }
-    
-    void __addIdMapping() {}
-    void __removeIdMapping() {}
-    
-    final void __nativeRef()
-    {
-        assert (__nativeRef_ < 255);
-        
-        if (!__nativeRef_)
-        {
-            __next = __root;
-            __root = this;
-            if (__next)
-                __next.__prev = this;        
-        }
-        __nativeRef_++;
-        
-        debug(QtdVerbose) __print("Native ref incremented");
-    }
-    
-    final void __nativeDeref()
-    {
-        assert (__nativeRef > 0);
-        __nativeRef_--;
-               
-        if (!__nativeRef_)
-        {
-            if (__prev)
-                __prev.__next = __next;
-            else
-                __root = __next;
-            
-            if (__next)      
-                __next.__prev = __prev;
-        }
-        
-        debug(QtdVerbose) __print("Native ref decremented");
-    }
-    
-    ~this()
-    {
-        if (!(__flags & QtdObjectFlags.isQObject) && !(__flags & QtdObjectFlags.hasDId))
-            __removeMapping;
-        
-        if (__nativeRef_)
-        {
-            if (__nativeRef_ > 1)
-            {
-                debug(QtdVerbose) __print("Native ref is greater then 1 when deleting the object");
-                __nativeRef_ = 1;
-            }
-            __nativeDeref;
-        }
+        if (__prev || __root is this)
+            __unpin;
     }
 }
 
@@ -324,14 +313,12 @@
     }
 }
 
-extern(C) void qtd_native_ref(void* dId)
+extern(C) void qtd_pin(void* dId)
 {
-    (cast(QtdObject)dId).__nativeRef;
+    (cast(QtdObject)dId).__pin;
 }
 
-extern(C) void qtd_native_deref(void* dId)
+extern(C) void qtd_native_unpin(void* dId)
 {
-    (cast(QtdObject)dId).__nativeDeref;
-}
-
-
+    (cast(QtdObject)dId).__unpin;
+}
\ No newline at end of file