diff options
author | Aaron Kennedy <aaron.kennedy@nokia.com> | 2011-05-05 13:48:29 +1000 |
---|---|---|
committer | Aaron Kennedy <aaron.kennedy@nokia.com> | 2011-05-05 15:25:43 +1000 |
commit | cb661b8fd32b20b4a90b13fa49e2a21f41b2e87d (patch) | |
tree | 3ae5ec10d1ccf079856547b93b05b078cc37a729 /src/declarative/qml/qdeclarativeinstruction_p.h | |
parent | 5f46c8e70f8891cb8702bf4c5949d3595b193660 (diff) |
Support variable length instructions in QML bytecode
Reviewed-by: Martin Jones
Change-Id: Ib04b8d46a78723d3a734e14d22a2f2256c1627c2
Diffstat (limited to 'src/declarative/qml/qdeclarativeinstruction_p.h')
-rw-r--r-- | src/declarative/qml/qdeclarativeinstruction_p.h | 375 |
1 files changed, 196 insertions, 179 deletions
diff --git a/src/declarative/qml/qdeclarativeinstruction_p.h b/src/declarative/qml/qdeclarativeinstruction_p.h index 3032964a33..b436ce531f 100644 --- a/src/declarative/qml/qdeclarativeinstruction_p.h +++ b/src/declarative/qml/qdeclarativeinstruction_p.h @@ -57,322 +57,339 @@ QT_BEGIN_NAMESPACE -class QDeclarativeCompiledData; -class Q_AUTOTEST_EXPORT QDeclarativeInstruction -{ -public: - enum Type { - // - // Object Creation - // - // CreateObject - Create a new object instance and push it on the - // object stack - // SetId - Set the id of the object on the top of the object stack - // SetDefault - Sets the instance on the top of the object stack to - // be the context's default object. - // StoreMetaObject - Assign the dynamic metaobject to object on the - // top of the stack. - Init, /* init */ - CreateObject, /* create */ - CreateSimpleObject, /* createSimple */ - SetId, /* setId */ - SetDefault, - CreateComponent, /* createComponent */ - StoreMetaObject, /* storeMeta */ - - // - // Precomputed single assignment - // - // StoreFloat - Store a float in a core property - // StoreDouble - Store a double in a core property - // StoreInteger - Store a int or uint in a core property - // StoreBool - Store a bool in a core property - // StoreString - Store a QString in a core property - // StoreByteArray - Store a QByteArray in a core property - // StoreUrl - Store a QUrl in a core property - // StoreColor - Store a QColor in a core property - // StoreDate - Store a QDate in a core property - // StoreTime - Store a QTime in a core property - // StoreDateTime - Store a QDateTime in a core property - // StoreVariant - Store a QVariant in a core property - // StoreObject - Pop the object on the top of the object stack and - // store it in a core property - StoreFloat, /* storeFloat */ - StoreDouble, /* storeDouble */ - StoreInteger, /* storeInteger */ - StoreBool, /* storeBool */ - StoreString, /* storeString */ - StoreByteArray, /* storeByteArray */ - StoreUrl, /* storeUrl */ - StoreColor, /* storeColor */ - StoreDate, /* storeDate */ - StoreTime, /* storeTime */ - StoreDateTime, /* storeDateTime */ - StorePoint, /* storeRealPair */ - StorePointF, /* storeRealPair */ - StoreSize, /* storeRealPair */ - StoreSizeF, /* storeRealPair */ - StoreRect, /* storeRect */ - StoreRectF, /* storeRect */ - StoreVector3D, /* storeVector3D */ - StoreVariant, /* storeString */ - StoreVariantInteger, /* storeInteger */ - StoreVariantDouble, /* storeDouble */ - StoreVariantBool, /* storeBool */ - StoreObject, /* storeObject */ - StoreVariantObject, /* storeObject */ - StoreInterface, /* storeObject */ - - StoreSignal, /* storeSignal */ - StoreImportedScript, /* storeScript */ - StoreScriptString, /* storeScriptString */ - - // - // Unresolved single assignment - // - AssignSignalObject, /* assignSignalObject */ - AssignCustomType, /* assignCustomType */ - - StoreBinding, /* assignBinding */ - StoreBindingOnAlias, /* assignBinding */ - StoreCompiledBinding, /* assignBinding */ - StoreValueSource, /* assignValueSource */ - StoreValueInterceptor, /* assignValueInterceptor */ - - BeginObject, /* begin */ - - StoreObjectQList, /* NA */ - AssignObjectList, /* assignObjectList */ +#define FOR_EACH_QML_INSTR(F) \ + F(Init, init) \ + F(Done, common) \ + F(CreateObject, create) \ + F(CreateSimpleObject, createSimple) \ + F(SetId, setId) \ + F(SetDefault, common) \ + F(CreateComponent, createComponent) \ + F(StoreMetaObject, storeMeta) \ + F(StoreVariant, storeString) \ + F(StoreVariantInteger, storeInteger) \ + F(StoreVariantDouble, storeDouble) \ + F(StoreVariantBool, storeBool) \ + F(StoreString, storeString) \ + F(StoreByteArray, storeByteArray) \ + F(StoreUrl, storeUrl) \ + F(StoreFloat, storeFloat) \ + F(StoreDouble, storeDouble) \ + F(StoreBool, storeBool) \ + F(StoreInteger, storeInteger) \ + F(StoreColor, storeColor) \ + F(StoreDate, storeDate) \ + F(StoreTime, storeTime) \ + F(StoreDateTime, storeDateTime) \ + F(StorePoint, storeRealPair) \ + F(StorePointF, storeRealPair) \ + F(StoreSize, storeRealPair) \ + F(StoreSizeF, storeRealPair) \ + F(StoreRect, storeRect) \ + F(StoreRectF, storeRect) \ + F(StoreVector3D, storeVector3D) \ + F(StoreObject, storeObject) \ + F(AssignCustomType, assignCustomType) \ + F(AssignSignalObject, assignSignalObject) \ + F(StoreSignal, storeSignal) \ + F(StoreImportedScript, storeScript) \ + F(StoreScriptString, storeScriptString) \ + F(BeginObject, begin) \ + F(StoreBinding, assignBinding) \ + F(StoreBindingOnAlias, assignBinding) \ + F(StoreCompiledBinding, assignBinding) \ + F(StoreValueSource, assignValueSource) \ + F(StoreValueInterceptor, assignValueInterceptor) \ + F(StoreObjectQList, common) \ + F(AssignObjectList, assignObjectList) \ + F(StoreVariantObject, storeObject) \ + F(StoreInterface, storeObject) \ + F(FetchAttached, fetchAttached) \ + F(FetchQList, fetchQmlList) \ + F(FetchObject, fetch) \ + F(PopQList, common) \ + F(Defer, defer) \ + F(PopFetchedObject, common) \ + F(FetchValueType, fetchValue) \ + F(PopValueType, fetchValue) - FetchAttached, /* fetchAttached */ - FetchQList, /* fetch */ - FetchObject, /* fetch */ - FetchValueType, /* fetchValue */ +#ifdef Q_ALIGNOF +# define QML_INSTR_ALIGN_MASK (Q_ALIGNOF(QDeclarativeInstruction) - 1) +#else +# define QML_INSTR_ALIGN_MASK (sizeof(void *) - 1) +#endif - // - // Stack manipulation - // - // PopFetchedObject - Remove an object from the object stack - // PopQList - Remove a list from the list stack - PopFetchedObject, - PopQList, - PopValueType, /* fetchValue */ +#define QML_INSTR_HEADER quint8 instructionType; +#define QML_INSTR_ENUM(I, FMT) I, +#define QML_INSTR_SIZE(I, FMT) ((sizeof(QDeclarativeInstruction::instr_##FMT) + QML_INSTR_ALIGN_MASK) & ~QML_INSTR_ALIGN_MASK) - // - // Deferred creation - // - Defer /* defer */ +class QDeclarativeCompiledData; +union QDeclarativeInstruction +{ + enum Type { + FOR_EACH_QML_INSTR(QML_INSTR_ENUM) }; - QDeclarativeInstruction() {} - Type type; + inline void setType(Type type) { common.instructionType = type; } + inline Type type() const { return (Type)common.instructionType; } - struct InitInstruction { + struct instr_common { + QML_INSTR_HEADER + }; + struct instr_init { + QML_INSTR_HEADER int bindingsSize; int parserStatusSize; int contextCache; int compiledBinding; }; - struct CreateInstruction { + struct instr_create { + QML_INSTR_HEADER int type; int data; int bindingBits; ushort column; ushort line; }; - struct CreateSimpleInstruction { + struct instr_createSimple { + QML_INSTR_HEADER void (*create)(void *); int typeSize; int type; ushort column; ushort line; }; - struct StoreMetaInstruction { + struct instr_storeMeta { + QML_INSTR_HEADER int data; int aliasData; int propertyCache; }; - struct SetIdInstruction { + struct instr_setId { + QML_INSTR_HEADER int value; int index; }; - struct AssignValueSourceInstruction { + struct instr_assignValueSource { + QML_INSTR_HEADER int property; int owner; int castValue; }; - struct AssignValueInterceptorInstruction { + struct instr_assignValueInterceptor { + QML_INSTR_HEADER int property; int owner; int castValue; }; - struct AssignBindingInstruction { + struct instr_assignBinding { + QML_INSTR_HEADER unsigned int property; int value; short context; short owner; ushort line; }; - struct FetchInstruction { + struct instr_fetch { + QML_INSTR_HEADER int property; ushort line; }; - struct FetchValueInstruction { + struct instr_fetchValue { + QML_INSTR_HEADER int property; int type; quint32 bindingSkipList; }; - struct FetchQmlListInstruction { + struct instr_fetchQmlList { + QML_INSTR_HEADER int property; int type; }; - struct BeginInstruction { + struct instr_begin { + QML_INSTR_HEADER int castValue; }; - struct StoreFloatInstruction { + struct instr_storeFloat { + QML_INSTR_HEADER int propertyIndex; float value; }; - struct StoreDoubleInstruction { + struct instr_storeDouble { + QML_INSTR_HEADER int propertyIndex; double value; }; - struct StoreIntegerInstruction { + struct instr_storeInteger { + QML_INSTR_HEADER int propertyIndex; int value; }; - struct StoreBoolInstruction { + struct instr_storeBool { + QML_INSTR_HEADER int propertyIndex; bool value; }; - struct StoreStringInstruction { + struct instr_storeString { + QML_INSTR_HEADER int propertyIndex; int value; }; - struct StoreByteArrayInstruction { + struct instr_storeByteArray { + QML_INSTR_HEADER int propertyIndex; int value; }; - struct StoreScriptStringInstruction { + struct instr_storeScriptString { + QML_INSTR_HEADER int propertyIndex; int value; int scope; }; - struct StoreScriptInstruction { + struct instr_storeScript { + QML_INSTR_HEADER int value; }; - struct StoreUrlInstruction { + struct instr_storeUrl { + QML_INSTR_HEADER int propertyIndex; int value; }; - struct StoreColorInstruction { + struct instr_storeColor { + QML_INSTR_HEADER int propertyIndex; unsigned int value; }; - struct StoreDateInstruction { + struct instr_storeDate { + QML_INSTR_HEADER int propertyIndex; int value; }; - struct StoreTimeInstruction { + struct instr_storeTime { + QML_INSTR_HEADER int propertyIndex; int valueIndex; }; - struct StoreDateTimeInstruction { + struct instr_storeDateTime { + QML_INSTR_HEADER int propertyIndex; int valueIndex; }; - struct StoreRealPairInstruction { + struct instr_storeRealPair { + QML_INSTR_HEADER int propertyIndex; int valueIndex; }; - struct StoreRectInstruction { + struct instr_storeRect { + QML_INSTR_HEADER int propertyIndex; int valueIndex; }; - struct StoreVector3DInstruction { + struct instr_storeVector3D { + QML_INSTR_HEADER int propertyIndex; int valueIndex; }; - struct StoreObjectInstruction { + struct instr_storeObject { + QML_INSTR_HEADER int propertyIndex; ushort line; }; - struct AssignCustomTypeInstruction { + struct instr_assignCustomType { + QML_INSTR_HEADER int propertyIndex; int valueIndex; ushort line; }; - struct StoreSignalInstruction { + struct instr_storeSignal { + QML_INSTR_HEADER int signalIndex; int value; short context; int name; ushort line; }; - struct AssignSignalObjectInstruction { + struct instr_assignSignalObject { + QML_INSTR_HEADER int signal; ushort line; }; - struct CreateComponentInstruction { + struct instr_createComponent { + QML_INSTR_HEADER int count; int endLine; int metaObject; ushort column; ushort line; }; - struct FetchAttachedInstruction { + struct instr_fetchAttached { + QML_INSTR_HEADER int id; ushort line; }; - struct DeferInstruction { + struct instr_defer { + QML_INSTR_HEADER int deferCount; }; - struct AssignObjectListInstruction { + struct instr_assignObjectList { + QML_INSTR_HEADER ushort line; }; - union { - InitInstruction init; - CreateInstruction create; - CreateSimpleInstruction createSimple; - StoreMetaInstruction storeMeta; - SetIdInstruction setId; - AssignValueSourceInstruction assignValueSource; - AssignValueInterceptorInstruction assignValueInterceptor; - AssignBindingInstruction assignBinding; - FetchInstruction fetch; - FetchValueInstruction fetchValue; - FetchQmlListInstruction fetchQmlList; - BeginInstruction begin; - StoreFloatInstruction storeFloat; - StoreDoubleInstruction storeDouble; - StoreIntegerInstruction storeInteger; - StoreBoolInstruction storeBool; - StoreStringInstruction storeString; - StoreByteArrayInstruction storeByteArray; - StoreScriptStringInstruction storeScriptString; - StoreScriptInstruction storeScript; - StoreUrlInstruction storeUrl; - StoreColorInstruction storeColor; - StoreDateInstruction storeDate; - StoreTimeInstruction storeTime; - StoreDateTimeInstruction storeDateTime; - StoreRealPairInstruction storeRealPair; - StoreRectInstruction storeRect; - StoreVector3DInstruction storeVector3D; - StoreObjectInstruction storeObject; - AssignCustomTypeInstruction assignCustomType; - StoreSignalInstruction storeSignal; - AssignSignalObjectInstruction assignSignalObject; - CreateComponentInstruction createComponent; - FetchAttachedInstruction fetchAttached; - DeferInstruction defer; - AssignObjectListInstruction assignObjectList; - }; + instr_common common; + instr_init init; + instr_create create; + instr_createSimple createSimple; + instr_storeMeta storeMeta; + instr_setId setId; + instr_assignValueSource assignValueSource; + instr_assignValueInterceptor assignValueInterceptor; + instr_assignBinding assignBinding; + instr_fetch fetch; + instr_fetchValue fetchValue; + instr_fetchQmlList fetchQmlList; + instr_begin begin; + instr_storeFloat storeFloat; + instr_storeDouble storeDouble; + instr_storeInteger storeInteger; + instr_storeBool storeBool; + instr_storeString storeString; + instr_storeByteArray storeByteArray; + instr_storeScriptString storeScriptString; + instr_storeScript storeScript; + instr_storeUrl storeUrl; + instr_storeColor storeColor; + instr_storeDate storeDate; + instr_storeTime storeTime; + instr_storeDateTime storeDateTime; + instr_storeRealPair storeRealPair; + instr_storeRect storeRect; + instr_storeVector3D storeVector3D; + instr_storeObject storeObject; + instr_assignCustomType assignCustomType; + instr_storeSignal storeSignal; + instr_assignSignalObject assignSignalObject; + instr_createComponent createComponent; + instr_fetchAttached fetchAttached; + instr_defer defer; + instr_assignObjectList assignObjectList; - void dump(QDeclarativeCompiledData *); + int size() const; }; +template<int N> +struct QDeclarativeInstructionMeta { +}; + +#define QML_INSTR_META_TEMPLATE(I, FMT) \ + template<> struct QDeclarativeInstructionMeta<(int)QDeclarativeInstruction::I> { \ + enum { Size = QML_INSTR_SIZE(I, FMT) }; \ + typedef QDeclarativeInstruction::instr_##FMT DataType; \ + static const DataType &data(const QDeclarativeInstruction &instr) { return instr.FMT; } \ + }; +FOR_EACH_QML_INSTR(QML_INSTR_META_TEMPLATE); +#undef QML_INSTR_META_TEMPLATE + QT_END_NAMESPACE #endif // QDECLARATIVEINSTRUCTION_P_H |