Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
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
// Qt-Security score:significant
4
5
#
ifndef
QV4EXECUTABLECOMPILATIONUNIT_P_H
6
#
define
QV4EXECUTABLECOMPILATIONUNIT_P_H
7
8
//
9
// W A R N I N G
10
// -------------
11
//
12
// This file is not part of the Qt API. It exists purely as an
13
// implementation detail. This header file may change from version to
14
// version without notice, or even be removed.
15
//
16
// We mean it.
17
//
18
19
#
include
<
private
/
qintrusivelist_p
.
h
>
20
#
include
<
private
/
qqmlmetatype_p
.
h
>
21
#
include
<
private
/
qqmlnullablevalue_p
.
h
>
22
#
include
<
private
/
qqmlpropertycachevector_p
.
h
>
23
#
include
<
private
/
qqmlrefcount_p
.
h
>
24
#
include
<
private
/
qqmltype_p
.
h
>
25
#
include
<
private
/
qqmltypenamecache_p
.
h
>
26
#
include
<
private
/
qv4compileddata_p
.
h
>
27
#
include
<
private
/
qv4identifierhash_p
.
h
>
28
29
#
include
<
memory
>
30
31
QT_BEGIN_NAMESPACE
32
33
class
QQmlScriptData;
34
class
QQmlEnginePrivate
;
35
36
namespace
QV4
{
37
38
class
CompilationUnitMapper
;
39
40
struct
CompilationUnitRuntimeData
41
{
42
Heap
::
String
**
runtimeStrings
=
nullptr
;
// Array
43
44
// pointers either to data->constants() or little-endian memory copy.
45
// We keep this member twice so that the JIT can access it via standard layout.
46
const
StaticValue
*
constants
=
nullptr
;
47
48
QV4
::
StaticValue
*
runtimeRegularExpressions
=
nullptr
;
49
Heap
::
InternalClass
**
runtimeClasses
=
nullptr
;
50
const
StaticValue
**
imports
=
nullptr
;
51
52
QV4
::
Lookup
*
runtimeLookups
=
nullptr
;
53
QList
<
QV4
::
Function
*>
runtimeFunctions
;
54
QList
<
QV4
::
Heap
::
InternalClass
*>
runtimeBlocks
;
55
mutable
QList
<
QV4
::
Heap
::
Object
*>
templateObjects
;
56
};
57
58
static_assert
(
std
::
is_standard_layout_v
<
CompilationUnitRuntimeData
>);
59
static_assert
(offsetof(CompilationUnitRuntimeData, runtimeStrings) == 0);
60
static_assert
(
offsetof
(
CompilationUnitRuntimeData
,
constants
) ==
sizeof
(
QV4
::
Heap
::
String
**));
61
static_assert
(
offsetof
(
CompilationUnitRuntimeData
,
runtimeRegularExpressions
) ==
offsetof
(
CompilationUnitRuntimeData
,
constants
) +
sizeof
(
const
StaticValue
*));
62
static_assert
(
offsetof
(
CompilationUnitRuntimeData
,
runtimeClasses
) ==
offsetof
(
CompilationUnitRuntimeData
,
runtimeRegularExpressions
) +
sizeof
(
const
StaticValue
*));
63
static_assert
(
offsetof
(
CompilationUnitRuntimeData
,
imports
) ==
offsetof
(
CompilationUnitRuntimeData
,
runtimeClasses
) +
sizeof
(
const
StaticValue
*));
64
65
class
Q_QML_EXPORT ExecutableCompilationUnit
final
66
:
public
CompilationUnitRuntimeData
,
67
public
QQmlRefCounted
<
ExecutableCompilationUnit
>
68
{
69
Q_DISABLE_COPY_MOVE
(
ExecutableCompilationUnit
)
70
public
:
71
friend
class
QQmlRefCounted
<
ExecutableCompilationUnit
>;
72
friend
class
QQmlRefPointer
<
ExecutableCompilationUnit
>;
73
friend
struct
ExecutionEngine
;
74
75
ExecutionEngine
*
engine
=
nullptr
;
76
77
QString
finalUrlString
()
const
{
return
m_compilationUnit
->
finalUrlString
(); }
78
QString
fileName
()
const
{
return
m_compilationUnit
->
fileName
(); }
79
80
QUrl
url
()
const
{
return
m_compilationUnit
->
url
(); }
81
QUrl
finalUrl
()
const
{
return
m_compilationUnit
->
finalUrl
(); }
82
83
QQmlRefPointer
<
QQmlTypeNameCache
>
typeNameCache
()
const
84
{
85
return
m_compilationUnit
->
typeNameCache
;
86
}
87
88
QQmlPropertyCacheVector
*
propertyCachesPtr
()
89
{
90
return
&
m_compilationUnit
->
propertyCaches
;
91
}
92
93
QQmlPropertyCache
::
ConstPtr
rootPropertyCache
()
const
94
{
95
return
m_compilationUnit
->
rootPropertyCache
();
96
}
97
98
// mapping from component object index (CompiledData::Unit object index that points to component) to identifier hash of named objects
99
// this is initialized on-demand by QQmlContextData
100
QHash
<
int
,
IdentifierHash
>
namedObjectsPerComponentCache
;
101
inline
IdentifierHash
namedObjectsPerComponent
(
int
componentObjectIndex
);
102
103
ResolvedTypeReference
*
resolvedType
(
int
id
)
const
104
{
105
return
m_compilationUnit
->
resolvedType
(
id
);
106
}
107
108
QQmlType
qmlTypeForComponent
(
const
QString
&
inlineComponentName
=
QString
())
const
109
{
110
return
m_compilationUnit
->
qmlTypeForComponent
(
inlineComponentName
);
111
}
112
113
QMetaType
metaType
()
const
{
return
m_compilationUnit
->
qmlType
.
typeId
(); }
114
115
int
inlineComponentId
(
const
QString
&
inlineComponentName
)
const
116
{
117
return
m_compilationUnit
->
inlineComponentId
(
inlineComponentName
);
118
}
119
120
// --- interface for QQmlPropertyCacheCreator
121
using
CompiledObject
=
CompiledData
::
CompilationUnit
::
CompiledObject
;
122
using
CompiledFunction
=
CompiledData
::
CompilationUnit
::
CompiledFunction
;
123
using
CompiledBinding
=
CompiledData
::
CompilationUnit
::
CompiledBinding
;
124
using
IdToObjectMap
=
CompiledData
::
CompilationUnit
::
IdToObjectMap
;
125
126
bool
nativeMethodsAcceptThisObjects
()
const
127
{
128
return
m_compilationUnit
->
nativeMethodsAcceptThisObjects
();
129
}
130
131
bool
ignoresFunctionSignature
()
const
{
return
m_compilationUnit
->
ignoresFunctionSignature
(); }
132
bool
valueTypesAreCopied
()
const
{
return
m_compilationUnit
->
valueTypesAreCopied
(); }
133
bool
valueTypesAreAddressable
()
const
{
return
m_compilationUnit
->
valueTypesAreAddressable
(); }
134
bool
valueTypesAreAssertable
()
const
{
return
m_compilationUnit
->
valueTypesAreAssertable
(); }
135
bool
componentsAreBound
()
const
{
return
m_compilationUnit
->
componentsAreBound
(); }
136
bool
isESModule
()
const
{
return
m_compilationUnit
->
isESModule
(); }
137
138
int
objectCount
()
const
{
return
m_compilationUnit
->
objectCount
(); }
139
int
resolvedIndex
(
int
index
)
const
{
return
m_compilationUnit
->
resolvedIndex
(
index
); }
140
int
implicitComponentForObject
(
int
index
)
const
141
{
142
return
m_compilationUnit
->
implicitComponentForObject
(
index
);
143
}
144
const
CompiledObject
*
objectAt
(
int
index
)
const
145
{
146
return
m_compilationUnit
->
objectAt
(
index
);
147
}
148
149
bool
objectHasDeferredBindings
(
int
objectIndex
)
const
150
{
151
return
m_compilationUnit
->
objectHasDeferredBindings
(
objectIndex
);
152
}
153
bool
objectHasCustomParserBindings
(
int
objectIndex
)
const
154
{
155
return
m_compilationUnit
->
objectHasCustomParserBindings
(
objectIndex
);
156
}
157
bool
objectIsPopulatedByDeferredBinding
(
int
objectIndex
)
const
158
{
159
return
m_compilationUnit
->
objectIsPopulatedByDeferredBinding
(
objectIndex
);
160
}
161
bool
objectIsComponent
(
int
objectIndex
)
const
162
{
163
return
m_compilationUnit
->
objectIsComponent
(
objectIndex
);
164
}
165
int
objectId
(
int
objectIndex
)
const
{
return
m_compilationUnit
->
objectId
(
objectIndex
); }
166
quint32
namedObjectCountInComponent
(
int
objectIndex
)
const
167
{
168
return
m_compilationUnit
->
namedObjectCountInComponent
(
objectIndex
);
169
}
170
bool
bindingIsDeferred
(
int
objectIndex
,
int
bindingIndex
)
const
171
{
172
return
m_compilationUnit
->
bindingIsDeferred
(
objectIndex
,
bindingIndex
);
173
}
174
bool
bindingIsCustomParser
(
int
objectIndex
,
int
bindingIndex
)
const
175
{
176
return
m_compilationUnit
->
bindingIsCustomParser
(
objectIndex
,
bindingIndex
);
177
}
178
bool
bindingIsSignalHandlerExpression
(
int
objectIndex
,
int
bindingIndex
)
const
179
{
180
return
m_compilationUnit
->
bindingIsSignalHandlerExpression
(
objectIndex
,
bindingIndex
);
181
}
182
bool
bindingIsSignalHandlerObject
(
int
objectIndex
,
int
bindingIndex
)
const
183
{
184
return
m_compilationUnit
->
bindingIsSignalHandlerObject
(
objectIndex
,
bindingIndex
);
185
}
186
bool
bindingIsPropertyObserver
(
int
objectIndex
,
int
bindingIndex
)
const
187
{
188
return
m_compilationUnit
->
bindingIsPropertyObserver
(
objectIndex
,
bindingIndex
);
189
}
190
bool
bindingIsSignalHandler
(
int
objectIndex
,
int
bindingIndex
)
const
191
{
192
return
m_compilationUnit
->
bindingIsSignalHandler
(
objectIndex
,
bindingIndex
);
193
}
194
std
::
optional
<
int
>
bindingFoldedEnum
(
int
objectIndex
,
int
bindingIndex
)
const
195
{
196
return
m_compilationUnit
->
bindingFoldedEnum
(
objectIndex
,
bindingIndex
);
197
}
198
const
CompiledData
::
RuntimeBindingIndex
*
bindingApplicationOrder
(
int
objectIndex
)
const
199
{
200
return
m_compilationUnit
->
bindingApplicationOrder
(
objectIndex
);
201
}
202
203
Heap
::
Object
*
templateObjectAt
(
int
index
)
const
;
204
205
Heap
::
Module
*
instantiate
();
206
const
Value
*
resolveExport
(
QV4
::
String
*
exportName
)
const
207
{
208
QList
<
ResolveSetEntry
>
resolveSet
;
209
return
resolveExportRecursively
(
exportName
, &
resolveSet
);
210
}
211
212
QStringList
exportedNames
()
const
213
{
214
QStringList
names
;
215
QList
<
const
ExecutableCompilationUnit
*>
exportNameSet
;
216
getExportedNamesRecursively
(&
names
, &
exportNameSet
);
217
names
.
sort
();
218
auto
last
=
std
::
unique
(
names
.
begin
(),
names
.
end
());
219
names
.
erase
(
last
,
names
.
end
());
220
return
names
;
221
}
222
223
void
evaluate
();
224
void
evaluateModuleRequests
();
225
226
void
mark
(
MarkStack
*
markStack
)
const
{
markObjects
(
markStack
); }
227
void
markObjects
(
MarkStack
*
markStack
)
const
;
228
229
QString
bindingValueAsString
(
const
CompiledData
::
Binding
*
binding
)
const
;
230
double
bindingValueAsNumber
(
const
CompiledData
::
Binding
*
binding
)
const
231
{
232
return
m_compilationUnit
->
bindingValueAsNumber
(
binding
);
233
}
234
QString
bindingValueAsScriptString
(
const
CompiledData
::
Binding
*
binding
)
const
235
{
236
return
m_compilationUnit
->
bindingValueAsScriptString
(
binding
);
237
}
238
239
struct
TranslationDataIndex
240
{
241
uint
index
;
242
bool
byId
;
243
};
244
245
QString
translateFrom
(
TranslationDataIndex
index
)
const
;
246
247
Heap
::
Module
*
module
()
const
;
248
void
setModule
(
Heap
::
Module
*
module
);
249
250
ReturnedValue
value
()
const
{
return
m_valueOrModule
.
asReturnedValue
(); }
251
252
// Non-ES script values are held in the context's importedScripts array.
253
// That one uses the generic write barrier we have for JavaScript arrays.
254
// We don't need to markCustom() here.
255
void
setValue
(
const
QV4
::
Value
&
value
) {
m_valueOrModule
=
value
; }
256
257
const
CompiledData
::
Unit
*
unitData
()
const
{
return
m_compilationUnit
->
data
; }
258
259
QString
stringAt
(
uint
index
)
const
{
return
m_compilationUnit
->
stringAt
(
index
); }
260
261
const
QList
<
QQmlRefPointer
<
QQmlScriptData
>> *
dependentScriptsPtr
()
const
262
{
263
return
&
m_compilationUnit
->
dependentScripts
;
264
}
265
266
const
CompiledData
::
BindingPropertyData
*
bindingPropertyDataPerObjectAt
(
267
qsizetype
objectIndex
)
const
268
{
269
return
&
m_compilationUnit
->
bindingPropertyDataPerObject
.
at
(
objectIndex
);
270
}
271
272
const
QQmlRefPointer
<
QV4
::
CompiledData
::
CompilationUnit
> &
baseCompilationUnit
()
const
273
{
274
return
m_compilationUnit
;
275
}
276
277
QV4
::
Function
*
rootFunction
()
278
{
279
if
(!
runtimeStrings
)
280
populate
();
281
282
const
auto
*
data
=
unitData
();
283
return
data
->
indexOfRootFunction
!= -1
284
?
runtimeFunctions
[
data
->
indexOfRootFunction
]
285
:
nullptr
;
286
}
287
288
template
<
typename
Engine
=
ExecutionEngine
>
289
QQmlRefPointer
<
ExecutableCompilationUnit
>
dependentModule
(
const
QUrl
&
relative
)
const
290
{
291
auto
cu
=
static_cast
<
Engine
*>(
engine
)->
moduleForUrl
(
relative
,
this
);
292
293
// Make sure that this is actually a dependent script.
294
// Otherwise we cannot guarantee that it's available.
295
Q_ASSERT
(
cu
);
296
Q_ASSERT
(
std
::
any_of
(
m_compilationUnit
->
dependentScripts
.
cbegin
(),
297
m_compilationUnit
->
dependentScripts
.
cend
(),
298
[&](
const
auto
&
dependentScript
) {
299
return
dependentScript
->
url
==
cu
->
finalUrl
();
300
}));
301
302
return
cu
;
303
}
304
305
void
populate
();
306
void
clear
();
307
308
protected
:
309
quint32
totalStringCount
()
const
310
{
return
unitData
()->
stringTableSize
; }
311
312
private
:
313
friend
struct
ExecutionEngine
;
314
315
QQmlRefPointer
<
CompiledData
::
CompilationUnit
>
m_compilationUnit
;
316
Value
m_valueOrModule
=
QV4
::
Value
::
emptyValue
();
317
318
struct
ResolveSetEntry
319
{
320
ResolveSetEntry
() {}
321
ResolveSetEntry
(
const
ExecutableCompilationUnit
*
module
,
QV4
::
String
*
exportName
)
322
:
module
(
module
),
exportName
(
exportName
) {}
323
const
ExecutableCompilationUnit
*
module
=
nullptr
;
324
QV4
::
String
*
exportName
=
nullptr
;
325
};
326
327
ExecutableCompilationUnit
();
328
ExecutableCompilationUnit
(
QQmlRefPointer
<
CompiledData
::
CompilationUnit
> &&
compilationUnit
);
329
~
ExecutableCompilationUnit
();
330
331
static
QQmlRefPointer
<
ExecutableCompilationUnit
>
create
(
332
QQmlRefPointer
<
CompiledData
::
CompilationUnit
> &&
compilationUnit
,
333
ExecutionEngine
*
engine
);
334
335
const
Value
*
resolveExportRecursively
(
QV4
::
String
*
exportName
,
336
QList
<
ResolveSetEntry
> *
resolveSet
)
const
;
337
338
QUrl
urlAt
(
int
index
)
const
{
return
QUrl
(
stringAt
(
index
)); }
339
340
Q_NEVER_INLINE
IdentifierHash
createNamedObjectsPerComponent
(
int
componentObjectIndex
);
341
const
CompiledData
::
ExportEntry
*
lookupNameInExportTable
(
342
const
CompiledData
::
ExportEntry
*
firstExportEntry
,
int
tableSize
,
343
QV4
::
String
*
name
)
const
;
344
345
void
getExportedNamesRecursively
(
346
QStringList
*
names
,
QList
<
const
ExecutableCompilationUnit
*> *
exportNameSet
,
347
bool
includeDefaultExport
=
true
)
const
;
348
};
349
350
IdentifierHash
ExecutableCompilationUnit
::
namedObjectsPerComponent
(
int
componentObjectIndex
)
351
{
352
auto
it
=
namedObjectsPerComponentCache
.
constFind
(
componentObjectIndex
);
353
if
(
Q_UNLIKELY
(
it
==
namedObjectsPerComponentCache
.
cend
()))
354
return
createNamedObjectsPerComponent
(
componentObjectIndex
);
355
Q_ASSERT
(
it
->
isValid
());
356
return
*
it
;
357
}
358
359
}
// namespace QV4
360
361
QT_END_NAMESPACE
362
363
#
endif
// QV4EXECUTABLECOMPILATIONUNIT_P_H
QQmlIncubator::QQmlEnginePrivate
friend class QQmlEnginePrivate
Definition
qqmlincubator.h:63
QV4::CompilationUnitMapper
Definition
qv4compilationunitmapper_p.h:31
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
QV4
Definition
qjsvalue.h:24
QV4::dumpConstantTable
static void dumpConstantTable(const StaticValue *constants, uint count)
Definition
qv4executablecompilationunit.cpp:67
QV4::toString
static QString toString(QV4::ReturnedValue v)
Definition
qv4executablecompilationunit.cpp:52
QV4::CompilationUnitRuntimeData
Definition
qv4executablecompilationunit_p.h:41
QV4::CompilationUnitRuntimeData::templateObjects
QList< QV4::Heap::Object * > templateObjects
Definition
qv4executablecompilationunit_p.h:55
QV4::CompilationUnitRuntimeData::runtimeClasses
Heap::InternalClass ** runtimeClasses
Definition
qv4executablecompilationunit_p.h:49
QV4::CompilationUnitRuntimeData::constants
const StaticValue * constants
Definition
qv4executablecompilationunit_p.h:46
QV4::CompilationUnitRuntimeData::imports
const StaticValue ** imports
Definition
qv4executablecompilationunit_p.h:50
QV4::CompilationUnitRuntimeData::runtimeRegularExpressions
QV4::StaticValue * runtimeRegularExpressions
Definition
qv4executablecompilationunit_p.h:48
QV4::CompilationUnitRuntimeData::runtimeBlocks
QList< QV4::Heap::InternalClass * > runtimeBlocks
Definition
qv4executablecompilationunit_p.h:54
QV4::CompilationUnitRuntimeData::runtimeStrings
Heap::String ** runtimeStrings
Definition
qv4executablecompilationunit_p.h:42
QV4::CompilationUnitRuntimeData::runtimeFunctions
QList< QV4::Function * > runtimeFunctions
Definition
qv4executablecompilationunit_p.h:53
QV4::CompilationUnitRuntimeData::runtimeLookups
QV4::Lookup * runtimeLookups
Definition
qv4executablecompilationunit_p.h:52
qtdeclarative
src
qml
jsruntime
qv4executablecompilationunit_p.h
Generated on
for Qt by
1.18.0