15#include <private/qqmljavascriptexpression_p.h>
16#include <private/qqmlsourcecoordinate_p.h>
18#include <private/qv4functionobject_p.h>
19#include <private/qv4script_p.h>
20#include <private/qv4scopedvalue_p.h>
21#include <private/qv4objectiterator_p.h>
22#include <private/qv4qobjectwrapper_p.h>
23#include <private/qv4jscall_p.h>
28#include <QThreadStorage>
29#include <QtCore/qdebug.h>
30#include <QtCore/qloggingcategory.h>
34using namespace Qt::Literals::StringLiterals;
37 Q_CONSTINIT
thread_local int creationDepth = 0;
44class QQmlComponentExtension :
public QV4::ExecutionEngine::Deletable
47 QQmlComponentExtension(QV4::ExecutionEngine *v4);
48 virtual ~QQmlComponentExtension();
50 QV4::PersistentValue incubationProto;
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
273
274
275
276
277
278
279
280
281
284
285
286
287
288
289
290
291
293void QQmlComponentPrivate::ready(QQmlNotifyingBlob *)
297 Q_ASSERT(m_typeData);
299 fromTypeData(m_typeData);
302 emit q->statusChanged(q->status());
305void QQmlComponentPrivate::progress(QQmlNotifyingBlob *, qreal p)
310void QQmlComponentPrivate::fromTypeData(
const QQmlRefPointer<QQmlTypeData> &data)
312 m_url = data->finalUrl();
313 if (
auto cu = data->compilationUnit())
314 m_compilationUnit = m_engine->handle()->executableCompilationUnit(std::move(cu));
316 if (!m_compilationUnit) {
317 Q_ASSERT(data->isError());
318 m_state.errors.clear();
319 m_state.appendErrors(data->errors());
323bool QQmlComponentPrivate::hadTopLevelRequiredProperties()
const
325 return m_state.creator()->componentHadTopLevelRequiredProperties();
328void QQmlComponentPrivate::clear()
331 m_typeData->unregisterCallback(
this);
336 m_loadHelper->unregisterCallback(
this);
337 m_loadHelper.reset();
340 m_compilationUnit.reset();
341 m_inlineComponentName.reset();
344QObject *QQmlComponentPrivate::doBeginCreate(QQmlComponent *q, QQmlContext *context)
348 qWarning(
"QQmlComponent: Must provide an engine before calling create");
352 context = m_engine->rootContext();
353 return q->beginCreate(context);
357 QV4::Value *object,
const QString &propertyName,
const QQmlObjectCreator *creator)
362 QV4::QObjectWrapper *wrapper = object->as<QV4::QObjectWrapper>();
366 QObject *o = wrapper->object();
370 if (QQmlData *ddata = QQmlData::get(o)) {
372 propertyName, o, ddata->outerContext);
373 if (propData && propData->acceptsQBinding())
374 creator->removePendingBinding(o, propData->coreIndex());
378 const QMetaObject *meta = o->metaObject();
380 const int index = meta->indexOfProperty(propertyName.toUtf8());
381 if (index != -1 && meta->property(index).isBindable())
382 creator->removePendingBinding(o, index);
385bool QQmlComponentPrivate::setInitialProperty(
386 QObject *base,
const QString &name,
const QVariant &value)
388 bool isComplexProperty = name.contains(u'.');
391 if (m_state.hasUnsetRequiredProperties() && !isComplexProperty)
392 prop = QQmlComponentPrivate::removePropertyFromRequired(
393 base, name, m_state.requiredProperties(), m_engine);
394 else if (QQmlContext *ctxt = qmlContext(base); ctxt)
395 prop = QQmlProperty(base, name, ctxt);
397 prop = QQmlProperty(base, name, m_engine);
399 if (!prop.isValid()) {
403 if (!isComplexProperty)
407 const QStringList properties = name.split(u'.');
408 QV4::Scope scope(m_engine->handle());
409 QV4::ScopedObject object(scope, QV4::QObjectWrapper::wrap(scope.engine, base));
410 QV4::ScopedString segment(scope);
411 for (
int i = 0; i < properties.size() - 1; ++i) {
412 segment = scope.engine->newString(properties.at(i));
413 object = object->get(segment);
414 if (scope.engine->hasException || object->isNullOrUndefined())
418 const QString lastProperty = properties.last();
419 if (!object->isNullOrUndefined()) {
420 segment = scope.engine->newString(lastProperty);
421 QV4::ScopedValue v(scope, scope.engine->metaTypeToJS(value.metaType(), value.constData()));
422 object->put(segment, v);
427 if (scope.engine->hasException) {
428 qmlWarning(base, scope.engine->catchExceptionAsQmlError());
429 scope.engine->hasException =
false;
433 removePendingQPropertyBinding(object, lastProperty, m_state.creator());
437 if (QQmlPropertyPrivate::get(prop)->writeValueProperty(value, {})) {
438 if (prop.isBindable()) {
439 if (QQmlObjectCreator *creator = m_state.creator())
440 creator->removePendingBinding(prop.object(), prop.index());
447 error.setDescription(QStringLiteral(
"Could not set initial property %1").arg(name));
448 qmlWarning(base, error);
453
454
455QQmlComponent::QQmlComponent(QObject *parent)
456 : QObject(*(
new QQmlComponentPrivate), parent)
461
462
463QQmlComponent::~QQmlComponent()
467 if (d->m_state.isCompletePending()) {
468 qWarning(
"QQmlComponent: Component destroyed while completion pending");
471 qWarning() <<
"This may have been caused by one of the following errors:";
472 for (
const QQmlComponentPrivate::AnnotatedQmlError &e : std::as_const(d->m_state.errors))
473 qWarning().nospace().noquote() << QLatin1String(
" ") << e.error;
477 if (d->m_state.hasCreator())
482 d->m_typeData->unregisterCallback(d);
483 if (d->m_engine && !d->m_typeData->isCompleteOrError()) {
486 QQmlTypeLoader::get(d->m_engine)->drop(QQmlDataBlob::Ptr(d->m_typeData.data()));
488 d->m_typeData.reset();
493
494
495
496
497
498
499
500
501
502
503
506
507
508
509QQmlComponent::Status QQmlComponent::status()
const
511 Q_D(
const QQmlComponent);
515 else if (!d->m_state.errors.isEmpty())
517 else if (d->m_engine && (d->m_compilationUnit || d->loadedType().isValid()))
519 else if (d->m_loadHelper)
526
527
528bool QQmlComponent::isNull()
const
530 return status() == Null;
534
535
536bool QQmlComponent::isReady()
const
538 return status() == Ready;
542
543
544bool QQmlComponent::isError()
const
546 return status() == Error;
550
551
552bool QQmlComponent::isLoading()
const
554 return status() == Loading;
558
559
560
561
562
563bool QQmlComponent::isBound()
const
565 Q_D(
const QQmlComponent);
570
571
572
573
576
577
578
579
580qreal QQmlComponent::progress()
const
582 Q_D(
const QQmlComponent);
583 return d->m_progress;
587
588
589
590
591
594
595
596
597
598
601
602
603
604QQmlComponent::QQmlComponent(QQmlEngine *engine, QObject *parent)
605 : QObject(*(
new QQmlComponentPrivate), parent)
608 d->m_engine = engine;
609 QObject::connect(engine, &QObject::destroyed,
this, [d]() {
611 d->m_engine =
nullptr;
616
617
618
619
620
621
622
623QQmlComponent::QQmlComponent(QQmlEngine *engine,
const QUrl &url, QObject *parent)
624 : QQmlComponent(engine, url, QQmlComponent::PreferSynchronous, parent)
629
630
631
632
633
634
635
636
637QQmlComponent::QQmlComponent(QQmlEngine *engine,
const QUrl &url, CompilationMode mode,
639 : QQmlComponent(engine, parent)
642 d->loadUrl(url, mode);
646
647
648
649
650
651
652
653
654QQmlComponent::QQmlComponent(QQmlEngine *engine, QAnyStringView uri, QAnyStringView typeName, QObject *parent)
655 : QQmlComponent(engine, uri, typeName, QQmlComponent::PreferSynchronous, parent)
661
662
663
664
665
666
667
668
669QQmlComponent::QQmlComponent(QQmlEngine *engine, QAnyStringView uri, QAnyStringView typeName, CompilationMode mode, QObject *parent)
670 : QQmlComponent(engine, parent)
672 loadFromModule(uri, typeName, mode);
676
677
678
679
680
681QQmlComponent::QQmlComponent(QQmlEngine *engine,
const QString &fileName,
683 : QQmlComponent(engine, fileName, QQmlComponent::PreferSynchronous, parent)
688
689
690
691
692
693
694QQmlComponent::QQmlComponent(QQmlEngine *engine,
const QString &fileName,
695 CompilationMode mode, QObject *parent)
696 : QQmlComponent(engine, parent)
699 if (fileName.startsWith(u':'))
700 d->loadUrl(QUrl(QLatin1String(
"qrc") + fileName), mode);
701 else if (QDir::isAbsolutePath(fileName))
702 d->loadUrl(QUrl::fromLocalFile(fileName), mode);
704 d->loadUrl(QUrl(fileName), mode);
708
709
710QQmlComponent::QQmlComponent(QQmlEngine *engine, QV4::ExecutableCompilationUnit *compilationUnit,
711 int start, QObject *parent)
712 : QQmlComponent(engine, parent)
715 d->m_compilationUnit.reset(compilationUnit);
717 d->m_url = compilationUnit->finalUrl();
722
723
724
725
726
727
728
729
730
731
732
733
734void QQmlComponent::setData(
const QByteArray &data,
const QUrl &url, CompilationMode compilationMode)
740 qWarning(
"QQmlComponent: Must provide an engine before calling setData");
751 d->m_engine->handle()->trimCompilationUnitsForUrl(url);
753 QQmlTypeLoader::Mode mode = compilationMode == Asynchronous
754 ? QQmlTypeLoader::Asynchronous
755 : QQmlTypeLoader::PreferSynchronous;
756 QQmlRefPointer<QQmlTypeData> typeData = QQmlTypeLoader::get(d->m_engine)->getType(data, url, mode);
758 if (typeData->isCompleteOrError()) {
759 d->fromTypeData(typeData);
762 d->m_typeData = typeData;
763 d->m_typeData->registerCallback(d);
764 d->setProgress(typeData->progress());
767 emit statusChanged(status());
771
772
773
774
775
776
777
778
779
780
781
782void QQmlComponent::setData(
const QByteArray &data,
const QUrl &url)
784 setData(data, url, PreferSynchronous);
788
789
790
791QQmlContext *QQmlComponent::creationContext()
const
793 Q_D(
const QQmlComponent);
794 if (!d->m_creationContext.isNull())
795 return d->m_creationContext->asQQmlContext();
797 return qmlContext(
this);
801
802
803
804
805QQmlEngine *QQmlComponent::engine()
const
807 Q_D(
const QQmlComponent);
812
813
814
815
816void QQmlComponent::loadUrl(
const QUrl &url)
823
824
825
826
827
828void QQmlComponent::loadUrl(
const QUrl &url, QQmlComponent::CompilationMode mode)
831 d->loadUrl(url, mode);
834void QQmlComponentPrivate::loadUrl(
const QUrl &newUrl, QQmlComponent::CompilationMode mode)
839 if (newUrl.isRelative()) {
841 m_url = m_engine->baseUrl().resolved(QUrl(newUrl.toString()));
842 }
else if (m_engine->baseUrl().isLocalFile() && newUrl.isLocalFile() && !QDir::isAbsolutePath(newUrl.toLocalFile())) {
846 QUrl fixedUrl(newUrl);
847 fixedUrl.setScheme(QString());
850 m_url = m_engine->baseUrl().resolved(fixedUrl);
855 if (m_url.scheme() ==
"qrc"_L1 && !m_url.path().startsWith(
"/"_L1)) {
856 qWarning().nospace().noquote()
857 <<
"QQmlComponent: attempted to load via a relative URL '" << m_url.toString()
858 <<
"' in resource file system. This is not fully supported and may not work";
861 if (newUrl.isEmpty()) {
863 error.setDescription(QQmlComponent::tr(
"Invalid empty URL"));
864 m_state.errors.emplaceBack(error);
870 QQmlTypeLoader::Mode loaderMode = (mode == QQmlComponent::Asynchronous)
871 ? QQmlTypeLoader::Asynchronous
872 : QQmlTypeLoader::PreferSynchronous;
873 QQmlRefPointer<QQmlTypeData> data = QQmlTypeLoader::get(m_engine)->getType(m_url, loaderMode);
875 if (data->isCompleteOrError()) {
880 m_typeData->registerCallback(
this);
881 setProgress(data->progress());
884 emit q->statusChanged(q->status());
888
889
890
891QList<QQmlError> QQmlComponent::errors()
const
893 Q_D(
const QQmlComponent);
894 QList<QQmlError> errors;
895 errors.reserve(d->m_state.errors.size());
896 for (
const QQmlComponentPrivate::AnnotatedQmlError &annotated : d->m_state.errors)
897 errors.emplaceBack(annotated.error);
902
903
904
905
906
907
908
909
910
913
914
915
916QString QQmlComponent::errorString()
const
918 Q_D(
const QQmlComponent);
922 for (
const QQmlComponentPrivate::AnnotatedQmlError &annotated : d->m_state.errors) {
923 ret += annotated.error.toString() + QLatin1Char(
'\n');
929
930
931
934
935
936
937
938QUrl QQmlComponent::url()
const
940 Q_D(
const QQmlComponent);
945
946
947QQmlComponent::QQmlComponent(QQmlComponentPrivate &dd, QObject *parent)
948 : QObject(dd, parent)
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968QObject *QQmlComponent::create(QQmlContext *context)
971 return d->createWithProperties(
972 nullptr, QVariantMap {}, context, QQmlComponentPrivate::CreateBehavior::Cpp);
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995QObject *QQmlComponent::createWithInitialProperties(
996 const QVariantMap& initialProperties, QQmlContext *context)
999 return d->createWithProperties(
1000 nullptr, initialProperties, context, QQmlComponentPrivate::CreateBehavior::Cpp);
1006
1007QObject *QQmlComponentPrivate::createWithProperties(
1008 QObject *parent,
const QVariantMap &properties,
1009 QQmlContext *context, CreateBehavior behavior)
1013 QObject *rv = doBeginCreate(q, context);
1015 if (m_state.isCompletePending()) {
1019 QQmlEnginePrivate *ep = QQmlEnginePrivate::get(m_engine);
1020 complete(ep, &m_state);
1026 QQmlComponent_setQmlParent(rv, parent);
1028 if (behavior == CreateBehavior::Qml) {
1030 for (
auto it = properties.cbegin(), end = properties.cend(); it != end; ++it)
1031 ok = setInitialProperty(rv, it.key(), it.value()) && ok;
1032 q->completeCreate();
1033 if (m_state.hasUnsetRequiredProperties()) {
1034 for (
const auto &unsetRequiredProperty : std::as_const(*m_state.requiredProperties())) {
1035 const QQmlError error = unsetRequiredPropertyToQQmlError(unsetRequiredProperty);
1036 qmlWarning(rv, error);
1038 delete std::exchange(rv,
nullptr);
1041 delete std::exchange(rv,
nullptr);
1044 setInitialProperties(rv, properties);
1045 q->completeCreate();
1046 if (m_state.hasUnsetRequiredProperties())
1047 delete std::exchange(rv,
nullptr);
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090QObject *QQmlComponent::beginCreate(QQmlContext *context)
1094 return d->beginCreate(QQmlContextData::get(context));
1099 const int parserStatusCast = type.parserStatusCast();
1100 return parserStatusCast == -1
1102 :
reinterpret_cast<QQmlParserStatus *>(
reinterpret_cast<
char *>(rv) + parserStatusCast);
1105QObject *QQmlComponentPrivate::beginCreate(QQmlRefPointer<QQmlContextData> context)
1108 auto cleanup = qScopeGuard([
this] {
1109 if (!m_state.errors.isEmpty() && lcQmlComponentGeneral().isDebugEnabled()) {
1110 for (
const auto &e : std::as_const(m_state.errors)) {
1111 qCDebug(lcQmlComponentGeneral) <<
"QQmlComponent: " << e.error.toString();
1116 qWarning(
"QQmlComponent: Cannot create a component in a null context");
1120 if (!context->isValid()) {
1121 qWarning(
"QQmlComponent: Cannot create a component in an invalid context");
1125 if (context->engine() != m_engine) {
1126 qWarning(
"QQmlComponent: Must create component in context from the same QQmlEngine");
1130 if (m_state.isCompletePending()) {
1131 qWarning(
"QQmlComponent: Cannot create new component instance before completing the previous");
1137 m_state.errors.removeIf([](
const auto &e) {
return e.isTransient; });
1138 m_state.clearRequiredProperties();
1140 if (!q->isReady()) {
1141 qWarning(
"QQmlComponent: Component is not ready");
1146 static const int maxCreationDepth = 10;
1147 if (creationDepth >= maxCreationDepth) {
1148 qWarning(
"QQmlComponent: Component creation is recursing - aborting");
1152 QQmlEnginePrivate *enginePriv = QQmlEnginePrivate::get(m_engine);
1154 enginePriv->inProgressCreations++;
1155 m_state.errors.clear();
1156 m_state.setCompletePending(
true);
1158 QObject *rv =
nullptr;
1159 auto setupDData = [&]() {
1160 QQmlData *ddata = QQmlData::get(rv);
1164 ddata->indestructible =
true;
1165 ddata->explicitIndestructibleSet =
true;
1166 ddata->rootObjectInCreation =
false;
1169 if (!ddata->outerContext)
1170 ddata->outerContext = context.data();
1171 if (!ddata->context)
1172 ddata->context = context.data();
1175 const QQmlType type = loadedType();
1176 if (!type.isValid()) {
1177 enginePriv->referenceScarceResources();
1178 const QString *icName = m_inlineComponentName.get();
1179 m_state.initCreator(
1180 context, m_compilationUnit, m_creationContext, icName ? *icName : QString());
1182 QQmlObjectCreator::CreationFlags flags;
1184 flags = QQmlObjectCreator::InlineComponent;
1186 m_start = m_compilationUnit->inlineComponentId(*icName);
1187 Q_ASSERT(m_start > 0);
1189 flags = QQmlObjectCreator::NormalObject;
1192 rv = m_state.creator()->create(m_start,
nullptr,
nullptr, flags);
1194 m_state.appendCreatorErrors();
1197 enginePriv->dereferenceScarceResources();
1200 rv = type.createWithQQmlData();
1201 QQmlPropertyCache::ConstPtr propertyCache = QQmlData::ensurePropertyCache(rv);
1203 if (QQmlParserStatus *parserStatus = parserStatusCast(type, rv)) {
1204 parserStatus->classBegin();
1205 m_state.ensureRequiredPropertyStorage(rv);
1206 }
else if (type.finalizerCast() != -1) {
1207 m_state.ensureRequiredPropertyStorage(rv);
1210 if (propertyCache) {
1211 for (
int i = 0, propertyCount = propertyCache->propertyCount(); i < propertyCount; ++i) {
1212 if (
const QQmlPropertyData *propertyData = propertyCache->property(i); propertyData->isRequired()) {
1213 m_state.ensureRequiredPropertyStorage(rv);
1214 RequiredPropertyInfo info;
1215 info.propertyName = propertyData->name(rv);
1216 m_state.addPendingRequiredProperty(rv, propertyData, info);
1229void QQmlComponentPrivate::beginDeferred(QQmlEnginePrivate *enginePriv,
1230 QObject *object, DeferredState *deferredState)
1232 QQmlData *ddata = QQmlData::get(object);
1233 Q_ASSERT(!ddata->deferredData.isEmpty());
1235 deferredState->reserve(ddata->deferredData.size());
1237 for (QQmlData::DeferredData *deferredData : std::as_const(ddata->deferredData)) {
1238 enginePriv->inProgressCreations++;
1240 ConstructionState state;
1241 state.setCompletePending(
true);
1243 auto creator = state.initCreator(
1244 deferredData->context->parent(),
1245 deferredData->compilationUnit,
1246 QQmlRefPointer<QQmlContextData>(),
1247 deferredData->inlineComponentName
1250 if (!creator->populateDeferredProperties(object, deferredData))
1251 state.appendCreatorErrors();
1252 deferredData->bindings.clear();
1254 deferredState->push_back(std::move(state));
1258void QQmlComponentPrivate::completeDeferred(QQmlEnginePrivate *enginePriv, QQmlComponentPrivate::DeferredState *deferredState)
1260 for (ConstructionState &state : *deferredState)
1261 complete(enginePriv, &state);
1264void QQmlComponentPrivate::complete(QQmlEnginePrivate *enginePriv, ConstructionState *state)
1266 if (state->isCompletePending()) {
1267 QQmlInstantiationInterrupt interrupt;
1268 state->creator()->finalize(interrupt);
1270 state->setCompletePending(
false);
1272 enginePriv->inProgressCreations--;
1274 if (0 == enginePriv->inProgressCreations) {
1275 while (enginePriv->erroredBindings) {
1276 enginePriv->warning(enginePriv->erroredBindings->removeError());
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299QQmlProperty QQmlComponentPrivate::removePropertyFromRequired(
1300 QObject *target,
const QString &name, RequiredProperties *requiredProperties,
1301 QQmlEngine *engine,
bool *wasInRequiredProperties)
1303 Q_ASSERT(requiredProperties);
1305 const QQmlProperty prop(target, name, engine);
1306 if (!prop.isValid()) {
1307 if (wasInRequiredProperties)
1308 *wasInRequiredProperties =
false;
1312 const QQmlPropertyPrivate *privProp = QQmlPropertyPrivate::get(prop);
1316 const QQmlPropertyData *targetProp = &privProp->core;
1317 QQmlData *data = QQmlData::get(target);
1318 Q_ASSERT(data && data->propertyCache);
1320 if (targetProp->isAlias()) {
1321 if (requiredProperties->remove(
1322 { target, data->propertyCache->property(targetProp->coreIndex()) })) {
1326 QQmlPropertyIndex originalIndex(targetProp->coreIndex());
1327 QQmlPropertyIndex propIndex;
1328 QQmlPropertyPrivate::findAliasTarget(target, originalIndex, &target, &propIndex);
1329 data = QQmlData::get(target);
1330 Q_ASSERT(data && data->propertyCache);
1331 targetProp = data->propertyCache->property(propIndex.coreIndex());
1335 targetProp = data->propertyCache->property(targetProp->coreIndex());
1339 if (requiredProperties->remove({target, targetProp}))
1342 if (wasInRequiredProperties)
1343 *wasInRequiredProperties = found;
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358void QQmlComponent::completeCreate()
1362 d->completeCreate();
1365void QQmlComponentPrivate::completeCreate()
1367 if (m_state.hasUnsetRequiredProperties()) {
1368 for (
const auto& unsetRequiredProperty: std::as_const(*m_state.requiredProperties())) {
1369 QQmlError error = unsetRequiredPropertyToQQmlError(unsetRequiredProperty);
1370 m_state.errors.push_back(QQmlComponentPrivate::AnnotatedQmlError { error,
true });
1374 const QQmlType type = loadedType();
1375 if (type.isValid()) {
1376 QObject *rv = m_state.target();
1377 if (QQmlParserStatus *parserStatus = parserStatusCast(type, rv))
1378 parserStatus->componentComplete();
1380 if (
const int finalizerCast = type.finalizerCast(); finalizerCast != -1) {
1381 auto *hook =
reinterpret_cast<QQmlFinalizerHook *>(
1382 reinterpret_cast<
char *>(rv) + finalizerCast);
1383 hook->componentFinalized();
1387
1388
1389
1390
1391 m_state.setCompletePending(
false);
1392 QQmlEnginePrivate::get(m_engine)->inProgressCreations--;
1393 }
else if (m_state.isCompletePending()) {
1395 QQmlEnginePrivate *ep = QQmlEnginePrivate::get(m_engine);
1396 complete(ep, &m_state);
1401QQmlComponentAttached::QQmlComponentAttached(QObject *parent)
1402: QObject(parent), m_prev(
nullptr), m_next(
nullptr)
1406QQmlComponentAttached::~QQmlComponentAttached()
1408 if (m_prev) *m_prev = m_next;
1409 if (m_next) m_next->m_prev = m_prev;
1415
1416
1417QQmlComponentAttached *QQmlComponent::qmlAttachedProperties(QObject *obj)
1419 QQmlComponentAttached *a =
new QQmlComponentAttached(obj);
1421 QQmlEngine *engine = qmlEngine(obj);
1425 QQmlEnginePrivate *p = QQmlEnginePrivate::get(engine);
1426 if (p->activeObjectCreator) {
1427 a->insertIntoList(p->activeObjectCreator->componentAttachment());
1429 QQmlData *d = QQmlData::get(obj);
1431 Q_ASSERT(d->context);
1432 d->context->addComponentAttached(a);
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455void QQmlComponent::loadFromModule(QAnyStringView uri, QAnyStringView typeName,
1456 QQmlComponent::CompilationMode mode)
1460 QQmlTypeLoader::Mode typeLoaderMode = QQmlTypeLoader::Synchronous;
1462 case QQmlComponent::PreferSynchronous:
1463 typeLoaderMode = QQmlTypeLoader::PreferSynchronous;
1465 case QQmlComponent::Asynchronous:
1466 typeLoaderMode = QQmlTypeLoader::Asynchronous;
1470 d->prepareLoadFromModule(uri, typeName, typeLoaderMode);
1471 if (d->m_loadHelper->isCompleteOrError())
1472 d->completeLoadFromModule(uri, typeName);
1474 d->m_loadHelper->registerCallback(d);
1477void QQmlComponentPrivate::prepareLoadFromModule(
1478 QAnyStringView uri, QAnyStringView typeName, QQmlTypeLoader::Mode mode)
1482 m_loadHelper->unregisterCallback(
this);
1485 m_loadHelper = QQml::makeRefPointer<LoadHelper>(QQmlTypeLoader::get(m_engine), uri, typeName, mode);
1488void QQmlComponentPrivate::completeLoadFromModule(QAnyStringView uri, QAnyStringView typeName)
1493 auto reportError = [&](QString msg) {
1495 error.setDescription(msg);
1496 m_state.errors.push_back(std::move(error));
1498 emit q->statusChanged(q->Error);
1500 auto emitComplete = [&]() {
1502 emit q->statusChanged(q->status());
1507 const QQmlType type = m_loadHelper->type();
1509 if (m_loadHelper->resolveTypeResult() == LoadHelper::ResolveTypeResult::NoSuchModule) {
1510 reportError(QLatin1String(R"(No module named "%1" found)").arg(uri.toString()));
1511 }
else if (!type.isValid()) {
1512 reportError(QLatin1String(R"(Module "%1" contains no type named "%2")")
1513 .arg(uri.toString(), typeName.toString()));
1514 }
else if (type.isCreatable()) {
1516 }
else if (type.isInlineComponent()) {
1517 auto baseUrl = type.sourceUrl();
1518 baseUrl.setFragment(QString());
1520 Q_ASSERT(m_progress == 0.0);
1524 QSignalBlocker blockSignals(q);
1526 loadUrl(baseUrl, QQmlComponent::PreferSynchronous);
1529 if (m_progress != 0.0)
1530 emit q->progressChanged(m_progress);
1536 QString elementName = type.elementName();
1537 if (m_compilationUnit->inlineComponentId(elementName) == -1) {
1538 QString realTypeName = typeName.toString();
1539 realTypeName.truncate(realTypeName.indexOf(u'.'));
1540 QString errorMessage = R"(Type "%1" from module "%2" contains no inline component named "%3".)"_L1.arg(
1541 realTypeName, uri.toString(), elementName);
1542 if (elementName == u"qml")
1543 errorMessage +=
" To load the type \"%1\", drop the \".qml\" extension."_L1.arg(realTypeName);
1544 reportError(std::move(errorMessage));
1546 m_inlineComponentName = std::make_unique<QString>(std::move(elementName));
1549 }
else if (type.isComposite()) {
1550 QQmlComponent::CompilationMode mode = QQmlComponent::PreferSynchronous;
1551 switch (m_loadHelper->mode()) {
1552 case QQmlTypeLoader::Asynchronous:
1553 mode = QQmlComponent::Asynchronous;
1555 case QQmlTypeLoader::PreferSynchronous:
1556 case QQmlTypeLoader::Synchronous:
1557 mode = QQmlComponent::PreferSynchronous;
1562 loadUrl(type.sourceUrl(), mode);
1563 }
else if (type.isSingleton()) {
1565 reportError(QLatin1String(R"(%1 is a singleton, and cannot be loaded)").arg(typeName.toString()));
1567 reportError(QLatin1String(
"Could not load %1, as the type is uncreatable").arg(typeName.toString()));
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1591void QQmlComponent::create(QQmlIncubator &incubator, QQmlContext *context, QQmlContext *forContext)
1596 context = d->m_engine->rootContext();
1598 QQmlRefPointer<QQmlContextData> contextData = QQmlContextData::get(context);
1599 QQmlRefPointer<QQmlContextData> forContextData =
1600 forContext ? QQmlContextData::get(forContext) : contextData;
1602 if (!contextData->isValid()) {
1603 qWarning(
"QQmlComponent: Cannot create a component in an invalid context");
1607 if (contextData->engine() != d->m_engine) {
1608 qWarning(
"QQmlComponent: Must create component in context from the same QQmlEngine");
1613 qWarning(
"QQmlComponent: Component is not ready");
1618 QExplicitlySharedDataPointer<QQmlIncubatorPrivate> p(incubator.d);
1620 if (d->loadedType().isValid()) {
1624 p->incubateCppBasedComponent(
this, context);
1628 QQmlEnginePrivate *enginePriv = QQmlEnginePrivate::get(d->m_engine);
1630 p->compilationUnit = d->m_compilationUnit;
1631 p->enginePriv = enginePriv;
1632 p->creator.reset(
new QQmlObjectCreator(
1633 contextData, d->m_compilationUnit, d->m_creationContext,
1634 d->m_inlineComponentName ? *d->m_inlineComponentName : QString(), p.data()));
1635 p->subComponentToCreate = d->m_start;
1637 enginePriv->incubate(incubator, forContextData);
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663void QQmlComponent::setInitialProperties(QObject *object,
const QVariantMap &properties)
1666 d->setInitialProperties(object, properties);
1669bool QQmlComponentPrivate::setInitialProperties(QObject *object,
const QVariantMap &properties)
1672 for (
auto it = properties.constBegin(); it != properties.constEnd(); ++it) {
1673 if (it.key().contains(u'.')) {
1674 auto segments = it.key().split(u'.');
1675 QString description = u"Setting initial properties failed: Cannot initialize nested "_s
1677 if (segments.size() >= 2) {
1678 QString s = u" To set %1.%2 as an initial property, create %1, set its "_s
1679 u"property %2, and pass %1 as an initial property."_s;
1680 description += s.arg(segments[0], segments[1]);
1683 error.setUrl(m_url);
1684 error.setDescription(description);
1685 qmlWarning(object, error);
1690 result = setInitialProperty(object, it.key(), it.value()) && result;
1696
1697
1698
1699
1700
1701
1702void QQmlComponentPrivate::incubateObject(
1703 QQmlIncubator *incubationTask,
1704 QQmlComponent *component,
1706 const QQmlRefPointer<QQmlContextData> &context,
1707 const QQmlRefPointer<QQmlContextData> &forContext)
1709 QQmlIncubatorPrivate *incubatorPriv = QQmlIncubatorPrivate::get(incubationTask);
1710 QQmlEnginePrivate *enginePriv = QQmlEnginePrivate::get(engine);
1711 QQmlComponentPrivate *componentPriv = QQmlComponentPrivate::get(component);
1713 incubatorPriv->compilationUnit = componentPriv->m_compilationUnit;
1714 incubatorPriv->enginePriv = enginePriv;
1715 incubatorPriv->creator.reset(
new QQmlObjectCreator(
1716 context, componentPriv->m_compilationUnit, componentPriv->m_creationContext,
1717 m_inlineComponentName ? *m_inlineComponentName : QString()));
1719 if (m_start == -1) {
1720 if (
const QString *icName = componentPriv->m_inlineComponentName.get()) {
1721 m_start = m_compilationUnit->inlineComponentId(*icName);
1722 Q_ASSERT(m_start > 0);
1725 incubatorPriv->subComponentToCreate = componentPriv->m_start;
1727 enginePriv->incubate(*incubationTask, forContext);
1738#define QmlIncubatorObjectMembers(class, Member)
1739 Member(class, HeapValue, HeapValue, valuemapOrObject)
1740 Member(class, HeapValue, HeapValue, statusChanged)
1741 Member(class, Pointer, QmlContext *, qmlContext)
1742 Member(class, NoMark, QQmlComponentIncubator *, incubator)
1743 Member(class, NoMark, QV4QPointer<QObject>, parent)
1746 DECLARE_MARKOBJECTS(QmlIncubatorObject)
1748 void init(QQmlIncubator::IncubationMode = QQmlIncubator::Asynchronous);
1749 inline void destroy();
1779 incubatorObject.set(inc->internalClass->engine, inc);
1783 QV4::Scope scope(incubatorObject.engine());
1784 QV4::Scoped<QV4::QmlIncubatorObject> i(scope, incubatorObject.as<QV4::QmlIncubatorObject>());
1785 i->statusChanged(s);
1789 QV4::Scope scope(incubatorObject.engine());
1790 QV4::Scoped<QV4::QmlIncubatorObject> i(scope, incubatorObject.as<QV4::QmlIncubatorObject>());
1791 auto d = QQmlIncubatorPrivate::get(
this);
1792 i->setInitialState(o, d->requiredProperties());
1802 me->setParent(parent);
1803 typedef QQmlPrivate::AutoParentFunction APF;
1804 QList<APF> functions = QQmlMetaType::parentFunctions();
1806 bool needParent =
false;
1807 for (
int ii = 0; ii < functions.size(); ++ii) {
1808 QQmlPrivate::AutoParentResult res = functions.at(ii)(me, parent);
1809 if (res == QQmlPrivate::Parented) {
1812 }
else if (res == QQmlPrivate::IncompatibleParent) {
1817 qmlWarning(me) <<
"Created graphical object was not placed in the graphics scene.";
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1864void QQmlComponentPrivate::setInitialProperties(
1865 QV4::ExecutionEngine *engine, QV4::QmlContext *qmlContext,
const QV4::Value &o,
1866 const QV4::Value &v, RequiredProperties *requiredProperties, QObject *createdComponent,
1867 const QQmlObjectCreator *creator)
1869 QV4::Scope scope(engine);
1870 QV4::ScopedObject object(scope);
1871 QV4::ScopedObject valueMap(scope, v);
1872 QV4::ObjectIterator it(scope, valueMap, QV4::ObjectIterator::EnumerableOnly);
1873 QV4::ScopedString name(scope);
1874 QV4::ScopedValue val(scope);
1875 if (engine->hasException)
1879 QV4::ScopedStackFrame frame(scope, qmlContext ? qmlContext : engine->scriptContext());
1882 name = it.nextPropertyNameAsString(val);
1886 const QStringList properties = name->toQString().split(QLatin1Char(
'.'));
1887 bool isTopLevelProperty = properties.size() == 1;
1888 for (
int i = 0; i < properties.size() - 1; ++i) {
1889 name = engine->newString(properties.at(i));
1890 object = object->get(name);
1891 if (engine->hasException || !object) {
1895 if (engine->hasException) {
1896 qmlWarning(createdComponent, engine->catchExceptionAsQmlError());
1901 error.setUrl(qmlContext ? qmlContext->qmlContext()->url() : QUrl());
1902 error.setDescription(QLatin1String(
"Cannot resolve property \"%1\".")
1903 .arg(properties.join(u'.')));
1904 qmlWarning(createdComponent, error);
1907 const QString lastProperty = properties.last();
1908 name = engine->newString(lastProperty);
1909 object->put(name, val);
1910 if (engine->hasException) {
1911 qmlWarning(createdComponent, engine->catchExceptionAsQmlError());
1913 }
else if (isTopLevelProperty && requiredProperties) {
1914 auto prop = removePropertyFromRequired(createdComponent, name->toQString(),
1915 requiredProperties, engine->qmlEngine());
1918 removePendingQPropertyBinding(object, lastProperty, creator);
1921 engine->hasException =
false;
1924QQmlError QQmlComponentPrivate::unsetRequiredPropertyToQQmlError(
const RequiredPropertyInfo &unsetRequiredProperty)
1927 QString description = QLatin1String(
"Required property %1 was not initialized").arg(unsetRequiredProperty.propertyName);
1928 switch (unsetRequiredProperty.aliasesToRequired.size()) {
1932 const auto info = unsetRequiredProperty.aliasesToRequired.first();
1933 description += QLatin1String(
"\nIt can be set via the alias property %1 from %2\n").arg(info.propertyName, info.fileUrl.toString());
1937 description += QLatin1String(
"\nIt can be set via one of the following alias properties:");
1938 for (
const auto &aliasInfo: unsetRequiredProperty.aliasesToRequired) {
1939 description += QLatin1String(
"\n- %1 (%2)").arg(aliasInfo.propertyName, aliasInfo.fileUrl.toString());
1941 description += QLatin1Char(
'\n');
1943 error.setDescription(description);
1944 error.setUrl(unsetRequiredProperty.fileUrl);
1945 error.setLine(qmlConvertSourceCoordinate<quint32,
int>(
1946 unsetRequiredProperty.location.line()));
1947 error.setColumn(qmlConvertSourceCoordinate<quint32,
int>(
1948 unsetRequiredProperty.location.column()));
1952#if QT_DEPRECATED_SINCE(6
, 3
)
1954
1955
1956void QQmlComponent::createObject(QQmlV4FunctionPtr args)
1959 Q_ASSERT(d->m_engine);
1962 qmlWarning(
this) <<
"Unsuitable arguments passed to createObject(). The first argument should "
1963 "be a QObject* or null, and the second argument should be a JavaScript "
1964 "object or a QVariantMap";
1966 QObject *parent =
nullptr;
1967 QV4::ExecutionEngine *v4 = args->v4engine();
1968 QV4::Scope scope(v4);
1969 QV4::ScopedValue valuemap(scope, QV4::Value::undefinedValue());
1971 if (args->length() >= 1) {
1972 QV4::Scoped<QV4::QObjectWrapper> qobjectWrapper(scope, (*args)[0]);
1974 parent = qobjectWrapper->object();
1977 if (args->length() >= 2) {
1978 QV4::ScopedValue v(scope, (*args)[1]);
1979 if (!v->as<QV4::Object>() || v->as<QV4::ArrayObject>()) {
1980 qmlWarning(
this) << tr(
"createObject: value is not an object");
1981 args->setReturnValue(QV4::Encode::null());
1987 QQmlContext *ctxt = creationContext();
1988 if (!ctxt) ctxt = d->m_engine->rootContext();
1990 QObject *rv = beginCreate(ctxt);
1993 args->setReturnValue(QV4::Encode::null());
1997 QQmlComponent_setQmlParent(rv, parent);
1999 QV4::ScopedValue object(scope, QV4::QObjectWrapper::wrap(v4, rv));
2000 Q_ASSERT(object->isObject());
2002 if (!valuemap->isUndefined()) {
2003 QV4::Scoped<QV4::QmlContext> qmlContext(scope, v4->qmlContext());
2004 QQmlComponentPrivate::setInitialProperties(
2005 v4, qmlContext, object, valuemap, d->m_state.requiredProperties(), rv,
2006 d->m_state.creator());
2008 if (d->m_state.hasUnsetRequiredProperties()) {
2009 QList<QQmlError> errors;
2010 for (
const auto &requiredProperty: std::as_const(*d->m_state.requiredProperties())) {
2011 errors.push_back(QQmlComponentPrivate::unsetRequiredPropertyToQQmlError(requiredProperty));
2013 qmlWarning(rv, errors);
2014 args->setReturnValue(QV4::Encode::null());
2019 d->completeCreate();
2021 Q_ASSERT(QQmlData::get(rv));
2022 QQmlData::get(rv)->explicitIndestructibleSet =
false;
2023 QQmlData::get(rv)->indestructible =
false;
2025 args->setReturnValue(object->asReturnedValue());
2030
2031
2032QObject *QQmlComponent::createObject(QObject *parent,
const QVariantMap &properties)
2035 Q_ASSERT(d->m_engine);
2036 QObject *rv = d->createWithProperties(
2037 parent, properties, creationContext(), QQmlComponentPrivate::CreateBehavior::Qml);
2039 QQmlData *qmlData = QQmlData::get(rv);
2041 qmlData->explicitIndestructibleSet =
false;
2042 qmlData->indestructible =
false;
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2103
2104
2105void QQmlComponent::incubateObject(QQmlV4FunctionPtr args)
2108 Q_ASSERT(d->m_engine);
2111 QV4::ExecutionEngine *v4 = args->v4engine();
2112 QV4::Scope scope(v4);
2114 QObject *parent =
nullptr;
2115 QV4::ScopedValue valuemap(scope, QV4::Value::undefinedValue());
2116 QQmlIncubator::IncubationMode mode = QQmlIncubator::Asynchronous;
2118 if (args->length() >= 1) {
2119 QV4::Scoped<QV4::QObjectWrapper> qobjectWrapper(scope, (*args)[0]);
2121 parent = qobjectWrapper->object();
2124 if (args->length() >= 2) {
2125 QV4::ScopedValue v(scope, (*args)[1]);
2127 }
else if (!v->as<QV4::Object>() || v->as<QV4::ArrayObject>()) {
2128 qmlWarning(
this) << tr(
"createObject: value is not an object");
2129 args->setReturnValue(QV4::Encode::null());
2136 if (args->length() >= 3) {
2137 QV4::ScopedValue val(scope, (*args)[2]);
2138 quint32 v = val->toUInt32();
2140 mode = QQmlIncubator::Asynchronous;
2142 mode = QQmlIncubator::AsynchronousIfNested;
2145 QQmlComponentExtension *e = componentExtension(args->v4engine());
2147 QV4::Scoped<QV4::QmlIncubatorObject> r(scope, v4->memoryManager->allocate<QV4::QmlIncubatorObject>(mode));
2148 QV4::ScopedObject p(scope, e->incubationProto.value());
2149 r->setPrototypeOf(p);
2151 if (!valuemap->isUndefined())
2152 r->d()->valuemapOrObject.set(scope.engine, valuemap);
2153 r->d()->qmlContext.set(scope.engine, v4->qmlContext());
2154 r->d()->parent = parent;
2156 QQmlIncubator *incubator = r->d()->incubator;
2157 create(*incubator, creationContext());
2159 if (incubator->status() == QQmlIncubator::Null) {
2160 args->setReturnValue(QV4::Encode::null());
2162 args->setReturnValue(r.asReturnedValue());
2167void QQmlComponentPrivate::initializeObjectWithInitialProperties(QV4::QmlContext *qmlContext,
const QV4::Value &valuemap, QObject *toCreate, RequiredProperties *requiredProperties)
2169 QV4::ExecutionEngine *v4engine = m_engine->handle();
2170 QV4::Scope scope(v4engine);
2172 QV4::ScopedValue object(scope, QV4::QObjectWrapper::wrap(v4engine, toCreate));
2173 Q_ASSERT(object->as<QV4::Object>());
2175 if (!valuemap.isUndefined()) {
2176 setInitialProperties(
2177 v4engine, qmlContext, object, valuemap, requiredProperties, toCreate, m_state.creator());
2181QQmlComponentExtension::QQmlComponentExtension(QV4::ExecutionEngine *v4)
2183 QV4::Scope scope(v4);
2184 QV4::ScopedObject proto(scope, v4->newObject());
2185 proto->defineAccessorProperty(QStringLiteral(
"onStatusChanged"),
2186 QV4::QmlIncubatorObject::method_get_statusChanged, QV4::QmlIncubatorObject::method_set_statusChanged);
2187 proto->defineAccessorProperty(QStringLiteral(
"status"), QV4::QmlIncubatorObject::method_get_status,
nullptr);
2188 proto->defineAccessorProperty(QStringLiteral(
"object"), QV4::QmlIncubatorObject::method_get_object,
nullptr);
2189 proto->defineDefaultProperty(QStringLiteral(
"forceCompletion"), QV4::QmlIncubatorObject::method_forceCompletion);
2191 incubationProto.set(v4, proto);
2194QV4::ReturnedValue
QV4::
QmlIncubatorObject::method_get_object(
const FunctionObject *b,
const Value *thisObject,
const Value *,
int)
2196 QV4::Scope scope(b);
2197 QV4::Scoped<QmlIncubatorObject> o(scope, thisObject->as<QmlIncubatorObject>());
2201 return QV4::QObjectWrapper::wrap(scope.engine, o->d()->incubator->object());
2204QV4::ReturnedValue
QV4::
QmlIncubatorObject::method_forceCompletion(
const FunctionObject *b,
const Value *thisObject,
const Value *,
int)
2206 QV4::Scope scope(b);
2207 QV4::Scoped<QmlIncubatorObject> o(scope, thisObject->as<QmlIncubatorObject>());
2211 o->d()->incubator->forceCompletion();
2216QV4::ReturnedValue
QV4::
QmlIncubatorObject::method_get_status(
const FunctionObject *b,
const Value *thisObject,
const Value *,
int)
2218 QV4::Scope scope(b);
2219 QV4::Scoped<QmlIncubatorObject> o(scope, thisObject->as<QmlIncubatorObject>());
2223 return QV4::Encode(o->d()->incubator->status());
2226QV4::ReturnedValue
QV4::
QmlIncubatorObject::method_get_statusChanged(
const FunctionObject *b,
const Value *thisObject,
const Value *,
int)
2228 QV4::Scope scope(b);
2229 QV4::Scoped<QmlIncubatorObject> o(scope, thisObject->as<QmlIncubatorObject>());
2233 return QV4::Encode(o->d()->statusChanged);
2236QV4::ReturnedValue
QV4::
QmlIncubatorObject::method_set_statusChanged(
const FunctionObject *b,
const Value *thisObject,
const Value *argv,
int argc)
2238 QV4::Scope scope(b);
2239 QV4::Scoped<QmlIncubatorObject> o(scope, thisObject->as<QmlIncubatorObject>());
2243 o->d()->statusChanged.set(scope.engine, argv[0]);
2248QQmlComponentExtension::~QQmlComponentExtension()
2252void QV4::Heap::QmlIncubatorObject::init(QQmlIncubator::IncubationMode m)
2255 valuemapOrObject.set(internalClass->engine, QV4::Value::undefinedValue());
2256 statusChanged.set(internalClass->engine, QV4::Value::undefinedValue());
2258 qmlContext.set(internalClass->engine,
nullptr);
2259 incubator =
new QQmlComponentIncubator(
this, m);
2262void QV4::Heap::QmlIncubatorObject::destroy() {
2270 QQmlComponent_setQmlParent(o, d()->parent);
2272 if (!d()->valuemapOrObject.isUndefined()) {
2273 QV4::ExecutionEngine *v4 = engine();
2274 QV4::Scope scope(v4);
2275 QV4::ScopedObject obj(scope, QV4::QObjectWrapper::wrap(v4, o));
2276 QV4::Scoped<QV4::QmlContext> qmlCtxt(scope, d()->qmlContext);
2277 QQmlComponentPrivate::setInitialProperties(
2278 v4, qmlCtxt, obj, d()->valuemapOrObject, requiredProperties, o,
2279 QQmlIncubatorPrivate::get(d()->incubator)->creator.data());
2285 QV4::Scope scope(engine());
2287 QObject *object = d()->incubator->object();
2289 if (s == QQmlIncubator::Ready) {
2292 d()->valuemapOrObject.set(scope.engine, QV4::QObjectWrapper::wrap(scope.engine, object));
2294 QQmlData *ddata = QQmlData::get(object);
2296 ddata->explicitIndestructibleSet =
false;
2297 ddata->indestructible =
false;
2300 QV4::ScopedFunctionObject f(scope, d()->statusChanged);
2302 QV4::JSCallArguments jsCallData(scope, 1);
2303 *jsCallData.thisObject =
this;
2304 jsCallData.args[0] = QV4::Value::fromUInt32(s);
2305 f->call(jsCallData);
2306 if (scope.hasException()) {
2307 QQmlError error = scope.engine->catchExceptionAsQmlError();
2308 QQmlEnginePrivate::warning(QQmlEnginePrivate::get(scope.engine->qmlEngine()), error);
2312 if (s != QQmlIncubator::Loading)
2313 d()->incubator->incubatorObject.clear();
2316#undef INITIALPROPERTIES_SOURCE
2320#include "moc_qqmlcomponent.cpp"
2321#include "moc_qqmlcomponentattached_p.cpp"
void setInitialState(QObject *o) override
Called after the object is first created, but before complex property bindings are evaluated and,...
void statusChanged(Status s) override
Called when the status of the incubator changes.
QQmlComponentIncubator(QV4::Heap::QmlIncubatorObject *inc, IncubationMode mode)
QV4::PersistentValue incubatorObject
The QQmlError class encapsulates a QML error.
Status
Specifies the status of the QQmlIncubator.
DECLARE_HEAP_OBJECT(QmlContext, ExecutionContext)
QT_BEGIN_NAMESPACE Q_STATIC_LOGGING_CATEGORY(lcSynthesizedIterableAccess, "qt.iterable.synthesized", QtWarningMsg)
static void removePendingQPropertyBinding(QV4::Value *object, const QString &propertyName, const QQmlObjectCreator *creator)
static void QQmlComponent_setQmlParent(QObject *me, QObject *parent)
DEFINE_OBJECT_VTABLE(QV4::QmlIncubatorObject)
V4_DEFINE_EXTENSION(QQmlComponentExtension, componentExtension)
static QQmlParserStatus * parserStatusCast(const QQmlType &type, QObject *rv)
static ReturnedValue method_set_statusChanged(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_get_status(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_get_object(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
void statusChanged(QQmlIncubator::Status)
void setInitialState(QObject *, RequiredProperties *requiredProperties)
static ReturnedValue method_forceCompletion(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)