diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/corelib/kernel/qtmetamacros.h | 4 | ||||
| -rw-r--r-- | src/corelib/kernel/qtmochelpers.h | 71 | ||||
| -rw-r--r-- | src/tools/moc/generator.cpp | 59 | ||||
| -rw-r--r-- | src/tools/moc/generator.h | 1 |
4 files changed, 73 insertions, 62 deletions
diff --git a/src/corelib/kernel/qtmetamacros.h b/src/corelib/kernel/qtmetamacros.h index f2838c46c77..4edfbcf8378 100644 --- a/src/corelib/kernel/qtmetamacros.h +++ b/src/corelib/kernel/qtmetamacros.h @@ -122,9 +122,9 @@ QT_BEGIN_NAMESPACE template <typename MetaObjectTagType> static constexpr inline auto \ qt_staticMetaObjectContent = qt_create_metaobjectdata<MetaObjectTagType>(); \ template <typename MetaObjectTagType> static constexpr inline auto \ - qt_staticMetaObjectStaticContent = qt_staticMetaObjectContent<MetaObjectTagType>.data; \ + qt_staticMetaObjectStaticContent = qt_staticMetaObjectContent<MetaObjectTagType>.staticData;\ template <typename MetaObjectTagType> static constexpr inline auto \ - qt_staticMetaObjectRelocatingContent = qt_staticMetaObjectContent<MetaObjectTagType>.metaTypes; + qt_staticMetaObjectRelocatingContent = qt_staticMetaObjectContent<MetaObjectTagType>.relocatingData; #define QT_OBJECT_GADGET_COMMON \ QT_META_OBJECT_VARS \ diff --git a/src/corelib/kernel/qtmochelpers.h b/src/corelib/kernel/qtmochelpers.h index 7620e0341f1..a253e7a1291 100644 --- a/src/corelib/kernel/qtmochelpers.h +++ b/src/corelib/kernel/qtmochelpers.h @@ -34,6 +34,18 @@ static constexpr size_t MaxStringSize = (std::min)(size_t((std::numeric_limits<uint>::max)()), size_t((std::numeric_limits<qsizetype>::max)())); +template <uint UCount, uint SCount, size_t SSize, uint MCount> struct MetaObjectContents +{ + struct StaticContent { + uint data[UCount]; + uint stringdata[SCount]; + char strings[SSize]; + } staticData = {}; + struct RelocatingContent { + const QtPrivate::QMetaTypeInterface *metaTypes[MCount]; + } relocatingData = {}; +}; + template <int Count, size_t StringSize> struct StringData { static_assert(StringSize <= MaxStringSize, "Meta Object data is too big"); @@ -192,7 +204,7 @@ template <typename... T> struct MetaTypeList TryMetaTypeInterfaceForType<Unique, T>::type()... }; for (const QMetaTypeInterface *mt : metaTypes) - result.metaTypes[metatypeoffset++] = mt; + result.relocatingData.metaTypes[metatypeoffset++] = mt; } } }; @@ -272,7 +284,7 @@ template <typename... Block> struct UintData template <typename Unique, typename Result> constexpr void copyTo(Result &result, size_t dataoffset, uint &metatypeoffset) const { - uint *ptr = result.data.data(); + uint *ptr = result.staticData.data; size_t payloadoffset = dataoffset + headerSize(); data.forEach([&](const auto &input) { // copy the uint data @@ -528,17 +540,11 @@ template <typename F> struct RevisionedConstructorData : {} }; - -template <uint N, uint M> struct UintAndMetaTypeData -{ - std::array<uint, N> data; - std::array<const QtPrivate::QMetaTypeInterface *, M> metaTypes; -}; - -template <typename ObjectType, typename Unique, +template <typename ObjectType, typename Unique, typename Strings, typename Methods, typename Properties, typename Enums, typename Constructors = UintData<>, typename ClassInfo = detail::UintDataBlock<0, 0>> -constexpr auto metaObjectData(uint flags, const Methods &methods, const Properties &properties, +constexpr auto metaObjectData(uint flags, const Strings &strings, + const Methods &methods, const Properties &properties, const Enums &enums, const Constructors &constructors = {}, const ClassInfo &classInfo = {}) { @@ -556,54 +562,59 @@ constexpr auto metaObjectData(uint flags, const Methods &methods, const Properti + Constructors::dataSize() + ClassInfo::headerSize() // + ClassInfo::payloadSize() + 1; // empty EOD - UintAndMetaTypeData<TotalSize, MetaTypeCount> result = {}; + + MetaObjectContents<TotalSize, 2 * Strings::StringCount, Strings::StringSize, + MetaTypeCount> result = {}; + strings.writeTo(result.staticData.stringdata, result.staticData.strings); + uint dataoffset = HeaderSize; uint metatypeoffset = 0; + uint *data = result.staticData.data; - result.data[0] = QtMocConstants::OutputRevision; - result.data[1] = 0; // class name index (it's always 0) + data[0] = QtMocConstants::OutputRevision; + data[1] = 0; // class name index (it's always 0) - result.data[2] = ClassInfo::headerSize() / 2; - result.data[3] = ClassInfo::headerSize() ? dataoffset : 0; - q20::copy_n(classInfo.header, classInfo.headerSize(), result.data.data() + dataoffset); + data[2] = ClassInfo::headerSize() / 2; + data[3] = ClassInfo::headerSize() ? dataoffset : 0; + q20::copy_n(classInfo.header, classInfo.headerSize(), data + dataoffset); dataoffset += ClassInfo::headerSize(); - result.data[6] = properties.count(); - result.data[7] = properties.count() ? dataoffset : 0; + data[6] = properties.count(); + data[7] = properties.count() ? dataoffset : 0; properties.template copyTo<Unique>(result, dataoffset, metatypeoffset); dataoffset += properties.dataSize(); - result.data[8] = enums.count(); - result.data[9] = enums.count() ? dataoffset : 0; + data[8] = enums.count(); + data[9] = enums.count() ? dataoffset : 0; enums.template copyTo<Unique>(result, dataoffset, metatypeoffset); dataoffset += enums.dataSize(); // the meta type referring to the object itself - result.metaTypes[metatypeoffset++] = + result.relocatingData.metaTypes[metatypeoffset++] = QtPrivate::qTryMetaTypeInterfaceForType<void, QtPrivate::TypeAndForceComplete<ObjectType, std::true_type>>(); - result.data[4] = methods.count(); - result.data[5] = methods.count() ? dataoffset : 0; + data[4] = methods.count(); + data[5] = methods.count() ? dataoffset : 0; methods.template copyTo<Unique>(result, dataoffset, metatypeoffset); dataoffset += methods.dataSize(); - result.data[10] = constructors.count(); - result.data[11] = constructors.count() ? dataoffset : 0; + data[10] = constructors.count(); + data[11] = constructors.count() ? dataoffset : 0; constructors.template copyTo<Unique>(result, dataoffset, metatypeoffset); dataoffset += constructors.dataSize(); - result.data[12] = flags; + data[12] = flags; // count the number of signals if constexpr (Methods::count()) { constexpr uint MethodHeaderSize = Methods::headerSize() / Methods::count(); - const uint *ptr = &result.data[result.data[5]]; - const uint *end = &result.data[result.data[5] + MethodHeaderSize * Methods::count()]; + const uint *ptr = &data[data[5]]; + const uint *end = &data[data[5] + MethodHeaderSize * Methods::count()]; for ( ; ptr < end; ptr += MethodHeaderSize) { if ((ptr[4] & QtMocConstants::MethodSignal) == 0) break; - ++result.data[13]; + ++data[13]; } } diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp index 54972ade90e..43583b35528 100644 --- a/src/tools/moc/generator.cpp +++ b/src/tools/moc/generator.cpp @@ -115,7 +115,7 @@ static inline qsizetype lengthOfEscapeSequence(const QByteArray &s, qsizetype i) // opening and closing quotes are NOT included (it's up to the caller). static void printStringWithIndentation(FILE *out, const QByteArray &s) { - static constexpr int ColumnWidth = 72; + static constexpr int ColumnWidth = 68; const qsizetype len = s.size(); qsizetype idx = 0; @@ -127,7 +127,7 @@ static void printStringWithIndentation(FILE *out, const QByteArray &s) const qsizetype escapeLen = lengthOfEscapeSequence(s, backSlashPos); spanLen = qBound(spanLen, backSlashPos + escapeLen - idx, len - idx); } - fprintf(out, "\n \"%.*s\"", int(spanLen), s.constData() + idx); + fprintf(out, "\n \"%.*s\"", int(spanLen), s.constData() + idx); idx += spanLen; } while (idx < len); } @@ -271,24 +271,7 @@ void Generator::generateCode() qualifiedClassNameIdentifier.constData()); // -// Build the strings using QtMocHelpers::stringData -// - - fprintf(out, "static constexpr auto qt_meta_stringdata_%s = QtMocHelpers::stringData(", - qualifiedClassNameIdentifier.constData()); - { - char comma = 0; - for (const QByteArray &str : strings) { - if (comma) - fputc(comma, out); - printStringWithIndentation(out, str); - comma = ','; - } - } - fprintf(out, "\n);\n\n"); - -// -// build the data array +// build the strings, data, and metatype arrays // // We define a method inside the context of the class or namespace we're @@ -297,10 +280,15 @@ void Generator::generateCode() // types). fprintf(out, "template <> constexpr inline auto %s::qt_create_metaobjectdata<qt_meta_tag_%s_t>()\n" "{\n" - " namespace QMC = QtMocConstants;\n" - " QtMocHelpers::UintData qt_methods {\n", + " namespace QMC = QtMocConstants;\n", cdef->qualified.constData(), qualifiedClassNameIdentifier.constData()); + fprintf(out, " QtMocHelpers::StringRefStorage qt_stringData {"); + addStrings(strings); + fprintf(out, "\n };\n\n"); + + fprintf(out, " QtMocHelpers::UintData qt_methods {\n"); + // Build signals array first, otherwise the signal indices would be wrong addFunctions(cdef->signalList, "Signal"); addFunctions(cdef->slotList, "Slot"); @@ -344,7 +332,7 @@ void Generator::generateCode() QByteArray tagType = "qt_meta_tag_" + qualifiedClassNameIdentifier + "_t"; if (requireCompleteness) tagType = "QtMocHelpers::ForceCompleteMetaTypes<" + tagType + '>'; - fprintf(out, " return QtMocHelpers::metaObjectData<%s, %s>(%s,\n" + fprintf(out, " return QtMocHelpers::metaObjectData<%s, %s>(%s, qt_stringData,\n" " qt_methods, qt_properties, qt_enums%s);\n" "}\n", ownType, tagType.constData(), metaObjectFlags, uintDataParams); @@ -360,9 +348,9 @@ void Generator::generateCode() static constexpr auto qt_staticMetaObjectContent%s = %s::qt_create_metaobjectdata<qt_meta_tag%s_t>(); static constexpr auto qt_staticMetaObjectStaticContent%s = - qt_staticMetaObjectContent%s.data; + qt_staticMetaObjectContent%s.staticData; static constexpr auto qt_staticMetaObjectRelocatingContent%s = - qt_staticMetaObjectContent%s.metaTypes; + qt_staticMetaObjectContent%s.relocatingData; )", n, cdef->qualified.constData(), n, @@ -459,9 +447,9 @@ static constexpr auto qt_staticMetaObjectRelocatingContent%s = fprintf(out, " QtPrivate::MetaObjectForType<%s>::value,\n", purestSuperClass.constData()); else fprintf(out, " nullptr,\n"); - fprintf(out, " qt_meta_stringdata_%s.offsetsAndSizes,\n" - " qt_staticMetaObjectStaticContent%s.data(),\n", - qualifiedClassNameIdentifier.constData(), + fprintf(out, " qt_staticMetaObjectStaticContent%s.stringdata,\n" + " qt_staticMetaObjectStaticContent%s.data,\n", + metaVarNameSuffix.constData(), metaVarNameSuffix.constData()); if (hasStaticMetaCall) fprintf(out, " qt_static_metacall,\n"); @@ -473,7 +461,7 @@ static constexpr auto qt_staticMetaObjectRelocatingContent%s = else fprintf(out, " qt_meta_extradata_%s,\n", qualifiedClassNameIdentifier.constData()); - fprintf(out, " qt_staticMetaObjectRelocatingContent%s.data(),\n", + fprintf(out, " qt_staticMetaObjectRelocatingContent%s.metaTypes,\n", metaVarNameSuffix.constData()); fprintf(out, " nullptr\n} };\n\n"); @@ -497,7 +485,7 @@ static constexpr auto qt_staticMetaObjectRelocatingContent%s = // fprintf(out, "\nvoid *%s::qt_metacast(const char *_clname)\n{\n", cdef->qualified.constData()); fprintf(out, " if (!_clname) return nullptr;\n"); - fprintf(out, " if (!strcmp(_clname, qt_meta_stringdata_%s.stringdata0))\n" + fprintf(out, " if (!strcmp(_clname, qt_staticMetaObjectStaticContent<qt_meta_tag_%s_t>.strings))\n" " return static_cast<void*>(this);\n", qualifiedClassNameIdentifier.constData()); @@ -617,6 +605,17 @@ void Generator::registerByteArrayVector(const QList<QByteArray> &list) strreg(ba); } +void Generator::addStrings(const QByteArrayList &strings) +{ + char comma = 0; + for (const QByteArray &str : strings) { + if (comma) + fputc(comma, out); + printStringWithIndentation(out, str); + comma = ','; + } +} + void Generator::addFunctions(const QList<FunctionDef> &list, const char *functype) { for (const FunctionDef &f : list) { diff --git a/src/tools/moc/generator.h b/src/tools/moc/generator.h index f70c8746e81..281ea092cde 100644 --- a/src/tools/moc/generator.h +++ b/src/tools/moc/generator.h @@ -28,6 +28,7 @@ private: void registerClassInfoStrings(); void registerFunctionStrings(const QList<FunctionDef> &list); void registerByteArrayVector(const QList<QByteArray> &list); + void addStrings(const QByteArrayList &strings); void addProperties(); void addEnums(); void addFunctions(const QList<FunctionDef> &list, const char *functype); |
