# HG changeset patch # User maxter # Date 1253299923 0 # Node ID b5773ccab07d831a3dfcbaf1560d2d76d3380e50 # Parent 515d6e1c7b105388f465791360326f048d4c1f5c closer diff -r 515d6e1c7b10 -r b5773ccab07d generator/abstractmetabuilder.cpp --- 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() diff -r 515d6e1c7b10 -r b5773ccab07d generator/abstractmetalang.cpp --- 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(); diff -r 515d6e1c7b10 -r b5773ccab07d generator/abstractmetalang.h --- 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 templateArguments() const { return m_template_args; } diff -r 515d6e1c7b10 -r b5773ccab07d generator/cppheadergenerator.cpp --- 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()); diff -r 515d6e1c7b10 -r b5773ccab07d generator/cppimplgenerator.cpp --- 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((" << 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((" << 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++; } diff -r 515d6e1c7b10 -r b5773ccab07d generator/dgenerator.cpp --- 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; jindexedName(); @@ -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(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(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(type->typeEntry()))->hasVirtualDestructor()) + if ((static_cast(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()))) { diff -r 515d6e1c7b10 -r b5773ccab07d generator/generatorsetd.cpp --- 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(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 -#include - -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(qObject->userData(userDataId)); - } -}; - -#endif // QQOBJECTENTITY_H diff -r 515d6e1c7b10 -r b5773ccab07d qt/QGlobal.d --- 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; diff -r 515d6e1c7b10 -r b5773ccab07d qt/core/QMetaObject.d --- 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)); } } } diff -r 515d6e1c7b10 -r b5773ccab07d qt/d1/qt/QtdObject.d --- 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; } }