aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichael Brasser <michael.brasser@live.com>2014-03-03 21:53:52 -0600
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-11 19:59:05 +0100
commitb9fbb7d9c8abe3003f44ba2eee235adc13c81898 (patch)
tree6ad1ee9d94cf7e4ede0cec61f858be74aa427e65 /src
parent92392c936f91412a278a3006f7538de81c856a7b (diff)
Remove redundant QQmlBinding members.
This reduces the size of QQmlBinding by 12 bytes. Task-number: QTBUG-37134 Change-Id: Id55257edec8cee88d863374e8a96d7eebbeaf523 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com> Reviewed-by: Michael Brasser <michael.brasser@live.com>
Diffstat (limited to 'src')
-rw-r--r--src/qml/jsruntime/qv4qobjectwrapper.cpp7
-rw-r--r--src/qml/qml/qqmlbinding.cpp88
-rw-r--r--src/qml/qml/qqmlbinding_p.h11
-rw-r--r--src/qml/qml/qqmlobjectcreator.cpp3
-rw-r--r--src/qml/qml/qqmlvaluetypewrapper.cpp7
-rw-r--r--src/qml/qml/v8/qqmlbuiltinfunctions.cpp53
-rw-r--r--src/qml/qml/v8/qqmlbuiltinfunctions_p.h19
-rw-r--r--src/quick/util/qquickpropertychanges.cpp2
8 files changed, 107 insertions, 83 deletions
diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp
index 531987f52d..004c3eb036 100644
--- a/src/qml/jsruntime/qv4qobjectwrapper.cpp
+++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp
@@ -53,6 +53,7 @@
#include <private/qqmlvaluetypewrapper_p.h>
#include <private/qqmlcontextwrapper_p.h>
#include <private/qqmllistwrapper_p.h>
+#include <private/qqmlbuiltinfunctions_p.h>
#include <private/qv8engine_p.h>
#include <private/qv4functionobject_p.h>
@@ -473,10 +474,10 @@ void QObjectWrapper::setProperty(QObject *object, ExecutionContext *ctx, QQmlPro
// binding assignment.
QQmlContextData *callingQmlContext = QV4::QmlContextWrapper::callingContext(ctx->engine);
- QV4::StackFrame frame = ctx->engine->currentStackFrame();
+ QV4::Scoped<QQmlBindingFunction> bindingFunction(scope, f);
+ bindingFunction->initBindingLocation();
- newBinding = new QQmlBinding(value, object, callingQmlContext, frame.source,
- qmlSourceCoordinate(frame.line), qmlSourceCoordinate(frame.column));
+ newBinding = new QQmlBinding(value, object, callingQmlContext);
newBinding->setTarget(object, *property, callingQmlContext);
}
}
diff --git a/src/qml/qml/qqmlbinding.cpp b/src/qml/qml/qqmlbinding.cpp
index 11b9353dfe..295461ba26 100644
--- a/src/qml/qml/qqmlbinding.cpp
+++ b/src/qml/qml/qqmlbinding.cpp
@@ -51,6 +51,7 @@
#include <private/qqmlexpression_p.h>
#include <private/qqmlscriptstring_p.h>
#include <private/qqmlcontextwrapper_p.h>
+#include <private/qqmlbuiltinfunctions_p.h>
#include <QVariant>
#include <QtCore/qdebug.h>
@@ -71,8 +72,7 @@ QQmlAbstractBinding::VTable QQmlBinding_vtable = {
QQmlBinding::Identifier QQmlBinding::Invalid = -1;
QQmlBinding *
-QQmlBinding::createBinding(Identifier id, QObject *obj, QQmlContext *ctxt,
- const QString &url, quint16 lineNumber)
+QQmlBinding::createBinding(Identifier id, QObject *obj, QQmlContext *ctxt)
{
if (id < 0)
return 0;
@@ -93,7 +93,7 @@ QQmlBinding::createBinding(Identifier id, QObject *obj, QQmlContext *ctxt,
QV4::ExecutionContext *qmlContext = wrapper->context();
QV4::Function *runtimeFunction = cdata->compilationUnit->runtimeFunctions[cdata->customParserBindings[id]];
QV4::ScopedValue function(valueScope, QV4::FunctionObject::creatScriptFunction(qmlContext, runtimeFunction));
- rv = new QQmlBinding(function, obj, ctxtdata, url, lineNumber, 0);
+ rv = new QQmlBinding(function, obj, ctxtdata);
}
typeData->release();
@@ -108,14 +108,12 @@ static QQmlJavaScriptExpression::VTable QQmlBinding_jsvtable = {
};
QQmlBinding::QQmlBinding(const QString &str, QObject *obj, QQmlContext *ctxt)
-: QQmlJavaScriptExpression(&QQmlBinding_jsvtable), QQmlAbstractBinding(Binding),
- m_lineNumber(0), m_columnNumber(0)
+: QQmlJavaScriptExpression(&QQmlBinding_jsvtable), QQmlAbstractBinding(Binding)
{
setNotifyOnValueChanged(true);
QQmlAbstractExpression::setContext(QQmlContextData::get(ctxt));
setScopeObject(obj);
- m_expression = str.toUtf8();
v4function = qmlBinding(context(), obj, str, QString(), 0);
}
@@ -129,6 +127,7 @@ QQmlBinding::QQmlBinding(const QQmlScriptString &script, QObject *obj, QQmlConte
if (!ctxt && (!scriptPrivate->context || !scriptPrivate->context->isValid()))
return;
+ QString url;
QString code;
int id = scriptPrivate->bindingId;
@@ -141,7 +140,7 @@ QQmlBinding::QQmlBinding(const QQmlScriptString &script, QObject *obj, QQmlConte
if (QQmlCompiledData *cdata = typeData->compiledData()) {
code = cdata->primitives.at(id);
- m_url = cdata->name;
+ url = cdata->name;
}
typeData->release();
@@ -153,44 +152,34 @@ QQmlBinding::QQmlBinding(const QQmlScriptString &script, QObject *obj, QQmlConte
QQmlAbstractExpression::setContext(QQmlContextData::get(ctxt ? ctxt : scriptPrivate->context));
setScopeObject(obj ? obj : scriptPrivate->scope);
- m_expression = scriptPrivate->script.toUtf8();
- m_lineNumber = scriptPrivate->lineNumber;
- m_columnNumber = scriptPrivate->columnNumber;
-
- v4function = qmlBinding(context(), scopeObject(), code, QString(), m_lineNumber);
+ v4function = qmlBinding(context(), scopeObject(), code, url, scriptPrivate->lineNumber);
}
QQmlBinding::QQmlBinding(const QString &str, QObject *obj, QQmlContextData *ctxt)
-: QQmlJavaScriptExpression(&QQmlBinding_jsvtable), QQmlAbstractBinding(Binding),
- m_lineNumber(0), m_columnNumber(0)
+: QQmlJavaScriptExpression(&QQmlBinding_jsvtable), QQmlAbstractBinding(Binding)
{
setNotifyOnValueChanged(true);
QQmlAbstractExpression::setContext(ctxt);
setScopeObject(obj);
- m_expression = str.toUtf8();
v4function = qmlBinding(ctxt, obj, str, QString(), 0);
}
QQmlBinding::QQmlBinding(const QString &str, QObject *obj,
QQmlContextData *ctxt,
const QString &url, quint16 lineNumber, quint16 columnNumber)
-: QQmlJavaScriptExpression(&QQmlBinding_jsvtable), QQmlAbstractBinding(Binding),
- m_url(url), m_lineNumber(lineNumber), m_columnNumber(columnNumber)
+: QQmlJavaScriptExpression(&QQmlBinding_jsvtable), QQmlAbstractBinding(Binding)
{
+ Q_UNUSED(columnNumber);
setNotifyOnValueChanged(true);
QQmlAbstractExpression::setContext(ctxt);
setScopeObject(obj);
- m_expression = str.toUtf8();
-
- v4function = qmlBinding(ctxt, obj, str, url, m_lineNumber);
+ v4function = qmlBinding(ctxt, obj, str, url, lineNumber);
}
-QQmlBinding::QQmlBinding(const QV4::ValueRef functionPtr, QObject *obj, QQmlContextData *ctxt,
- const QString &url, quint16 lineNumber, quint16 columnNumber)
-: QQmlJavaScriptExpression(&QQmlBinding_jsvtable), QQmlAbstractBinding(Binding),
- m_url(url), m_lineNumber(lineNumber), m_columnNumber(columnNumber)
+QQmlBinding::QQmlBinding(const QV4::ValueRef functionPtr, QObject *obj, QQmlContextData *ctxt)
+: QQmlJavaScriptExpression(&QQmlBinding_jsvtable), QQmlAbstractBinding(Binding)
{
setNotifyOnValueChanged(true);
QQmlAbstractExpression::setContext(ctxt);
@@ -217,17 +206,38 @@ void QQmlBinding::update(QQmlPropertyPrivate::WriteFlags flags)
if (QQmlData::wasDeleted(object()))
return;
- int lineNo = qmlSourceCoordinate(m_lineNumber);
- int columnNo = qmlSourceCoordinate(m_columnNumber);
+ QString url;
+ quint16 lineNumber;
+ quint16 columnNumber;
+
+ QQmlEnginePrivate *ep = QQmlEnginePrivate::get(context()->engine);
+ QV4::Scope scope(ep->v4engine());
+ QV4::ScopedFunctionObject f(scope, v4function.value());
+ Q_ASSERT(f);
+ if (f->bindingKeyFlag) {
+ QQmlSourceLocation loc = f->as<QQmlBindingFunction>()->bindingLocation;
+ url = loc.sourceFile;
+ lineNumber = loc.line;
+ columnNumber = loc.column;
+ } else {
+ QV4::Function *function = f->asFunctionObject()->function;
+ Q_ASSERT(function);
+
+ url = function->sourceFile();
+ lineNumber = function->compiledFunction->location.line;
+ columnNumber = function->compiledFunction->location.column;
+ }
+
+ int lineNo = qmlSourceCoordinate(lineNumber);
+ int columnNo = qmlSourceCoordinate(columnNumber);
QQmlTrace trace("General Binding Update");
- trace.addDetail("URL", m_url);
+ trace.addDetail("URL", url);
trace.addDetail("Line", lineNo);
trace.addDetail("Column", columnNo);
if (!updatingFlag()) {
- QQmlEnginePrivate *ep = QQmlEnginePrivate::get(context()->engine);
- QQmlBindingProfiler prof(ep->profiler, m_url, lineNo, columnNo);
+ QQmlBindingProfiler prof(ep->profiler, url, lineNo, columnNo);
setUpdatingFlag(true);
QQmlAbstractExpression::DeleteWatcher watcher(this);
@@ -243,13 +253,10 @@ void QQmlBinding::update(QQmlPropertyPrivate::WriteFlags flags)
QMetaObject::metacall(*m_coreObject, QMetaObject::WriteProperty, idx, a);
} else {
- QV4::Scope scope(ep->v4engine());
-
ep->referenceScarceResources();
bool isUndefined = false;
- QV4::ScopedValue f(scope, v4function.value());
QV4::ScopedValue result(scope, QQmlJavaScriptExpression::evaluate(context(), f, &isUndefined));
trace.event("writing binding result");
@@ -262,7 +269,7 @@ void QQmlBinding::update(QQmlPropertyPrivate::WriteFlags flags)
if (!watcher.wasDeleted()) {
if (needsErrorLocationData)
- delayedError()->setErrorLocation(QUrl(m_url), m_lineNumber, m_columnNumber);
+ delayedError()->setErrorLocation(QUrl(url), lineNumber, columnNumber);
if (hasError()) {
if (!delayedError()->addError(ep)) ep->warning(this->error(context()->engine));
@@ -303,7 +310,16 @@ QString QQmlBinding::expressionIdentifier(QQmlJavaScriptExpression *e)
{
QQmlBinding *This = static_cast<QQmlBinding *>(e);
- return This->m_url + QLatin1Char(':') + QString::number(This->m_lineNumber) + QLatin1Char(':') + QString::number(This->m_columnNumber);
+ QQmlEnginePrivate *ep = QQmlEnginePrivate::get(This->context()->engine);
+ QV4::Scope scope(ep->v4engine());
+ QV4::ScopedValue f(scope, This->v4function.value());
+ QV4::Function *function = f->asFunctionObject()->function;
+
+ QString url = function->sourceFile();
+ quint16 lineNumber = function->compiledFunction->location.line;
+ quint16 columnNumber = function->compiledFunction->location.column;
+
+ return url + QLatin1Char(':') + QString::number(lineNumber) + QLatin1Char(':') + QString::number(columnNumber);
}
void QQmlBinding::expressionChanged(QQmlJavaScriptExpression *e)
@@ -358,7 +374,9 @@ void QQmlBinding::setEnabled(bool e, QQmlPropertyPrivate::WriteFlags flags)
QString QQmlBinding::expression() const
{
- return QString::fromUtf8(m_expression);
+ QV4::Scope scope(QQmlEnginePrivate::get(context()->engine)->v4engine());
+ QV4::ScopedValue v(scope, v4function.value());
+ return v->toQStringNoThrow();
}
QObject *QQmlBinding::object() const
diff --git a/src/qml/qml/qqmlbinding_p.h b/src/qml/qml/qqmlbinding_p.h
index 9dd63a6e9c..3c2c832e0c 100644
--- a/src/qml/qml/qqmlbinding_p.h
+++ b/src/qml/qml/qqmlbinding_p.h
@@ -81,8 +81,7 @@ public:
QQmlBinding(const QString &, QObject *, QQmlContextData *);
QQmlBinding(const QString &, QObject *, QQmlContextData *,
const QString &url, quint16 lineNumber, quint16 columnNumber);
- QQmlBinding(const QV4::ValueRef, QObject *, QQmlContextData *,
- const QString &url, quint16 lineNumber, quint16 columnNumber);
+ QQmlBinding(const QV4::ValueRef, QObject *, QQmlContextData *);
void setTarget(const QQmlProperty &);
void setTarget(QObject *, const QQmlPropertyData &, QQmlContextData *);
@@ -113,7 +112,7 @@ public:
typedef int Identifier;
static Identifier Invalid;
- static QQmlBinding *createBinding(Identifier, QObject *, QQmlContext *, const QString &, quint16);
+ static QQmlBinding *createBinding(Identifier, QObject *, QQmlContext *);
QVariant evaluate();
@@ -143,12 +142,6 @@ private:
// m_ctxt:flag1 - updatingFlag
// m_ctxt:flag2 - enabledFlag
QFlagPointer<QQmlContextData> m_ctxt;
-
- // XXX It would be good if we could get rid of these in most circumstances
- QString m_url;
- quint16 m_lineNumber;
- quint16 m_columnNumber;
- QByteArray m_expression;
};
bool QQmlBinding::updatingFlag() const
diff --git a/src/qml/qml/qqmlobjectcreator.cpp b/src/qml/qml/qqmlobjectcreator.cpp
index 264ada2507..a5f7988bf8 100644
--- a/src/qml/qml/qqmlobjectcreator.cpp
+++ b/src/qml/qml/qqmlobjectcreator.cpp
@@ -845,8 +845,7 @@ bool QQmlObjectCreator::setPropertyBinding(QQmlPropertyData *property, const QV4
bs->takeExpression(expr);
} else {
- QQmlBinding *qmlBinding = new QQmlBinding(function, _scopeObject, context,
- context->urlString, binding->valueLocation.line, binding->valueLocation.column);
+ QQmlBinding *qmlBinding = new QQmlBinding(function, _scopeObject, context);
// When writing bindings to grouped properties implemented as value types,
// such as point.x: { someExpression; }, then the binding is installed on
diff --git a/src/qml/qml/qqmlvaluetypewrapper.cpp b/src/qml/qml/qqmlvaluetypewrapper.cpp
index 56da6819fe..9a87493e54 100644
--- a/src/qml/qml/qqmlvaluetypewrapper.cpp
+++ b/src/qml/qml/qqmlvaluetypewrapper.cpp
@@ -46,6 +46,7 @@
#include <private/qqmlbinding_p.h>
#include <private/qqmlglobal_p.h>
#include <private/qqmlcontextwrapper_p.h>
+#include <private/qqmlbuiltinfunctions_p.h>
#include <private/qv4engine_p.h>
#include <private/qv4functionobject_p.h>
@@ -380,10 +381,10 @@ void QmlValueTypeWrapper::put(Managed *m, const StringRef name, const ValueRef v
cacheData.valueTypeCoreIndex = index;
cacheData.valueTypePropType = p.userType();
- QV4::StackFrame frame = v4->currentStackFrame();
+ QV4::Scoped<QQmlBindingFunction> bindingFunction(scope, f);
+ bindingFunction->initBindingLocation();
- newBinding = new QQmlBinding(value, reference->object, context,
- frame.source, qmlSourceCoordinate(frame.line), qmlSourceCoordinate(frame.column));
+ newBinding = new QQmlBinding(value, reference->object, context);
newBinding->setTarget(reference->object, cacheData, context);
}
diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp
index 82af1c3fb8..5e0e68472d 100644
--- a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp
+++ b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp
@@ -1175,39 +1175,36 @@ ReturnedValue QtObject::method_locale(CallContext *ctx)
return QQmlLocale::locale(v8engine, code);
}
-namespace {
-
-struct BindingFunction : public QV4::FunctionObject
+QQmlBindingFunction::QQmlBindingFunction(FunctionObject *originalFunction)
+ : QV4::FunctionObject(originalFunction->scope, originalFunction->name())
+ , originalFunction(originalFunction)
{
- V4_OBJECT
- BindingFunction(FunctionObject *originalFunction)
- : QV4::FunctionObject(originalFunction->scope, originalFunction->name())
- , originalFunction(originalFunction)
- {
- setVTable(staticVTable());
- bindingKeyFlag = true;
- }
-
- static ReturnedValue call(Managed *that, CallData *callData)
- {
- BindingFunction *This = static_cast<BindingFunction*>(that);
- return This->originalFunction->call(callData);
- }
-
- static void markObjects(Managed *that, ExecutionEngine *e)
- {
- BindingFunction *This = static_cast<BindingFunction*>(that);
- This->originalFunction->mark(e);
- QV4::FunctionObject::markObjects(that, e);
- }
+ setVTable(staticVTable());
+ bindingKeyFlag = true;
+}
- QV4::FunctionObject *originalFunction;
-};
+void QQmlBindingFunction::initBindingLocation()
+{
+ QV4::StackFrame frame = engine()->currentStackFrame();
+ bindingLocation.sourceFile = frame.source;
+ bindingLocation.line = frame.line;
+}
-DEFINE_OBJECT_VTABLE(BindingFunction);
+ReturnedValue QQmlBindingFunction::call(Managed *that, CallData *callData)
+{
+ QQmlBindingFunction *This = static_cast<QQmlBindingFunction*>(that);
+ return This->originalFunction->call(callData);
+}
+void QQmlBindingFunction::markObjects(Managed *that, ExecutionEngine *e)
+{
+ QQmlBindingFunction *This = static_cast<QQmlBindingFunction*>(that);
+ This->originalFunction->mark(e);
+ QV4::FunctionObject::markObjects(that, e);
}
+DEFINE_OBJECT_VTABLE(QQmlBindingFunction);
+
/*!
\qmlmethod Qt::binding(function)
@@ -1262,7 +1259,7 @@ ReturnedValue QtObject::method_binding(CallContext *ctx)
if (!f)
V4THROW_TYPE("binding(): argument (binding expression) must be a function");
- return (new (ctx->engine->memoryManager) BindingFunction(f))->asReturnedValue();
+ return (new (ctx->engine->memoryManager) QQmlBindingFunction(f))->asReturnedValue();
}
diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions_p.h b/src/qml/qml/v8/qqmlbuiltinfunctions_p.h
index b0c63f1ad4..adc0c6ce4f 100644
--- a/src/qml/qml/v8/qqmlbuiltinfunctions_p.h
+++ b/src/qml/qml/v8/qqmlbuiltinfunctions_p.h
@@ -53,8 +53,8 @@
// We mean it.
//
-#include <QtCore/qglobal.h>
-#include <private/qv4object_p.h>
+#include <private/qqmlglobal_p.h>
+#include <private/qv4functionobject_p.h>
QT_BEGIN_NAMESPACE
@@ -145,6 +145,21 @@ struct GlobalExtensions {
};
+struct QQmlBindingFunction : public QV4::FunctionObject
+{
+ V4_OBJECT
+ QQmlBindingFunction(FunctionObject *originalFunction);
+
+ void initBindingLocation(); // from caller stack trace
+
+ static ReturnedValue call(Managed *that, CallData *callData);
+
+ static void markObjects(Managed *that, ExecutionEngine *e);
+
+ QV4::FunctionObject *originalFunction;
+ // Set when the binding is created later
+ QQmlSourceLocation bindingLocation;
+};
}
diff --git a/src/quick/util/qquickpropertychanges.cpp b/src/quick/util/qquickpropertychanges.cpp
index 39a1c1b861..b2f490e3c8 100644
--- a/src/quick/util/qquickpropertychanges.cpp
+++ b/src/quick/util/qquickpropertychanges.cpp
@@ -477,7 +477,7 @@ QQuickPropertyChanges::ActionList QQuickPropertyChanges::actions()
a.specifiedObject = d->object;
a.specifiedProperty = property;
- QQmlBinding *newBinding = e.id != QQmlBinding::Invalid ? QQmlBinding::createBinding(e.id, object(), qmlContext(this), e.url.toString(), e.column) : 0;
+ QQmlBinding *newBinding = e.id != QQmlBinding::Invalid ? QQmlBinding::createBinding(e.id, object(), qmlContext(this)) : 0;
if (!newBinding)
newBinding = new QQmlBinding(e.expression, object(), QQmlContextData::get(qmlContext(this)), e.url.toString(), e.line, e.column);