Inline static data for basic types into the QML instruction

The following types are now entirely inline:
    QPoint, QPointF
    QSize, QSizeF
    QRect, QRectF
    QVector3D,
    QTime, QDateTime
    CustomTypeData

Reviewed-by: Martin Jones
Change-Id: I7024d136c77f8fb23ef6a6abb23ddfe0f9f8a1ca
This commit is contained in:
Aaron Kennedy 2011-05-05 14:16:27 +10:00
parent cb661b8fd3
commit 21521c2d28
8 changed files with 335 additions and 233 deletions

View File

@ -97,70 +97,6 @@ int QDeclarativeCompiledData::indexForUrl(const QUrl &data)
return idx;
}
int QDeclarativeCompiledData::indexForFloat(float *data, int count)
{
Q_ASSERT(count > 0);
for (int ii = 0; ii <= floatData.count() - count; ++ii) {
bool found = true;
for (int jj = 0; jj < count; ++jj) {
if (floatData.at(ii + jj) != data[jj]) {
found = false;
break;
}
}
if (found)
return ii;
}
int idx = floatData.count();
for (int ii = 0; ii < count; ++ii)
floatData << data[ii];
return idx;
}
int QDeclarativeCompiledData::indexForInt(int *data, int count)
{
Q_ASSERT(count > 0);
for (int ii = 0; ii <= intData.count() - count; ++ii) {
bool found = true;
for (int jj = 0; jj < count; ++jj) {
if (intData.at(ii + jj) != data[jj]) {
found = false;
break;
}
}
if (found)
return ii;
}
int idx = intData.count();
for (int ii = 0; ii < count; ++ii)
intData << data[ii];
return idx;
}
int QDeclarativeCompiledData::indexForLocation(const QDeclarativeParser::Location &l)
{
// ### FIXME
int rv = locations.count();
locations << l;
return rv;
}
int QDeclarativeCompiledData::indexForLocation(const QDeclarativeParser::LocationSpan &l)
{
// ### FIXME
int rv = locations.count();
locations << l.start << l.end;
return rv;
}
QDeclarativeCompiledData::QDeclarativeCompiledData(QDeclarativeEngine *engine)
: QDeclarativeCleanup(engine), importCache(0), root(0), rootPropertyCache(0)
{

View File

@ -441,74 +441,84 @@ void QDeclarativeCompiler::genLiteralAssignment(const QMetaProperty &prop,
case QVariant::Time:
{
QTime time = QDeclarativeStringConverters::timeFromString(string);
int data[] = { time.hour(), time.minute(),
time.second(), time.msec() };
int index = output->indexForInt(data, 4);
instr.setType(QDeclarativeInstruction::StoreTime);
instr.storeTime.propertyIndex = prop.propertyIndex();
instr.storeTime.valueIndex = index;
instr.storeTime.time = *(QDeclarativeInstruction::instr_storeTime::QTime *)&time;
}
break;
case QVariant::DateTime:
{
QDateTime dateTime = QDeclarativeStringConverters::dateTimeFromString(string);
int data[] = { dateTime.date().toJulianDay(),
dateTime.time().hour(),
dateTime.time().minute(),
dateTime.time().second(),
dateTime.time().msec() };
int index = output->indexForInt(data, 5);
QTime time = dateTime.time();
instr.setType(QDeclarativeInstruction::StoreDateTime);
instr.storeDateTime.propertyIndex = prop.propertyIndex();
instr.storeDateTime.valueIndex = index;
instr.storeDateTime.date = dateTime.date().toJulianDay();
instr.storeDateTime.time = *(QDeclarativeInstruction::instr_storeTime::QTime *)&time;
}
break;
#endif // QT_NO_DATESTRING
case QVariant::Point:
{
bool ok;
QPoint point = QDeclarativeStringConverters::pointFFromString(string, &ok).toPoint();
instr.setType(QDeclarativeInstruction::StorePoint);
instr.storePoint.propertyIndex = prop.propertyIndex();
instr.storePoint.point.xp = point.x();
instr.storePoint.point.yp = point.y();
}
break;
case QVariant::PointF:
{
bool ok;
QPointF point =
QDeclarativeStringConverters::pointFFromString(string, &ok);
float data[] = { float(point.x()), float(point.y()) };
int index = output->indexForFloat(data, 2);
if (type == QVariant::PointF)
instr.setType(QDeclarativeInstruction::StorePointF);
else
instr.setType(QDeclarativeInstruction::StorePoint);
instr.storeRealPair.propertyIndex = prop.propertyIndex();
instr.storeRealPair.valueIndex = index;
QPointF point = QDeclarativeStringConverters::pointFFromString(string, &ok);
instr.setType(QDeclarativeInstruction::StorePointF);
instr.storePointF.propertyIndex = prop.propertyIndex();
instr.storePointF.point.xp = point.x();
instr.storePointF.point.yp = point.y();
}
break;
case QVariant::Size:
{
bool ok;
QSize size = QDeclarativeStringConverters::sizeFFromString(string, &ok).toSize();
instr.setType(QDeclarativeInstruction::StoreSize);
instr.storeSize.propertyIndex = prop.propertyIndex();
instr.storeSize.size.wd = size.width();
instr.storeSize.size.ht = size.height();
}
break;
case QVariant::SizeF:
{
bool ok;
QSizeF size = QDeclarativeStringConverters::sizeFFromString(string, &ok);
float data[] = { float(size.width()), float(size.height()) };
int index = output->indexForFloat(data, 2);
if (type == QVariant::SizeF)
instr.setType(QDeclarativeInstruction::StoreSizeF);
else
instr.setType(QDeclarativeInstruction::StoreSize);
instr.storeRealPair.propertyIndex = prop.propertyIndex();
instr.storeRealPair.valueIndex = index;
instr.setType(QDeclarativeInstruction::StoreSizeF);
instr.storeSizeF.propertyIndex = prop.propertyIndex();
instr.storeSizeF.size.wd = size.width();
instr.storeSizeF.size.ht = size.height();
}
break;
case QVariant::Rect:
{
bool ok;
QRect rect = QDeclarativeStringConverters::rectFFromString(string, &ok).toRect();
instr.setType(QDeclarativeInstruction::StoreRect);
instr.storeRect.propertyIndex = prop.propertyIndex();
instr.storeRect.rect.x1 = rect.left();
instr.storeRect.rect.y1 = rect.top();
instr.storeRect.rect.x2 = rect.right();
instr.storeRect.rect.y2 = rect.bottom();
}
break;
case QVariant::RectF:
{
bool ok;
QRectF rect = QDeclarativeStringConverters::rectFFromString(string, &ok);
float data[] = { float(rect.x()), float(rect.y()),
float(rect.width()), float(rect.height()) };
int index = output->indexForFloat(data, 4);
if (type == QVariant::RectF)
instr.setType(QDeclarativeInstruction::StoreRectF);
else
instr.setType(QDeclarativeInstruction::StoreRect);
instr.storeRect.propertyIndex = prop.propertyIndex();
instr.storeRect.valueIndex = index;
instr.setType(QDeclarativeInstruction::StoreRectF);
instr.storeRectF.propertyIndex = prop.propertyIndex();
instr.storeRectF.rect.xp = rect.left();
instr.storeRectF.rect.yp = rect.top();
instr.storeRectF.rect.w = rect.width();
instr.storeRectF.rect.h = rect.height();
}
break;
case QVariant::Bool:
@ -522,28 +532,21 @@ void QDeclarativeCompiler::genLiteralAssignment(const QMetaProperty &prop,
case QVariant::Vector3D:
{
bool ok;
QVector3D vector =
QDeclarativeStringConverters::vector3DFromString(string, &ok);
float data[] = { float(vector.x()), float(vector.y()), float(vector.z()) };
int index = output->indexForFloat(data, 3);
QVector3D vector = QDeclarativeStringConverters::vector3DFromString(string, &ok);
instr.setType(QDeclarativeInstruction::StoreVector3D);
instr.storeRealPair.propertyIndex = prop.propertyIndex();
instr.storeRealPair.valueIndex = index;
instr.storeVector3D.propertyIndex = prop.propertyIndex();
instr.storeVector3D.vector.xp = vector.x();
instr.storeVector3D.vector.yp = vector.y();
instr.storeVector3D.vector.zp = vector.z();
}
break;
default:
{
int t = prop.userType();
int index = output->customTypeData.count();
instr.setType(QDeclarativeInstruction::AssignCustomType);
instr.assignCustomType.propertyIndex = prop.propertyIndex();
instr.assignCustomType.valueIndex = index;
instr.assignCustomType.line = v->location.start.line;
QDeclarativeCompiledData::CustomTypeData data;
data.index = output->indexForString(string);
data.type = t;
output->customTypeData << data;
instr.assignCustomType.primitive = output->indexForString(string);
instr.assignCustomType.type = t;
}
break;
}
@ -557,9 +560,6 @@ void QDeclarativeCompiler::reset(QDeclarativeCompiledData *data)
{
data->types.clear();
data->primitives.clear();
data->floatData.clear();
data->intData.clear();
data->customTypeData.clear();
data->datas.clear();
data->bytecode.clear();
}

View File

@ -102,21 +102,12 @@ public:
QDeclarativePropertyCache *createPropertyCache(QDeclarativeEngine *);
};
QList<TypeReference> types;
struct CustomTypeData
{
int index;
int type;
};
const QMetaObject *root;
QAbstractDynamicMetaObject rootData;
QDeclarativePropertyCache *rootPropertyCache;
QList<QString> primitives;
QList<float> floatData;
QList<int> intData;
QList<CustomTypeData> customTypeData;
QList<QByteArray> datas;
QList<QDeclarativeParser::Location> locations;
QByteArray bytecode;
QList<QScriptProgram *> cachedPrograms;
QList<QScriptValue *> cachedClosures;
@ -144,10 +135,6 @@ private:
int indexForString(const QString &);
int indexForByteArray(const QByteArray &);
int indexForFloat(float *, int);
int indexForInt(int *, int);
int indexForLocation(const QDeclarativeParser::Location &);
int indexForLocation(const QDeclarativeParser::LocationSpan &);
int indexForUrl(const QUrl &);
};

