aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/qdeclarativecompiler_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/qml/qdeclarativecompiler_p.h')
-rw-r--r--src/declarative/qml/qdeclarativecompiler_p.h351
1 files changed, 199 insertions, 152 deletions
diff --git a/src/declarative/qml/qdeclarativecompiler_p.h b/src/declarative/qml/qdeclarativecompiler_p.h
index a2b959a568..0e159a2cdf 100644
--- a/src/declarative/qml/qdeclarativecompiler_p.h
+++ b/src/declarative/qml/qdeclarativecompiler_p.h
@@ -57,7 +57,7 @@
#include "qdeclarativeerror.h"
#include "private/qv8_p.h"
#include "private/qdeclarativeinstruction_p.h"
-#include "private/qdeclarativeparser_p.h"
+#include "private/qdeclarativescript_p.h"
#include "private/qdeclarativeengine_p.h"
#include "private/qbitfield_p.h"
#include "private/qdeclarativepropertycache_p.h"
@@ -91,7 +91,7 @@ public:
TypeReference()
: type(0), typePropertyCache(0), component(0) {}
- QByteArray className;
+ QString className;
QDeclarativeType *type;
QDeclarativePropertyCache *typePropertyCache;
QDeclarativeCompiledData *component;
@@ -139,183 +139,237 @@ private:
int indexForUrl(const QUrl &);
};
+namespace QDeclarativeCompilerTypes {
+ struct BindingContext
+ {
+ BindingContext()
+ : stack(0), owner(0), object(0) {}
+ BindingContext(QDeclarativeScript::Object *o)
+ : stack(0), owner(0), object(o) {}
+ BindingContext incr() const {
+ BindingContext rv(object);
+ rv.stack = stack + 1;
+ return rv;
+ }
+ bool isSubContext() const { return stack != 0; }
+ int stack;
+ int owner;
+ QDeclarativeScript::Object *object;
+ };
+
+ struct BindingReference : public QDeclarativePool::Class
+ {
+ BindingReference() : nextReference(0) {}
+
+ QDeclarativeScript::Variant expression;
+ QDeclarativeScript::Property *property;
+ QDeclarativeScript::Value *value;
+
+ enum DataType { QtScript, V4, V8 };
+ DataType dataType;
+
+ int compiledIndex;
+
+ QString rewrittenExpression;
+ BindingContext bindingContext;
+
+ BindingReference *nextReference;
+ };
+
+ struct IdList : public QFieldList<QDeclarativeScript::Object,
+ &QDeclarativeScript::Object::nextIdObject>
+ {
+ QDeclarativeScript::Object *value(const QString &id) const {
+ for (QDeclarativeScript::Object *o = first(); o; o = next(o)) {
+ if (o->id == id)
+ return o;
+ }
+ return 0;
+ }
+ };
+
+ // Contains all the incremental compiler state about a component. As
+ // a single QML file can have multiple components defined, there may be
+ // more than one of these for each compile
+ struct ComponentCompileState : public QDeclarativePool::Class
+ {
+ ComponentCompileState()
+ : parserStatusCount(0), pushedProperties(0), nested(false), v8BindingProgramLine(-1), root(0) {}
+
+ IdList ids;
+ int parserStatusCount;
+ int pushedProperties;
+ bool nested;
+
+ QByteArray compiledBindingData;
+ QString v8BindingProgram;
+ int v8BindingProgramLine;
+ int v8BindingProgramIndex;
+
+ typedef QDeclarativeCompilerTypes::BindingReference B;
+ typedef QFieldList<B, &B::nextReference> BindingReferenceList;
+ BindingReferenceList bindings;
+ typedef QDeclarativeScript::Object O;
+ typedef QFieldList<O, &O::nextAliasingObject> AliasingObjectsList;
+ AliasingObjectsList aliasingObjects;
+ QDeclarativeScript::Object *root;
+ };
+};
+
class QMetaObjectBuilder;
class Q_AUTOTEST_EXPORT QDeclarativeCompiler
{
Q_DECLARE_TR_FUNCTIONS(QDeclarativeCompiler)
public:
- QDeclarativeCompiler();
+ QDeclarativeCompiler(QDeclarativePool *);
bool compile(QDeclarativeEngine *, QDeclarativeTypeData *, QDeclarativeCompiledData *);
bool isError() const;
QList<QDeclarativeError> errors() const;
- static bool isAttachedPropertyName(const QByteArray &);
- static bool isSignalPropertyName(const QByteArray &);
+ static bool isAttachedPropertyName(const QString &);
+ static bool isSignalPropertyName(const QString &);
+ static bool isAttachedPropertyName(const QHashedStringRef &);
+ static bool isSignalPropertyName(const QHashedStringRef &);
int evaluateEnum(const QByteArray& script) const; // for QDeclarativeCustomParser::evaluateEnum
const QMetaObject *resolveType(const QByteArray& name) const; // for QDeclarativeCustomParser::resolveType
- int rewriteBinding(const QString& expression, const QByteArray& name); // for QDeclarativeCustomParser::rewriteBinding
+ int rewriteBinding(const QString& expression, const QString& name); // for QDeclarativeCustomParser::rewriteBinding
private:
static void reset(QDeclarativeCompiledData *);
- struct BindingContext {
- BindingContext()
- : stack(0), owner(0), object(0) {}
- BindingContext(QDeclarativeParser::Object *o)
- : stack(0), owner(0), object(o) {}
- BindingContext incr() const {
- BindingContext rv(object);
- rv.stack = stack + 1;
- return rv;
- }
- bool isSubContext() const { return stack != 0; }
- int stack;
- int owner;
- QDeclarativeParser::Object *object;
- };
-
- void compileTree(QDeclarativeParser::Object *tree);
+ void compileTree(QDeclarativeScript::Object *tree);
- bool buildObject(QDeclarativeParser::Object *obj, const BindingContext &);
- bool buildComponent(QDeclarativeParser::Object *obj, const BindingContext &);
- bool buildSubObject(QDeclarativeParser::Object *obj, const BindingContext &);
- bool buildSignal(QDeclarativeParser::Property *prop, QDeclarativeParser::Object *obj,
- const BindingContext &);
- bool buildProperty(QDeclarativeParser::Property *prop, QDeclarativeParser::Object *obj,
- const BindingContext &);
+ bool buildObject(QDeclarativeScript::Object *obj, const QDeclarativeCompilerTypes::BindingContext &);
+ bool buildComponent(QDeclarativeScript::Object *obj, const QDeclarativeCompilerTypes::BindingContext &);
+ bool buildSubObject(QDeclarativeScript::Object *obj, const QDeclarativeCompilerTypes::BindingContext &);
+ bool buildSignal(QDeclarativeScript::Property *prop, QDeclarativeScript::Object *obj,
+ const QDeclarativeCompilerTypes::BindingContext &);
+ bool buildProperty(QDeclarativeScript::Property *prop, QDeclarativeScript::Object *obj,
+ const QDeclarativeCompilerTypes::BindingContext &);
bool buildPropertyInNamespace(QDeclarativeImportedNamespace *ns,
- QDeclarativeParser::Property *prop,
- QDeclarativeParser::Object *obj,
- const BindingContext &);
- bool buildIdProperty(QDeclarativeParser::Property *prop, QDeclarativeParser::Object *obj);
- bool buildAttachedProperty(QDeclarativeParser::Property *prop,
- QDeclarativeParser::Object *obj,
- const BindingContext &ctxt);
- bool buildGroupedProperty(QDeclarativeParser::Property *prop,
- QDeclarativeParser::Object *obj,
- const BindingContext &ctxt);
+ QDeclarativeScript::Property *prop,
+ QDeclarativeScript::Object *obj,
+ const QDeclarativeCompilerTypes::BindingContext &);
+ bool buildIdProperty(QDeclarativeScript::Property *prop, QDeclarativeScript::Object *obj);
+ bool buildAttachedProperty(QDeclarativeScript::Property *prop,
+ QDeclarativeScript::Object *obj,
+ const QDeclarativeCompilerTypes::BindingContext &ctxt);
+ bool buildGroupedProperty(QDeclarativeScript::Property *prop,
+ QDeclarativeScript::Object *obj,
+ const QDeclarativeCompilerTypes::BindingContext &ctxt);
bool buildValueTypeProperty(QObject *type,
- QDeclarativeParser::Object *obj,
- QDeclarativeParser::Object *baseObj,
- const BindingContext &ctxt);
- bool buildListProperty(QDeclarativeParser::Property *prop,
- QDeclarativeParser::Object *obj,
- const BindingContext &ctxt);
- bool buildScriptStringProperty(QDeclarativeParser::Property *prop,
- QDeclarativeParser::Object *obj,
- const BindingContext &ctxt);
- bool buildPropertyAssignment(QDeclarativeParser::Property *prop,
- QDeclarativeParser::Object *obj,
- const BindingContext &ctxt);
- bool buildPropertyObjectAssignment(QDeclarativeParser::Property *prop,
- QDeclarativeParser::Object *obj,
- QDeclarativeParser::Value *value,
- const BindingContext &ctxt);
- bool buildPropertyOnAssignment(QDeclarativeParser::Property *prop,
- QDeclarativeParser::Object *obj,
- QDeclarativeParser::Object *baseObj,
- QDeclarativeParser::Value *value,
- const BindingContext &ctxt);
- bool buildPropertyLiteralAssignment(QDeclarativeParser::Property *prop,
- QDeclarativeParser::Object *obj,
- QDeclarativeParser::Value *value,
- const BindingContext &ctxt);
- bool doesPropertyExist(QDeclarativeParser::Property *prop, QDeclarativeParser::Object *obj);
- bool testLiteralAssignment(const QMetaProperty &prop,
- QDeclarativeParser::Value *value);
+ QDeclarativeScript::Object *obj,
+ QDeclarativeScript::Object *baseObj,
+ const QDeclarativeCompilerTypes::BindingContext &ctxt);
+ bool buildListProperty(QDeclarativeScript::Property *prop,
+ QDeclarativeScript::Object *obj,
+ const QDeclarativeCompilerTypes::BindingContext &ctxt);
+ bool buildScriptStringProperty(QDeclarativeScript::Property *prop,
+ QDeclarativeScript::Object *obj,
+ const QDeclarativeCompilerTypes::BindingContext &ctxt);
+ bool buildPropertyAssignment(QDeclarativeScript::Property *prop,
+ QDeclarativeScript::Object *obj,
+ const QDeclarativeCompilerTypes::BindingContext &ctxt);
+ bool buildPropertyObjectAssignment(QDeclarativeScript::Property *prop,
+ QDeclarativeScript::Object *obj,
+ QDeclarativeScript::Value *value,
+ const QDeclarativeCompilerTypes::BindingContext &ctxt);
+ bool buildPropertyOnAssignment(QDeclarativeScript::Property *prop,
+ QDeclarativeScript::Object *obj,
+ QDeclarativeScript::Object *baseObj,
+ QDeclarativeScript::Value *value,
+ const QDeclarativeCompilerTypes::BindingContext &ctxt);
+ bool buildPropertyLiteralAssignment(QDeclarativeScript::Property *prop,
+ QDeclarativeScript::Object *obj,
+ QDeclarativeScript::Value *value,
+ const QDeclarativeCompilerTypes::BindingContext &ctxt);
+ bool doesPropertyExist(QDeclarativeScript::Property *prop, QDeclarativeScript::Object *obj);
+ bool testLiteralAssignment(QDeclarativeScript::Property *prop,
+ QDeclarativeScript::Value *value);
bool testQualifiedEnumAssignment(const QMetaProperty &prop,
- QDeclarativeParser::Object *obj,
- QDeclarativeParser::Value *value,
+ QDeclarativeScript::Object *obj,
+ QDeclarativeScript::Value *value,
bool *isAssignment);
enum DynamicMetaMode { IgnoreAliases, ResolveAliases, ForceCreation };
- bool mergeDynamicMetaProperties(QDeclarativeParser::Object *obj);
- bool buildDynamicMeta(QDeclarativeParser::Object *obj, DynamicMetaMode mode);
- bool checkDynamicMeta(QDeclarativeParser::Object *obj);
- bool buildBinding(QDeclarativeParser::Value *, QDeclarativeParser::Property *prop,
- const BindingContext &ctxt);
- bool buildComponentFromRoot(QDeclarativeParser::Object *obj, const BindingContext &);
- bool compileAlias(QMetaObjectBuilder &,
+ bool mergeDynamicMetaProperties(QDeclarativeScript::Object *obj);
+ bool buildDynamicMeta(QDeclarativeScript::Object *obj, DynamicMetaMode mode);
+ bool checkDynamicMeta(QDeclarativeScript::Object *obj);
+ bool buildBinding(QDeclarativeScript::Value *, QDeclarativeScript::Property *prop,
+ const QDeclarativeCompilerTypes::BindingContext &ctxt);
+ bool buildComponentFromRoot(QDeclarativeScript::Object *obj, const QDeclarativeCompilerTypes::BindingContext &);
+ bool compileAlias(QFastMetaBuilder &,
QByteArray &data,
- QDeclarativeParser::Object *obj,
- const QDeclarativeParser::Object::DynamicProperty &);
+ QDeclarativeScript::Object *obj,
+ int propIndex, int aliasIndex,
+ QDeclarativeScript::Object::DynamicProperty &);
bool completeComponentBuild();
- bool checkValidId(QDeclarativeParser::Value *, const QString &);
-
-
- void genObject(QDeclarativeParser::Object *obj);
- void genObjectBody(QDeclarativeParser::Object *obj);
- void genValueTypeProperty(QDeclarativeParser::Object *obj,QDeclarativeParser::Property *);
- void genComponent(QDeclarativeParser::Object *obj);
- void genValueProperty(QDeclarativeParser::Property *prop, QDeclarativeParser::Object *obj);
- void genListProperty(QDeclarativeParser::Property *prop, QDeclarativeParser::Object *obj);
- void genPropertyAssignment(QDeclarativeParser::Property *prop,
- QDeclarativeParser::Object *obj,
- QDeclarativeParser::Property *valueTypeProperty = 0);
- void genLiteralAssignment(const QMetaProperty &prop,
- QDeclarativeParser::Value *value);
- void genBindingAssignment(QDeclarativeParser::Value *binding,
- QDeclarativeParser::Property *prop,
- QDeclarativeParser::Object *obj,
- QDeclarativeParser::Property *valueTypeProperty = 0);
+ bool checkValidId(QDeclarativeScript::Value *, const QString &);
+
+
+ void genObject(QDeclarativeScript::Object *obj);
+ void genObjectBody(QDeclarativeScript::Object *obj);
+ void genValueTypeProperty(QDeclarativeScript::Object *obj,QDeclarativeScript::Property *);
+ void genComponent(QDeclarativeScript::Object *obj);
+ void genValueProperty(QDeclarativeScript::Property *prop, QDeclarativeScript::Object *obj);
+ void genListProperty(QDeclarativeScript::Property *prop, QDeclarativeScript::Object *obj);
+ void genPropertyAssignment(QDeclarativeScript::Property *prop,
+ QDeclarativeScript::Object *obj,
+ QDeclarativeScript::Property *valueTypeProperty = 0);
+ void genLiteralAssignment(QDeclarativeScript::Property *prop,
+ QDeclarativeScript::Value *value);
+ void genBindingAssignment(QDeclarativeScript::Value *binding,
+ QDeclarativeScript::Property *prop,
+ QDeclarativeScript::Object *obj,
+ QDeclarativeScript::Property *valueTypeProperty = 0);
int genContextCache();
- int genValueTypeData(QDeclarativeParser::Property *prop, QDeclarativeParser::Property *valueTypeProp);
- int genPropertyData(QDeclarativeParser::Property *prop);
+ int genValueTypeData(QDeclarativeScript::Property *prop, QDeclarativeScript::Property *valueTypeProp);
+ int genPropertyData(QDeclarativeScript::Property *prop);
int componentTypeRef();
- static QDeclarativeType *toQmlType(QDeclarativeParser::Object *from);
- bool canCoerce(int to, QDeclarativeParser::Object *from);
+ static QDeclarativeType *toQmlType(QDeclarativeScript::Object *from);
+ bool canCoerce(int to, QDeclarativeScript::Object *from);
- QStringList deferredProperties(QDeclarativeParser::Object *);
- int indexOfProperty(QDeclarativeParser::Object *, const QByteArray &, bool *notInRevision = 0);
- int indexOfSignal(QDeclarativeParser::Object *, const QByteArray &, bool *notInRevision = 0);
+ QString elementName(QDeclarativeScript::Object *);
- void addId(const QString &, QDeclarativeParser::Object *);
+ QStringList deferredProperties(QDeclarativeScript::Object *);
- void dumpStats();
+ QDeclarativePropertyCache::Data *property(QDeclarativeScript::Object *, int);
+ QDeclarativePropertyCache::Data *property(QDeclarativeScript::Object *, const QHashedStringRef &,
+ bool *notInRevision = 0);
+ QDeclarativePropertyCache::Data *signal(QDeclarativeScript::Object *, const QHashedStringRef &,
+ bool *notInRevision = 0);
+ int indexOfProperty(QDeclarativeScript::Object *, const QHashedStringRef &, bool *notInRevision = 0);
+ int indexOfProperty(QDeclarativeScript::Object *, const QString &, bool *notInRevision = 0);
+ int indexOfSignal(QDeclarativeScript::Object *, const QString &, bool *notInRevision = 0);
- struct BindingReference {
- QDeclarativeParser::Variant expression;
- QDeclarativeParser::Property *property;
- QDeclarativeParser::Value *value;
+ void addId(const QString &, QDeclarativeScript::Object *);
- enum DataType { QtScript, V4, V8 };
- DataType dataType;
+ void dumpStats();
- int compiledIndex;
+ void addBindingReference(QDeclarativeCompilerTypes::BindingReference *);
- QString rewrittenExpression;
- BindingContext bindingContext;
- };
- void addBindingReference(const BindingReference &);
+ QDeclarativeCompilerTypes::ComponentCompileState *compileState;
- struct ComponentCompileState
- {
- ComponentCompileState()
- : parserStatusCount(0), pushedProperties(0), nested(false), v8BindingProgramLine(-1), root(0) {}
- QHash<QString, QDeclarativeParser::Object *> ids;
- QHash<int, QDeclarativeParser::Object *> idIndexes;
- int parserStatusCount;
- int pushedProperties;
- bool nested;
+ QDeclarativePool *pool;
- QByteArray compiledBindingData;
- QString v8BindingProgram;
- int v8BindingProgramLine;
- int v8BindingProgramIndex;
+ QDeclarativeCompilerTypes::ComponentCompileState *componentState(QDeclarativeScript::Object *);
+ void saveComponentState();
+
+ QList<QDeclarativeError> exceptions;
+ QDeclarativeCompiledData *output;
+ QDeclarativeEngine *engine;
+ QDeclarativeEnginePrivate *enginePrivate;
+ QDeclarativeScript::Object *unitRoot;
+ QDeclarativeTypeData *unit;
- QHash<QDeclarativeParser::Value *, BindingReference> bindings;
- QHash<QDeclarativeParser::Value *, BindingContext> signalExpressions;
- QList<QDeclarativeParser::Object *> aliasingObjects;
- QDeclarativeParser::Object *root;
- };
- ComponentCompileState compileState;
+ // Compiler component statistics. Only collected if QML_COMPILER_STATS=1
struct ComponentStat
{
ComponentStat() : ids(0), objects(0) {}
@@ -323,25 +377,18 @@ private:
int lineNumber;
int ids;
- QList<QDeclarativeParser::LocationSpan> scriptBindings;
- QList<QDeclarativeParser::LocationSpan> optimizedBindings;
+ QList<QDeclarativeScript::LocationSpan> scriptBindings;
+ QList<QDeclarativeScript::LocationSpan> optimizedBindings;
int objects;
};
- ComponentStat componentStat;
-
- void saveComponentState();
-
- ComponentCompileState componentState(QDeclarativeParser::Object *);
- QHash<QDeclarativeParser::Object *, ComponentCompileState> savedCompileStates;
- QList<ComponentStat> savedComponentStats;
-
- QList<QDeclarativeError> exceptions;
- QDeclarativeCompiledData *output;
- QDeclarativeEngine *engine;
- QDeclarativeEnginePrivate *enginePrivate;
- QDeclarativeParser::Object *unitRoot;
- QDeclarativeTypeData *unit;
+ struct ComponentStats : public QDeclarativePool::Class
+ {
+ ComponentStat componentStat;
+ QList<ComponentStat> savedComponentStats;
+ };
+ ComponentStats *componentStats;
};
+
QT_END_NAMESPACE
#endif // QDECLARATIVECOMPILER_P_H