139 Q_DECLARE_TR_FUNCTIONS(QQmlObjectCreator)
141 enum class InitFlag: quint8
144 IsDocumentRoot = 0x1,
145 IsContextObject = 0x2,
146 IsImplicitComponent = 0x4,
151 const QQmlRefPointer<QV4::ExecutableCompilationUnit> &compilationUnit,
152 const QQmlRefPointer<QQmlContextData> &creationContext,
153 const QString &inlineComponentName,
155 ~QQmlObjectCreator();
158 QObject *
create(
int subComponentIndex = -1, QObject *parent =
nullptr,
165 const QV4::CompiledData::Binding *binding);
167 int index, QObject *instance, QObject *bindingTarget,
169 const QV4::CompiledData::Binding *binding =
nullptr);
176 int objectIndex, QObject *parent,
177 const QQmlRefPointer<QQmlContextData> &existingContext);
186 return parentContext.contextData();
194 QQmlEngine *engine,
QV4::ExecutableCompilationUnit *compilationUnit,
int index,
195 QObject *parent,
const QQmlRefPointer<QQmlContextData> &context);
199 QList<DeferredQPropertyBinding> &pendingBindings = sharedState.data()->allQPropertyBindings;
201 return deferred.properyIndex == propertyIndex && deferred.target == target;
206 int index, QObject *instance,
207 const QQmlRefPointer<QQmlContextData> &instanceContext, InitFlags flags);
211 const QQmlRefPointer<QQmlContextData> &contextData,
212 const QQmlRefPointer<QV4::ExecutableCompilationUnit> &compilationUnit,
213 const QString inlineComponentName,
214 QQmlObjectCreatorSharedState *inheritedSharedState,
bool isContextObject);
216 void init(
const QQmlRefPointer<QQmlContextData> &parentContext);
218 void initializeDData(
219 const QV4::CompiledData::Object *obj, QObject *instance, QQmlData *ddata,
221 void initializePropertyCache(
222 int index, QQmlData *ddata,
const QV4::ResolvedTypeReference *typeRef);
223 void initializeParent(QObject *instance, QObject *parent);
224 QObject *populateInstanceAndAliasBindings(
int index, QObject *instance, InitFlags flags);
226 QObject *createInstance(
int index, QObject *parent =
nullptr,
bool isContextObject =
false);
228 QObject *initializeComponent(
229 int index,
const QV4::CompiledData::Object *obj, QObject *instance, InitFlags flags);
230 QObject *initializeComposite(
231 int index,
const QV4::CompiledData::Object *obj,
232 const QV4::ResolvedTypeReference *typeRef, QObject *instance, QObject *parent,
234 QObject *initializeNonComposite(
235 int index,
const QV4::CompiledData::Object *obj,
236 const QV4::ResolvedTypeReference *typeRef, QObject *instance, QObject *parent,
239 bool populateInstance(
int index, QObject *instance, QObject *bindingTarget,
241 const QV4::CompiledData::Binding *binding =
nullptr);
244 void populateDeferred(QObject *instance,
int deferredIndex);
245 void populateDeferred(QObject *instance,
int deferredIndex,
246 const QQmlPropertyPrivate *qmlProperty,
247 const QV4::CompiledData::Binding *binding);
251 ApplyImmediate = 0x1,
253 ApplyAll = ApplyImmediate | ApplyDeferred,
255 Q_DECLARE_FLAGS(BindingSetupFlags, BindingMode);
257 void setupBindings(BindingSetupFlags mode = BindingMode::ApplyImmediate);
258 bool setPropertyBinding(
const QQmlPropertyData *property,
const QV4::CompiledData::Binding *binding);
259 void setPropertyValue(
const QQmlPropertyData *property,
const QV4::CompiledData::Binding *binding,
260 std::optional<
int> foldedNumber = std::nullopt);
261 void setupFunctions();
263 QString stringAt(
int idx)
const {
return compilationUnit->stringAt(idx); }
264 void recordError(
const QV4::CompiledData::Location &location,
const QString &description);
266 void registerObjectWithContextById(
int objectIndex, QObject *instance)
const;
268 inline QV4::QmlContext *currentQmlContext();
269 QV4::ResolvedTypeReference *resolvedType(
int id)
const
271 return compilationUnit->resolvedType(id);
277 CreatingObjectsPhase2,
284 QV4::ExecutionEngine *v4;
285 QString m_inlineComponentName;
286 QQmlRefPointer<QV4::ExecutableCompilationUnit> compilationUnit;
287 const QV4::CompiledData::Unit *qmlUnit;
288 QQmlGuardedContextData parentContext;
289 QQmlRefPointer<QQmlContextData> context;
290 const QQmlPropertyCacheVector *propertyCaches;
291 QQmlRefPointer<QQmlObjectCreatorSharedState> sharedState;
292 bool topLevelCreator;
293 bool isContextObject;
297 QObject *_scopeObject;
298 QObject *_bindingTarget;
301 int _compiledObjectIndex;
302 const QV4::CompiledData::Object *_compiledObject;
304 QQmlPropertyCache::ConstPtr _propertyCache;
305 QQmlVMEMetaObject *_vmeMetaObject;
306 QQmlListProperty<QObject> _currentList;
307 QV4::QmlContext *_qmlContext;
311 typedef std::function<
bool(QQmlObjectCreatorSharedState *sharedState)> PendingAliasBinding;
312 std::vector<PendingAliasBinding> pendingAliasBindings;
314 template<
typename Functor>
315 void doPopulateDeferred(QObject *instance,
int deferredIndex, Functor f)
317 QQmlData *declarativeData = QQmlData::get(instance);
320 Q_ASSERT(declarativeData && declarativeData->propertyCache);
322 QObject *bindingTarget = instance;
324 QQmlPropertyCache::ConstPtr cache = declarativeData->propertyCache;
325 QQmlVMEMetaObject *vmeMetaObject = QQmlVMEMetaObject::get(instance, v4);
327 QObject *scopeObject = instance;
328 qt_ptr_swap(_scopeObject, scopeObject);
330 QV4::Scope valueScope(v4);
331 QScopedValueRollback<ObjectInCreationGCAnchorList> jsObjectGuard(
332 sharedState->allJavaScriptObjects, ObjectInCreationGCAnchorList(valueScope));
334 Q_ASSERT(topLevelCreator);
335 QV4::QmlContext *qmlContext =
static_cast<QV4::QmlContext *>(valueScope.constructUndefined(1));
337 qt_ptr_swap(_qmlContext, qmlContext);
339 _propertyCache.swap(cache);
340 qt_ptr_swap(_qobject, instance);
342 int objectIndex = deferredIndex;
343 std::swap(_compiledObjectIndex, objectIndex);
345 const QV4::CompiledData::Object *obj = compilationUnit->objectAt(_compiledObjectIndex);
346 qt_ptr_swap(_compiledObject, obj);
347 qt_ptr_swap(_ddata, declarativeData);
348 qt_ptr_swap(_bindingTarget, bindingTarget);
349 qt_ptr_swap(_vmeMetaObject, vmeMetaObject);
353 qt_ptr_swap(_vmeMetaObject, vmeMetaObject);
354 qt_ptr_swap(_bindingTarget, bindingTarget);
355 qt_ptr_swap(_ddata, declarativeData);
356 qt_ptr_swap(_compiledObject, obj);
357 std::swap(_compiledObjectIndex, objectIndex);
358 qt_ptr_swap(_qobject, instance);
359 _propertyCache.swap(cache);
361 qt_ptr_swap(_qmlContext, qmlContext);
362 qt_ptr_swap(_scopeObject, scopeObject);
364 void registerPostHocRequiredProperties(
const QV4::CompiledData::Binding *binding);