View File

@ -106,31 +106,31 @@ void QDeclarativeCompiledData::dump(QDeclarativeInstruction *instr, int idx)
qWarning().nospace() << idx << "\t\t" << "STORE_DATE\t\t" << instr->storeDate.propertyIndex << "\t" << instr->storeDate.value;
break;
case QDeclarativeInstruction::StoreTime:
qWarning().nospace() << idx << "\t\t" << "STORE_TIME\t\t" << instr->storeTime.propertyIndex << "\t" << instr->storeTime.valueIndex;
qWarning().nospace() << idx << "\t\t" << "STORE_TIME\t\t" << instr->storeTime.propertyIndex;
break;
case QDeclarativeInstruction::StoreDateTime:
qWarning().nospace() << idx << "\t\t" << "STORE_DATETIME\t\t" << instr->storeDateTime.propertyIndex << "\t" << instr->storeDateTime.valueIndex;
qWarning().nospace() << idx << "\t\t" << "STORE_DATETIME\t\t" << instr->storeDateTime.propertyIndex;
break;
case QDeclarativeInstruction::StorePoint:
qWarning().nospace() << idx << "\t\t" << "STORE_POINT\t\t" << instr->storeRealPair.propertyIndex << "\t" << instr->storeRealPair.valueIndex;
qWarning().nospace() << idx << "\t\t" << "STORE_POINT\t\t" << instr->storePoint.propertyIndex << "\t" << instr->storePoint.point.xp << "\t" << instr->storePoint.point.yp;
break;
case QDeclarativeInstruction::StorePointF:
qWarning().nospace() << idx << "\t\t" << "STORE_POINTF\t\t" << instr->storeRealPair.propertyIndex << "\t" << instr->storeRealPair.valueIndex;
qWarning().nospace() << idx << "\t\t" << "STORE_POINTF\t\t" << instr->storePointF.propertyIndex << "\t" << instr->storePointF.point.xp << "\t" << instr->storePointF.point.yp;
break;
case QDeclarativeInstruction::StoreSize:
qWarning().nospace() << idx << "\t\t" << "STORE_SIZE\t\t" << instr->storeRealPair.propertyIndex << "\t" << instr->storeRealPair.valueIndex;
qWarning().nospace() << idx << "\t\t" << "STORE_SIZE\t\t" << instr->storeSize.propertyIndex << "\t" << instr->storeSize.size.wd << "\t" << instr->storeSize.size.ht;
break;
case QDeclarativeInstruction::StoreSizeF:
qWarning().nospace() << idx << "\t\t" << "STORE_SIZEF\t\t" << instr->storeRealPair.propertyIndex << "\t" << instr->storeRealPair.valueIndex;
qWarning().nospace() << idx << "\t\t" << "STORE_SIZEF\t\t" << instr->storeSizeF.propertyIndex << "\t" << instr->storeSizeF.size.wd << "\t" << instr->storeSizeF.size.ht;
break;
case QDeclarativeInstruction::StoreRect:
qWarning().nospace() << idx << "\t\t" << "STORE_RECT\t\t" << instr->storeRect.propertyIndex << "\t" << instr->storeRect.valueIndex;
qWarning().nospace() << idx << "\t\t" << "STORE_RECT\t\t" << instr->storeRect.propertyIndex << "\t" << instr->storeRect.rect.x1 << "\t" << instr->storeRect.rect.y1 << "\t" << instr->storeRect.rect.x2 << "\t" << instr->storeRect.rect.y2;
break;
case QDeclarativeInstruction::StoreRectF:
qWarning().nospace() << idx << "\t\t" << "STORE_RECTF\t\t" << instr->storeRect.propertyIndex << "\t" << instr->storeRect.valueIndex;
qWarning().nospace() << idx << "\t\t" << "STORE_RECTF\t\t" << instr->storeRectF.propertyIndex << "\t" << instr->storeRectF.rect.xp << "\t" << instr->storeRectF.rect.yp << "\t" << instr->storeRectF.rect.w << "\t" << instr->storeRectF.rect.h;
break;
case QDeclarativeInstruction::StoreVector3D:
qWarning().nospace() << idx << "\t\t" << "STORE_VECTOR3D\t\t" << instr->storeVector3D.propertyIndex << "\t" << instr->storeVector3D.valueIndex;
qWarning().nospace() << idx << "\t\t" << "STORE_VECTOR3D\t\t" << instr->storeVector3D.propertyIndex << "\t" << instr->storeVector3D.vector.xp << "\t" << instr->storeVector3D.vector.yp << "\t" << instr->storeVector3D.vector.zp;
break;
case QDeclarativeInstruction::StoreVariant:
qWarning().nospace() << idx << "\t\t" << "STORE_VARIANT\t\t" << instr->storeString.propertyIndex << "\t" << instr->storeString.value << "\t\t" << primitives.at(instr->storeString.value);
@ -166,7 +166,7 @@ void QDeclarativeCompiledData::dump(QDeclarativeInstruction *instr, int idx)
qWarning().nospace() << idx << "\t\t" << "ASSIGN_SIGNAL_OBJECT\t" << instr->assignSignalObject.signal << "\t\t\t" << datas.at(instr->assignSignalObject.signal);
break;
case QDeclarativeInstruction::AssignCustomType:
qWarning().nospace() << idx << "\t\t" << "ASSIGN_CUSTOMTYPE\t" << instr->assignCustomType.propertyIndex << "\t" << instr->assignCustomType.valueIndex;
qWarning().nospace() << idx << "\t\t" << "ASSIGN_CUSTOMTYPE\t" << instr->assignCustomType.propertyIndex << "\t" << instr->assignCustomType.primitive << "\t" << instr->assignCustomType.type;
break;
case QDeclarativeInstruction::StoreBinding:
qWarning().nospace() << idx << "\t\t" << "STORE_BINDING\t" << instr->assignBinding.property << "\t" << instr->assignBinding.value << "\t" << instr->assignBinding.context;

