aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2013-09-17 12:47:47 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-20 14:26:49 +0200
commit1e1dde6a546b4869534928f1c5bdb43b712f75ac (patch)
treef8afb18e8ee04a71945a96b4867bd18e3b5e4bfd
parent6b5177a7565c7b4c4f49a636d135f8ea4e443506 (diff)
[new compiler] Cleanups
Collect code for collecting errors and string access for different compile passes (vme creation, qobject creation) in a QQmlCompilePass base class. Change-Id: Ib2119e730ce7d3181599ba29da12273f041f2b70 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
-rw-r--r--src/qml/qml/qqmlobjectcreator.cpp100
-rw-r--r--src/qml/qml/qqmlobjectcreator_p.h35
2 files changed, 64 insertions, 71 deletions
diff --git a/src/qml/qml/qqmlobjectcreator.cpp b/src/qml/qml/qqmlobjectcreator.cpp
index 924522836f..be96d473fa 100644
--- a/src/qml/qml/qqmlobjectcreator.cpp
+++ b/src/qml/qml/qqmlobjectcreator.cpp
@@ -67,6 +67,22 @@ struct ActiveOCRestorer
};
}
+QQmlCompilePass::QQmlCompilePass(const QUrl &url, const QV4::CompiledData::QmlUnit *unit)
+ : url(url)
+ , qmlUnit(unit)
+{
+}
+
+void QQmlCompilePass::recordError(const QV4::CompiledData::Location &location, const QString &description)
+{
+ QQmlError error;
+ error.setUrl(url);
+ error.setLine(location.line);
+ error.setColumn(location.column);
+ error.setDescription(description);
+ errors << error;
+}
+
#define COMPILE_EXCEPTION(token, desc) \
{ \
recordError((token)->location, desc); \
@@ -77,9 +93,8 @@ static QAtomicInt classIndexCounter(0);
QQmlPropertyCacheCreator::QQmlPropertyCacheCreator(QQmlEnginePrivate *enginePrivate, const QV4::CompiledData::QmlUnit *unit, const QUrl &url, const QQmlImports *imports,
QHash<int, QQmlCompiledData::TypeReference> *resolvedTypes)
- : enginePrivate(enginePrivate)
- , unit(unit)
- , url(url)
+ : QQmlCompilePass(url, unit)
+ , enginePrivate(enginePrivate)
, imports(imports)
, resolvedTypes(resolvedTypes)
{
@@ -291,7 +306,7 @@ bool QQmlPropertyCacheCreator::create(const QV4::CompiledData::Object *obj, QQml
// Dynamic slots
const quint32 *functionIndex = obj->functionOffsetTable();
for (quint32 i = 0; i < obj->nFunctions; ++i, ++functionIndex) {
- const QV4::CompiledData::Function *s = unit->header.functionAt(*functionIndex);
+ const QV4::CompiledData::Function *s = qmlUnit->header.functionAt(*functionIndex);
int paramCount = s->nFormals;
quint32 flags = QQmlPropertyData::IsFunction | QQmlPropertyData::IsVMEFunction;
@@ -422,7 +437,7 @@ bool QQmlPropertyCacheCreator::create(const QV4::CompiledData::Object *obj, QQml
// Dynamic slot data - comes after the property data
/*const quint32* */functionIndex = obj->functionOffsetTable();
for (quint32 i = 0; i < obj->nFunctions; ++i, ++functionIndex) {
- const QV4::CompiledData::Function *s = unit->header.functionAt(*functionIndex);
+ const QV4::CompiledData::Function *s = qmlUnit->header.functionAt(*functionIndex);
VMD::MethodData methodData = { int(s->nFormals),
/* body offset*/0,
@@ -438,16 +453,6 @@ bool QQmlPropertyCacheCreator::create(const QV4::CompiledData::Object *obj, QQml
return true;
}
-void QQmlPropertyCacheCreator::recordError(const QV4::CompiledData::Location &location, const QString &description)
-{
- QQmlError error;
- error.setUrl(url);
- error.setLine(location.line);
- error.setColumn(location.column);
- error.setDescription(description);
- errors << error;
-}
-
static void removeBindingOnProperty(QObject *o, int index)
{
int coreIndex = index & 0x0000FFFF;
@@ -462,10 +467,9 @@ QmlObjectCreator::QmlObjectCreator(QQmlContextData *contextData, const QV4::Comp
const QHash<int, QQmlCompiledData::TypeReference> &resolvedTypes,
const QList<QQmlPropertyCache*> &propertyCaches,
const QList<QByteArray> &vmeMetaObjectData, const QHash<int, int> &objectIndexToId)
- : componentAttached(0)
+ : QQmlCompilePass(contextData->url, qmlUnit)
+ , componentAttached(0)
, engine(contextData->engine)
- , url(contextData->url)
- , unit(qmlUnit)
, jsUnit(jsUnit)
, context(contextData)
, resolvedTypes(resolvedTypes)
@@ -521,7 +525,7 @@ void QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, const QV4::C
QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv);
}
} else {
- QString stringValue = binding->valueAsString(&unit->header);
+ QString stringValue = binding->valueAsString(&qmlUnit->header);
if (property->isVarProperty()) {
_vmeMetaObject->setVMEProperty(property->coreIndex, QV4::Value::fromString(QV8Engine::getV4(engine), stringValue));
} else {
@@ -534,7 +538,7 @@ void QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, const QV4::C
break;
case QVariant::String: {
if (binding->type == QV4::CompiledData::Binding::Type_String) {
- QString value = binding->valueAsString(&unit->header);
+ QString value = binding->valueAsString(&qmlUnit->header);
argv[0] = &value;
QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv);
} else {
@@ -544,7 +548,7 @@ void QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, const QV4::C
break;
case QVariant::StringList: {
if (binding->type == QV4::CompiledData::Binding::Type_String) {
- QStringList value(binding->valueAsString(&unit->header));
+ QStringList value(binding->valueAsString(&qmlUnit->header));
argv[0] = &value;
QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv);
} else {
@@ -554,7 +558,7 @@ void QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, const QV4::C
break;
case QVariant::ByteArray: {
if (binding->type == QV4::CompiledData::Binding::Type_String) {
- QByteArray value(binding->valueAsString(&unit->header).toUtf8());
+ QByteArray value(binding->valueAsString(&qmlUnit->header).toUtf8());
argv[0] = &value;
QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv);
} else {
@@ -564,7 +568,7 @@ void QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, const QV4::C
break;
case QVariant::Url: {
if (binding->type == QV4::CompiledData::Binding::Type_String) {
- QString string = binding->valueAsString(&unit->header);
+ QString string = binding->valueAsString(&qmlUnit->header);
// Encoded dir-separators defeat QUrl processing - decode them first
string.replace(QLatin1String("%2f"), QLatin1String("/"), Qt::CaseInsensitive);
QUrl value = string.isEmpty() ? QUrl() : this->url.resolved(QUrl(string));
@@ -626,7 +630,7 @@ void QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, const QV4::C
break;
case QVariant::Color: {
bool ok = false;
- uint colorValue = QQmlStringConverters::rgbaFromString(binding->valueAsString(&unit->header), &ok);
+ uint colorValue = QQmlStringConverters::rgbaFromString(binding->valueAsString(&qmlUnit->header), &ok);
if (ok) {
struct { void *data[4]; } buffer;
@@ -642,7 +646,7 @@ void QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, const QV4::C
#ifndef QT_NO_DATESTRING
case QVariant::Date: {
bool ok = false;
- QDate value = QQmlStringConverters::dateFromString(binding->valueAsString(&unit->header), &ok);
+ QDate value = QQmlStringConverters::dateFromString(binding->valueAsString(&qmlUnit->header), &ok);
if (ok) {
argv[0] = &value;
QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv);
@@ -653,7 +657,7 @@ void QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, const QV4::C
break;
case QVariant::Time: {
bool ok = false;
- QTime value = QQmlStringConverters::timeFromString(binding->valueAsString(&unit->header), &ok);
+ QTime value = QQmlStringConverters::timeFromString(binding->valueAsString(&qmlUnit->header), &ok);
if (ok) {
argv[0] = &value;
QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv);
@@ -664,7 +668,7 @@ void QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, const QV4::C
break;
case QVariant::DateTime: {
bool ok = false;
- QDateTime value = QQmlStringConverters::dateTimeFromString(binding->valueAsString(&unit->header), &ok);
+ QDateTime value = QQmlStringConverters::dateTimeFromString(binding->valueAsString(&qmlUnit->header), &ok);
if (ok) {
argv[0] = &value;
QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv);
@@ -676,7 +680,7 @@ void QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, const QV4::C
#endif // QT_NO_DATESTRING
case QVariant::Point: {
bool ok = false;
- QPoint value = QQmlStringConverters::pointFFromString(binding->valueAsString(&unit->header), &ok).toPoint();
+ QPoint value = QQmlStringConverters::pointFFromString(binding->valueAsString(&qmlUnit->header), &ok).toPoint();
if (ok) {
argv[0] = &value;
QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv);
@@ -687,7 +691,7 @@ void QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, const QV4::C
break;
case QVariant::PointF: {
bool ok = false;
- QPointF value = QQmlStringConverters::pointFFromString(binding->valueAsString(&unit->header), &ok);
+ QPointF value = QQmlStringConverters::pointFFromString(binding->valueAsString(&qmlUnit->header), &ok);
if (ok) {
argv[0] = &value;
QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv);
@@ -698,7 +702,7 @@ void QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, const QV4::C
break;
case QVariant::Size: {
bool ok = false;
- QSize value = QQmlStringConverters::sizeFFromString(binding->valueAsString(&unit->header), &ok).toSize();
+ QSize value = QQmlStringConverters::sizeFFromString(binding->valueAsString(&qmlUnit->header), &ok).toSize();
if (ok) {
argv[0] = &value;
QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv);
@@ -709,7 +713,7 @@ void QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, const QV4::C
break;
case QVariant::SizeF: {
bool ok = false;
- QSizeF value = QQmlStringConverters::sizeFFromString(binding->valueAsString(&unit->header), &ok);
+ QSizeF value = QQmlStringConverters::sizeFFromString(binding->valueAsString(&qmlUnit->header), &ok);
if (ok) {
argv[0] = &value;
QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv);
@@ -720,7 +724,7 @@ void QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, const QV4::C
break;
case QVariant::Rect: {
bool ok = false;
- QRect value = QQmlStringConverters::rectFFromString(binding->valueAsString(&unit->header), &ok).toRect();
+ QRect value = QQmlStringConverters::rectFFromString(binding->valueAsString(&qmlUnit->header), &ok).toRect();
if (ok) {
argv[0] = &value;
QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv);
@@ -731,7 +735,7 @@ void QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, const QV4::C
break;
case QVariant::RectF: {
bool ok = false;
- QRectF value = QQmlStringConverters::rectFFromString(binding->valueAsString(&unit->header), &ok);
+ QRectF value = QQmlStringConverters::rectFFromString(binding->valueAsString(&qmlUnit->header), &ok);
if (ok) {
argv[0] = &value;
QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv);
@@ -756,7 +760,7 @@ void QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, const QV4::C
float yp;
float zy;
} vec;
- if (QQmlStringConverters::createFromString(QMetaType::QVector3D, binding->valueAsString(&unit->header), &vec, sizeof(vec))) {
+ if (QQmlStringConverters::createFromString(QMetaType::QVector3D, binding->valueAsString(&qmlUnit->header), &vec, sizeof(vec))) {
argv[0] = reinterpret_cast<void *>(&vec);
QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv);
} else {
@@ -771,7 +775,7 @@ void QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, const QV4::C
float zy;
float wp;
} vec;
- if (QQmlStringConverters::createFromString(QMetaType::QVector4D, binding->valueAsString(&unit->header), &vec, sizeof(vec))) {
+ if (QQmlStringConverters::createFromString(QMetaType::QVector4D, binding->valueAsString(&qmlUnit->header), &vec, sizeof(vec))) {
argv[0] = reinterpret_cast<void *>(&vec);
QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv);
} else {
@@ -820,7 +824,7 @@ void QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, const QV4::C
break;
} else if (property->propType == qMetaTypeId<QList<QUrl> >()) {
if (binding->type == QV4::CompiledData::Binding::Type_String) {
- QString urlString = binding->valueAsString(&unit->header);
+ QString urlString = binding->valueAsString(&qmlUnit->header);
QUrl u = urlString.isEmpty() ? QUrl() : this->url.resolved(QUrl(urlString));
QList<QUrl> value;
value.append(u);
@@ -833,7 +837,7 @@ void QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, const QV4::C
} else if (property->propType == qMetaTypeId<QList<QString> >()) {
if (binding->type == QV4::CompiledData::Binding::Type_String) {
QList<QString> value;
- value.append(binding->valueAsString(&unit->header));
+ value.append(binding->valueAsString(&qmlUnit->header));
argv[0] = reinterpret_cast<void *>(&value);
QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv);
} else {
@@ -851,7 +855,7 @@ void QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, const QV4::C
} else
value = QJSValue(n);
} else {
- value = QJSValue(binding->valueAsString(&unit->header));
+ value = QJSValue(binding->valueAsString(&qmlUnit->header));
}
argv[0] = reinterpret_cast<void *>(&value);
QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv);
@@ -859,7 +863,7 @@ void QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, const QV4::C
}
// otherwise, try a custom type assignment
- QString stringValue = binding->valueAsString(&unit->header);
+ QString stringValue = binding->valueAsString(&qmlUnit->header);
QQmlMetaType::StringConverter converter = QQmlMetaType::customStringConverter(property->propType);
if (converter) {
QVariant value = (*converter)(stringValue);
@@ -915,7 +919,7 @@ void QmlObjectCreator::setupBindings()
bool QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, int bindingIndex, const QV4::CompiledData::Binding *binding)
{
if (binding->type == QV4::CompiledData::Binding::Type_AttachedProperty) {
- const QV4::CompiledData::Object *obj = unit->objectAt(binding->value.objectIndex);
+ const QV4::CompiledData::Object *obj = qmlUnit->objectAt(binding->value.objectIndex);
Q_ASSERT(stringAt(obj->inheritedTypeNameIndex).isEmpty());
QQmlType *attachedType = resolvedTypes.value(binding->propertyNameIndex).type;
const int id = attachedType->attachedPropertiesId();
@@ -942,7 +946,7 @@ bool QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, int bindingI
return true;
if (binding->type == QV4::CompiledData::Binding::Type_GroupProperty) {
- const QV4::CompiledData::Object *obj = unit->objectAt(binding->value.objectIndex);
+ const QV4::CompiledData::Object *obj = qmlUnit->objectAt(binding->value.objectIndex);
if (stringAt(obj->inheritedTypeNameIndex).isEmpty()) {
QQmlValueType *valueType = QQmlValueTypeFactory::valueType(property->propType);
@@ -1084,7 +1088,7 @@ QObject *QmlObjectCreator::create(int index, QObject *parent)
{
ActiveOCRestorer ocRestorer(this, QQmlEnginePrivate::get(engine));
- const QV4::CompiledData::Object *obj = unit->objectAt(index);
+ const QV4::CompiledData::Object *obj = qmlUnit->objectAt(index);
QQmlType *type = resolvedTypes.value(obj->inheritedTypeNameIndex).type;
Q_ASSERT(type);
@@ -1156,7 +1160,7 @@ void QmlObjectCreator::finalize()
bool QmlObjectCreator::populateInstance(int index, QObject *instance, QQmlRefPointer<QQmlPropertyCache> cache)
{
- const QV4::CompiledData::Object *obj = unit->objectAt(index);
+ const QV4::CompiledData::Object *obj = qmlUnit->objectAt(index);
QQmlData *declarativeData = QQmlData::get(instance, /*create*/true);
@@ -1208,13 +1212,3 @@ bool QmlObjectCreator::populateInstance(int index, QObject *instance, QQmlRefPoi
return errors.isEmpty();
}
-
-void QmlObjectCreator::recordError(const QV4::CompiledData::Location &location, const QString &description)
-{
- QQmlError error;
- error.setUrl(url);
- error.setLine(location.line);
- error.setColumn(location.column);
- error.setDescription(description);
- errors << error;
-}
diff --git a/src/qml/qml/qqmlobjectcreator_p.h b/src/qml/qml/qqmlobjectcreator_p.h
index 6bdcf623ca..eb7a6233c5 100644
--- a/src/qml/qml/qqmlobjectcreator_p.h
+++ b/src/qml/qml/qqmlobjectcreator_p.h
@@ -51,30 +51,36 @@ QT_BEGIN_NAMESPACE
class QQmlAbstractBinding;
-class QQmlPropertyCacheCreator
+struct QQmlCompilePass
+{
+ QQmlCompilePass(const QUrl &url, const QV4::CompiledData::QmlUnit *unit);
+ QList<QQmlError> errors;
+
+protected:
+ QString stringAt(int idx) const { return qmlUnit->header.stringAt(idx); }
+ void recordError(const QV4::CompiledData::Location &location, const QString &description);
+
+ const QUrl url;
+ const QV4::CompiledData::QmlUnit *qmlUnit;
+};
+
+class QQmlPropertyCacheCreator : public QQmlCompilePass
{
Q_DECLARE_TR_FUNCTIONS(QQmlPropertyCacheCreator)
public:
- QQmlPropertyCacheCreator(QQmlEnginePrivate *enginePrivate, const QV4::CompiledData::QmlUnit *unit,
+ QQmlPropertyCacheCreator(QQmlEnginePrivate *enginePrivate, const QV4::CompiledData::QmlUnit *qmlUnit,
const QUrl &url, const QQmlImports *imports,
QHash<int, QQmlCompiledData::TypeReference> *resolvedTypes);
- QList<QQmlError> errors;
-
bool create(const QV4::CompiledData::Object *obj, QQmlPropertyCache **cache, QByteArray *vmeMetaObjectData);
protected:
- QString stringAt(int idx) const { return unit->header.stringAt(idx); }
- void recordError(const QV4::CompiledData::Location &location, const QString &description);
-
QQmlEnginePrivate *enginePrivate;
- const QV4::CompiledData::QmlUnit *unit;
- QUrl url;
const QQmlImports *imports;
QHash<int, QQmlCompiledData::TypeReference> *resolvedTypes;
};
-class QmlObjectCreator
+class QmlObjectCreator : public QQmlCompilePass
{
Q_DECLARE_TR_FUNCTIONS(QmlObjectCreator)
public:
@@ -83,13 +89,11 @@ public:
const QHash<int, int> &objectIndexToId);
QObject *create(QObject *parent = 0)
- { return create(unit->indexOfRootObject, parent); }
+ { return create(qmlUnit->indexOfRootObject, parent); }
QObject *create(int index, QObject *parent = 0);
void finalize();
- QList<QQmlError> errors;
-
QQmlComponentAttached *componentAttached;
QList<QQmlEnginePrivate::FinalizeCallback> finalizeCallbacks;
@@ -101,12 +105,7 @@ private:
void setPropertyValue(QQmlPropertyData *property, const QV4::CompiledData::Binding *binding);
void setupFunctions();
- QString stringAt(int idx) const { return unit->header.stringAt(idx); }
- void recordError(const QV4::CompiledData::Location &location, const QString &description);
-
QQmlEngine *engine;
- QUrl url;
- const QV4::CompiledData::QmlUnit *unit;
const QV4::CompiledData::CompilationUnit *jsUnit;
QQmlContextData *context;
const QHash<int, QQmlCompiledData::TypeReference> resolvedTypes;