aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/compiler/qqmltypecompiler_p.h
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2014-03-06 16:19:42 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-11 18:31:21 +0100
commit914b72418b7e766026f2679254fcee93fc920866 (patch)
tree202634bd203c830ddc7eeb7dab1d071ca506b8a3 /src/qml/compiler/qqmltypecompiler_p.h
parentaf7ba8a6194b83fe7380b8d4ae027e2f04e21f17 (diff)
Add support for resolving translation bindings at compile time
Simple calls to qsTr and qsTrId are detected at type compile time and reduced to a special Translation and TranslationById binding type, which avoids allocating a QML binding at type instantiation type just to perform a translation. Change-Id: I61e4f2db2a8092b5e6870e174b832d9c20cd62b5 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/qml/compiler/qqmltypecompiler_p.h')
-rw-r--r--src/qml/compiler/qqmltypecompiler_p.h110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/qml/compiler/qqmltypecompiler_p.h b/src/qml/compiler/qqmltypecompiler_p.h
index 73ca9de8b8..74168fee41 100644
--- a/src/qml/compiler/qqmltypecompiler_p.h
+++ b/src/qml/compiler/qqmltypecompiler_p.h
@@ -79,6 +79,8 @@ public:
QString stringAt(int idx) const;
int registerString(const QString &str);
+ QV4::IR::Module *jsIRModule() const;
+
const QV4::CompiledData::QmlUnit *qmlUnit() const;
QUrl url() const { return compiledData->url; }
@@ -100,12 +102,16 @@ public:
void setCustomParserBindings(const QVector<int> &bindings);
void setDeferredBindingsPerObject(const QHash<int, QBitArray> &deferredBindingsPerObject);
+ const QHash<int, QQmlCustomParser*> &customParserCache() const { return customParsers; }
+
private:
QList<QQmlError> errors;
QQmlEnginePrivate *engine;
QQmlCompiledData *compiledData;
QQmlTypeData *typeData;
QtQml::ParsedQML *parsedQML;
+ // index is string index of type name (use obj->inheritedTypeNameIndex)
+ QHash<int, QQmlCustomParser*> customParsers;
};
struct QQmlCompilePass
@@ -158,6 +164,7 @@ private:
bool convertSignalHandlerExpressionsToFunctionDeclarations(const QmlObject *obj, const QString &typeName, QQmlPropertyCache *propertyCache);
const QList<QtQml::QmlObject*> &qmlObjects;
+ const QHash<int, QQmlCustomParser*> &customParsers;
const QHash<int, QQmlCompiledData::TypeReference*> &resolvedTypes;
const QSet<QString> &illegalNames;
const QVector<QQmlPropertyCache*> &propertyCaches;
@@ -261,6 +268,7 @@ private:
QQmlEnginePrivate *enginePrivate;
const QV4::CompiledData::QmlUnit *qmlUnit;
const QHash<int, QQmlCompiledData::TypeReference*> &resolvedTypes;
+ const QHash<int, QQmlCustomParser*> &customParsers;
const QVector<QQmlPropertyCache *> &propertyCaches;
const QHash<int, QHash<int, int> > objectIndexToIdPerComponent;
QHash<int, QQmlCompiledData::CustomParserData> *customParserData;
@@ -286,6 +294,7 @@ private:
const QHash<int, QHash<int, int> > &objectIndexToIdPerComponent;
const QHash<int, QQmlCompiledData::TypeReference*> &resolvedTypes;
+ const QHash<int, QQmlCustomParser*> &customParsers;
const QList<QtQml::QmlObject*> &qmlObjects;
const QVector<QQmlPropertyCache *> &propertyCaches;
QtQml::JSCodeGen * const v4CodeGen;
@@ -305,6 +314,107 @@ private:
const QVector<QQmlPropertyCache*> &propertyCaches;
};
+class QQmlJavaScriptBindingExpressionSimplificationPass : public QQmlCompilePass, public QV4::IR::StmtVisitor
+{
+public:
+ QQmlJavaScriptBindingExpressionSimplificationPass(QQmlTypeCompiler *typeCompiler);
+
+ void reduceTranslationBindings();
+
+private:
+ void reduceTranslationBindings(int objectIndex);
+
+ virtual void visitMove(QV4::IR::Move *move);
+ virtual void visitJump(QV4::IR::Jump *) {}
+ virtual void visitCJump(QV4::IR::CJump *) { discard(); }
+ virtual void visitExp(QV4::IR::Exp *) { discard(); }
+ virtual void visitPhi(IR::Phi *) {}
+ virtual void visitRet(QV4::IR::Ret *ret);
+
+ void visitFunctionCall(const QString *name, IR::ExprList *args, IR::Temp *target);
+
+ void discard() { _canSimplify = false; }
+
+ bool simplifyBinding(QV4::IR::Function *function, Binding *binding);
+ bool detectTranslationCallAndConvertBinding(Binding *binding);
+
+ const QList<QtQml::QmlObject*> &qmlObjects;
+ const QHash<int, QQmlCustomParser*> &customParsers;
+ QV4::IR::Module *jsModule;
+
+ bool _canSimplify;
+ const QString *_nameOfFunctionCalled;
+ QVector<int> _functionParameters;
+ int _functionCallReturnValue;
+
+ QHash<int, IR::Expr*> _temps;
+ int _returnValueOfBindingExpression;
+ int _synthesizedConsts;
+
+ QVector<int> irFunctionsToRemove;
+};
+
+class QQmlIRFunctionCleanser : public QQmlCompilePass, public QV4::IR::StmtVisitor,
+ public QV4::IR::ExprVisitor
+{
+public:
+ QQmlIRFunctionCleanser(QQmlTypeCompiler *typeCompiler, const QVector<int> &functionsToRemove);
+
+ void clean();
+
+private:
+ virtual void visitClosure(QV4::IR::Closure *closure);
+
+ virtual void visitTemp(QV4::IR::Temp *) {}
+
+ virtual void visitMove(QV4::IR::Move *s) {
+ s->source->accept(this);
+ s->target->accept(this);
+ }
+
+ virtual void visitConvert(QV4::IR::Convert *e) { e->expr->accept(this); }
+ virtual void visitPhi(QV4::IR::Phi *) { }
+
+ virtual void visitExp(QV4::IR::Exp *s) { s->expr->accept(this); }
+
+ virtual void visitJump(QV4::IR::Jump *) {}
+ virtual void visitCJump(QV4::IR::CJump *s) { s->cond->accept(this); }
+ virtual void visitRet(QV4::IR::Ret *s) { s->expr->accept(this); }
+
+ virtual void visitConst(QV4::IR::Const *) {}
+ virtual void visitString(QV4::IR::String *) {}
+ virtual void visitRegExp(QV4::IR::RegExp *) {}
+ virtual void visitName(QV4::IR::Name *) {}
+ virtual void visitUnop(QV4::IR::Unop *e) { e->expr->accept(this); }
+ virtual void visitBinop(QV4::IR::Binop *e) { e->left->accept(this); e->right->accept(this); }
+ virtual void visitCall(QV4::IR::Call *e) {
+ e->base->accept(this);
+ for (QV4::IR::ExprList *it = e->args; it; it = it->next)
+ it->expr->accept(this);
+ }
+
+ virtual void visitNew(QV4::IR::New *e) {
+ e->base->accept(this);
+ for (QV4::IR::ExprList *it = e->args; it; it = it->next)
+ it->expr->accept(this);
+ }
+
+ virtual void visitSubscript(QV4::IR::Subscript *e) {
+ e->base->accept(this);
+ e->index->accept(this);
+ }
+
+ virtual void visitMember(QV4::IR::Member *e) {
+ e->base->accept(this);
+ }
+
+private:
+ QV4::IR::Module *module;
+ const QVector<int> &functionsToRemove;
+
+ QVector<int> newFunctionIndices;
+};
+
QT_END_NAMESPACE
#endif // QQMLTYPECOMPILER_P_H