View File

@ -81,12 +81,12 @@ QT_BEGIN_NAMESPACE
F(StoreDate, storeDate) \
F(StoreTime, storeTime) \
F(StoreDateTime, storeDateTime) \
F(StorePoint, storeRealPair) \
F(StorePointF, storeRealPair) \
F(StoreSize, storeRealPair) \
F(StoreSizeF, storeRealPair) \
F(StorePoint, storePoint) \
F(StorePointF, storePointF) \
F(StoreSize, storeSize) \
F(StoreSizeF, storeSizeF) \
F(StoreRect, storeRect) \
F(StoreRectF, storeRect) \
F(StoreRectF, storeRectF) \
F(StoreVector3D, storeVector3D) \
F(StoreObject, storeObject) \
F(AssignCustomType, assignCustomType) \
@ -268,27 +268,45 @@ union QDeclarativeInstruction
struct instr_storeTime {
QML_INSTR_HEADER
int propertyIndex;
int valueIndex;
struct QTime {
int mds;
#if defined(Q_OS_WINCE)
int startTick;
#endif
} time;
};
struct instr_storeDateTime {
QML_INSTR_HEADER
int propertyIndex;
int valueIndex;
};
struct instr_storeRealPair {
QML_INSTR_HEADER
int propertyIndex;
int valueIndex;
int date;
instr_storeTime::QTime time;
};
struct instr_storeRect {
QML_INSTR_HEADER
int propertyIndex;
int valueIndex;
struct QRect {
#if defined(Q_OS_MAC)
int y1;
int x1;
int y2;
int x2;
#else
int x1;
int y1;
int x2;
int y2;
#endif
} rect;
};
struct instr_storeVector3D {
struct instr_storeRectF {
QML_INSTR_HEADER
int propertyIndex;
int valueIndex;
struct QRectF {
qreal xp;
qreal yp;
qreal w;
qreal h;
} rect;
};
struct instr_storeObject {
QML_INSTR_HEADER
@ -298,7 +316,8 @@ union QDeclarativeInstruction
struct instr_assignCustomType {
QML_INSTR_HEADER
int propertyIndex;
int valueIndex;
int primitive;
int type;
ushort line;
};
struct instr_storeSignal {
@ -335,6 +354,52 @@ union QDeclarativeInstruction
QML_INSTR_HEADER
ushort line;
};
struct instr_storePoint {
QML_INSTR_HEADER
int propertyIndex;
struct QPoint {
#if defined(Q_OS_MAC)
int yp;
int xp;
#else
int xp;
int yp;
#endif
} point;
};
struct instr_storePointF {
QML_INSTR_HEADER
int propertyIndex;
struct QPointF {
qreal xp;
qreal yp;
} point;
};
struct instr_storeSize {
QML_INSTR_HEADER
int propertyIndex;
struct QSize {
int wd;
int ht;
} size;
};
struct instr_storeSizeF {
QML_INSTR_HEADER
int propertyIndex;
struct QSizeF {
qreal wd;
qreal ht;
} size;
};
struct instr_storeVector3D {
QML_INSTR_HEADER
int propertyIndex;
struct QVector3D {
float xp;
float yp;
float zp;
} vector;
};
instr_common common;
instr_init init;
@ -362,8 +427,12 @@ union QDeclarativeInstruction
instr_storeDate storeDate;
instr_storeTime storeTime;
instr_storeDateTime storeDateTime;
instr_storeRealPair storeRealPair;
instr_storePoint storePoint;
instr_storePointF storePointF;
instr_storeSize storeSize;
instr_storeSizeF storeSizeF;
instr_storeRect storeRect;
instr_storeRectF storeRectF;
instr_storeVector3D storeVector3D;
instr_storeObject storeObject;
instr_assignCustomType assignCustomType;

View File

@ -161,9 +161,6 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
const QList<QDeclarativeCompiledData::TypeReference> &types = comp->types;
const QList<QString> &primitives = comp->primitives;
const QList<QByteArray> &datas = comp->datas;
const QList<QDeclarativeCompiledData::CustomTypeData> &customTypeData = comp->customTypeData;
const QList<int> &intData = comp->intData;
const QList<float> &floatData = comp->floatData;
const QList<QDeclarativePropertyCache *> &propertyCaches = comp->propertyCaches;
const QList<QDeclarativeScriptData *> &scripts = comp->scripts;
const QList<QUrl> &urls = comp->urls;
@ -475,12 +472,8 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
QObject *target = stack.top();
CLEAN_PROPERTY(target, instr.propertyIndex);
QTime t;
t.setHMS(intData.at(instr.valueIndex),
intData.at(instr.valueIndex+1),
intData.at(instr.valueIndex+2),
intData.at(instr.valueIndex+3));
void *a[] = { &t, 0, &status, &flags };
QTime *t = (QTime *)&instr.time;
void *a[] = { t, 0, &status, &flags };
QMetaObject::metacall(target, QMetaObject::WriteProperty,
instr.propertyIndex, a);
QML_END_INSTR(StoreTime)
@ -489,12 +482,8 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
QObject *target = stack.top();
CLEAN_PROPERTY(target, instr.propertyIndex);
QTime t;
t.setHMS(intData.at(instr.valueIndex+1),
intData.at(instr.valueIndex+2),
intData.at(instr.valueIndex+3),
intData.at(instr.valueIndex+4));
QDateTime dt(QDate::fromJulianDay(intData.at(instr.valueIndex)), t);
QTime *t = (QTime *)&instr.time;
QDateTime dt(QDate::fromJulianDay(instr.date), *t);
void *a[] = { &dt, 0, &status, &flags };
QMetaObject::metacall(target, QMetaObject::WriteProperty,
instr.propertyIndex, a);
@ -504,9 +493,8 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
QObject *target = stack.top();
CLEAN_PROPERTY(target, instr.propertyIndex);
QPoint p = QPointF(floatData.at(instr.valueIndex),
floatData.at(instr.valueIndex+1)).toPoint();
void *a[] = { &p, 0, &status, &flags };
QPoint *p = (QPoint *)&instr.point;
void *a[] = { p, 0, &status, &flags };
QMetaObject::metacall(target, QMetaObject::WriteProperty,
instr.propertyIndex, a);
QML_END_INSTR(StorePoint)
@ -515,9 +503,8 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
QObject *target = stack.top();
CLEAN_PROPERTY(target, instr.propertyIndex);
QPointF p(floatData.at(instr.valueIndex),
floatData.at(instr.valueIndex+1));
void *a[] = { &p, 0, &status, &flags };
QPointF *p = (QPointF *)&instr.point;
void *a[] = { p, 0, &status, &flags };
QMetaObject::metacall(target, QMetaObject::WriteProperty,
instr.propertyIndex, a);
QML_END_INSTR(StorePointF)
@ -526,9 +513,8 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
QObject *target = stack.top();
CLEAN_PROPERTY(target, instr.propertyIndex);
QSize p = QSizeF(floatData.at(instr.valueIndex),
floatData.at(instr.valueIndex+1)).toSize();
void *a[] = { &p, 0, &status, &flags };
QSize *s = (QSize *)&instr.size;
void *a[] = { s, 0, &status, &flags };
QMetaObject::metacall(target, QMetaObject::WriteProperty,
instr.propertyIndex, a);
QML_END_INSTR(StoreSize)
@ -537,9 +523,8 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
QObject *target = stack.top();
CLEAN_PROPERTY(target, instr.propertyIndex);
QSizeF s(floatData.at(instr.valueIndex),
floatData.at(instr.valueIndex+1));
void *a[] = { &s, 0, &status, &flags };
QSizeF *s = (QSizeF *)&instr.size;
void *a[] = { s, 0, &status, &flags };
QMetaObject::metacall(target, QMetaObject::WriteProperty,
instr.propertyIndex, a);
QML_END_INSTR(StoreSizeF)
@ -548,11 +533,8 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
QObject *target = stack.top();
CLEAN_PROPERTY(target, instr.propertyIndex);
QRect r = QRectF(floatData.at(instr.valueIndex),
floatData.at(instr.valueIndex+1),
floatData.at(instr.valueIndex+2),
floatData.at(instr.valueIndex+3)).toRect();
void *a[] = { &r, 0, &status, &flags };
QRect *r = (QRect *)&instr.rect;
void *a[] = { r, 0, &status, &flags };
QMetaObject::metacall(target, QMetaObject::WriteProperty,
instr.propertyIndex, a);
QML_END_INSTR(StoreRect)
@ -561,11 +543,8 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
QObject *target = stack.top();
CLEAN_PROPERTY(target, instr.propertyIndex);
QRectF r(floatData.at(instr.valueIndex),
floatData.at(instr.valueIndex+1),
floatData.at(instr.valueIndex+2),
floatData.at(instr.valueIndex+3));
void *a[] = { &r, 0, &status, &flags };
QRectF *r = (QRectF *)&instr.rect;
void *a[] = { r, 0, &status, &flags };
QMetaObject::metacall(target, QMetaObject::WriteProperty,
instr.propertyIndex, a);
QML_END_INSTR(StoreRectF)
@ -574,10 +553,8 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
QObject *target = stack.top();
CLEAN_PROPERTY(target, instr.propertyIndex);
QVector3D p(floatData.at(instr.valueIndex),
floatData.at(instr.valueIndex+1),
floatData.at(instr.valueIndex+2));
void *a[] = { &p, 0, &status, &flags };
QVector3D *v = (QVector3D *)&instr.vector;
void *a[] = { v, 0, &status, &flags };
QMetaObject::metacall(target, QMetaObject::WriteProperty,
instr.propertyIndex, a);
QML_END_INSTR(StoreVector3D)
@ -596,15 +573,14 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
QObject *target = stack.top();
CLEAN_PROPERTY(target, instr.propertyIndex);
QDeclarativeCompiledData::CustomTypeData data = customTypeData.at(instr.valueIndex);
const QString &primitive = primitives.at(data.index);
QDeclarativeMetaType::StringConverter converter =
QDeclarativeMetaType::customStringConverter(data.type);
const QString &primitive = primitives.at(instr.primitive);
int type = instr.type;
QDeclarativeMetaType::StringConverter converter = QDeclarativeMetaType::customStringConverter(type);
QVariant v = (*converter)(primitive);
QMetaProperty prop =
target->metaObject()->property(instr.propertyIndex);
if (v.isNull() || ((int)prop.type() != data.type && prop.userType() != data.type))
if (v.isNull() || ((int)prop.type() != type && prop.userType() != type))
VME_EXCEPTION(QCoreApplication::translate("QDeclarativeVME","Cannot assign value %1 to property %2").arg(primitive).arg(QString::fromUtf8(prop.name())), instr.line);
void *a[] = { (void *)v.data(), 0, &status, &flags };

View File

@ -55,6 +55,15 @@ public:
private slots:
void dump();
void point();
void pointf();
void size();
void sizef();
void rect();
void rectf();
void vector3d();
void time();
};
static QStringList messages;
@ -198,7 +207,6 @@ void tst_qdeclarativeinstruction::dump()
QDeclarativeInstruction i;
i.setType(QDeclarativeInstruction::StoreTime);
i.storeTime.propertyIndex = 11;
i.storeTime.valueIndex = 33;
data->addInstruction(i);
}
@ -206,39 +214,42 @@ void tst_qdeclarativeinstruction::dump()
QDeclarativeInstruction i;
i.setType(QDeclarativeInstruction::StoreDateTime);
i.storeDateTime.propertyIndex = 12;
i.storeDateTime.valueIndex = 44;
data->addInstruction(i);
}
{
QDeclarativeInstruction i;
i.setType(QDeclarativeInstruction::StorePoint);
i.storeRealPair.propertyIndex = 13;
i.storeRealPair.valueIndex = 3;
i.storePoint.propertyIndex = 13;
i.storePoint.point.xp = 3;
i.storePoint.point.yp = 7;
data->addInstruction(i);
}
{
QDeclarativeInstruction i;
i.setType(QDeclarativeInstruction::StorePointF);
i.storeRealPair.propertyIndex = 14;
i.storeRealPair.valueIndex = 9;
i.storePointF.propertyIndex = 13;
i.storePointF.point.xp = 3;
i.storePointF.point.yp = 7;
data->addInstruction(i);
}
{
QDeclarativeInstruction i;
i.setType(QDeclarativeInstruction::StoreSize);
i.storeRealPair.propertyIndex = 15;
i.storeRealPair.valueIndex = 8;
i.storeSize.propertyIndex = 15;
i.storeSize.size.wd = 8;
i.storeSize.size.ht = 11;
data->addInstruction(i);
}
{
QDeclarativeInstruction i;
i.setType(QDeclarativeInstruction::StoreSizeF);
i.storeRealPair.propertyIndex = 16;
i.storeRealPair.valueIndex = 99;
i.storeSizeF.propertyIndex = 15;
i.storeSizeF.size.wd = 8;
i.storeSizeF.size.ht = 11;
data->addInstruction(i);
}
@ -246,15 +257,21 @@ void tst_qdeclarativeinstruction::dump()
QDeclarativeInstruction i;
i.setType(QDeclarativeInstruction::StoreRect);
i.storeRect.propertyIndex = 17;
i.storeRect.valueIndex = 2;
i.storeRect.rect.x1 = 7;
i.storeRect.rect.y1 = 9;
i.storeRect.rect.x2 = 11;
i.storeRect.rect.y2 = 13;
data->addInstruction(i);
}
{
QDeclarativeInstruction i;
i.setType(QDeclarativeInstruction::StoreRectF);
i.storeRect.propertyIndex = 18;
i.storeRect.valueIndex = 19;
i.storeRectF.propertyIndex = 18;
i.storeRectF.rect.xp = 11.3;
i.storeRectF.rect.yp = 9.8;
i.storeRectF.rect.w = 3;
i.storeRectF.rect.h = 2.1;
data->addInstruction(i);
}
@ -262,7 +279,9 @@ void tst_qdeclarativeinstruction::dump()
QDeclarativeInstruction i;
i.setType(QDeclarativeInstruction::StoreVector3D);
i.storeVector3D.propertyIndex = 19;
i.storeVector3D.valueIndex = 9;
i.storeVector3D.vector.xp = 9;
i.storeVector3D.vector.yp = 3;
i.storeVector3D.vector.zp = 92;
data->addInstruction(i);
}
@ -329,7 +348,8 @@ void tst_qdeclarativeinstruction::dump()
QDeclarativeInstruction i;
i.setType(QDeclarativeInstruction::AssignCustomType);
i.assignCustomType.propertyIndex = 25;
i.assignCustomType.valueIndex = 4;
i.assignCustomType.primitive = 6;
i.assignCustomType.type = 9;
data->addInstruction(i);
}
@ -501,15 +521,15 @@ void tst_qdeclarativeinstruction::dump()
<< "11\t\tSTORE_URL\t\t8\t0\t\tQUrl(\"http://www.nokia.com\") "
<< "12\t\tSTORE_COLOR\t\t9\t\t\t\"ff00ff00\""
<< "13\t\tSTORE_DATE\t\t10\t9"
<< "14\t\tSTORE_TIME\t\t11\t33"
<< "15\t\tSTORE_DATETIME\t\t12\t44"
<< "16\t\tSTORE_POINT\t\t13\t3"
<< "17\t\tSTORE_POINTF\t\t14\t9"
<< "18\t\tSTORE_SIZE\t\t15\t8"
<< "19\t\tSTORE_SIZEF\t\t16\t99"
<< "20\t\tSTORE_RECT\t\t17\t2"
<< "21\t\tSTORE_RECTF\t\t18\t19"
<< "22\t\tSTORE_VECTOR3D\t\t19\t9"
<< "14\t\tSTORE_TIME\t\t11"
<< "15\t\tSTORE_DATETIME\t\t12"
<< "16\t\tSTORE_POINT\t\t13\t3\t7"
<< "17\t\tSTORE_POINTF\t\t13\t3\t7"
<< "18\t\tSTORE_SIZE\t\t15\t8\t11"
<< "19\t\tSTORE_SIZEF\t\t15\t8\t11"
<< "20\t\tSTORE_RECT\t\t17\t7\t9\t11\t13"
<< "21\t\tSTORE_RECTF\t\t18\t11.3\t9.8\t3\t2.1"
<< "22\t\tSTORE_VECTOR3D\t\t19\t9\t3\t92"
<< "23\t\tSTORE_VARIANT\t\t20\t2\t\t\"color(1, 1, 1, 1)\""
<< "24\t\tSTORE_OBJECT\t\t21"
<< "25\t\tSTORE_VARIANT_OBJECT\t22"
@ -517,7 +537,7 @@ void tst_qdeclarativeinstruction::dump()
<< "27\t\tSTORE_SIGNAL\t\t2\t3\t\t\"console.log(1921)\""
<< "28\t\tSTORE_SCRIPT_STRING\t24\t3\t1"
<< "29\t\tASSIGN_SIGNAL_OBJECT\t0\t\t\t\"mySignal\""
<< "30\t\tASSIGN_CUSTOMTYPE\t25\t4"
<< "30\t\tASSIGN_CUSTOMTYPE\t25\t6\t9"
<< "31\t\tSTORE_BINDING\t26\t3\t2"
<< "32\t\tSTORE_COMPILED_BINDING\t27\t2\t4"
<< "33\t\tSTORE_VALUE_SOURCE\t29\t4"
@ -553,6 +573,120 @@ void tst_qdeclarativeinstruction::dump()
data->release();
}
void tst_qdeclarativeinstruction::point()
{
QCOMPARE(sizeof(QDeclarativeInstruction::instr_storePoint::QPoint), sizeof(QPoint));
QCOMPARE(Q_ALIGNOF(QDeclarativeInstruction::instr_storePoint::QPoint), Q_ALIGNOF(QPoint));
QDeclarativeInstruction i;
i.storePoint.point.xp = 8;
i.storePoint.point.yp = 11;
const QPoint &point = (const QPoint &)(i.storePoint.point);
QCOMPARE(point.x(), 8);
QCOMPARE(point.y(), 11);
}
void tst_qdeclarativeinstruction::pointf()
{
QCOMPARE(sizeof(QDeclarativeInstruction::instr_storePointF::QPointF), sizeof(QPointF));
QCOMPARE(Q_ALIGNOF(QDeclarativeInstruction::instr_storePointF::QPointF), Q_ALIGNOF(QPointF));
QDeclarativeInstruction i;
i.storePointF.point.xp = 8.7;
i.storePointF.point.yp = 11.3;
const QPointF &point = (const QPointF &)(i.storePointF.point);
QCOMPARE(point.x(), 8.7);
QCOMPARE(point.y(), 11.3);
}
void tst_qdeclarativeinstruction::size()
{
QCOMPARE(sizeof(QDeclarativeInstruction::instr_storeSize::QSize), sizeof(QSize));
QCOMPARE(Q_ALIGNOF(QDeclarativeInstruction::instr_storeSize::QSize), Q_ALIGNOF(QSize));
QDeclarativeInstruction i;
i.storeSize.size.wd = 8;
i.storeSize.size.ht = 11;
const QSize &size = (const QSize &)(i.storeSize.size);
QCOMPARE(size.width(), 8);
QCOMPARE(size.height(), 11);
}
void tst_qdeclarativeinstruction::sizef()
{
QCOMPARE(sizeof(QDeclarativeInstruction::instr_storeSizeF::QSizeF), sizeof(QSizeF));
QCOMPARE(Q_ALIGNOF(QDeclarativeInstruction::instr_storeSizeF::QSizeF), Q_ALIGNOF(QSizeF));
QDeclarativeInstruction i;
i.storeSizeF.size.wd = 8;
i.storeSizeF.size.ht = 11;
const QSizeF &size = (const QSizeF &)(i.storeSizeF.size);
QCOMPARE(size.width(), (qreal)8);
QCOMPARE(size.height(), (qreal)11);
}
void tst_qdeclarativeinstruction::rect()
{
QCOMPARE(sizeof(QDeclarativeInstruction::instr_storeRect::QRect), sizeof(QRect));
QCOMPARE(Q_ALIGNOF(QDeclarativeInstruction::instr_storeRect::QRect), Q_ALIGNOF(QRect));
QDeclarativeInstruction i;
i.storeRect.rect.x1 = 8;
i.storeRect.rect.y1 = 11;
i.storeRect.rect.x2 = 13;
i.storeRect.rect.y2 = 19;
const QRect &rect = (const QRect &)(i.storeRect.rect);
QCOMPARE(rect.left(), 8);
QCOMPARE(rect.top(), 11);
QCOMPARE(rect.right(), 13);
QCOMPARE(rect.bottom(), 19);
}
void tst_qdeclarativeinstruction::rectf()
{
QCOMPARE(sizeof(QDeclarativeInstruction::instr_storeRectF::QRectF), sizeof(QRectF));
QCOMPARE(Q_ALIGNOF(QDeclarativeInstruction::instr_storeRectF::QRectF), Q_ALIGNOF(QRectF));
QDeclarativeInstruction i;
i.storeRectF.rect.xp = 8;
i.storeRectF.rect.yp = 11;
i.storeRectF.rect.w = 13;
i.storeRectF.rect.h = 19;
const QRectF &rect = (const QRectF &)(i.storeRectF.rect);
QCOMPARE(rect.left(), (qreal)8);
QCOMPARE(rect.top(), (qreal)11);
QCOMPARE(rect.width(), (qreal)13);
QCOMPARE(rect.height(), (qreal)19);
}
void tst_qdeclarativeinstruction::vector3d()
{
QCOMPARE(sizeof(QDeclarativeInstruction::instr_storeVector3D::QVector3D), sizeof(QVector3D));
QCOMPARE(Q_ALIGNOF(QDeclarativeInstruction::instr_storeVector3D::QVector3D), Q_ALIGNOF(QVector3D));
QDeclarativeInstruction i;
i.storeVector3D.vector.xp = 8.2;
i.storeVector3D.vector.yp = 99.3;
i.storeVector3D.vector.zp = 12.0;
const QVector3D &vector = (const QVector3D &)(i.storeVector3D.vector);
QCOMPARE(vector.x(), (qreal)(float)8.2);
QCOMPARE(vector.y(), (qreal)(float)99.3);
QCOMPARE(vector.z(), (qreal)(float)12.0);
}
void tst_qdeclarativeinstruction::time()
{
QCOMPARE(sizeof(QDeclarativeInstruction::instr_storeTime::QTime), sizeof(QTime));
QCOMPARE(Q_ALIGNOF(QDeclarativeInstruction::instr_storeTime::QTime), Q_ALIGNOF(QTime));
}
QTEST_MAIN(tst_qdeclarativeinstruction)
#include "tst_qdeclarativeinstruction.moc"

