Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qv4executablecompilationunit_p.h
Go to the documentation of this file.
1// Copyright (C) 2019 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QV4EXECUTABLECOMPILATIONUNIT_P_H
5#define QV4EXECUTABLECOMPILATIONUNIT_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <private/qintrusivelist_p.h>
19#include <private/qqmlmetatype_p.h>
20#include <private/qqmlnullablevalue_p.h>
21#include <private/qqmlpropertycachevector_p.h>
22#include <private/qqmlrefcount_p.h>
23#include <private/qqmltype_p.h>
24#include <private/qqmltypenamecache_p.h>
25#include <private/qv4compileddata_p.h>
26#include <private/qv4identifierhash_p.h>
27
28#include <memory>
29
31
32class QQmlScriptData;
34
35namespace QV4 {
36
37class CompilationUnitMapper;
38
40{
41 Heap::String **runtimeStrings = nullptr; // Array
42
43 // pointers either to data->constants() or little-endian memory copy.
44 // We keep this member twice so that the JIT can access it via standard layout.
45 const StaticValue *constants = nullptr;
46
49 const StaticValue **imports = nullptr;
50
52 QVector<QV4::Function *> runtimeFunctions;
53 QVector<QV4::Heap::InternalClass *> runtimeBlocks;
54 mutable QVector<QV4::Heap::Object *> templateObjects;
55};
56
57static_assert(std::is_standard_layout_v<CompilationUnitRuntimeData>);
58static_assert(offsetof(CompilationUnitRuntimeData, runtimeStrings) == 0);
59static_assert(offsetof(CompilationUnitRuntimeData, constants) == sizeof(QV4::Heap::String **));
60static_assert(offsetof(CompilationUnitRuntimeData, runtimeRegularExpressions) == offsetof(CompilationUnitRuntimeData, constants) + sizeof(const StaticValue *));
61static_assert(offsetof(CompilationUnitRuntimeData, runtimeClasses) == offsetof(CompilationUnitRuntimeData, runtimeRegularExpressions) + sizeof(const StaticValue *));
62static_assert(offsetof(CompilationUnitRuntimeData, imports) == offsetof(CompilationUnitRuntimeData, runtimeClasses) + sizeof(const StaticValue *));
63
64class Q_QML_EXPORT ExecutableCompilationUnit final
66 public QQmlRefCounted<ExecutableCompilationUnit>
67{
68 Q_DISABLE_COPY_MOVE(ExecutableCompilationUnit)
69public:
72 friend struct ExecutionEngine;
73
75
76 QString finalUrlString() const { return m_compilationUnit->finalUrlString(); }
77 QString fileName() const { return m_compilationUnit->fileName(); }
78
79 QUrl url() const { return m_compilationUnit->url(); }
80 QUrl finalUrl() const { return m_compilationUnit->finalUrl(); }
81
82 QQmlRefPointer<QQmlTypeNameCache> typeNameCache() const
83 {
84 return m_compilationUnit->typeNameCache;
85 }
86
88 {
89 return &m_compilationUnit->propertyCaches;
90 }
91
93 {
94 return m_compilationUnit->rootPropertyCache();
95 }
96
97 // mapping from component object index (CompiledData::Unit object index that points to component) to identifier hash of named objects
98 // this is initialized on-demand by QQmlContextData
99 QHash<int, IdentifierHash> namedObjectsPerComponentCache;
100 inline IdentifierHash namedObjectsPerComponent(int componentObjectIndex);
101
102 int totalBindingsCount() const { return m_compilationUnit->totalBindingsCount(); }
103 int totalParserStatusCount() const { return m_compilationUnit->totalParserStatusCount(); }
104 int totalObjectCount() const { return m_compilationUnit->totalObjectCount(); }
105
107 {
108 return m_compilationUnit->resolvedType(id);
109 }
110
111 QQmlType qmlTypeForComponent(const QString &inlineComponentName = QString()) const
112 {
113 return m_compilationUnit->qmlTypeForComponent(inlineComponentName);
114 }
115
116 QMetaType metaType() const { return m_compilationUnit->qmlType.typeId(); }
117
118 int inlineComponentId(const QString &inlineComponentName) const
119 {
120 return m_compilationUnit->inlineComponentId(inlineComponentName);
121 }
122
123 // --- interface for QQmlPropertyCacheCreator
128
130 {
131 return m_compilationUnit->nativeMethodsAcceptThisObjects();
132 }
133
134 bool ignoresFunctionSignature() const { return m_compilationUnit->ignoresFunctionSignature(); }
135 bool valueTypesAreCopied() const { return m_compilationUnit->valueTypesAreCopied(); }
136 bool valueTypesAreAddressable() const { return m_compilationUnit->valueTypesAreAddressable(); }
137 bool componentsAreBound() const { return m_compilationUnit->componentsAreBound(); }
138 bool isESModule() const { return m_compilationUnit->isESModule(); }
139
140 int objectCount() const { return m_compilationUnit->objectCount(); }
141 const CompiledObject *objectAt(int index) const
142 {
143 return m_compilationUnit->objectAt(index);
144 }
145
146 Heap::Object *templateObjectAt(int index) const;
147
148 Heap::Module *instantiate();
149 const Value *resolveExport(QV4::String *exportName)
150 {
151 QVector<ResolveSetEntry> resolveSet;
152 return resolveExportRecursively(exportName, &resolveSet);
153 }
154
156 {
158 QVector<const ExecutableCompilationUnit*> exportNameSet;
159 getExportedNamesRecursively(&names, &exportNameSet);
160 names.sort();
161 auto last = std::unique(names.begin(), names.end());
162 names.erase(last, names.end());
163 return names;
164 }
165
166 void evaluate();
167 void evaluateModuleRequests();
168
169 void mark(MarkStack *markStack) const { markObjects(markStack); }
170 void markObjects(MarkStack *markStack) const;
171
172 QString bindingValueAsString(const CompiledData::Binding *binding) const;
173 double bindingValueAsNumber(const CompiledData::Binding *binding) const
174 {
175 return m_compilationUnit->bindingValueAsNumber(binding);
176 }
178 {
179 return m_compilationUnit->bindingValueAsScriptString(binding);
180 }
181
183 {
185 bool byId;
186 };
187
188 QString translateFrom(TranslationDataIndex index) const;
189
190 Heap::Module *module() const { return m_module; }
191 void setModule(Heap::Module *module) { m_module = module; }
192
193 const CompiledData::Unit *unitData() const { return m_compilationUnit->data; }
194
195 QString stringAt(uint index) const { return m_compilationUnit->stringAt(index); }
196
197 const QVector<QQmlRefPointer<QQmlScriptData>> *dependentScriptsPtr() const
198 {
199 return &m_compilationUnit->dependentScripts;
200 }
201
203 qsizetype objectIndex) const
204 {
205 return &m_compilationUnit->bindingPropertyDataPerObject.at(objectIndex);
206 }
207
208 const QQmlRefPointer<QV4::CompiledData::CompilationUnit> &baseCompilationUnit() const
209 {
210 return m_compilationUnit;
211 }
212
214 {
215 if (!runtimeStrings)
216 populate();
217
218 const auto *data = unitData();
219 return data->indexOfRootFunction != -1
220 ? runtimeFunctions[data->indexOfRootFunction]
221 : nullptr;
222 }
223
224 void populate();
225 void clear();
226
227protected:
229 { return unitData()->stringTableSize; }
230
231private:
232 friend struct ExecutionEngine;
233
234 QQmlRefPointer<CompiledData::CompilationUnit> m_compilationUnit;
235 Heap::Module *m_module = nullptr;
236
237 struct ResolveSetEntry
238 {
239 ResolveSetEntry() {}
240 ResolveSetEntry(ExecutableCompilationUnit *module, QV4::String *exportName)
241 : module(module), exportName(exportName) {}
242 ExecutableCompilationUnit *module = nullptr;
243 QV4::String *exportName = nullptr;
244 };
245
246 ExecutableCompilationUnit();
247 ExecutableCompilationUnit(QQmlRefPointer<CompiledData::CompilationUnit> &&compilationUnit);
248 ~ExecutableCompilationUnit();
249
250 static QQmlRefPointer<ExecutableCompilationUnit> create(
251 QQmlRefPointer<CompiledData::CompilationUnit> &&compilationUnit,
252 ExecutionEngine *engine);
253
254 const Value *resolveExportRecursively(QV4::String *exportName,
255 QVector<ResolveSetEntry> *resolveSet);
256
257 QUrl urlAt(int index) const { return QUrl(stringAt(index)); }
258
259 Q_NEVER_INLINE IdentifierHash createNamedObjectsPerComponent(int componentObjectIndex);
260 const CompiledData::ExportEntry *lookupNameInExportTable(
261 const CompiledData::ExportEntry *firstExportEntry, int tableSize,
262 QV4::String *name) const;
263
264 void getExportedNamesRecursively(
265 QStringList *names, QVector<const ExecutableCompilationUnit *> *exportNameSet,
266 bool includeDefaultExport = true) const;
267};
268
270{
271 auto it = namedObjectsPerComponentCache.constFind(componentObjectIndex);
273 return createNamedObjectsPerComponent(componentObjectIndex);
274 Q_ASSERT(!it->isEmpty());
275 return *it;
276}
277
278} // namespace QV4
279
281
282#endif // QV4EXECUTABLECOMPILATIONUNIT_P_H
\inmodule QtCore
Definition qmetatype.h:341
bool isEmpty() const
Definition qset.h:52
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
\inmodule QtCore
Definition qurl.h:94
QString url(FormattingOptions options=FormattingOptions(PrettyDecoded)) const
Returns a string representation of the URL.
Definition qurl.cpp:2817
const CompiledObject * objectAt(int index) const
const CompiledData::Unit * unitData() const
const CompiledData::BindingPropertyData * bindingPropertyDataPerObjectAt(qsizetype objectIndex) const
QQmlPropertyCacheVector * propertyCachesPtr()
QHash< int, IdentifierHash > namedObjectsPerComponentCache
ResolvedTypeReference * resolvedType(int id) const
void mark(MarkStack *markStack) const
const Value * resolveExport(QV4::String *exportName)
QQmlPropertyCache::ConstPtr rootPropertyCache() const
double bindingValueAsNumber(const CompiledData::Binding *binding) const
IdentifierHash namedObjectsPerComponent(int componentObjectIndex)
int inlineComponentId(const QString &inlineComponentName) const
QString bindingValueAsScriptString(const CompiledData::Binding *binding) const
QQmlType qmlTypeForComponent(const QString &inlineComponentName=QString()) const
const QVector< QQmlRefPointer< QQmlScriptData > > * dependentScriptsPtr() const
const QQmlRefPointer< QV4::CompiledData::CompilationUnit > & baseCompilationUnit() const
QQmlRefPointer< QQmlTypeNameCache > typeNameCache() const
b clear()
QSet< QString >::iterator it
Combined button and popup list for selecting options.
QVector< const QQmlPropertyData * > BindingPropertyData
#define Q_UNLIKELY(x)
#define Q_NEVER_INLINE
GLuint index
[2]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLuint name
GLuint GLuint * names
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
unsigned int quint32
Definition qtypes.h:50
ptrdiff_t qsizetype
Definition qtypes.h:165
unsigned int uint
Definition qtypes.h:34
view create()
engine evaluate("var myObject = new MyObject()")
[8]
QJSEngine engine
[0]
QVector< QV4::Heap::Object * > templateObjects
QVector< QV4::Heap::InternalClass * > runtimeBlocks