aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/qdeclarativevme.cpp
diff options
context:
space:
mode:
authorChris Adams <christopher.adams@nokia.com>2011-09-30 11:14:10 +1000
committerQt by Nokia <qt-info@nokia.com>2011-10-06 05:29:00 +0200
commit752cd2aca42f6625f1cfc364937e0d39828cf954 (patch)
treedcb8891d7ff0d99d7bcbf948ed6339c4cce6b257 /src/declarative/qml/qdeclarativevme.cpp
parent6bd1704c42f564980677682e1d47e91129d94e5c (diff)
Add JavaScript "var" property type to QML
This commit adds a new syntax which allows "var" type properties which can have JavaScript objects (as well as other basic types) assigned to them. Such JavaScript objects cannot be bound to. Task-number: QMLNG-18 Change-Id: If7f5045f4669e0d5c1b8d0891ed765128d0bc1c6 Reviewed-on: http://codereview.qt-project.org/1466 Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
Diffstat (limited to 'src/declarative/qml/qdeclarativevme.cpp')
-rw-r--r--src/declarative/qml/qdeclarativevme.cpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/declarative/qml/qdeclarativevme.cpp b/src/declarative/qml/qdeclarativevme.cpp
index 8cc8fa0247..8f34fb5dc6 100644
--- a/src/declarative/qml/qdeclarativevme.cpp
+++ b/src/declarative/qml/qdeclarativevme.cpp
@@ -251,6 +251,10 @@ QObject *QDeclarativeVME::run(QList<QDeclarativeError> *errors,
QDeclarativeEngine *engine = states.at(0).context->engine;
QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(engine);
+ // Need a v8 handle scope and execution context for StoreVar instructions.
+ v8::HandleScope handleScope;
+ v8::Context::Scope contextScope(ep->v8engine()->context());
+
int status = -1; // needed for dbus
QDeclarativePropertyPrivate::WriteFlags flags = QDeclarativePropertyPrivate::BypassInterceptor |
QDeclarativePropertyPrivate::RemoveBindingOnAliasWrite;
@@ -542,6 +546,41 @@ QObject *QDeclarativeVME::run(QList<QDeclarativeError> *errors,
instr.propertyIndex, a);
QML_END_INSTR(StoreVariantBool)
+ QML_BEGIN_INSTR(StoreVar)
+ QObject *target = objects.top();
+ CLEAN_PROPERTY(target, instr.propertyIndex);
+
+ // Note that we don't use QDeclarativeStringConverters::variantFromString() here, which
+ // means that automatic generation of value types from strings doesn't occur.
+ // This is a deliberate behaviour difference to variant properties.
+ v8::Handle<v8::Value> v8Value = ep->v8engine()->fromVariant(PRIMITIVES.at(instr.value));
+ static_cast<QDeclarativeVMEMetaObject *>(const_cast<QMetaObject *>(target->metaObject()))->setVMEProperty(instr.propertyIndex, v8Value);
+ QML_END_INSTR(StoreVar)
+
+ QML_BEGIN_INSTR(StoreVarInteger)
+ QObject *target = objects.top();
+ CLEAN_PROPERTY(target, instr.propertyIndex);
+
+ v8::Handle<v8::Value> v8Value = v8::Integer::New(instr.value);
+ static_cast<QDeclarativeVMEMetaObject *>(const_cast<QMetaObject *>(target->metaObject()))->setVMEProperty(instr.propertyIndex, v8Value);
+ QML_END_INSTR(StoreVarInteger)
+
+ QML_BEGIN_INSTR(StoreVarDouble)
+ QObject *target = objects.top();
+ CLEAN_PROPERTY(target, instr.propertyIndex);
+
+ v8::Handle<v8::Value> v8Value = v8::Number::New(instr.value);
+ static_cast<QDeclarativeVMEMetaObject *>(const_cast<QMetaObject *>(target->metaObject()))->setVMEProperty(instr.propertyIndex, v8Value);
+ QML_END_INSTR(StoreVarDouble)
+
+ QML_BEGIN_INSTR(StoreVarBool)
+ QObject *target = objects.top();
+ CLEAN_PROPERTY(target, instr.propertyIndex);
+
+ v8::Handle<v8::Value> v8Value = v8::Boolean::New(instr.value);
+ static_cast<QDeclarativeVMEMetaObject *>(const_cast<QMetaObject *>(target->metaObject()))->setVMEProperty(instr.propertyIndex, v8Value);
+ QML_END_INSTR(StoreVarBool)
+
QML_BEGIN_INSTR(StoreString)
QObject *target = objects.top();
CLEAN_PROPERTY(target, instr.propertyIndex);
@@ -974,6 +1013,15 @@ QObject *QDeclarativeVME::run(QList<QDeclarativeError> *errors,
instr.propertyIndex, a);
QML_END_INSTR(StoreVariantObject)
+ QML_BEGIN_INSTR(StoreVarObject)
+ QObject *assign = objects.pop();
+ QObject *target = objects.top();
+ CLEAN_PROPERTY(target, instr.propertyIndex);
+
+ v8::Handle<v8::Value> v8Value = ep->v8engine()->newQObject(assign);
+ static_cast<QDeclarativeVMEMetaObject *>(const_cast<QMetaObject *>(target->metaObject()))->setVMEProperty(instr.propertyIndex, v8Value);
+ QML_END_INSTR(StoreVarObject)
+
QML_BEGIN_INSTR(StoreInterface)
QObject *assign = objects.pop();
QObject *target = objects.top();