View File

@ -549,11 +549,11 @@ void tst_qdeclarativelanguage::assignBasicTypes()
QCOMPARE(object->timeProperty(), QTime(11, 11, 32));
QCOMPARE(object->dateTimeProperty(), QDateTime(QDate(2009, 5, 12), QTime(13, 22, 1)));
QCOMPARE(object->pointProperty(), QPoint(99,13));
QCOMPARE(object->pointFProperty(), QPointF((float)-10.1, (float)12.3));
QCOMPARE(object->pointFProperty(), QPointF(-10.1, 12.3));
QCOMPARE(object->sizeProperty(), QSize(99, 13));
QCOMPARE(object->sizeFProperty(), QSizeF((float)0.1, (float)0.2));
QCOMPARE(object->sizeFProperty(), QSizeF(0.1, 0.2));
QCOMPARE(object->rectProperty(), QRect(9, 7, 100, 200));
QCOMPARE(object->rectFProperty(), QRectF((float)1000.1, (float)-10.9, (float)400, (float)90.99));
QCOMPARE(object->rectFProperty(), QRectF(1000.1, -10.9, 400, 90.99));
QCOMPARE(object->boolProperty(), true);
QCOMPARE(object->variantProperty(), QVariant("Hello World!"));
QCOMPARE(object->vectorProperty(), QVector3D(10, 1, 2.2));