From 752cd2aca42f6625f1cfc364937e0d39828cf954 Mon Sep 17 00:00:00 2001 From: Chris Adams Date: Fri, 30 Sep 2011 11:14:10 +1000 Subject: 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 --- src/declarative/qml/qdeclarativevme.cpp | 48 +++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'src/declarative/qml/qdeclarativevme.cpp') 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 *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 *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 v8Value = ep->v8engine()->fromVariant(PRIMITIVES.at(instr.value)); + static_cast(const_cast(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 v8Value = v8::Integer::New(instr.value); + static_cast(const_cast(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 v8Value = v8::Number::New(instr.value); + static_cast(const_cast(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 v8Value = v8::Boolean::New(instr.value); + static_cast(const_cast(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 *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 v8Value = ep->v8engine()->newQObject(assign); + static_cast(const_cast(target->metaObject()))->setVMEProperty(instr.propertyIndex, v8Value); + QML_END_INSTR(StoreVarObject) + QML_BEGIN_INSTR(StoreInterface) QObject *assign = objects.pop(); QObject *target = objects.top(); -- cgit v1.2.3