Mercurial > projects > qtd
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