Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qqmlcppbinding.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 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
4#include "qqmlcppbinding_p.h"
5
6#include <QtQml/qqmlengine.h>
7#include <QtQml/qqmlcontext.h>
8#include <QtCore/qmetaobject.h>
9
10#include <private/qqmltypedata_p.h>
11#include <private/qqmlpropertybinding_p.h>
12#include <private/qqmlbinding_p.h>
13#include <private/qv4qmlcontext_p.h>
14#include <private/qqmlproperty_p.h>
15#include <private/qqmlbinding_p.h>
16
18
19template<typename CreateBinding>
20inline decltype(auto) createBindingInScope(QObject *thisObject, CreateBinding create)
21{
22 QQmlEngine *qmlengine = qmlEngine(thisObject);
23 Q_ASSERT(qmlengine);
24 QV4::ExecutionEngine *v4 = qmlengine->handle();
25 Q_ASSERT(v4);
26
27 QQmlData *ddata = QQmlData::get(thisObject);
28 Q_ASSERT(ddata && ddata->outerContext);
29 QQmlRefPointer<QQmlContextData> ctxtdata = QQmlRefPointer<QQmlContextData>(ddata->outerContext);
30
31 QV4::Scope scope(v4);
32 QV4::ExecutionContext *executionCtx = v4->scriptContext();
34 scope, QV4::QmlContext::create(executionCtx, ctxtdata, thisObject));
35
36 return create(ctxtdata, qmlContext);
37}
38
41 QObject *thisObject, qsizetype functionIndex,
42 QObject *bindingTarget, int metaPropertyIndex,
43 int valueTypePropertyIndex, const QString &propertyName)
44{
45 Q_UNUSED(propertyName);
46
47 QV4::Function *v4Function = unit->runtimeFunctions.value(functionIndex, nullptr);
48 if (!v4Function) {
49 // TODO: align with existing logging of such
50 qCritical() << "invalid JavaScript function index (internal error)";
52 }
53 if (metaPropertyIndex < 0) {
54 // TODO: align with existing logging of such
55 qCritical() << "invalid meta property index (internal error)";
57 }
58
59 const QMetaObject *mo = bindingTarget->metaObject();
60 Q_ASSERT(mo);
61 QMetaProperty property = mo->property(metaPropertyIndex);
62 Q_ASSERT(valueTypePropertyIndex == -1 || QString::fromUtf8(property.name()) == propertyName);
63
65 thisObject,
66 [&](const QQmlRefPointer<QQmlContextData> &ctxt, QV4::ExecutionContext *scope) {
67 auto index = QQmlPropertyIndex(property.propertyIndex(), valueTypePropertyIndex);
68 return QQmlPropertyBinding::create(property.metaType(), v4Function, thisObject,
69 ctxt, scope, bindingTarget, index);
70 });
71}
72
74 QObject *thisObject, qsizetype functionIndex,
75 QObject *bindingTarget, int metaPropertyIndex,
76 int valueTypePropertyIndex,
77 const QString &propertyName)
78{
79 Q_UNUSED(propertyName);
80
81 QV4::Function *v4Function = unit->runtimeFunctions.value(functionIndex, nullptr);
82 if (!v4Function) {
83 // TODO: align with existing logging of such
84 qCritical() << "invalid JavaScript function index (internal error)";
85 return;
86 }
87 if (metaPropertyIndex < 0) {
88 // TODO: align with existing logging of such
89 qCritical() << "invalid meta property index (internal error)";
90 return;
91 }
92
93 const QMetaObject *mo = bindingTarget->metaObject();
94 Q_ASSERT(mo);
95 QMetaProperty property = mo->property(metaPropertyIndex);
96 Q_ASSERT(valueTypePropertyIndex != -1 || QString::fromUtf8(property.name()) == propertyName);
97
99 thisObject,
100 [&](const QQmlRefPointer<QQmlContextData> &ctxt, QV4::ExecutionContext *scope) -> void {
101 QQmlBinding *binding = QQmlBinding::create(property.metaType(), v4Function,
102 thisObject, ctxt, scope);
103 // almost as in qv4objectwrapper.cpp:535
104 Q_ASSERT(!property.isAlias()); // we convert aliases to (almost) real properties
105 binding->setTarget(bindingTarget, property.propertyIndex(), false,
106 valueTypePropertyIndex);
108 });
109}
110
112 const QQmlRefPointer<QV4::ExecutableCompilationUnit> &unit, QObject *bindingTarget,
113 int metaPropertyIndex, const QQmlTranslation &translationData, const QString &propertyName)
114{
115 Q_UNUSED(propertyName);
116
117 if (metaPropertyIndex < 0) {
118 // TODO: align with existing logging of such
119 qCritical() << "invalid meta property index (internal error)";
121 }
122
123 const QMetaObject *mo = bindingTarget->metaObject();
124 Q_ASSERT(mo);
125 QMetaProperty property = mo->property(metaPropertyIndex);
126 Q_ASSERT(QString::fromUtf8(property.name()) == propertyName);
127
128 return QQmlTranslationPropertyBinding::create(property.metaType(), unit, translationData);
129}
130
132 const QQmlRefPointer<QV4::ExecutableCompilationUnit> &unit,
133 const QQmlSourceLocation &location, const QQmlTranslation &translationData,
134 QObject *thisObject, QObject *bindingTarget, int metaPropertyIndex,
135 const QString &propertyName, int valueTypePropertyIndex)
136{
137 Q_UNUSED(propertyName);
138
139 if (metaPropertyIndex < 0) {
140 // TODO: align with existing logging of such
141 qCritical() << "invalid meta property index (internal error)";
142 return;
143 }
144
145 const QMetaObject *mo = bindingTarget->metaObject();
146 Q_ASSERT(mo);
147 QMetaProperty property = mo->property(metaPropertyIndex);
148 Q_ASSERT(QString::fromUtf8(property.name()) == propertyName);
149
151 thisObject,
152 [&](const QQmlRefPointer<QQmlContextData> &ctxt, QV4::ExecutionContext *) -> void {
154 unit, ctxt, propertyName, translationData, location, thisObject);
155 // almost as in qv4objectwrapper.cpp:535
156 Q_ASSERT(!property.isAlias()); // we convert aliases to (almost) real properties
157 binding->setTarget(bindingTarget, property.propertyIndex(), false,
158 valueTypePropertyIndex);
160 });
161}
162
QV4::ExecutionEngine * handle() const
Definition qjsengine.h:298
\inmodule QtCore
\inmodule QtCore
Definition qobject.h:103
void setTarget(const QQmlProperty &)
static QQmlBinding * createTranslationBinding(const QQmlRefPointer< QV4::ExecutableCompilationUnit > &unit, const QV4::CompiledData::Binding *binding, QObject *obj, const QQmlRefPointer< QQmlContextData > &ctxt)
static QQmlBinding * create(const QQmlPropertyData *, const QQmlScriptString &, QObject *, QQmlContext *)
static QQmlData * get(QObjectPrivate *priv, bool create)
Definition qqmldata_p.h:199
The QQmlEngine class provides an environment for instantiating QML components.
Definition qqmlengine.h:57
static QUntypedPropertyBinding create(const QQmlPropertyData *pd, QV4::Function *function, QObject *obj, const QQmlRefPointer< QQmlContextData > &ctxt, QV4::ExecutionContext *scope, QObject *target, QQmlPropertyIndex targetIndex)
static void setBinding(QQmlAbstractBinding *binding, BindingFlags flags=None, QQmlPropertyData::WriteFlags writeFlags=QQmlPropertyData::DontRemoveBinding)
static QUntypedPropertyBinding Q_QML_EXPORT create(const QQmlPropertyData *pd, const QQmlRefPointer< QV4::ExecutableCompilationUnit > &compilationUnit, const QV4::CompiledData::Binding *binding)
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:6018
auto mo
[7]
Combined button and popup list for selecting options.
#define qCritical
Definition qlogging.h:167
GLint location
GLuint index
[2]
QQmlEngine * qmlEngine(const QObject *obj)
Definition qqml.cpp:80
QQmlContext * qmlContext(const QObject *obj)
Definition qqml.cpp:75
QT_BEGIN_NAMESPACE decltype(auto) createBindingInScope(QObject *thisObject, CreateBinding create)
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
#define Q_UNUSED(x)
ptrdiff_t qsizetype
Definition qtypes.h:165
const char property[13]
Definition qwizard.cpp:101
view create()
\inmodule QtCore
static void createTranslationBindingForNonBindable(const QQmlRefPointer< QV4::ExecutableCompilationUnit > &unit, const QQmlSourceLocation &location, const QQmlTranslation &translationData, QObject *thisObject, QObject *bindingTarget, int metaPropertyIndex, const QString &propertyName, int valueTypePropertyIndex)
static QUntypedPropertyBinding createTranslationBindingForBindable(const QQmlRefPointer< QV4::ExecutableCompilationUnit > &unit, QObject *bindingTarget, int metaPropertyIndex, const QQmlTranslation &translationData, const QString &propertyName)
static QUntypedPropertyBinding createBindingForBindable(const QV4::ExecutableCompilationUnit *unit, QObject *thisObject, qsizetype functionIndex, QObject *bindingTarget, int metaPropertyIndex, int valueTypePropertyIndex, const QString &propertyName)
static void createBindingForNonBindable(const QV4::ExecutableCompilationUnit *unit, QObject *thisObject, qsizetype functionIndex, QObject *bindingTarget, int metaPropertyIndex, int valueTypePropertyIndex, const QString &propertyName)
ExecutionContext * scriptContext() const
static Heap::QmlContext * create(QV4::ExecutionContext *parent, QQmlRefPointer< QQmlContextData > context, QObject *scopeObject)