diff options
author | Shane Kearns <shane.kearns@sosco.com> | 2009-08-28 13:19:24 (GMT) |
---|---|---|
committer | Shane Kearns <shane.kearns@sosco.com> | 2009-08-28 13:35:03 (GMT) |
commit | 8d0b487437e731ff3f5f97779002a4ffb48d92ec (patch) | |
tree | c27050a2dcb5c08e56eef2ed3abcc8aab12547c1 /src/tools | |
parent | a0065aa78c9a95c707a8f814f61cc99f74d3fc30 (diff) | |
download | Qt-8d0b487437e731ff3f5f97779002a4ffb48d92ec.zip Qt-8d0b487437e731ff3f5f97779002a4ffb48d92ec.tar.gz Qt-8d0b487437e731ff3f5f97779002a4ffb48d92ec.tar.bz2 |
Enable Q_OBJECT usage across DLL boundary on Symbian OS
Symbian loader does not allow DLL import relocations in the data
section. To workaround this, added an accessor function which can be
used to get the class static metadata from the base class even if it is
in another DLL.
Changing the implementation for all platforms would cause a binary
break, so it is only used for Symbian. The Q_NO_DATA_RELOCATION macro
is used to configure this feature instead of Q_OS_SYMBIAN, because
it is possible another platform may need the same fix and Symbian may
eventually fix their DLL loader to support this feature.
Task-number: 258893
Reviewed-by: Kent Hansen
Diffstat (limited to 'src/tools')
-rw-r--r-- | src/tools/moc/generator.cpp | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp index cc6fa88..95e8386 100644 --- a/src/tools/moc/generator.cpp +++ b/src/tools/moc/generator.cpp @@ -302,13 +302,18 @@ void Generator::generateCode() } } if (!extraList.isEmpty()) { + fprintf(out, "#ifdef Q_NO_DATA_RELOCATION\n"); + fprintf(out, "static const QMetaObjectAccessor qt_meta_extradata_%s[] = {\n ", qualifiedClassNameIdentifier.constData()); + for (int i = 0; i < extraList.count(); ++i) { + fprintf(out, " %s::getStaticMetaObject,\n", extraList.at(i).constData()); + } + fprintf(out, "#else\n"); fprintf(out, "static const QMetaObject *qt_meta_extradata_%s[] = {\n ", qualifiedClassNameIdentifier.constData()); for (int i = 0; i < extraList.count(); ++i) { - if (i) - fprintf(out, ",\n "); - fprintf(out, " &%s::staticMetaObject", extraList.at(i).constData()); + fprintf(out, " &%s::staticMetaObject,\n", extraList.at(i).constData()); } - fprintf(out, ",0\n};\n\n"); + fprintf(out, "#endif //Q_NO_DATA_RELOCATION\n"); + fprintf(out, " 0\n};\n\n"); } if (isConstructible || !extraList.isEmpty()) { @@ -328,7 +333,6 @@ void Generator::generateCode() // // Finally create and initialize the static meta object // - if (isQt) fprintf(out, "const QMetaObject QObject::staticQtMetaObject = {\n"); else @@ -348,11 +352,22 @@ void Generator::generateCode() fprintf(out, "&qt_meta_extradata2_%s }\n", qualifiedClassNameIdentifier.constData()); fprintf(out, "};\n"); - if (isQt || !cdef->hasQObject) + if(isQt) + return; + +// +// Generate static meta object accessor (needed for symbian, because DLLs do not support data imports. +// + fprintf(out, "\n#ifdef Q_NO_DATA_RELOCATION\n"); + fprintf(out, "const QMetaObject &%s::getStaticMetaObject() { return staticMetaObject; }\n", cdef->qualified.constData()); + fprintf(out, "#endif //Q_NO_DATA_RELOCATION\n"); + + if (!cdef->hasQObject) return; fprintf(out, "\nconst QMetaObject *%s::metaObject() const\n{\n return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject;\n}\n", cdef->qualified.constData()); + // // Generate smart cast function // |