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;
207 const QQmlRefPointer<QQmlContextData> &contextData,
208 const QQmlRefPointer<QV4::ExecutableCompilationUnit> &compilationUnit,
209 const QString inlineComponentName,
210 QQmlObjectCreatorSharedState *inheritedSharedState,
bool isContextObject);
212 void init(
const QQmlRefPointer<QQmlContextData> &parentContext);
214 void initializeDData(
215 const QV4::CompiledData::Object *obj, QObject *instance, QQmlData *ddata,
217 void initializePropertyCache(
218 int index, QQmlData *ddata,
const QV4::ResolvedTypeReference *typeRef);
219 void initializeParent(QObject *instance, QObject *parent);
220 QObject *populateInstanceAndAliasBindings(
int index, QObject *instance, InitFlags flags);
222 QObject *createInstance(
int index, QObject *parent =
nullptr,
bool isContextObject =
false);
224 QObject *initializeComponent(
225 const QV4::CompiledData::Object *obj, QObject *instance, InitFlags flags);
226 QObject *initializeComposite(
227 int index,
const QV4::CompiledData::Object *obj,
228 const QV4::ResolvedTypeReference *typeRef, QObject *instance, QObject *parent,
230 QObject *initializeNonComposite(
231 int index,
const QV4::CompiledData::Object *obj,
232 const QV4::ResolvedTypeReference *typeRef, QObject *instance, QObject *parent,
235 bool populateInstance(
int index, QObject *instance, QObject *bindingTarget,
237 const QV4::CompiledData::Binding *binding =
nullptr);
240 void populateDeferred(QObject *instance,
int deferredIndex);
241 void populateDeferred(QObject *instance,
int deferredIndex,
242 const QQmlPropertyPrivate *qmlProperty,
243 const QV4::CompiledData::Binding *binding);
247 ApplyImmediate = 0x1,
249 ApplyAll = ApplyImmediate | ApplyDeferred,
251 Q_DECLARE_FLAGS(BindingSetupFlags, BindingMode);
253 void setupBindings(BindingSetupFlags mode = BindingMode::ApplyImmediate);
254 bool setPropertyBinding(
const QQmlPropertyData *property,
const QV4::CompiledData::Binding *binding);
255 void setPropertyValue(
const QQmlPropertyData *property,
const QV4::CompiledData::Binding *binding);
256 void setupFunctions();
258 QString stringAt(
int idx)
const {
return compilationUnit->stringAt(idx); }
259 void recordError(
const QV4::CompiledData::Location &location,
const QString &description);
261 void registerObjectWithContextById(
const QV4::CompiledData::Object *object, QObject *instance)
const;
263 inline QV4::QmlContext *currentQmlContext();
264 QV4::ResolvedTypeReference *resolvedType(
int id)
const
266 return compilationUnit->resolvedType(id);
272 CreatingObjectsPhase2,
279 QV4::ExecutionEngine *v4;
280 QString m_inlineComponentName;
281 QQmlRefPointer<QV4::ExecutableCompilationUnit> compilationUnit;
282 const QV4::CompiledData::Unit *qmlUnit;
283 QQmlGuardedContextData parentContext;
284 QQmlRefPointer<QQmlContextData> context;
285 const QQmlPropertyCacheVector *propertyCaches;
286 QQmlRefPointer<QQmlObjectCreatorSharedState> sharedState;
287 bool topLevelCreator;
288 bool isContextObject;
292 QObject *_scopeObject;
293 QObject *_bindingTarget;
296 int _compiledObjectIndex;
297 const QV4::CompiledData::Object *_compiledObject;
299 QQmlPropertyCache::ConstPtr _propertyCache;
300 QQmlVMEMetaObject *_vmeMetaObject;
301 QQmlListProperty<QObject> _currentList;
302 QV4::QmlContext *_qmlContext;
306 typedef std::function<
bool(QQmlObjectCreatorSharedState *sharedState)> PendingAliasBinding;
307 std::vector<PendingAliasBinding> pendingAliasBindings;
309 template<
typename Functor>
310 void doPopulateDeferred(QObject *instance,
int deferredIndex, Functor f)
312 QQmlData *declarativeData = QQmlData::get(instance);
315 Q_ASSERT(declarativeData && declarativeData->propertyCache);
317 QObject *bindingTarget = instance;
319 QQmlPropertyCache::ConstPtr cache = declarativeData->propertyCache;
320 QQmlVMEMetaObject *vmeMetaObject = QQmlVMEMetaObject::get(instance);
322 QObject *scopeObject = instance;
323 qt_ptr_swap(_scopeObject, scopeObject);
325 QV4::Scope valueScope(v4);
326 QScopedValueRollback<ObjectInCreationGCAnchorList> jsObjectGuard(
327 sharedState->allJavaScriptObjects, ObjectInCreationGCAnchorList(valueScope));
329 Q_ASSERT(topLevelCreator);
330 QV4::QmlContext *qmlContext =
static_cast<QV4::QmlContext *>(valueScope.constructUndefined(1));
332 qt_ptr_swap(_qmlContext, qmlContext);
334 _propertyCache.swap(cache);
335 qt_ptr_swap(_qobject, instance);
337 int objectIndex = deferredIndex;
338 std::swap(_compiledObjectIndex, objectIndex);
340 const QV4::CompiledData::Object *obj = compilationUnit->objectAt(_compiledObjectIndex);
341 qt_ptr_swap(_compiledObject, obj);
342 qt_ptr_swap(_ddata, declarativeData);
343 qt_ptr_swap(_bindingTarget, bindingTarget);
344 qt_ptr_swap(_vmeMetaObject, vmeMetaObject);
348 qt_ptr_swap(_vmeMetaObject, vmeMetaObject);
349 qt_ptr_swap(_bindingTarget, bindingTarget);
350 qt_ptr_swap(_ddata, declarativeData);
351 qt_ptr_swap(_compiledObject, obj);
352 std::swap(_compiledObjectIndex, objectIndex);
353 qt_ptr_swap(_qobject, instance);
354 _propertyCache.swap(cache);
356 qt_ptr_swap(_qmlContext, qmlContext);
357 qt_ptr_swap(_scopeObject, scopeObject);
359 void registerPostHocRequiredProperties(
const QV4::CompiledData::Binding *binding);