8#include <private/qv4engine_p.h>
9#include <private/qv4regexp_p.h>
10#include <private/qv4lookup_p.h>
11#include <private/qv4qmlcontext_p.h>
12#include <private/qv4identifiertable_p.h>
13#include <private/qv4objectproto_p.h>
14#include <private/qqmlengine_p.h>
15#include <private/qv4qobjectwrapper_p.h>
16#include <private/qqmlvaluetypewrapper_p.h>
17#include <private/qqmlscriptdata_p.h>
18#include <private/qv4module_p.h>
19#include <private/qv4compilationunitmapper_p.h>
20#include <private/qml_compile_hash_p.h>
21#include <private/qqmltypewrapper_p.h>
22#include <private/inlinecomponentutils_p.h>
23#include <private/qv4resolvedtypereference_p.h>
24#include <private/qv4objectiterator_p.h>
26#include <QtQml/qqmlfile.h>
27#include <QtQml/qqmlpropertymap.h>
29#include <QtCore/qdir.h>
30#include <QtCore/qstandardpaths.h>
31#include <QtCore/qfileinfo.h>
32#include <QtCore/qscopeguard.h>
33#include <QtCore/qcryptographichash.h>
34#include <QtCore/QScopedValueRollback>
38#if defined(QML_COMPILE_HASH) && defined(QML_COMPILE_HASH_LENGTH) && QML_COMPILE_HASH_LENGTH > 0
46 "Compile hash length exceeds reserved size in data structure. Please adjust and bump the format version");
48# error "QML_COMPILE_HASH must be defined for the build of QtDeclarative to ensure version checking for cache files"
55ExecutableCompilationUnit::ExecutableCompilationUnit() =
default;
57ExecutableCompilationUnit::ExecutableCompilationUnit(
58 CompiledData::CompilationUnit &&compilationUnit)
59 : CompiledData::CompilationUnit(
std::move(compilationUnit))
62ExecutableCompilationUnit::~ExecutableCompilationUnit()
88 else if (
val.isDouble())
103 <<
toString(constants[
i].asReturnedValue()).toUtf8().constData() <<
"\n";
110 engine->compilationUnits.insert(
this);
114 const quint32 stringCount = totalStringCount();
117 for (
uint i = 0;
i < stringCount; ++
i)
118 runtimeStrings[
i] =
engine->newString(stringAt(
i));
121 runtimeRegularExpressions
131 if (
data->lookupTableSize) {
133 memset(runtimeLookups, 0,
data->lookupTableSize *
sizeof(
QV4::Lookup));
140 if (
type == CompiledData::Lookup::Type_Getter)
142 else if (
type == CompiledData::Lookup::Type_Setter)
144 else if (
type == CompiledData::Lookup::Type_GlobalGetter)
146 else if (
type == CompiledData::Lookup::Type_QmlContextPropertyGetter)
148 l->
forCall = compiledLookups[
i].
mode() == CompiledData::Lookup::Mode_ForCall;
153 if (
data->jsClassTableSize) {
159 for (
uint i = 0;
i <
data->jsClassTableSize; ++
i) {
162 =
data->jsClassAt(
i, &memberCount);
165 for (
int j = 0;
j < memberCount; ++
j, ++member)
167 = runtimeClasses[
i]->addMember(
168 engine->identifierTable->asPropertyKey(
176 runtimeFunctions.resize(
data->functionTableSize);
177 static bool ignoreAotCompiledFunctions
179 || !(
engine->diskCacheOptions() & ExecutionEngine::DiskCache::AotNative);
182 = ignoreAotCompiledFunctions ?
nullptr : aotCompiledFunctions;
188 return aotFunction++;
190 aotFunction =
nullptr;
196 for (
int i = 0 ;
i < runtimeFunctions.size(); ++
i) {
199 advanceAotFunction(
i));
205 runtimeBlocks.resize(
data->blockTableSize);
206 for (
int i = 0 ;
i < runtimeBlocks.size(); ++
i) {
208 ic =
engine->internalClasses(EngineBase::Class_CallContext);
214 engine->identifierTable->asPropertyKey(runtimeStrings[localsIndices[
j]]),
216 runtimeBlocks[
i] = ic->d();
221 qDebug() <<
"=== Constant table";
223 qDebug() <<
"=== String table";
225 qDebug() <<
" " <<
i <<
":" << runtimeStrings[
i]->toQString();
226 qDebug() <<
"=== Closure table";
228 qDebug() <<
" " <<
i <<
":" << runtimeFunctions[
i]->name()->toQString();
229 qDebug() <<
"root function at index "
230 << (
data->indexOfRootFunction != -1
231 ?
data->indexOfRootFunction : 0);
234 if (
data->indexOfRootFunction != -1)
235 return runtimeFunctions[
data->indexOfRootFunction];
240Heap::Object *ExecutableCompilationUnit::templateObjectAt(
int index)
const
243 if (!templateObjects.size())
244 templateObjects.resize(
data->templateObjectTableSize);
245 Heap::Object *
o = templateObjects.at(
index);
255 for (
uint i = 0;
i <
t->size; ++
i) {
256 s = runtimeStrings[
t->stringIndexAt(
i)];
258 s = runtimeStrings[
t->rawStringIndexAt(
i)];
262 ObjectPrototype::method_freeze(
engine->functionCtor(),
nullptr, raw, 1);
264 ObjectPrototype::method_freeze(
engine->functionCtor(),
nullptr,
a, 1);
266 templateObjects[
index] =
a->objectValue()->d();
267 return templateObjects.at(
index);
270void ExecutableCompilationUnit::unlink()
273 nextCompilationUnit.remove();
278 for (
auto &ic : inlineComponentData)
281 if (runtimeLookups) {
283 runtimeLookups[
i].releasePropertyCache();
286 dependentScripts.clear();
288 typeNameCache.reset();
291 resolvedTypes.clear();
295 delete [] runtimeLookups;
296 runtimeLookups =
nullptr;
300 runtimeFunctions.clear();
302 free(runtimeStrings);
303 runtimeStrings =
nullptr;
304 delete [] runtimeRegularExpressions;
305 runtimeRegularExpressions =
nullptr;
306 free(runtimeClasses);
307 runtimeClasses =
nullptr;
312 if (runtimeStrings) {
314 if (runtimeStrings[
i])
315 runtimeStrings[
i]->mark(markStack);
317 if (runtimeRegularExpressions) {
319 Value::fromStaticValue(runtimeRegularExpressions[
i]).mark(markStack);
321 if (runtimeClasses) {
323 if (runtimeClasses[
i])
324 runtimeClasses[
i]->mark(markStack);
327 if (
f &&
f->internalClass)
328 f->internalClass->mark(markStack);
333 for (QV4::Heap::Object *
o : std::as_const(templateObjects))
337 if (runtimeLookups) {
339 runtimeLookups[
i].markObjects(markStack);
342 if (
auto mod = module())
343 mod->mark(markStack);
346IdentifierHash ExecutableCompilationUnit::createNamedObjectsPerComponent(
int componentObjectIndex)
355 Q_ASSERT(!namedObjectCache.isEmpty());
356 return *namedObjectsPerComponentCache.insert(componentObjectIndex, namedObjectCache);
364 if (
type.isInlineComponentType()) {
366 if (compilationUnit->icRootName) {
367 icRootName =
type.elementName();
368 std::swap(*compilationUnit->icRootName, icRootName);
370 compilationUnit->icRootName = std::make_unique<QString>(
type.elementName());
376 compilationUnit->icRootName.
reset();
378 std::swap(*compilationUnit->icRootName, icRootName);
384void ExecutableCompilationUnit::finalizeCompositeType(
const QQmlType &
type)
387 if (propertyCaches.needsVMEMetaObject(0)) {
389 if (
type.isValid()) {
393 finalUrl(),
this, (unitData()->
flags & CompiledData::Unit::IsSingleton)
401 auto *typeRef = resolvedTypes.value(
obj->inheritedTypeNameIndex);
403 if (
const auto compilationUnit = typeRef->compilationUnit())
404 qmlType = compilationUnit->qmlType;
406 qmlType = typeRef->type();
411 std::vector<QV4::CompiledData::InlineComponent> allICs {};
412 for (
int i=0;
i != objectCount(); ++
i) {
414 for (
auto it =
obj->inlineComponentsBegin();
it !=
obj->inlineComponentsEnd(); ++
it) {
415 allICs.push_back(*
it);
419 nodes.resize(allICs.size());
420 std::iota(nodes.begin(), nodes.end(), 0);
422 adjacencyList.resize(nodes.size());
423 fillAdjacencyListForInlineComponents(
this, adjacencyList, nodes, allICs);
424 bool hasCycle =
false;
425 auto nodesSorted = topoSort(nodes, adjacencyList, hasCycle);
430 for (
auto nodeIt = nodesSorted.rbegin(); nodeIt != nodesSorted.rend(); ++nodeIt) {
431 const auto &ic = allICs.at(nodeIt->index());
432 const int lastICRoot = ic.objectIndex;
433 for (
int i = ic.objectIndex;
i<objectCount(); ++
i) {
435 bool leftCurrentInlineComponent
439 if (leftCurrentInlineComponent)
441 const QString lastICRootName = stringAt(ic.nameIndex);
442 inlineComponentData[lastICRootName].totalBindingCount +=
obj->nBindings;
444 if (
auto *typeRef = resolvedTypes.value(
obj->inheritedTypeNameIndex)) {
445 const auto type = typeRef->type();
446 if (
type.isValid() &&
type.parserStatusCast() != -1)
447 ++inlineComponentData[lastICRootName].totalParserStatusCount;
449 ++inlineComponentData[lastICRootName].totalObjectCount;
450 if (
const auto compilationUnit = typeRef->compilationUnit()) {
454 auto &icData = inlineComponentData[lastICRootName];
455 icData.totalBindingCount += compilationUnit->totalBindingsCount();
456 icData.totalParserStatusCount += compilationUnit->totalParserStatusCount();
457 icData.totalObjectCount += compilationUnit->totalObjectCount();
463 int bindingCount = 0;
464 int parserStatusCount = 0;
471 bindingCount +=
obj->nBindings;
472 if (
auto *typeRef = resolvedTypes.value(
obj->inheritedTypeNameIndex)) {
473 const auto type = typeRef->type();
474 if (
type.isValid() &&
type.parserStatusCast() != -1)
477 if (
const auto compilationUnit = typeRef->compilationUnit()) {
479 bindingCount += compilationUnit->totalBindingsCount();
480 parserStatusCount += compilationUnit->totalParserStatusCount();
481 objectCount += compilationUnit->totalObjectCount();
487 m_totalBindingsCount = bindingCount;
488 m_totalParserStatusCount = parserStatusCount;
489 m_totalObjectCount = objectCount;
492int ExecutableCompilationUnit::totalBindingsCount()
const {
494 return m_totalBindingsCount;
495 return inlineComponentData[*icRootName].totalBindingCount;
498int ExecutableCompilationUnit::totalObjectCount()
const {
500 return m_totalObjectCount;
501 return inlineComponentData[*icRootName].totalObjectCount;
504int ExecutableCompilationUnit::totalParserStatusCount()
const {
506 return m_totalParserStatusCount;
507 return inlineComponentData[*icRootName].totalParserStatusCount;
512 if (!dependencyHasher) {
513 for (
size_t i = 0;
i <
sizeof(
data->dependencyMD5Checksum); ++
i) {
514 if (
data->dependencyMD5Checksum[
i] != 0)
520 return checksum.size() ==
sizeof(
data->dependencyMD5Checksum)
521 && memcmp(
data->dependencyMD5Checksum,
checksum.constData(),
522 sizeof(
data->dependencyMD5Checksum)) == 0;
525QQmlType ExecutableCompilationUnit::qmlTypeForComponent(
const QString &inlineComponentName)
const
527 if (inlineComponentName.
isEmpty())
529 return inlineComponentData[inlineComponentName].qmlType;
536 for (
uint i = 0;
i <
data->moduleRequestTableSize; ++
i)
543 if (isESModule() && module())
546 if (
data->indexOfRootFunction < 0)
556 setModule(module->d());
560 const auto dependentModuleUnit =
engine->loadModule(
url,
this);
563 if (dependentModuleUnit.compiled)
564 dependentModuleUnit.compiled->instantiate(
engine);
569 const uint importCount =
data->importEntryTableSize;
570 if (importCount > 0) {
572 memset(imports, 0, importCount *
sizeof(
StaticValue *));
574 for (
uint i = 0;
i < importCount; ++
i) {
577 importName = runtimeStrings[
entry.importName];
579 const auto module =
engine->loadModule(
url,
this);
580 if (module.compiled) {
581 const Value *valuePtr = module.compiled->resolveExport(importName);
584 referenceErrorMessage += importName->toQString();
585 engine->throwReferenceError(
587 entry.location.line(),
entry.location.column());
590 imports[
i] = valuePtr;
593 if (
value->isNullOrUndefined()) {
606 const auto fragment =
engine->moduleForUrl(
url,
this);
607 if (fragment.native) {
608 imports[
i] = fragment.native;
610 Scope scope(this->engine);
614 referenceErrorMessage +=
name;
618 engine->throwReferenceError(
620 entry.location.line(),
entry.location.column());
634 referenceErrorMessage += importName;
635 engine->throwReferenceError(
637 entry.location.line(),
entry.location.column());
640 for (
uint i = 0;
i <
data->indirectExportEntryTableSize; ++
i) {
642 auto dependentModule =
engine->loadModule(urlAt(
entry.moduleRequest),
this);
644 if (
const auto dependentModuleUnit = dependentModule.compiled) {
645 if (!dependentModuleUnit->resolveExport(importName)) {
646 throwReferenceError(
entry, importName->toQString());
649 }
else if (
const auto native = dependentModule.native) {
653 if (
result->isUndefined()) {
654 throwReferenceError(
entry, importName->toQString());
663const Value *ExecutableCompilationUnit::resolveExportRecursively(
669 for (
const auto &
entry: *resolveSet)
673 (*resolveSet) << ResolveSetEntry(
this, exportName);
676 return &module()->self;
680 if (
auto localExport = lookupNameInExportTable(
681 data->localExportEntryTable(),
data->localExportEntryTableSize, exportName)) {
682 ScopedString localName(scope, runtimeStrings[localExport->localName]);
683 uint index = module()->scope->internalClass->indexOfValueOrGetter(localName->toPropertyKey());
684 if (
index == UINT_MAX)
686 if (
index >= module()->scope->locals.size)
687 return &(imports[
index - module()->scope->locals.size]->asValue<
Value>());
688 return &module()->scope->locals[
index];
691 if (
auto indirectExport = lookupNameInExportTable(
692 data->indirectExportEntryTable(),
data->indirectExportEntryTableSize, exportName)) {
693 QUrl request = urlAt(indirectExport->moduleRequest);
695 ScopedString importName(scope, runtimeStrings[indirectExport->importName]);
696 if (dependentModule.compiled) {
697 return dependentModule.compiled->resolveExportRecursively(importName, resolveSet);
698 }
else if (dependentModule.native) {
700 return dependentModule.native;
704 request.setFragment(importName->toQString());
707 return fragment.native;
722 const Value *starResolution =
nullptr;
724 for (
uint i = 0;
i <
data->starExportEntryTableSize; ++
i) {
725 const CompiledData::ExportEntry &
entry =
data->starExportEntryTable()[
i];
728 const Value *resolution =
nullptr;
729 if (dependentModule.compiled) {
730 resolution = dependentModule.compiled->resolveExportRecursively(
731 exportName, resolveSet);
732 }
else if (dependentModule.native) {
734 resolution = dependentModule.native;
738 if (fragment.native) {
739 resolution = fragment.native;
743 resolution =
engine->registerNativeModule(
request,
o->get(exportName));
750 if (!starResolution) {
751 starResolution = resolution;
754 if (resolution != starResolution)
759 return starResolution;
762const CompiledData::ExportEntry *ExecutableCompilationUnit::lookupNameInExportTable(
763 const CompiledData::ExportEntry *firstExportEntry,
int tableSize,
QV4::String *
name)
const
765 const CompiledData::ExportEntry *lastExportEntry = firstExportEntry + tableSize;
766 auto matchingExport = std::lower_bound(firstExportEntry, lastExportEntry,
name, [
this](
const CompiledData::ExportEntry &lhs,
QV4::String *
name) {
767 return stringAt(lhs.exportName) <
name->toQString();
769 if (matchingExport == lastExportEntry || stringAt(matchingExport->exportName) !=
name->toQString())
771 return matchingExport;
774void ExecutableCompilationUnit::getExportedNamesRecursively(
776 bool includeDefaultExport)
const
780 exportNameSet->
append(
this);
788 for (
uint i = 0;
i <
data->localExportEntryTableSize; ++
i) {
789 const CompiledData::ExportEntry &
entry =
data->localExportEntryTable()[
i];
793 for (
uint i = 0;
i <
data->indirectExportEntryTableSize; ++
i) {
794 const CompiledData::ExportEntry &
entry =
data->indirectExportEntryTable()[
i];
798 for (
uint i = 0;
i <
data->starExportEntryTableSize; ++
i) {
799 const CompiledData::ExportEntry &
entry =
data->starExportEntryTable()[
i];
800 auto dependentModule =
engine->loadModule(urlAt(
entry.moduleRequest),
this);
801 if (dependentModule.compiled) {
802 dependentModule.compiled->getExportedNamesRecursively(
803 names, exportNameSet,
false);
804 }
else if (dependentModule.native) {
807 ObjectIterator
iterator(scope,
o, ObjectIterator::EnumerableOnly);
809 ScopedValue
val(scope,
iterator.nextPropertyNameAsString());
818void ExecutableCompilationUnit::evaluate()
825void ExecutableCompilationUnit::evaluateModuleRequests()
829 if (dependentModule.native)
836 dependentModule.compiled->evaluate();
850 auto cacheFile = std::make_unique<CompilationUnitMapper>();
853 for (
const QString &cachePath : cachePaths) {
854 CompiledData::Unit *mappedUnit = cacheFile->get(cachePath, sourceTimeStamp, errorString);
862 auto dataPtrRevert =
qScopeGuard([
this, oldData](){
863 setUnitData(oldData);
865 setUnitData(mappedUnit);
867 if (
data->sourceFileIndex != 0) {
868 if (
data->sourceFileIndex >=
data->stringTableSize + dynamicStrings.size()) {
869 *errorString =
QStringLiteral(
"QML source file index is invalid.");
873 *errorString =
QStringLiteral(
"QML source file has moved to a different location.");
878 dataPtrRevert.dismiss();
880 backingFile = std::move(cacheFile);
887bool ExecutableCompilationUnit::saveToDisk(
const QUrl &unitUrl,
QString *errorString)
889 if (
data->sourceTimeStamp == 0) {
890 *errorString =
QStringLiteral(
"Missing time stamp for source file");
901 const QString cachePath = localCacheFilePath(unitUrl);
902 if (CompiledData::SaveableUnitPointer::writeDataToFile(
903 cachePath,
data,
size, errorString)) {
904 CompilationUnitMapper::invalidate(cachePath);
917bool ResolvedTypeReferenceMap::addToHash(
922 for (
auto it = constBegin(),
end = constEnd();
it !=
end; ++
it) {
926 std::sort(
keys.begin(),
keys.end());
928 if (!this->
operator[](
key)->addToHash(
hash, checksums))
937#if QT_CONFIG(translation)
938 using namespace CompiledData;
940 switch (binding->
type()) {
941 case Binding::Type_TranslationById:
944 case Binding::Type_Translation: {
951 return CompilationUnit::bindingValueAsString(binding);
956#if !QT_CONFIG(translation)
966 const auto fileContext = [
this]() {
985bool ExecutableCompilationUnit::verifyHeader(
988 if (strncmp(unit->
magic, CompiledData::magic_str,
sizeof(unit->
magic))) {
989 *errorString =
QStringLiteral(
"Magic bytes in the header do not match");
994 *errorString =
QString::fromUtf8(
"V4 data structure version mismatch. Found %1 expected %2")
1008 if (!expectedSourceTimeStamp.
isValid())
1011 if (expectedSourceTimeStamp.
isValid()
1013 *errorString =
QStringLiteral(
"QML source file has a different time stamp than cached file.");
1018#if defined(QML_COMPILE_HASH) && defined(QML_COMPILE_HASH_LENGTH) && QML_COMPILE_HASH_LENGTH > 0
1020 *errorString =
QStringLiteral(
"QML compile hashes don't match. Found %1 expected %2")
1025 QByteArray(qml_compile_hash, QML_COMPILE_HASH_LENGTH)
1026 .toPercentEncoding()));
1030#error "QML_COMPILE_HASH must be defined for the build of QtDeclarative to ensure version checking for cache files"
DarwinBluetooth::RequestQueue requests
QByteArray toPercentEncoding(const QByteArray &exclude=QByteArray(), const QByteArray &include=QByteArray(), char percent='%') const
bool isEmpty() const noexcept
Returns true if the byte array has size 0; otherwise returns false.
QByteArray toHex(char separator='\0') const
Returns a hex encoded copy of the byte array.
static QString applicationFilePath()
Returns the file path of the application executable.
static QString translate(const char *context, const char *key, const char *disambiguation=nullptr, int n=-1)
\threadsafe
void addData(QByteArrayView data) noexcept
Adds the characters in bytes to the cryptographic hash.
QByteArray result() const
Returns the final hash value.
\inmodule QtCore\reentrant
qint64 toMSecsSinceEpoch() const
bool isValid() const
Returns true if this datetime represents a definite moment, otherwise false.
static QDir root()
Returns the root directory.
bool mkpath(const QString &dirPath) const
Creates the directory path dirPath.
\inmodule QtCore \reentrant
QDateTime lastModified() const
Returns the date and time when the file was last modified.
QString completeSuffix() const
Returns the complete suffix (extension) of the file.
void throwError(const QString &message)
Throws a run-time error (exception) with the given message.
void reserve(qsizetype size)
void append(parameter_type t)
static bool isLocalFile(const QString &url)
Returns true if url is a local file that can be opened with QFile.
static QString urlToLocalFileOrQrc(const QString &)
If url is a local file returns a path suitable for passing to QFile.
static QString writableLocation(StandardLocation type)
constexpr QStringView mid(qsizetype pos, qsizetype n=-1) const noexcept
Returns the substring of length length starting at position start in this object.
\macro QT_RESTRICTED_CAST_FROM_ASCII
static QString fromLatin1(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
static QString fromLocal8Bit(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QString arg(qlonglong a, int fieldwidth=0, int base=10, QChar fillChar=u' ') const
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
QByteArray toUtf8() const &
void setFragment(const QString &fragment, ParsingMode mode=TolerantMode)
Sets the fragment of the URL to fragment.
QString toString(FormattingOptions options=FormattingOptions(PrettyDecoded)) const
Returns a string representation of the URL.
bool saveToDisk(const std::function< bool(const Char *, quint32)> &writer) const
QHash< int, QWidget * > hash
[35multi]
list append(new Employee("Blackpool", "Stephen"))
qDeleteAll(list.begin(), list.end())
QSet< QString >::iterator it
typename C::iterator iterator
Combined button and popup list for selecting options.
std::function< QByteArray()> DependentTypesHasher
\qmltype Particle \inqmlmodule QtQuick.Particles
static void dumpConstantTable(const StaticValue *constants, uint count)
Scoped< Object > ScopedObject
void processInlinComponentType(const QQmlType &type, const QQmlRefPointer< QV4::ExecutableCompilationUnit > &compilationUnit, F &&populateIcData)
QTextStream & right(QTextStream &stream)
Calls QTextStream::setFieldAlignment(QTextStream::AlignRight) on stream and returns stream.
std::vector< std::vector< Node * > > AdjacencyList
int qstrncmp(const char *str1, const char *str2, size_t len)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
static quint32 checksum(const QByteArray &table)
GLsizei const GLfloat * v
[13]
GLboolean GLboolean GLboolean GLboolean a
[7]
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLenum GLenum GLsizei count
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLsizei const GLchar *const * path
static qreal component(const QPointF &point, unsigned int i)
QScopeGuard< typename std::decay< F >::type > qScopeGuard(F &&f)
[qScopeGuard]
QLatin1StringView QLatin1String
#define QStringLiteral(str)
Q_CORE_EXPORT QByteArray qgetenv(const char *varName)
Q_CORE_EXPORT bool qEnvironmentVariableIsSet(const char *varName) noexcept
QTextStreamManipulator qSetFieldWidth(int width)
Q_CORE_EXPORT QString qtTrId(const char *id, int n=-1)
static QString errorMessage(QUrlPrivate::ErrorCode errorCode, const QString &errorSource, qsizetype errorPosition)
#define QV4_DATA_STRUCTURE_VERSION
if(qFloatDistance(a, b)<(1<< 7))
[0]
QUrl url("example.com")
[constructor-url-reference]
QNetworkRequest request(url)
char * toString(const MyType &t)
[31]
\inmodule QtCore \reentrant
bool contains(const AT &t) const noexcept
void(* functionPtr)(const AOTCompiledContext *context, void *resultPtr, void **arguments)
union QV4::CompiledData::Binding::@543 value
quint32_le translationDataIndex
const quint32_le * localsTable() const
quint32 nameOffset() const
quint32 nameIndex() const
@ IsPartOfInlineComponent
quint32 stringIndex() const
char libraryVersionHash[QmlCompileHashSpace]
qint64_le sourceTimeStamp
IdentifierTable * identifierTable
static Function * create(ExecutionEngine *engine, ExecutableCompilationUnit *unit, const CompiledData::Function *function, const QQmlPrivate::AOTCompiledFunction *aotFunction)
PropertyKey asPropertyKey(const Heap::String *str)
ReturnedValue(* globalGetter)(Lookup *l, ExecutionEngine *engine)
ReturnedValue(* qmlContextPropertyGetter)(Lookup *l, ExecutionEngine *engine, Value *thisObject)
ReturnedValue(* getter)(Lookup *l, ExecutionEngine *engine, const Value &object)
static ReturnedValue getterGeneric(Lookup *l, ExecutionEngine *engine, const Value &object)
static bool setterGeneric(Lookup *l, ExecutionEngine *engine, Value &object, const Value &value)
static ReturnedValue globalGetterGeneric(Lookup *l, ExecutionEngine *engine)
bool(* setter)(Lookup *l, ExecutionEngine *engine, Value &object, const Value &v)
static Heap::RegExp * create(ExecutionEngine *engine, const QString &pattern, uint flags=CompiledData::RegExp::RegExp_NoFlags)
QString toQString() const