3#ifndef QV4COMPILEDDATA_P_H
4#define QV4COMPILEDDATA_P_H
19#include <QtCore/qcryptographichash.h>
20#include <QtCore/qhash.h>
21#include <QtCore/qhashfunctions.h>
22#include <QtCore/qlocale.h>
23#include <QtCore/qscopeguard.h>
24#include <QtCore/qstring.h>
25#include <QtCore/qstringlist.h>
26#include <QtCore/qurl.h>
27#include <QtCore/qvector.h>
28#include <QtCore/qversionnumber.h>
30#if QT_CONFIG(temporaryfile)
31#include <QtCore/qsavefile.h>
34#include <private/qendian_p.h>
35#include <private/qqmlnullablevalue_p.h>
36#include <private/qqmlpropertycachevector_p.h>
37#include <private/qqmlrefcount_p.h>
38#include <private/qqmltype_p.h>
39#include <private/qv4compilationunitmapper_p.h>
40#include <private/qv4staticvalue_p.h>
54#define QV4_DATA_STRUCTURE_VERSION 0x47
57class QQmlTypeNameCache;
90 bool addToHash(QCryptographicHash *hash, QHash<quintptr, QByteArray> *checksums)
const;
99template <
typename ItemType,
typename Container,
const ItemType *(Container::*IndexedGetter)(
int index)
const>
118 m_data.set<LineField>(l);
119 m_data.set<ColumnField>(c);
120 Q_ASSERT(m_data.get<LineField>() == l);
121 Q_ASSERT(m_data.get<ColumnField>() == c);
125 return m_data.get<LineField>() < other.m_data.get<LineField>()
126 || (m_data.get<LineField>() == other.m_data.get<LineField>()
127 && m_data.get<ColumnField>() < other.m_data.get<ColumnField>());
132 return QT_PREPEND_NAMESPACE(qHash)(location.m_data.data(), seed);
137 return a.m_data.data()== b.m_data.data();
140 void set(quint32 line, quint32 column)
142 m_data.set<LineField>(line);
143 m_data.set<ColumnField>(column);
153 quint32_le_bitfield_union<LineField, ColumnField> m_data;
155static_assert(
sizeof(
Location) == 4,
"Location structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
173 m_data.set<FlagsField>(flags);
174 m_data.set<StringIndexField>(stringIndex);
183 quint32_le_bitfield_union<FlagsField, StringIndexField> m_data;
185static_assert(
sizeof(
RegExp) == 4,
"RegExp structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
208 m_data.set<TypeField>(type);
209 m_data.set<ModeField>(mode);
210 m_data.set<NameIndexField>(nameIndex);
218 quint32_le_bitfield_union<TypeField, ModeField, NameIndexField> m_data;
220static_assert(
sizeof(
Lookup) == 4,
"Lookup structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
226 void set(quint32 nameOffset,
bool isAccessor)
228 m_data.set<NameOffsetField>(nameOffset);
229 m_data.set<IsAccessorField>(isAccessor ? 1 : 0);
233 bool isAccessor()
const {
return m_data.get<IsAccessorField>() != 0; }
238 quint32_le_bitfield_union<NameOffsetField, IsAccessorField> m_data;
240static_assert(
sizeof(
JSClassMember) == 4,
"JSClassMember structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
249static_assert(
sizeof(
JSClass) == 4,
"JSClass structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
258 return (
sizeof(String) + (
int(str.size()) + 1) *
sizeof(quint16) + 7) & ~0x7;
262static_assert (
sizeof (
String) == 4,
"String structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
269static_assert(
sizeof(
CodeOffsetToLineAndStatement) == 12,
"CodeOffsetToLineAndStatement structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
278 const quint32_le *
localsTable()
const {
return reinterpret_cast<
const quint32_le *>(
reinterpret_cast<
const char *>(
this) + localsOffset); }
281 int trailingData = nLocals*
sizeof (quint32);
282 size_t size = align(align(
sizeof(
Block)) + size_t(trailingData));
283 Q_ASSERT(size < INT_MAX);
288 return (a + 7) & ~size_t(7);
291static_assert(
sizeof(
Block) == 12,
"Block structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
325 void set(Flags flags, quint32 typeNameIndexOrCommonType)
327 m_data.set<IsListField>(flags.testFlag(List) ? 1 : 0);
328 m_data.set<IndexIsCommonTypeField>(flags.testFlag(Common) ? 1 : 0);
329 m_data.set<TypeNameIndexOrCommonTypeField>(typeNameIndexOrCommonType);
334 return m_data.get<IndexIsCommonTypeField>() != 0;
339 return m_data.get<IsListField>() != 0;
344 return m_data.get<TypeNameIndexOrCommonTypeField>();
351 quint32_le_bitfield_union<IndexIsCommonTypeField, IsListField, TypeNameIndexOrCommonTypeField> m_data;
353static_assert(
sizeof(
ParameterType) == 4,
"ParameterType structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
360static_assert(
sizeof(
Parameter) == 8,
"Parameter structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
398 return lineAndStatementNumberOffset() + nLineAndStatementNumbers *
sizeof(CodeOffsetToLineAndStatement);
410 return reinterpret_cast<
const Parameter *>(
411 reinterpret_cast<
const char *>(
this) + formalsOffset);
415 return reinterpret_cast<
const quint32_le *>(
416 reinterpret_cast<
const char *>(
this) + localsOffset);
420 return reinterpret_cast<
const CodeOffsetToLineAndStatement *>(
421 reinterpret_cast<
const char *>(
this) + lineAndStatementNumberOffset());
429 const quint32_le *
labelInfoTable()
const {
return reinterpret_cast<
const quint32_le *>(
reinterpret_cast<
const char *>(
this) + labelInfosOffset()); }
431 const char *
code()
const {
return reinterpret_cast<
const char *>(
this) + codeOffset; }
434 int nFormals,
int nLocals,
int nLinesAndStatements,
int nInnerfunctions,
435 int labelInfoSize,
int codeSize)
437 int trailingData = nFormals *
sizeof(Parameter)
438 + (nLocals + nInnerfunctions + labelInfoSize) *
sizeof (quint32)
439 + nLinesAndStatements *
sizeof(CodeOffsetToLineAndStatement);
440 size_t size = align(align(
sizeof(
Function)) + size_t(trailingData)) + align(codeSize);
441 Q_ASSERT(size < INT_MAX);
446 return (a + 7) & ~size_t(7);
449static_assert(
sizeof(
Function) == 56,
"Function structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
462static_assert(
sizeof(
Method) == 12,
"Method structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
473 const Method *
methodTable()
const {
return reinterpret_cast<
const Method *>(
reinterpret_cast<
const char *>(
this) + methodTableOffset); }
476 int trailingData = (nStaticMethods + nMethods) *
sizeof(
Method);
477 size_t size = align(
sizeof(
Class) + trailingData);
478 Q_ASSERT(size < INT_MAX);
483 return (a + 7) & ~size_t(7);
486static_assert(
sizeof(
Class) == 24,
"Class structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
493 int trailingData = 2 * size *
sizeof(quint32_le);
495 Q_ASSERT(s < INT_MAX);
500 return (a + 7) & ~size_t(7);
504 return reinterpret_cast<
const quint32_le *>(
reinterpret_cast<
const char *>(
this + 1));
508 return stringTable()[i];
511 return stringTable()[size + i];
514static_assert(
sizeof(
TemplateObject) == 4,
"Template object structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
524static_assert(
sizeof(
ExportEntry) == 20,
"ExportEntry structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
533static_assert(
sizeof(
ImportEntry) == 16,
"ImportEntry structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
545static_assert(
sizeof(
TranslationData) == 16,
"TranslationData structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
585 void setFlag(
Flag flag) { flagsAndType.set<FlagsField>(flagsAndType.get<FlagsField>() | flag); }
586 bool hasFlag(
Flag flag)
const {
return Flags(flagsAndType.get<FlagsField>()) & flag; }
587 Flags flags()
const {
return Flags(flagsAndType.get<FlagsField>()); }
590 Type type()
const {
return Type(flagsAndType.get<TypeField>()); }
607 const Flags bindingFlags = flags();
665 QString tmp = QLatin1String(
"\"");
666 for (
int i = 0; i < string.size(); ++i) {
667 const QChar &c = string.at(i);
668 switch (c.unicode()) {
670 tmp += QLatin1String(
"\\b");
673 tmp += QLatin1String(
"\\t");
676 tmp += QLatin1String(
"\\n");
679 tmp += QLatin1String(
"\\v");
682 tmp += QLatin1String(
"\\f");
685 tmp += QLatin1String(
"\\r");
688 tmp += QLatin1String(
"\\\"");
691 tmp += QLatin1String(
"\\\'");
694 tmp += QLatin1String(
"\\\\");
701 tmp += QLatin1Char(
'\"');
716 if (type() == Type_Boolean)
722static_assert(
sizeof(
Binding) == 24,
"Binding structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
731static_assert(
sizeof(
InlineComponent) == 12,
"InlineComponent structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
739static_assert(
sizeof(
EnumValue) == 12,
"EnumValue structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
748 return reinterpret_cast<
const EnumValue*>(
this + 1) + idx;
763static_assert(
sizeof(
Enum) == 12,
"Enum structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
773 return reinterpret_cast<
const Parameter*>(
this + 1) + idx;
788static_assert(
sizeof(
Signal) == 12,
"Signal structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
812 void setNameIndex(
int nameIndex) { nameIndexAndFinal.set<NameIndexField>(nameIndex); }
814 bool isFinal()
const {
return nameIndexAndFinal.get<FinalField>(); }
815 void setIsFinal(
bool final) { nameIndexAndFinal.set<FinalField>(final ? 1 : 0); }
819 data.set<CommonTypeOrTypeNameIndexField>(
static_cast<quint32>(t));
820 data.set<IsCommonTypeField>(
true);
825 return CommonType(data.get<CommonTypeOrTypeNameIndexField>());
831 data.set<CommonTypeOrTypeNameIndexField>(nameIndex);
832 data.set<IsCommonTypeField>(
false);
837 return data.get<IsCommonTypeField>() ? -1 : data.get<CommonTypeOrTypeNameIndexField>();
843 bool isList()
const {
return data.get<IsListField>(); }
844 void setIsList(
bool isList) { data.set<IsListField>(isList); }
846 bool isRequired()
const {
return data.get<IsRequiredField>(); }
847 void setIsRequired(
bool isRequired) { data.set<IsRequiredField>(isRequired); }
849 bool isReadOnly()
const {
return data.get<IsReadOnlyField>(); }
850 void setIsReadOnly(
bool isReadOnly) { data.set<IsReadOnlyField>(isReadOnly); }
852static_assert(
sizeof(
Property) == 12,
"Property structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
858static_assert (
sizeof(
RequiredPropertyExtraData) == 4,
"RequiredPropertyExtraData structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
877 Q_DECLARE_FLAGS(Flags,
Flag)
892 return nameIndexAndFlags.get<FlagsField>() & flag;
897 nameIndexAndFlags.set<FlagsField>(nameIndexAndFlags.get<FlagsField>() | flag);
902 nameIndexAndFlags.set<FlagsField>(0);
907 return nameIndexAndFlags.get<NameIndexField>();
912 nameIndexAndFlags.set<NameIndexField>(nameIndex);
917 return idIndexAndTargetObjectIdAndAliasToLocalAlias.get<IdIndexField>();
922 idIndexAndTargetObjectIdAndAliasToLocalAlias.set<IdIndexField>(idIndex);
928 return idIndexAndTargetObjectIdAndAliasToLocalAlias.get<AliasToLocalAliasField>();
933 idIndexAndTargetObjectIdAndAliasToLocalAlias.set<AliasToLocalAliasField>(isAliasToLocalAlias);
938 return idIndexAndTargetObjectIdAndAliasToLocalAlias.get<TargetObjectIdField>();
943 idIndexAndTargetObjectIdAndAliasToLocalAlias.set<TargetObjectIdField>(targetObjectId);
946static_assert(
sizeof(
Alias) == 20,
"Alias structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
1002 return Flags(flagsAndDefaultPropertyIsAliasAndId.get<FlagsField>());
1007 return flagsAndDefaultPropertyIsAliasAndId.get<FlagsField>() & flag;
1012 flagsAndDefaultPropertyIsAliasAndId.set<FlagsField>(
1013 flagsAndDefaultPropertyIsAliasAndId.get<FlagsField>() | flag);
1018 flagsAndDefaultPropertyIsAliasAndId.set<FlagsField>(flags);
1023 return flagsAndDefaultPropertyIsAliasAndId.get<DefaultPropertyIsAliasField>();
1028 flagsAndDefaultPropertyIsAliasAndId.set<DefaultPropertyIsAliasField>(defaultAlias);
1033 return flagsAndDefaultPropertyIsAliasAndId.get<IdField>();
1038 flagsAndDefaultPropertyIsAliasAndId.set<IdField>(id);
1042 static int calculateSizeExcludingSignalsAndEnums(
int nFunctions,
int nProperties,
int nAliases,
int nEnums,
int nSignals,
int nBindings,
int nNamedObjectsInComponent,
int nInlineComponents,
int nRequiredPropertyExtraData)
1044 return (
sizeof(Object)
1045 + nFunctions *
sizeof(quint32)
1046 + nProperties *
sizeof(Property)
1047 + nAliases *
sizeof(Alias)
1048 + nEnums *
sizeof(quint32)
1049 + nSignals *
sizeof(quint32)
1050 + nBindings *
sizeof(Binding)
1051 + nNamedObjectsInComponent *
sizeof(
int)
1052 + nInlineComponents *
sizeof(InlineComponent)
1053 + nRequiredPropertyExtraData *
sizeof(RequiredPropertyExtraData)
1060 return reinterpret_cast<
const quint32_le*>(
reinterpret_cast<
const char *>(
this) + offsetToFunctions);
1065 return reinterpret_cast<
const Property*>(
reinterpret_cast<
const char *>(
this) + offsetToProperties);
1070 return reinterpret_cast<
const Alias*>(
reinterpret_cast<
const char *>(
this) + offsetToAliases);
1075 return reinterpret_cast<
const Binding*>(
reinterpret_cast<
const char *>(
this) + offsetToBindings);
1080 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToEnums);
1081 const quint32_le offset = offsetTable[idx];
1082 return reinterpret_cast<
const Enum*>(
reinterpret_cast<
const char*>(
this) + offset);
1087 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToSignals);
1088 const quint32_le offset = offsetTable[idx];
1089 return reinterpret_cast<
const Signal*>(
reinterpret_cast<
const char*>(
this) + offset);
1099 return reinterpret_cast<
const quint32_le*>(
reinterpret_cast<
const char *>(
this) + offsetToNamedObjectsInComponent);
1104 return reinterpret_cast<
const InlineComponent*>(
reinterpret_cast<
const char *>(
this) + offsetToInlineComponents);
1114 return reinterpret_cast<
const RequiredPropertyExtraData*>(
reinterpret_cast<
const char *>(
this) + offsetToRequiredPropertyExtraData);
1154static_assert(
sizeof(
Object) == 84,
"Object structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
1175 type = 0; uriIndex = 0; qualifierIndex = 0; version = QTypeRevision::zero(); reserved = 0;
1178static_assert(
sizeof(
Import) == 20,
"Import structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
1188 return reinterpret_cast<
const Import*>((
reinterpret_cast<
const char *>(
this)) + offsetToImports + idx *
sizeof(Import));
1192 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToObjects);
1193 const quint32_le offset = offsetTable[idx];
1194 return reinterpret_cast<
const Object*>(
reinterpret_cast<
const char*>(
this) + offset);
1197static_assert(
sizeof(
QmlUnit) == 16,
"QmlUnit structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
1215 enum :
unsigned int {
1274 return reinterpret_cast<
const QmlUnit *>(
reinterpret_cast<
const char *>(
this) + offsetToQmlUnit);
1278 return reinterpret_cast<QmlUnit *>(
reinterpret_cast<
char *>(
this) + offsetToQmlUnit);
1282 return flags & Unit::IsSingleton;
1287 Q_ASSERT(idx < stringTableSize);
1288 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToStringTable);
1289 const quint32_le offset = offsetTable[idx];
1290 const String *str =
reinterpret_cast<
const String*>(
reinterpret_cast<
const char *>(
this) + offset);
1291 Q_ASSERT(str->size >= 0);
1292#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
1293 const QChar *characters =
reinterpret_cast<
const QChar *>(str + 1);
1294 if (flags & StaticData)
1295 return QString::fromRawData(characters, str->size);
1296 return QString(characters, str->size);
1298 const quint16_le *characters =
reinterpret_cast<
const quint16_le *>(str + 1);
1299 QString qstr(str->size, Qt::Uninitialized);
1300 QChar *ch = qstr.data();
1301 for (
int i = 0; i < str->size; ++i)
1302 ch[i] = QChar(quint16(characters[i]));
1308 const quint32_le *
classOffsetTable()
const {
return reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToClassTable); }
1310 const quint32_le *
blockOffsetTable()
const {
return reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToBlockTable); }
1313 const quint32_le *offsetTable = functionOffsetTable();
1314 const quint32_le offset = offsetTable[idx];
1315 return reinterpret_cast<
const Function*>(
reinterpret_cast<
const char *>(
this) + offset);
1319 const quint32_le *offsetTable = classOffsetTable();
1320 const quint32_le offset = offsetTable[idx];
1321 return reinterpret_cast<
const Class *>(
reinterpret_cast<
const char *>(
this) + offset);
1325 const quint32_le *offsetTable = templateObjectOffsetTable();
1326 const quint32_le offset = offsetTable[idx];
1327 return reinterpret_cast<
const TemplateObject *>(
reinterpret_cast<
const char *>(
this) + offset);
1331 const quint32_le *offsetTable = blockOffsetTable();
1332 const quint32_le offset = offsetTable[idx];
1333 return reinterpret_cast<
const Block *>(
reinterpret_cast<
const char *>(
this) + offset);
1336 const Lookup *
lookupTable()
const {
return reinterpret_cast<
const Lookup*>(
reinterpret_cast<
const char *>(
this) + offsetToLookupTable); }
1338 return reinterpret_cast<
const RegExp*>(
reinterpret_cast<
const char *>(
this) + offsetToRegexpTable + index *
sizeof(RegExp));
1341 return reinterpret_cast<
const quint64_le*>(
reinterpret_cast<
const char *>(
this) + offsetToConstantTable);
1345 const quint32_le *offsetTable =
reinterpret_cast<
const quint32_le *>(
reinterpret_cast<
const char *>(
this) + offsetToJSClassTable);
1346 const quint32_le offset = offsetTable[idx];
1347 const char *ptr =
reinterpret_cast<
const char *>(
this) + offset;
1349 *nMembers = klass->nMembers;
1354 return reinterpret_cast<
const TranslationData *>(
reinterpret_cast<
const char *>(
this) + offsetToTranslationTable);
1358 if ( translationTableSize == 0)
1360 return reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this))
1361 + offsetToTranslationTable
1362 + translationTableSize *
sizeof(CompiledData::TranslationData)); }
1365 if ( translationTableSize == 0)
1367 return reinterpret_cast<quint32_le*>((
reinterpret_cast<
char *>(
this))
1368 + offsetToTranslationTable
1369 + translationTableSize *
sizeof(CompiledData::TranslationData)); }
1371 const ImportEntry *
importEntryTable()
const {
return reinterpret_cast<
const ImportEntry *>(
reinterpret_cast<
const char *>(
this) + offsetToImportEntryTable); }
1376 const quint32_le *
moduleRequestTable()
const {
return reinterpret_cast<
const quint32_le*>((
reinterpret_cast<
const char *>(
this)) + offsetToModuleRequestTable); }
1378 bool verifyHeader(QDateTime expectedSourceTimeStamp, QString *errorString)
const;
1381static_assert(
sizeof(
Unit) == 200,
"Unit structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target");
1399 Iterator it = find(nameIndex);
1402 return *insert(nameIndex, loc);
1405 template <
typename CompiledObject>
1408 if (obj->inheritedTypeNameIndex != 0) {
1414 auto binding = obj->bindingsBegin();
1415 auto const bindingEnd = obj->bindingsEnd();
1416 for ( ; binding != bindingEnd; ++binding) {
1418 this->add(binding->propertyNameIndex
, binding->location
);
1421 auto ic = obj->inlineComponentsBegin();
1422 auto const icEnd = obj->inlineComponentsEnd();
1423 for (; ic != icEnd; ++ic) {
1424 this->add(ic->nameIndex
, ic->location
);
1428 template <
typename Iterator>
1431 for (; it != end; ++it)
1432 collectFromObject(*it);
1500 const QString &fileName = QString(),
const QString &finalUrlString = QString())
1515 const QString &fileName = QString(),
const QString &finalUrlString = QString())
1519#if Q_BYTE_ORDER == Q_BIG_ENDIAN
1520 delete [] constants;
1522 constants =
nullptr;
1524 m_finalUrlString.clear();
1528 qmlData = qmlUnit ? qmlUnit : data->qmlUnit();
1530#if Q_BYTE_ORDER == Q_BIG_ENDIAN
1531 StaticValue *bigEndianConstants =
new StaticValue[data->constantTableSize];
1532 const quint64_le *littleEndianConstants = data->constants();
1533 for (uint i = 0; i < data->constantTableSize; ++i)
1534 bigEndianConstants[i] = StaticValue::fromReturnedValue(littleEndianConstants[i]);
1535 constants = bigEndianConstants;
1537 constants =
reinterpret_cast<
const StaticValue*>(data->constants());
1540 m_fileName = !fileName.isEmpty() ? fileName : stringAt(data->sourceFileIndex);
1541 m_finalUrlString = !finalUrlString.isEmpty() ? finalUrlString : stringAt(data->finalUrlIndex);
1546 if (index < data->stringTableSize)
1547 return data->stringAtInternal(index);
1549 const qsizetype dynamicIndex = index - data->stringTableSize;
1550 Q_ASSERT(dynamicIndex < dynamicStrings.size());
1551 return dynamicStrings.at(dynamicIndex);
1561 case Binding::Type_Script:
1562 case Binding::Type_String:
1563 return stringAt(binding->stringIndex);
1565 return QStringLiteral(
"null");
1567 return binding->value.b ? QStringLiteral(
"true") : QStringLiteral(
"false");
1568 case Binding::Type_Number:
1569 return QString::number(bindingValueAsNumber(binding),
'g', QLocale::FloatingPointShortest);
1572 case Binding::Type_TranslationById:
1573 case Binding::Type_Translation:
1574 return stringAt(data->translations()[binding->value.translationDataIndex].stringIndex);
1583 return (binding->type() == CompiledData::Binding::Type_String)
1584 ? CompiledData::Binding::escapedString(stringAt(binding->stringIndex))
1585 : bindingValueAsString(binding);
1592 return constants[binding->value.constantValueIndex].doubleValue();
1597 const QUrl &url,
const QDateTime &sourceTimeStamp, QString *errorString);
1614 if (!m_url.isValid())
1615 m_url = QUrl(fileName());
1621 if (!m_finalUrl.isValid())
1622 m_finalUrl = QUrl(finalUrlString());
1631 return propertyCaches.isEmpty()
1632 ? QQmlPropertyCache::ConstPtr()
1633 : propertyCaches.at(0);
1641 for (uint i = 0; i <
qmlData->nObjects; ++i) {
1643 for (
auto it = object->inlineComponentsBegin(), end = object->inlineComponentsEnd();
1645 if (stringAt(it->nameIndex) == inlineComponentName)
1646 return it->objectIndex;
1654 bool verifyChecksum(
const CompiledData::DependentTypesHasher &dependencyHasher)
const;
1739 QString m_finalUrlString;
1741 mutable QQmlNullableValue<QUrl> m_url;
1742 mutable QQmlNullableValue<QUrl> m_finalUrl;
1757 template<
typename Char>
1760 const quint32_le oldFlags = mutableFlags();
1761 auto cleanup = qScopeGuard([
this, oldFlags]() { mutableFlags() = oldFlags; });
1762 mutableFlags() |= temporaryFlags;
1763 return writer(data<Char>(), size());
1766 static bool writeDataToFile(
const QString &outputFileName,
const char *data, quint32 size,
1767 QString *errorString)
1769#if QT_CONFIG(temporaryfile)
1770 QSaveFile cacheFile(outputFileName);
1771 if (!cacheFile.open(QIODevice::WriteOnly | QIODevice::Truncate)
1772 || cacheFile.write(data, size) != size
1773 || !cacheFile.commit()) {
1774 *errorString = cacheFile.errorString();
1778 errorString->clear();
1781 Q_UNUSED(outputFileName);
1782 *errorString = QStringLiteral(
"features.temporaryfile is disabled.");
1789 quint32 temporaryFlags;
1791 quint32_le &mutableFlags()
const
1793 return const_cast<
Unit *>(unit)->flags;
1796 template<
typename Char>
1797 const Char *data()
const
1799 Q_STATIC_ASSERT(
sizeof(Char) == 1);
1800 const Char *dataPtr;
1801 memcpy(&dataPtr, &unit,
sizeof(dataPtr));
1805 quint32 size()
const
1807 return unit->unitSize;
static bool writeDataToFile(const QString &outputFileName, const char *data, quint32 size, QString *errorString)
bool saveToDisk(const std::function< bool(const Char *, quint32)> &writer) const
static const char magic_str[]
Q_DECLARE_TYPEINFO(QV4::CompiledData::JSClassMember, Q_PRIMITIVE_TYPE)
#define QV4_DATA_STRUCTURE_VERSION
Q_DECLARE_OPERATORS_FOR_FLAGS(QV4::CompiledData::ParameterType::Flags)
Location referenceLocation
quint32_le propertyNameIndex
@ AliasPointsToPointerObject
void setIsAliasToLocalAlias(bool isAliasToLocalAlias)
void setTargetObjectId(quint32 targetObjectId)
quint32 targetObjectId() const
bool hasFlag(Flag flag) const
quint32_le_bitfield_union< IdIndexField, TargetObjectIdField, AliasToLocalAliasField > idIndexAndTargetObjectIdAndAliasToLocalAlias
void setNameIndex(quint32 nameIndex)
void setIdIndex(quint32 idIndex)
bool isAliasToLocalAlias() const
quint32 nameIndex() const
quint32_le localAliasIndex
quint32_le propertyNameIndex
bool isNumberBinding() const
bool isSignalHandler() const
bool isFunctionExpression() const
bool hasSignalHandlerBindingFlag() const
bool evaluatesToString() const
bool isAttachedProperty() const
quint32_le_bitfield_union< FlagsField, TypeField > flagsAndType
bool hasFlag(Flag flag) const
bool isGroupProperty() const
bool isValueBindingNoAlias() const
bool isTranslationBinding() const
bool valueAsBoolean() const
static QString escapedString(const QString &string)
bool isValueBinding() const
quint32_le translationDataIndex
quint32_le constantValueIndex
bool isValueBindingToAlias() const
Q_DECLARE_FLAGS(Flags, Flag)
@ InitializerForReadOnlyDeclaration
@ IsSignalHandlerExpression
quint32_le compiledScriptIndex
const quint32_le * localsTable() const
quint16_le sizeOfLocalTemporalDeadZone
static size_t align(size_t a)
static int calculateSize(int nLocals)
static int calculateSize(int nStaticMethods, int nMethods)
static size_t align(size_t a)
quint32_le methodTableOffset
const Method * methodTable() const
quint32_le nStaticMethods
quint32_le constructorFunction
const CompiledObject * object
const CompiledData::Unit * unit
bool operator!=(const FunctionIterator &rhs) const
bool operator==(const FunctionIterator &rhs) const
FunctionIterator(const CompiledData::Unit *unit, const CompiledObject *object, int index)
const CompiledFunction * operator->() const
QString stringAt(uint index) const
std::unique_ptr< CompilationUnitMapper > backingFile
QString bindingValueAsScriptString(const CompiledData::Binding *binding) const
QHash< QString, InlineComponentData > inlineComponentData
Q_QML_EXPORT ~CompilationUnit()
void setUnitData(const Unit *unitData, const QmlUnit *qmlUnit=nullptr, const QString &fileName=QString(), const QString &finalUrlString=QString())
int inlineComponentId(const QString &inlineComponentName) const
QMetaType metaType() const
double bindingValueAsNumber(const CompiledData::Binding *binding) const
void finalizeCompositeType(const QQmlType &type)
Q_QML_EXPORT bool saveToDisk(const QUrl &unitUrl, QString *errorString)
ResolvedTypeReference * resolvedType(int id) const
const CompiledData::Function CompiledFunction
const QQmlPrivate::AOTCompiledFunction * aotCompiledFunctions
bool valueTypesAreAssertable() const
CompilationUnit(const Unit *unitData, const QQmlPrivate::AOTCompiledFunction *aotCompiledFunctions, const QString &fileName=QString(), const QString &finalUrlString=QString())
QVector< QQmlRefPointer< QQmlScriptData > > dependentScripts
ResolvedTypeReferenceMap resolvedTypes
bool isSharedLibrary() const
bool componentsAreBound() const
bool verifyChecksum(const CompiledData::DependentTypesHasher &dependencyHasher) const
QVector< BindingPropertyData > bindingPropertyDataPerObject
QQmlType qmlTypeForComponent(const QString &inlineComponentName=QString()) const
FunctionIterator objectFunctionsBegin(const CompiledObject *object) const
QString finalUrlString() const
QQmlRefPointer< QQmlTypeNameCache > typeNameCache
FunctionIterator objectFunctionsEnd(const CompiledObject *object) const
bool nativeMethodsAcceptThisObjects() const
ListPropertyAssignBehavior listPropertyAssignBehavior() const
const Unit * unitData() const
ListPropertyAssignBehavior
const CompiledObject * objectAt(int index) const
bool valueTypesAreAddressable() const
const CompiledData::Object CompiledObject
bool ignoresFunctionSignature() const
bool valueTypesAreCopied() const
const CompiledData::Binding CompiledBinding
const CompiledData::Import * importAt(int index) const
QQmlPropertyCacheVector propertyCaches
QStringList dynamicStrings
Q_QML_EXPORT bool loadFromDisk(const QUrl &url, const QDateTime &sourceTimeStamp, QString *errorString)
QString bindingValueAsString(const CompiledData::Binding *binding) const
QQmlPropertyCache::ConstPtr rootPropertyCache() const
const StaticValue * constants
const EnumValue * enumValueAt(int idx) const
const EnumValue * enumValuesEnd() const
const EnumValue * enumValuesBegin() const
static int calculateSize(int nEnumValues)
int enumValueCount() const
quint32_le nestedFunctionIndex
quint16_le firstTemporalDeadZoneRegister
size_t labelInfosOffset() const
const quint32_le * localsTable() const
static size_t align(size_t a)
const CodeOffsetToLineAndStatement * lineAndStatementNumberTable() const
quint16_le sizeOfRegisterTemporalDeadZone
quint16_le sizeOfLocalTemporalDeadZone
const char * code() const
static int calculateSize(int nFormals, int nLocals, int nLinesAndStatements, int nInnerfunctions, int labelInfoSize, int codeSize)
size_t lineAndStatementNumberOffset() const
const Parameter * formalsTable() const
const Parameter * formalsEnd() const
const Parameter * formalsBegin() const
const quint32_le * labelInfoTable() const
quint16_le nLineAndStatementNumbers
quint32_le qualifierIndex
InlineComponentData(const QQmlType &qmlType, int objectIndex, int nameIndex)
InlineComponentData()=default
void set(quint32 nameOffset, bool isAccessor)
quint32 nameOffset() const
static int calculateSize(int nMembers)
Location(quint32 l, quint32 c)
void set(quint32 line, quint32 column)
friend size_t qHash(const Location &location, size_t seed=0)
bool operator<(const Location &other) const
friend bool operator==(const Location &a, const Location &b)
Lookup(Type type, Mode mode, quint32 nameIndex)
quint32 nameIndex() const
@ Type_QmlContextPropertyGetter
void setFlags(Flags flags)
quint32_le offsetToBindings
TableIterator< Enum, Object, &Object::enumAt > EnumIterator
EnumIterator enumsBegin() const
Q_DECLARE_FLAGS(Flags, Flag)
quint32_le offsetToAliases
quint32_le offsetToProperties
int propertyCount() const
quint32_le offsetToSignals
const RequiredPropertyExtraData * requiredPropertyExtraDataAt(int idx) const
EnumIterator enumsEnd() const
const Enum * enumAt(int idx) const
RequiredPropertyExtraDataIterator requiredPropertyExtraDataEnd() const
bool hasAliasAsDefaultProperty() const
quint32_le offsetToInlineComponents
const RequiredPropertyExtraData * requiredPropertyExtraDataTable() const
TableIterator< Signal, Object, &Object::signalAt > SignalIterator
const Binding * bindingsEnd() const
quint32_le inheritedTypeNameIndex
bool hasFlag(Flag flag) const
const Property * propertyTable() const
@ HasCustomParserBindings
@ IsPartOfInlineComponent
SignalIterator signalsBegin() const
quint32_le_bitfield_union< FlagsField, DefaultPropertyIsAliasField, IdField > flagsAndDefaultPropertyIsAliasAndId
quint32_le offsetToNamedObjectsInComponent
int namedObjectsInComponentCount() const
InlineComponentIterator inlineComponentsEnd() const
qint32_le indexOfDefaultPropertyOrAlias
int functionCount() const
const Alias * aliasTable() const
quint16_le nInlineComponents
void setObjectId(qint32 id)
quint32_le offsetToRequiredPropertyExtraData
const InlineComponent * inlineComponentAt(int idx) const
const Property * propertiesEnd() const
quint32_le nNamedObjectsInComponent
const Binding * bindingTable() const
quint16_le nRequiredPropertyExtraData
const Signal * signalAt(int idx) const
const Property * propertiesBegin() const
Location locationOfIdProperty
const quint32_le * functionOffsetTable() const
static int calculateSizeExcludingSignalsAndEnums(int nFunctions, int nProperties, int nAliases, int nEnums, int nSignals, int nBindings, int nNamedObjectsInComponent, int nInlineComponents, int nRequiredPropertyExtraData)
TableIterator< InlineComponent, Object, &Object::inlineComponentAt > InlineComponentIterator
const InlineComponent * inlineComponentTable() const
InlineComponentIterator inlineComponentsBegin() const
TableIterator< RequiredPropertyExtraData, Object, &Object::requiredPropertyExtraDataAt > RequiredPropertyExtraDataIterator
SignalIterator signalsEnd() const
const Alias * aliasesEnd() const
quint32_le offsetToFunctions
const Binding * bindingsBegin() const
RequiredPropertyExtraDataIterator requiredPropertyExtraDataBegin() const
void setHasAliasAsDefaultProperty(bool defaultAlias)
int inlineComponentCount() const
const Alias * aliasesBegin() const
const quint32_le * namedObjectsInComponentTable() const
quint32 typeNameIndexOrCommonType() const
void set(Flags flags, quint32 typeNameIndexOrCommonType)
bool indexIsCommonType() const
Q_DECLARE_FLAGS(Flags, Flag)
void setNameIndex(int nameIndex)
void setIsList(bool isList)
void setIsReadOnly(bool isReadOnly)
bool isCommonType() const
void setTypeNameIndex(int nameIndex)
quint32 nameIndex() const
void setIsFinal(bool final)
quint32_le_bitfield_union< CommonTypeOrTypeNameIndexField, IsRequiredField, IsCommonTypeField, IsListField, IsReadOnlyField > data
uint commonTypeOrTypeNameIndex() const
int typeNameIndex() const
void setIsRequired(bool isRequired)
void setCommonType(CommonType t)
quint32_le_bitfield_union< NameIndexField, FinalField > nameIndexAndFinal
CommonType commonType() const
quint32_le offsetToObjects
const Object * objectAt(int idx) const
const Import * importAt(int idx) const
quint32_le offsetToImports
quint32 stringIndex() const
RegExp(quint32 flags, quint32 stringIndex)
Q_DECLARE_FLAGS(Flags, Flag)
bool addToHash(QCryptographicHash *hash, QHash< quintptr, QByteArray > *checksums) const
int parameterCount() const
const Parameter * parametersBegin() const
static int calculateSize(int nParameters)
const Parameter * parametersEnd() const
const Parameter * parameterAt(int idx) const
static int calculateSize(const QString &str)
bool operator==(const TableIterator &rhs) const
const Container * container
const ItemType * operator->()
bool operator!=(const TableIterator &rhs) const
TableIterator(const Container *container, int index)
static int calculateSize(int size)
uint stringIndexAt(uint i) const
static size_t align(size_t a)
uint rawStringIndexAt(uint i) const
const quint32_le * stringTable() const
void collectFromObject(const CompiledObject *obj)
TypeReference & add(int nameIndex, const Location &loc)
void collectFromObjects(Iterator it, Iterator end)
TypeReference(const Location &loc)
quint32_le offsetToLookupTable
quint32_le offsetToIndirectExportEntryTable
quint32_le offsetToJSClassTable
quint32_le jsClassTableSize
quint32_le * translationContextIndex()
quint32_le offsetToTemplateObjectTable
quint32_le functionTableSize
@ ListPropertyAssignReplace
@ FunctionSignaturesIgnored
@ ListPropertyAssignReplaceIfDefault
@ ListPropertyAssignReplaceIfNotDefault
@ NativeMethodsAcceptThisObject
const TranslationData * translations() const
quint32_le offsetToRegexpTable
quint32_le importEntryTableSize
const ExportEntry * indirectExportEntryTable() const
const quint64_le * constants() const
quint32_le starExportEntryTableSize
quint32_le lookupTableSize
qint32_le indexOfRootFunction
QString stringAtInternal(uint idx) const
quint32_le offsetToLocalExportEntryTable
const quint32_le * functionOffsetTable() const
bool verifyHeader(QDateTime expectedSourceTimeStamp, QString *errorString) const
quint32_le offsetToClassTable
quint32_le classTableSize
quint32_le offsetToStringTable
quint32_le offsetToQmlUnit
const Function * functionAt(int idx) const
const TemplateObject * templateObjectAt(int idx) const
quint32_le offsetToFunctionTable
quint32_le offsetToStarExportEntryTable
const ExportEntry * starExportEntryTable() const
const Lookup * lookupTable() const
quint32_le offsetToModuleRequestTable
quint32_le translationTableSize
const RegExp * regexpAt(int index) const
const Block * blockAt(int idx) const
const ExportEntry * localExportEntryTable() const
const quint32_le * translationContextIndex() const
const quint32_le * classOffsetTable() const
const quint32_le * moduleRequestTable() const
quint32_le sourceFileIndex
quint32_le moduleRequestTableSize
quint32_le offsetToTranslationTable
quint32_le blockTableSize
quint32_le templateObjectTableSize
quint32_le localExportEntryTableSize
const Class * classAt(int idx) const
quint32_le regexpTableSize
quint32_le offsetToImportEntryTable
quint32_le stringTableSize
quint32_le constantTableSize
const ImportEntry * importEntryTable() const
qint64_le sourceTimeStamp
char dependencyMD5Checksum[16]
const QmlUnit * qmlUnit() const
quint32_le offsetToConstantTable
quint32_le offsetToBlockTable
const quint32_le * blockOffsetTable() const
quint32_le indirectExportEntryTableSize
const JSClassMember * jsClassAt(int idx, int *nMembers) const
const quint32_le * templateObjectOffsetTable() const