diff options
author | Chris Adams <christopher.adams@nokia.com> | 2011-09-30 11:14:10 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-10-06 05:29:00 +0200 |
commit | 752cd2aca42f6625f1cfc364937e0d39828cf954 (patch) | |
tree | dcb8891d7ff0d99d7bcbf948ed6339c4cce6b257 /src/declarative/qml/qdeclarativevme.cpp | |
parent | 6bd1704c42f564980677682e1d47e91129d94e5c (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.cpp | 48 |
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(); |