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 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 void setupFunctions();
262 QString stringAt(
int idx)
const {
return compilationUnit->stringAt(idx); }
263 void recordError(
const QV4::CompiledData::Location &location,
const QString &description);
265 void registerObjectWithContextById(
const QV4::CompiledData::Object *object, QObject *instance)
const;
267 inline QV4::QmlContext *currentQmlContext();
268 QV4::ResolvedTypeReference *resolvedType(
int id)
const
270 return compilationUnit->resolvedType(id);
276 CreatingObjectsPhase2,
283 QV4::ExecutionEngine *v4;
284 QString m_inlineComponentName;
285 QQmlRefPointer<QV4::ExecutableCompilationUnit> compilationUnit;
286 const QV4::CompiledData::Unit *qmlUnit;
287 QQmlGuardedContextData parentContext;
288 QQmlRefPointer<QQmlContextData> context;
289 const QQmlPropertyCacheVector *propertyCaches;
290 QQmlRefPointer<QQmlObjectCreatorSharedState> sharedState;
291 bool topLevelCreator;
292 bool isContextObject;
296 QObject *_scopeObject;
297 QObject *_bindingTarget;
300 int _compiledObjectIndex;
301 const QV4::CompiledData::Object *_compiledObject;
303 QQmlPropertyCache::ConstPtr _propertyCache;
304 QQmlVMEMetaObject *_vmeMetaObject;
305 QQmlListProperty<QObject> _currentList;
306 QV4::QmlContext *_qmlContext;
310 typedef std::function<
bool(QQmlObjectCreatorSharedState *sharedState)> PendingAliasBinding;
311 std::vector<PendingAliasBinding> pendingAliasBindings;
313 template<
typename Functor>
314 void doPopulateDeferred(QObject *instance,
int deferredIndex, Functor f)
316 QQmlData *declarativeData = QQmlData::get(instance);
319 Q_ASSERT(declarativeData && declarativeData->propertyCache);
321 QObject *bindingTarget = instance;
323 QQmlPropertyCache::ConstPtr cache = declarativeData->propertyCache;
324 QQmlVMEMetaObject *vmeMetaObject = QQmlVMEMetaObject::get(instance);
326 QObject *scopeObject = instance;
327 qt_ptr_swap(_scopeObject, scopeObject);
329 QV4::Scope valueScope(v4);
330 QScopedValueRollback<ObjectInCreationGCAnchorList> jsObjectGuard(
331 sharedState->allJavaScriptObjects, ObjectInCreationGCAnchorList(valueScope));
333 Q_ASSERT(topLevelCreator);
334 QV4::QmlContext *qmlContext =
static_cast<QV4::QmlContext *>(valueScope.constructUndefined(1));
336 qt_ptr_swap(_qmlContext, qmlContext);
338 _propertyCache.swap(cache);
339 qt_ptr_swap(_qobject, instance);
341 int objectIndex = deferredIndex;
342 std::swap(_compiledObjectIndex, objectIndex);
344 const QV4::CompiledData::Object *obj = compilationUnit->objectAt(_compiledObjectIndex);
345 qt_ptr_swap(_compiledObject, obj);
346 qt_ptr_swap(_ddata, declarativeData);
347 qt_ptr_swap(_bindingTarget, bindingTarget);
348 qt_ptr_swap(_vmeMetaObject, vmeMetaObject);
352 qt_ptr_swap(_vmeMetaObject, vmeMetaObject);
353 qt_ptr_swap(_bindingTarget, bindingTarget);
354 qt_ptr_swap(_ddata, declarativeData);
355 qt_ptr_swap(_compiledObject, obj);
356 std::swap(_compiledObjectIndex, objectIndex);
357 qt_ptr_swap(_qobject, instance);
358 _propertyCache.swap(cache);
360 qt_ptr_swap(_qmlContext, qmlContext);
361 qt_ptr_swap(_scopeObject, scopeObject);
363 void registerPostHocRequiredProperties(
const QV4::CompiledData::Binding *binding);