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
qv4lookup_p.h
Go to the documentation of this file.
1
// Copyright (C) 2016 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
#
ifndef
QV4LOOKUP_H
5
#
define
QV4LOOKUP_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
"qv4engine_p.h"
19
#
include
"qv4object_p.h"
20
#
include
"qv4internalclass_p.h"
21
#
include
"qv4qmlcontext_p.h"
22
#
include
<
private
/
qqmltypewrapper_p
.
h
>
23
#
include
<
private
/
qv4mm_p
.
h
>
24
25
QT_BEGIN_NAMESPACE
26
27
namespace
QV4
{
28
29
namespace
Heap
{
30
struct
QObjectMethod;
31
}
32
33
template
<
typename
T
,
int
PhantomTag
>
34
using
HeapObjectWrapper
=
WriteBarrier
::
HeapObjectWrapper
<
T
,
PhantomTag
>;
35
36
// Note: We cannot hide the copy ctor and assignment operator of this class because it needs to
37
// be trivially copyable. But you should never ever copy it. There are refcounted members
38
// in there.
39
struct
Q_QML_EXPORT
Lookup
{
40
enum
class
Call
:
quint16
{
41
ContextGetterContextObjectMethod
,
42
ContextGetterContextObjectProperty
,
43
ContextGetterGeneric
,
44
ContextGetterIdObject
,
45
ContextGetterIdObjectInParentContext
,
46
ContextGetterInGlobalObject
,
47
ContextGetterInParentContextHierarchy
,
48
ContextGetterScopeObjectMethod
,
49
ContextGetterScopeObjectProperty
,
50
ContextGetterScopeObjectPropertyFallback
,
51
ContextGetterScript
,
52
ContextGetterSingleton
,
53
ContextGetterType
,
54
ContextGetterValueSingleton
,
55
56
GlobalGetterGeneric
,
57
GlobalGetterProto
,
58
GlobalGetterProtoAccessor
,
59
60
Getter0Inline
,
61
Getter0InlineGetter0Inline
,
62
Getter0InlineGetter0MemberData
,
63
Getter0MemberData
,
64
Getter0MemberDataGetter0MemberData
,
65
GetterAccessor
,
66
GetterAccessorPrimitive
,
67
GetterEnum
,
68
GetterEnumValue
,
69
GetterGeneric
,
70
GetterIndexed
,
71
GetterProto
,
72
GetterProtoAccessor
,
73
GetterProtoAccessorTwoClasses
,
74
GetterProtoPrimitive
,
75
GetterProtoTwoClasses
,
76
GetterQObjectAttached
,
77
GetterQObjectMethod
,
78
GetterQObjectMethodFallback
,
79
GetterQObjectProperty
,
80
GetterQObjectPropertyFallback
,
81
GetterSingletonMethod
,
82
GetterSingletonProperty
,
83
GetterStringLength
,
84
GetterValueTypeProperty
,
85
86
Setter0Inline
,
87
Setter0MemberData
,
88
Setter0Setter0
,
89
SetterArrayLength
,
90
SetterGeneric
,
91
SetterInsert
,
92
SetterQObjectProperty
,
93
SetterQObjectPropertyFallback
,
94
SetterValueTypeProperty
,
95
};
96
97
// NOTE: gc assumes the first two entries in the struct are pointers to heap objects or null
98
// or that the least significant bit is 1 (see the Lookup::markObjects function)
99
union
{
100
struct
{
101
Heap
::
Base
*
h1
;
102
Heap
::
Base
*
h2
;
103
quintptr
unused
;
104
quintptr
unused2
;
105
}
markDef
;
106
struct
{
107
HeapObjectWrapper
<
Heap
::
InternalClass
, 0>
ic
;
108
quintptr
unused
;
109
uint
index
;
110
uint
offset
;
111
}
objectLookup
;
112
struct
{
113
quintptr
protoId
;
114
quintptr
_unused
;
115
const
Value
*
data
;
116
const
QtPrivate
::
QMetaTypeInterface
*
metaType
;
117
}
protoLookup
;
118
struct
{
119
HeapObjectWrapper
<
Heap
::
InternalClass
, 1>
ic
;
120
HeapObjectWrapper
<
Heap
::
InternalClass
, 2>
ic2
;
121
uint
offset
;
122
uint
offset2
;
123
}
objectLookupTwoClasses
;
124
struct
{
125
quintptr
protoId
;
126
quintptr
protoId2
;
127
const
Value
*
data
;
128
const
Value
*
data2
;
129
}
protoLookupTwoClasses
;
130
struct
{
131
// Make sure the next two values are in sync with protoLookup
132
quintptr
protoId
;
133
HeapObjectWrapper
<
Heap
::
Object
, 3>
proto
;
134
const
Value
*
data
;
135
quintptr
type
;
136
}
primitiveLookup
;
137
struct
{
138
HeapObjectWrapper
<
Heap
::
InternalClass
, 4>
newClass
;
139
quintptr
protoId
;
140
uint
offset
;
141
uint
unused
;
142
}
insertionLookup
;
143
struct
{
144
quintptr
_unused
;
145
quintptr
_unused2
;
146
uint
index
;
147
uint
unused
;
148
}
indexedLookup
;
149
struct
{
150
HeapObjectWrapper
<
Heap
::
InternalClass
, 5>
ic
;
151
HeapObjectWrapper
<
Heap
::
InternalClass
, 6>
qmlTypeIc
;
// only used when lookup goes through QQmlTypeWrapper
152
const
QQmlPropertyCache
*
propertyCache
;
153
const
QQmlPropertyData
*
propertyData
;
154
}
qobjectLookup
;
155
struct
{
156
HeapObjectWrapper
<
Heap
::
InternalClass
, 7>
ic
;
157
HeapObjectWrapper
<
Heap
::
QObjectMethod
, 8>
method
;
158
const
QQmlPropertyCache
*
propertyCache
;
159
const
QQmlPropertyData
*
propertyData
;
160
}
qobjectMethodLookup
;
161
struct
{
162
// NB: None of this is actually cache-able. The metaobject may change at any time.
163
// We invalidate this data every time the lookup is invoked and thereby force a
164
// re-initialization next time.
165
166
quintptr
metaObject
;
// a (const QMetaObject* | 1) or nullptr
167
quintptr
metaType
;
// a (const QtPrivate::QMetaTypeInterface* | 1) or nullptr
168
169
// If it was negative it would be invalid. So 31 bits are enough
170
uint
coreIndex
: 31;
171
172
// isConstant for getter lookups, isResettable for setter ones
173
uint
isConstantOrResettable
: 1;
174
175
int
notifyIndex
;
176
}
qobjectFallbackLookup
;
177
struct
{
178
HeapObjectWrapper
<
Heap
::
InternalClass
, 9>
ic
;
179
quintptr
metaObject
;
// a (const QMetaObject* & 1) or nullptr
180
const
QtPrivate
::
QMetaTypeInterface
*
metaType
;
// cannot use QMetaType; class must be trivial
181
quint16
coreIndex
;
182
bool
isFunction
;
183
bool
isEnum
;
184
}
qgadgetLookup
;
185
struct
{
186
quintptr
unused1
;
187
quintptr
unused2
;
188
int
scriptIndex
;
189
}
qmlContextScriptLookup
;
190
struct
{
191
HeapObjectWrapper
<
Heap
::
Base
, 10>
singletonObject
;
192
quintptr
unused2
;
193
QV4
::
ReturnedValue
singletonValue
;
194
}
qmlContextSingletonLookup
;
195
struct
{
196
quintptr
unused1
;
197
quintptr
unused2
;
198
int
objectId
;
199
}
qmlContextIdObjectLookup
;
200
struct
{
201
// Same as protoLookup, as used for global lookups
202
quintptr
reserved1
;
203
quintptr
reserved2
;
204
quintptr
reserved3
;
205
Call
getterTrampoline
;
206
}
qmlContextGlobalLookup
;
207
struct
{
208
HeapObjectWrapper
<
Heap
::
Base
, 11>
qmlTypeWrapper
;
209
quintptr
unused2
;
210
}
qmlTypeLookup
;
211
struct
{
212
HeapObjectWrapper
<
Heap
::
InternalClass
, 12>
ic
;
213
quintptr
unused
;
214
ReturnedValue
encodedEnumValue
;
215
const
QtPrivate
::
QMetaTypeInterface
*
metaType
;
216
}
qmlEnumValueLookup
;
217
struct
{
218
HeapObjectWrapper
<
Heap
::
InternalClass
, 13>
ic
;
219
HeapObjectWrapper
<
Heap
::
Object
, 14>
qmlEnumWrapper
;
220
}
qmlEnumWrapperLookup
;
221
};
222
223
Call
call
;
224
quint16
padding
;
225
226
uint
nameIndex
: 28;
// Same number of bits we store in the compilation unit for name indices
227
uint
forCall
: 1;
// Whether we are looking up a value in order to call it right away
228
uint
asVariant
: 1;
// Whether all types are to be converted from/to QVariant
229
uint
reserved
: 2;
230
231
ReturnedValue
resolveGetter
(
ExecutionEngine
*
engine
,
const
Object
*
object
);
232
ReturnedValue
resolvePrimitiveGetter
(
ExecutionEngine
*
engine
,
const
Value
&
object
);
233
ReturnedValue
resolveGlobalGetter
(
ExecutionEngine
*
engine
);
234
void
resolveProtoGetter
(
PropertyKey
name
,
const
Heap
::
Object
*
proto
);
235
236
static
ReturnedValue
getterGeneric
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
const
Value
&
object
);
237
static
ReturnedValue
getterTwoClasses
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
const
Value
&
object
);
238
static
ReturnedValue
getterFallback
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
const
Value
&
object
);
239
240
static
ReturnedValue
getter0MemberData
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
const
Value
&
object
);
241
static
ReturnedValue
getter0Inline
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
const
Value
&
object
);
242
static
ReturnedValue
getterProto
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
const
Value
&
object
);
243
static
ReturnedValue
getter0Inlinegetter0Inline
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
const
Value
&
object
);
244
static
ReturnedValue
getter0Inlinegetter0MemberData
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
const
Value
&
object
);
245
static
ReturnedValue
getter0MemberDatagetter0MemberData
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
const
Value
&
object
);
246
static
ReturnedValue
getterProtoTwoClasses
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
const
Value
&
object
);
247
static
ReturnedValue
getterAccessor
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
const
Value
&
object
);
248
static
ReturnedValue
getterProtoAccessor
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
const
Value
&
object
);
249
static
ReturnedValue
getterProtoAccessorTwoClasses
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
const
Value
&
object
);
250
static
ReturnedValue
getterIndexed
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
const
Value
&
object
);
251
static
ReturnedValue
getterQObject
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
const
Value
&
object
);
252
static
ReturnedValue
getterQObjectMethod
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
const
Value
&
object
);
253
static
ReturnedValue
getterFallbackMethod
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
const
Value
&
object
);
254
255
static
ReturnedValue
getterValueType
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
const
Value
&
object
);
256
257
static
ReturnedValue
primitiveGetterProto
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
const
Value
&
object
);
258
static
ReturnedValue
primitiveGetterAccessor
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
const
Value
&
object
);
259
static
ReturnedValue
stringLengthGetter
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
const
Value
&
object
);
260
261
static
ReturnedValue
globalGetterGeneric
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
);
262
static
ReturnedValue
globalGetterProto
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
);
263
static
ReturnedValue
globalGetterProtoAccessor
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
);
264
265
bool
resolveSetter
(
ExecutionEngine
*
engine
,
Object
*
object
,
const
Value
&
value
);
266
static
bool
setterGeneric
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
Value
&
object
,
const
Value
&
value
);
267
Q_NEVER_INLINE
static
bool
setterTwoClasses
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
Value
&
object
,
const
Value
&
value
);
268
static
bool
setterFallback
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
Value
&
object
,
const
Value
&
value
);
269
static
bool
setter0MemberData
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
Value
&
object
,
const
Value
&
value
);
270
static
bool
setter0Inline
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
Value
&
object
,
const
Value
&
value
);
271
static
bool
setter0setter0
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
Value
&
object
,
const
Value
&
value
);
272
static
bool
setterInsert
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
Value
&
object
,
const
Value
&
value
);
273
static
bool
setterQObject
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
Value
&
object
,
const
Value
&
value
);
274
static
bool
arrayLengthSetter
(
Lookup
*
lookup
,
ExecutionEngine
*
engine
,
Value
&
object
,
const
Value
&
value
);
275
276
void
markObjects
(
MarkStack
*
stack
) {
277
if
(
markDef
.
h1
&& !(
reinterpret_cast
<
quintptr
>(
markDef
.
h1
) & 1))
278
markDef
.
h1
->
mark
(
stack
);
279
if
(
markDef
.
h2
&& !(
reinterpret_cast
<
quintptr
>(
markDef
.
h2
) & 1))
280
markDef
.
h2
->
mark
(
stack
);
281
}
282
283
ReturnedValue
contextGetter
(
ExecutionEngine
*
engine
,
Value
*
base
)
284
{
285
switch
(
call
) {
286
case
Call
::
ContextGetterContextObjectMethod
:
287
return
QQmlContextWrapper
::
lookupContextObjectMethod
(
this
,
engine
,
base
);
288
case
Call
::
ContextGetterContextObjectProperty
:
289
return
QQmlContextWrapper
::
lookupContextObjectProperty
(
this
,
engine
,
base
);
290
case
Call
::
ContextGetterGeneric
:
291
return
QQmlContextWrapper
::
resolveQmlContextPropertyLookupGetter
(
this
,
engine
,
base
);
292
case
Call
::
ContextGetterIdObject
:
293
return
QQmlContextWrapper
::
lookupIdObject
(
this
,
engine
,
base
);
294
case
Call
::
ContextGetterIdObjectInParentContext
:
295
return
QQmlContextWrapper
::
lookupIdObjectInParentContext
(
this
,
engine
,
base
);
296
case
Call
::
ContextGetterInGlobalObject
:
297
return
QQmlContextWrapper
::
lookupInGlobalObject
(
this
,
engine
,
base
);
298
case
Call
::
ContextGetterInParentContextHierarchy
:
299
return
QQmlContextWrapper
::
lookupInParentContextHierarchy
(
this
,
engine
,
base
);
300
case
Call
::
ContextGetterScopeObjectMethod
:
301
return
QQmlContextWrapper
::
lookupScopeObjectMethod
(
this
,
engine
,
base
);
302
case
Call
::
ContextGetterScopeObjectProperty
:
303
return
QQmlContextWrapper
::
lookupScopeObjectProperty
(
this
,
engine
,
base
);
304
case
Call
::
ContextGetterSingleton
:
305
return
QQmlContextWrapper
::
lookupSingleton
(
this
,
engine
,
base
);
306
case
Call
::
ContextGetterScript
:
307
return
QQmlContextWrapper
::
lookupScript
(
this
,
engine
,
base
);
308
case
Call
::
ContextGetterType
:
309
return
QQmlContextWrapper
::
lookupType
(
this
,
engine
,
base
);
310
case
Call
::
ContextGetterValueSingleton
:
311
return
QQmlContextWrapper
::
lookupValueSingleton
(
this
,
engine
,
base
);
312
default
:
313
break
;
314
}
315
316
Q_UNREACHABLE_RETURN
(
Encode
::
undefined
());
317
}
318
319
static
ReturnedValue
doCallGlobal
(
Call
call
,
Lookup
*
lookup
,
ExecutionEngine
*
engine
)
320
{
321
switch
(
call
) {
322
case
Call
::
GlobalGetterGeneric
:
323
return
globalGetterGeneric
(
lookup
,
engine
);
324
case
Call
::
GlobalGetterProto
:
325
return
globalGetterProto
(
lookup
,
engine
);
326
case
Call
::
GlobalGetterProtoAccessor
:
327
return
globalGetterProtoAccessor
(
lookup
,
engine
);
328
default
:
329
break
;
330
}
331
332
Q_UNREACHABLE_RETURN
(
Encode
::
undefined
());
333
}
334
335
ReturnedValue
globalGetter
(
ExecutionEngine
*
engine
)
336
{
337
return
doCallGlobal
(
call
,
this
,
engine
);
338
}
339
340
ReturnedValue
getter
(
ExecutionEngine
*
engine
,
const
Value
&
object
)
341
{
342
switch
(
call
) {
343
case
Call
::
Getter0Inline
:
344
return
getter0Inline
(
this
,
engine
,
object
);
345
case
Call
::
Getter0InlineGetter0Inline
:
346
return
getter0Inlinegetter0Inline
(
this
,
engine
,
object
);
347
case
Call
::
Getter0InlineGetter0MemberData
:
348
return
getter0Inlinegetter0MemberData
(
this
,
engine
,
object
);
349
case
Call
::
Getter0MemberData
:
350
return
getter0MemberData
(
this
,
engine
,
object
);
351
case
Call
::
Getter0MemberDataGetter0MemberData
:
352
return
getter0MemberDatagetter0MemberData
(
this
,
engine
,
object
);
353
case
Call
::
GetterAccessor
:
354
return
getterAccessor
(
this
,
engine
,
object
);
355
case
Call
::
GetterAccessorPrimitive
:
356
return
primitiveGetterAccessor
(
this
,
engine
,
object
);
357
case
Call
::
GetterEnumValue
:
358
return
QQmlTypeWrapper
::
lookupEnumValue
(
this
,
engine
,
object
);
359
case
Call
::
GetterQObjectPropertyFallback
:
360
return
getterFallback
(
this
,
engine
,
object
);
361
case
Call
::
GetterQObjectMethodFallback
:
362
return
getterFallbackMethod
(
this
,
engine
,
object
);
363
case
Call
::
GetterGeneric
:
364
return
getterGeneric
(
this
,
engine
,
object
);
365
case
Call
::
GetterIndexed
:
366
return
getterIndexed
(
this
,
engine
,
object
);
367
case
Call
::
GetterProto
:
368
return
getterProto
(
this
,
engine
,
object
);
369
case
Call
::
GetterProtoAccessor
:
370
return
getterProtoAccessor
(
this
,
engine
,
object
);
371
case
Call
::
GetterProtoAccessorTwoClasses
:
372
return
getterProtoAccessorTwoClasses
(
this
,
engine
,
object
);
373
case
Call
::
GetterProtoPrimitive
:
374
return
primitiveGetterProto
(
this
,
engine
,
object
);
375
case
Call
::
GetterProtoTwoClasses
:
376
return
getterProtoTwoClasses
(
this
,
engine
,
object
);
377
case
Call
::
GetterQObjectProperty
:
378
return
getterQObject
(
this
,
engine
,
object
);
379
case
Call
::
GetterQObjectAttached
:
380
// TODO: more specific implementation for interpreter / JIT
381
return
getterGeneric
(
this
,
engine
,
object
);
382
case
Call
::
GetterQObjectMethod
:
383
return
getterQObjectMethod
(
this
,
engine
,
object
);
384
case
Call
::
GetterSingletonMethod
:
385
return
QQmlTypeWrapper
::
lookupSingletonMethod
(
this
,
engine
,
object
);
386
case
Call
::
GetterSingletonProperty
:
387
return
QQmlTypeWrapper
::
lookupSingletonProperty
(
this
,
engine
,
object
);
388
case
Call
::
GetterStringLength
:
389
return
stringLengthGetter
(
this
,
engine
,
object
);
390
case
Call
::
GetterValueTypeProperty
:
391
return
getterValueType
(
this
,
engine
,
object
);
392
case
Call
::
GetterEnum
:
393
return
QQmlTypeWrapper
::
lookupEnum
(
this
,
engine
,
object
);
394
default
:
395
break
;
396
}
397
398
Q_UNREACHABLE_RETURN
(
Encode
::
undefined
());
399
}
400
401
bool
setter
(
ExecutionEngine
*
engine
,
Value
&
object
,
const
Value
&
value
)
402
{
403
switch
(
call
) {
404
case
Call
::
Setter0Inline
:
405
return
setter0Inline
(
this
,
engine
,
object
,
value
);
406
case
Call
::
Setter0MemberData
:
407
return
setter0MemberData
(
this
,
engine
,
object
,
value
);
408
case
Call
::
Setter0Setter0
:
409
return
setter0setter0
(
this
,
engine
,
object
,
value
);
410
case
Call
::
SetterArrayLength
:
411
return
arrayLengthSetter
(
this
,
engine
,
object
,
value
);
412
case
Call
::
SetterQObjectPropertyFallback
:
413
return
setterFallback
(
this
,
engine
,
object
,
value
);
414
case
Call
::
SetterGeneric
:
415
return
setterGeneric
(
this
,
engine
,
object
,
value
);
416
case
Call
::
SetterInsert
:
417
return
setterInsert
(
this
,
engine
,
object
,
value
);
418
case
Call
::
SetterQObjectProperty
:
419
return
setterQObject
(
this
,
engine
,
object
,
value
);
420
case
Call
::
SetterValueTypeProperty
:
421
// TODO: more specific implementation for interpreter / JIT
422
return
setterFallback
(
this
,
engine
,
object
,
value
);
423
default
:
424
break
;
425
}
426
427
Q_UNREACHABLE_RETURN
(
Encode
::
undefined
());
428
}
429
430
void
releasePropertyCache
()
431
{
432
switch
(
call
) {
433
case
Call
::
ContextGetterContextObjectProperty
:
434
case
Call
::
ContextGetterScopeObjectProperty
:
435
case
Call
::
GetterQObjectProperty
:
436
case
Call
::
GetterSingletonProperty
:
437
case
Call
::
SetterQObjectProperty
:
438
if
(
const
QQmlPropertyCache
*
pc
=
qobjectLookup
.
propertyCache
)
439
pc
->
release
();
440
break
;
441
case
Call
::
ContextGetterContextObjectMethod
:
442
case
Call
::
ContextGetterScopeObjectMethod
:
443
case
Call
::
GetterQObjectMethod
:
444
case
Call
::
GetterSingletonMethod
:
445
if
(
const
QQmlPropertyCache
*
pc
=
qobjectMethodLookup
.
propertyCache
)
446
pc
->
release
();
447
break
;
448
default
:
449
break
;
450
}
451
}
452
};
453
454
Q_STATIC_ASSERT
(
std
::
is_standard_layout
<
Lookup
>::
value
);
455
456
inline
void
setupQObjectLookup
(
457
Lookup *lookup,
const
QQmlData *ddata,
const
QQmlPropertyData *propertyData)
458
{
459
lookup->releasePropertyCache();
460
Q_ASSERT(!ddata->propertyCache.isNull());
461
lookup->qobjectLookup.propertyCache = ddata->propertyCache.data();
462
lookup->qobjectLookup.propertyCache->addref();
463
lookup->qobjectLookup.propertyData = propertyData;
464
}
465
466
inline
void
setupQObjectLookup
(
467
Lookup *lookup,
const
QQmlData *ddata,
const
QQmlPropertyData *propertyData,
468
const
Object *self)
469
{
470
setupQObjectLookup(lookup, ddata, propertyData);
471
lookup->qobjectLookup.ic.set(self->engine(), self->internalClass());
472
}
473
474
475
inline
void
setupQObjectLookup
(
476
Lookup *lookup,
const
QQmlData *ddata,
const
QQmlPropertyData *propertyData,
477
const
Object *self,
const
Object *qmlType)
478
{
479
setupQObjectLookup(lookup, ddata, propertyData, self);
480
lookup->qobjectLookup.qmlTypeIc.set(self->engine(), qmlType->internalClass());
481
}
482
483
// template parameter is an ugly trick to avoid pulling in the QObjectMethod header here
484
template
<
typename
QObjectMethod =
Heap
::QObjectMethod>
485
inline
void
setupQObjectMethodLookup
(
486
Lookup *lookup,
const
QQmlPropertyCache::ConstPtr &propertyCache,
487
const
QQmlPropertyData *propertyData,
const
Object *self, QObjectMethod *method)
488
{
489
lookup->releasePropertyCache();
490
Q_ASSERT(!propertyCache.isNull());
491
auto
engine = self->engine();
492
lookup->qobjectMethodLookup.method.set(engine, method);
493
lookup->qobjectMethodLookup.ic.set(engine, self->internalClass());
494
lookup->qobjectMethodLookup.propertyCache = propertyCache.data();
495
lookup->qobjectMethodLookup.propertyCache->addref();
496
lookup->qobjectMethodLookup.propertyData = propertyData;
497
}
498
499
inline
bool
qualifiesForMethodLookup
(
const
QQmlPropertyData *propertyData)
500
{
501
return
propertyData->isFunction()
502
&& !propertyData->isSignalHandler()
// TODO: Optimize SignalHandler, too
503
&& !propertyData->isVMEFunction()
// Handled by QObjectLookup
504
&& !propertyData->isVarProperty();
505
}
506
507
}
508
509
QT_END_NAMESPACE
510
511
#
endif
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
QV4::Heap
Definition
qv4compileddata_p.h:76
QV4
Definition
qjsvalue.h:24
QV4::setupQObjectLookup
void setupQObjectLookup(Lookup *lookup, const QQmlData *ddata, const QQmlPropertyData *propertyData, const Object *self, const Object *qmlType)
Definition
qv4lookup_p.h:475
QV4::setupQObjectLookup
void setupQObjectLookup(Lookup *lookup, const QQmlData *ddata, const QQmlPropertyData *propertyData)
Definition
qv4lookup_p.h:456
QV4::qualifiesForMethodLookup
bool qualifiesForMethodLookup(const QQmlPropertyData *propertyData)
Definition
qv4lookup_p.h:499
QV4::setupQObjectMethodLookup
void setupQObjectMethodLookup(Lookup *lookup, const QQmlPropertyCache::ConstPtr &propertyCache, const QQmlPropertyData *propertyData, const Object *self, QObjectMethod *method)
Definition
qv4lookup_p.h:485
QV4::setupQObjectLookup
void setupQObjectLookup(Lookup *lookup, const QQmlData *ddata, const QQmlPropertyData *propertyData, const Object *self)
Definition
qv4lookup_p.h:466
setupProtoLookupTwoClasses
static void setupProtoLookupTwoClasses(Lookup *lookup, const Lookup &first, const Lookup &second)
Definition
qv4lookup.cpp:147
setupObjectLookupTwoClasses
static void setupObjectLookupTwoClasses(Lookup *lookup, const Lookup &first, const Lookup &second)
Definition
qv4lookup.cpp:133
QV4::Lookup
Definition
qv4lookup_p.h:39
qtdeclarative
src
qml
jsruntime
qv4lookup_p.h
Generated on
for Qt by
1.18.0