summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/corelib/kernel/qtmetamacros.h4
-rw-r--r--src/corelib/kernel/qtmochelpers.h71
-rw-r--r--src/tools/moc/generator.cpp59
-rw-r--r--src/tools/moc/generator.h1
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);