aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2013-05-31 13:39:15 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2013-05-31 15:48:41 +0200
commit976051c491c9a79e5c34b97a0e3a37350a7c557c (patch)
tree261c9d9d15674e524ceea25bb7a65813e32431db /src/qml/qml
parente14b9dbee1260f799d1d2e175d106dbed79b6c49 (diff)
Move Variant and QtObject over to new casting scheme
Change-Id: Ie9e5e40b4bea4d4379dc9bdd103852c32d6ae478 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/qml')
-rw-r--r--src/qml/qml/qqmlvaluetypewrapper.cpp2
-rw-r--r--src/qml/qml/qqmlvmemetaobject.cpp8
-rw-r--r--src/qml/qml/v4/qv4managed_p.h5
-rw-r--r--src/qml/qml/v4/qv4value_p.h10
-rw-r--r--src/qml/qml/v4/qv4variantobject.cpp15
-rw-r--r--src/qml/qml/v4/qv4variantobject_p.h7
-rw-r--r--src/qml/qml/v8/qjsvalue.cpp2
-rw-r--r--src/qml/qml/v8/qqmlbuiltinfunctions.cpp8
-rw-r--r--src/qml/qml/v8/qqmlbuiltinfunctions_p.h1
-rw-r--r--src/qml/qml/v8/qv8engine.cpp12
-rw-r--r--src/qml/qml/v8/qv8qobjectwrapper.cpp2
11 files changed, 33 insertions, 39 deletions
diff --git a/src/qml/qml/qqmlvaluetypewrapper.cpp b/src/qml/qml/qqmlvaluetypewrapper.cpp
index 03e4639ae8..8248e479ec 100644
--- a/src/qml/qml/qqmlvaluetypewrapper.cpp
+++ b/src/qml/qml/qqmlvaluetypewrapper.cpp
@@ -194,7 +194,7 @@ bool QmlValueTypeWrapper::isEqualTo(Managed *m, Managed *other)
QV4::QmlValueTypeWrapper *lv = m->as<QmlValueTypeWrapper>();
assert(lv);
- if (QV4::VariantObject *rv = other->asVariantObject())
+ if (QV4::VariantObject *rv = other->as<VariantObject>())
return lv->isEqual(rv->data);
if (QV4::QmlValueTypeWrapper *v = other->as<QmlValueTypeWrapper>())
diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp
index 09edd3af89..28e4c64f31 100644
--- a/src/qml/qml/qqmlvmemetaobject.cpp
+++ b/src/qml/qml/qqmlvmemetaobject.cpp
@@ -1018,7 +1018,7 @@ void QQmlVMEMetaObject::writeVarProperty(int id, const QV4::Value &value)
// Importantly, if the current value is a scarce resource, we need to ensure that it
// gets automatically released by the engine if no other references to it exist.
QV4::Value oldv = varProperties.value().asObject()->getIndexed(id - firstVarPropertyIndex);
- if (QV4::VariantObject *v = oldv.asVariantObject())
+ if (QV4::VariantObject *v = oldv.as<QV4::VariantObject>())
v->removeVmePropertyReference();
QObject *valueObject = 0;
@@ -1027,7 +1027,7 @@ void QQmlVMEMetaObject::writeVarProperty(int id, const QV4::Value &value)
if (QV4::Object *o = value.asObject()) {
// And, if the new value is a scarce resource, we need to ensure that it does not get
// automatically released by the engine until no other references to it exist.
- if (QV4::VariantObject *v = o->asVariantObject()) {
+ if (QV4::VariantObject *v = o->as<QV4::VariantObject>()) {
v->addVmePropertyReference();
} else if (QV4::QObjectWrapper *wrapper = o->asQObjectWrapper()) {
// We need to track this QObject to signal its deletion
@@ -1059,13 +1059,13 @@ void QQmlVMEMetaObject::writeProperty(int id, const QVariant &value)
// Importantly, if the current value is a scarce resource, we need to ensure that it
// gets automatically released by the engine if no other references to it exist.
QV4::Value oldv = varProperties.value().asObject()->getIndexed(id - firstVarPropertyIndex);
- if (QV4::VariantObject *v = oldv.asVariantObject())
+ if (QV4::VariantObject *v = oldv.as<QV4::VariantObject>())
v->removeVmePropertyReference();
// And, if the new value is a scarce resource, we need to ensure that it does not get
// automatically released by the engine until no other references to it exist.
QV4::Value newv = QQmlEnginePrivate::get(ctxt->engine)->v8engine()->fromVariant(value);
- if (QV4::VariantObject *v = newv.asVariantObject())
+ if (QV4::VariantObject *v = newv.as<QV4::VariantObject>())
v->addVmePropertyReference();
// Write the value and emit change signal as appropriate.
diff --git a/src/qml/qml/v4/qv4managed_p.h b/src/qml/qml/v4/qv4managed_p.h
index a942377163..702e620ff7 100644
--- a/src/qml/qml/v4/qv4managed_p.h
+++ b/src/qml/qml/v4/qv4managed_p.h
@@ -77,9 +77,7 @@ struct Value;
class RegExp;
struct Lookup;
struct ExecutionEngine;
-struct VariantObject;
struct QObjectWrapper;
-struct QtObject;
#define Q_MANAGED_CHECK \
template <typename T> inline void qt_check_for_QMANAGED_macro(const T &_q_argument) const \
@@ -239,9 +237,6 @@ public:
QQmlLocaleData *asQmlLocale() { return type == Type_QmlLocale ? reinterpret_cast<QQmlLocaleData *>(this) : 0; }
QQuickJSContext2D *asQQuickJSContext2D() { return type == Type_QQuickJSContext2D ? reinterpret_cast<QQuickJSContext2D *>(this) : 0; }
- VariantObject *asVariantObject() { return type == Type_QVariant ? reinterpret_cast<VariantObject *>(this) : 0; }
-
- QtObject *asQtObject() { return type == Type_QtObject ? reinterpret_cast<QtObject *>(this) : 0; }
bool isListType() const { return type == Type_QmlSequence; }
diff --git a/src/qml/qml/v4/qv4value_p.h b/src/qml/qml/v4/qv4value_p.h
index af6f6ab64d..ea97229958 100644
--- a/src/qml/qml/v4/qv4value_p.h
+++ b/src/qml/qml/v4/qv4value_p.h
@@ -269,8 +269,11 @@ struct Q_QML_EXPORT Value
RegExpObject *asRegExpObject() const;
ArrayObject *asArrayObject() const;
ErrorObject *asErrorObject() const;
- VariantObject *asVariantObject() const;
QObjectWrapper *asQObjectWrapper() const;
+
+ template<typename T>
+ T *as() const { Managed *m = asObject(); return m ? m->as<T>() : 0; }
+
uint asArrayIndex() const;
uint asArrayLength(bool *ok) const;
@@ -543,11 +546,6 @@ inline ErrorObject *Value::asErrorObject() const
return isObject() ? managed()->asErrorObject() : 0;
}
-inline VariantObject *Value::asVariantObject() const
-{
- return isObject() ? managed()->asVariantObject() : 0;
-}
-
inline QObjectWrapper *Value::asQObjectWrapper() const
{
return isObject() ? managed()->asQObjectWrapper() : 0;
diff --git a/src/qml/qml/v4/qv4variantobject.cpp b/src/qml/qml/v4/qv4variantobject.cpp
index 2348a93a6f..badc49c98b 100644
--- a/src/qml/qml/v4/qv4variantobject.cpp
+++ b/src/qml/qml/v4/qv4variantobject.cpp
@@ -56,6 +56,7 @@ VariantObject::VariantObject(ExecutionEngine *engine, const QVariant &value)
, m_vmePropertyReferenceCount(0)
{
type = Type_QVariant;
+ vtbl = &static_vtbl;
prototype = engine->variantPrototype;
if (isScarce())
internalClass->engine->scarceResources.insert(this);
@@ -63,7 +64,7 @@ VariantObject::VariantObject(ExecutionEngine *engine, const QVariant &value)
QVariant VariantObject::toVariant(const QV4::Value &v)
{
- VariantObject *o = v.asVariantObject();
+ VariantObject *o = v.as<QV4::VariantObject>();
return o ? o->data : QVariant();
}
@@ -83,10 +84,10 @@ void VariantObject::destroy(Managed *that)
bool VariantObject::isEqualTo(Managed *m, Managed *other)
{
- QV4::VariantObject *lv = m->asVariantObject();
+ QV4::VariantObject *lv = m->as<QV4::VariantObject>();
assert(lv);
- if (QV4::VariantObject *rv = other->asVariantObject())
+ if (QV4::VariantObject *rv = other->as<QV4::VariantObject>())
return lv->data == rv->data;
if (QV4::QmlValueTypeWrapper *v = other->as<QmlValueTypeWrapper>())
@@ -124,7 +125,7 @@ VariantPrototype::VariantPrototype(ExecutionEngine *engine)
QV4::Value VariantPrototype::method_preserve(SimpleCallContext *ctx)
{
- VariantObject *o = ctx->thisObject.asVariantObject();
+ VariantObject *o = ctx->thisObject.as<QV4::VariantObject>();
if (o && o->isScarce())
o->node.remove();
return Value::undefinedValue();
@@ -132,7 +133,7 @@ QV4::Value VariantPrototype::method_preserve(SimpleCallContext *ctx)
QV4::Value VariantPrototype::method_destroy(SimpleCallContext *ctx)
{
- VariantObject *o = ctx->thisObject.asVariantObject();
+ VariantObject *o = ctx->thisObject.as<QV4::VariantObject>();
if (o) {
if (o->isScarce())
o->node.remove();
@@ -143,7 +144,7 @@ QV4::Value VariantPrototype::method_destroy(SimpleCallContext *ctx)
QV4::Value VariantPrototype::method_toString(SimpleCallContext *ctx)
{
- VariantObject *o = ctx->thisObject.asVariantObject();
+ VariantObject *o = ctx->thisObject.as<QV4::VariantObject>();
if (!o)
return Value::undefinedValue();
QString result = o->data.toString();
@@ -154,7 +155,7 @@ QV4::Value VariantPrototype::method_toString(SimpleCallContext *ctx)
QV4::Value VariantPrototype::method_valueOf(SimpleCallContext *ctx)
{
- VariantObject *o = ctx->thisObject.asVariantObject();
+ VariantObject *o = ctx->thisObject.as<QV4::VariantObject>();
if (o) {
QVariant v = o->data;
switch (v.type()) {
diff --git a/src/qml/qml/v4/qv4variantobject_p.h b/src/qml/qml/v4/qv4variantobject_p.h
index b0ff5ad406..74aff80132 100644
--- a/src/qml/qml/v4/qv4variantobject_p.h
+++ b/src/qml/qml/v4/qv4variantobject_p.h
@@ -66,6 +66,7 @@ namespace QV4 {
struct VariantObject : Object, public ExecutionEngine::ScarceResourceData
{
+ Q_MANAGED
public:
VariantObject(ExecutionEngine *engine, const QVariant &value);
@@ -78,9 +79,6 @@ public:
static void destroy(Managed *that);
static bool isEqualTo(Managed *m, Managed *other);
-
-private:
- static const ManagedVTable static_vtbl;
};
struct QV4_JS_CLASS(VariantPrototype) : VariantObject
@@ -94,9 +92,6 @@ public:
static Value method_destroy(SimpleCallContext *ctx);
static Value method_toString(SimpleCallContext *ctx);
static Value method_valueOf(SimpleCallContext *ctx);
-
-private:
- static const QV4::ManagedVTable static_vtbl;
};
}
diff --git a/src/qml/qml/v8/qjsvalue.cpp b/src/qml/qml/v8/qjsvalue.cpp
index 86673b6b25..c2e2f6e37d 100644
--- a/src/qml/qml/v8/qjsvalue.cpp
+++ b/src/qml/qml/v8/qjsvalue.cpp
@@ -319,7 +319,7 @@ bool QJSValue::isCallable() const
bool QJSValue::isVariant() const
{
Managed *m = d->value.asManaged();
- return m ? m->asVariantObject() : 0;
+ return m ? m->as<QV4::VariantObject>() : 0;
}
/*!
diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp
index 734d910d69..95b7aaf502 100644
--- a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp
+++ b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp
@@ -75,6 +75,8 @@ QT_BEGIN_NAMESPACE
using namespace QV4;
+DEFINE_MANAGED_VTABLE(QtObject);
+
struct StaticQtMetaObject : public QObject
{
static const QMetaObject *get()
@@ -86,6 +88,8 @@ QV4::QtObject::QtObject(ExecutionEngine *v4, QQmlEngine *qmlEngine)
, m_platform(0)
, m_application(0)
{
+ vtbl = &static_vtbl;
+
// Set all the enums from the "Qt" namespace
const QMetaObject *qtMetaObject = StaticQtMetaObject::get();
for (int ii = 0; ii < qtMetaObject->enumeratorCount(); ++ii) {
@@ -1233,7 +1237,7 @@ Value QtObject::method_get_platform(SimpleCallContext *ctx)
Object *o = ctx->thisObject.asObject();
if (!o)
ctx->throwTypeError();
- QtObject *qt = o->asQtObject();
+ QtObject *qt = o->as<QtObject>();
if (!qt)
ctx->throwTypeError();
@@ -1250,7 +1254,7 @@ Value QtObject::method_get_application(SimpleCallContext *ctx)
Object *o = ctx->thisObject.asObject();
if (!o)
ctx->throwTypeError();
- QtObject *qt = o->asQtObject();
+ QtObject *qt = o->as<QtObject>();
if (!qt)
ctx->throwTypeError();
diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions_p.h b/src/qml/qml/v8/qqmlbuiltinfunctions_p.h
index caa5be86da..5b639089ea 100644
--- a/src/qml/qml/v8/qqmlbuiltinfunctions_p.h
+++ b/src/qml/qml/v8/qqmlbuiltinfunctions_p.h
@@ -66,6 +66,7 @@ namespace QV4 {
struct QtObject : Object
{
+ Q_MANAGED
QtObject(ExecutionEngine *v4, QQmlEngine *qmlEngine);
static Value method_isQtObject(SimpleCallContext *ctx);
diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp
index ec56f73845..2b4f4ce05b 100644
--- a/src/qml/qml/v8/qv8engine.cpp
+++ b/src/qml/qml/v8/qv8engine.cpp
@@ -134,7 +134,7 @@ QVariant QV8Engine::toVariant(const QV4::Value &value, int typeHint)
if (value.isEmpty())
return QVariant();
- if (QV4::VariantObject *v = value.asVariantObject())
+ if (QV4::VariantObject *v = value.as<QV4::VariantObject>())
return v->data;
if (typeHint == QVariant::Bool)
@@ -986,9 +986,9 @@ bool QV8Engine::metaTypeFromJS(const QV4::Value &value, int type, void *data) {
QByteArray name = QMetaType::typeName(type);
if (convertToNativeQObject(value, name, reinterpret_cast<void* *>(data)))
return true;
- if (value.asVariantObject() && name.endsWith('*')) {
+ if (value.as<QV4::VariantObject>() && name.endsWith('*')) {
int valueType = QMetaType::type(name.left(name.size()-1));
- QVariant &var = value.asVariantObject()->data;
+ QVariant &var = value.as<QV4::VariantObject>()->data;
if (valueType == var.userType()) {
// We have T t, T* is requested, so return &t.
*reinterpret_cast<void* *>(data) = var.data();
@@ -998,7 +998,7 @@ bool QV8Engine::metaTypeFromJS(const QV4::Value &value, int type, void *data) {
QV4::Object *proto = o->prototype;
while (proto) {
bool canCast = false;
- if (QV4::VariantObject *vo = proto->asVariantObject()) {
+ if (QV4::VariantObject *vo = proto->as<QV4::VariantObject>()) {
const QVariant &v = vo->data;
canCast = (type == v.userType()) || (valueType && (valueType == v.userType()));
}
@@ -1068,7 +1068,7 @@ QVariant QV8Engine::variantFromJS(const QV4::Value &value,
return d->toQDateTime();
if (QV4::RegExpObject *re = value.asRegExpObject())
return re->toQRegExp();
- if (QV4::VariantObject *v = value.asVariantObject())
+ if (QV4::VariantObject *v = value.as<QV4::VariantObject>())
return v->data;
if (isQObject(value))
return qVariantFromValue(qtObjectFromJS(value));
@@ -1128,7 +1128,7 @@ QObject *QV8Engine::qtObjectFromJS(const QV4::Value &value)
return 0;
- if (QV4::VariantObject *v = value.asVariantObject()) {
+ if (QV4::VariantObject *v = value.as<QV4::VariantObject>()) {
QVariant variant = v->data;
int type = variant.userType();
if (type == QMetaType::QObjectStar)
diff --git a/src/qml/qml/v8/qv8qobjectwrapper.cpp b/src/qml/qml/v8/qv8qobjectwrapper.cpp
index b8f13d51a1..4157f8abc6 100644
--- a/src/qml/qml/v8/qv8qobjectwrapper.cpp
+++ b/src/qml/qml/v8/qv8qobjectwrapper.cpp
@@ -1418,7 +1418,7 @@ static int MatchScore(v8::Handle<v8::Value> actual, int conversionType)
QV4::Object *obj = actual->v4Value().asObject();
QV8Engine *engine = obj->engine()->publicEngine->handle();
- if (QV4::VariantObject *v = obj->asVariantObject()) {
+ if (QV4::VariantObject *v = obj->as<QV4::VariantObject>()) {
if (conversionType == qMetaTypeId<QVariant>())
return 0;
if (engine->toVariant(actual->v4Value(), -1).userType() == conversionType)