From d96bc6ba81465c5a82ca08ac68c2dac54a57700f Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Thu, 9 Jul 2009 13:55:31 +0200 Subject: make QObject property access use getter+setter functions Setters don't work yet. But hey, the defaultprototypes example finally works. --- src/script/bridge/qscriptqobject.cpp | 18 ++++++++++++------ tests/auto/qscriptqobject/tst_qscriptqobject.cpp | 2 -- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/script/bridge/qscriptqobject.cpp b/src/script/bridge/qscriptqobject.cpp index b3a92b3..534e141 100644 --- a/src/script/bridge/qscriptqobject.cpp +++ b/src/script/bridge/qscriptqobject.cpp @@ -171,7 +171,7 @@ static QVariant variantFromValue(QScriptEnginePrivate *eng, return QVariant(); } -static const bool GeneratePropertyFunctions = false; +static const bool GeneratePropertyFunctions = true; static unsigned flagsForMetaProperty(const QMetaProperty &prop) { @@ -1120,16 +1120,19 @@ bool QObjectWrapperObject::getOwnPropertySlot(JSC::ExecState *exec, return false; } + const QMetaObject *meta = qobject->metaObject(); { QHash::const_iterator it = data->cachedMembers.constFind(name); if (it != data->cachedMembers.constEnd()) { - slot.setValue(it.value()); + if (GeneratePropertyFunctions && (meta->indexOfProperty(name) != -1)) + slot.setGetterSlot(JSC::asObject(it.value())); + else + slot.setValue(it.value()); return true; } } const QScriptEngine::QObjectWrapOptions &opt = data->options; - const QMetaObject *meta = qobject->metaObject(); QScriptEnginePrivate *eng = static_cast(exec->lexicalGlobalObject())->engine; int index = -1; if (name.contains('(')) { @@ -1248,8 +1251,9 @@ void QObjectWrapperObject::put(JSC::ExecState* exec, const JSC::Identifier& prop index = meta->indexOfProperty(name); if (index != -1) { - if (GeneratePropertyFunctions) - qWarning("Booo, the property setter should be called..."); + if (GeneratePropertyFunctions) { + // ### the setter should be called + } QMetaProperty prop = meta->property(index); if (prop.isScriptable()) { if (!(opt & QScriptEngine::ExcludeSuperClassProperties) @@ -1302,16 +1306,18 @@ bool QObjectWrapperObject::deleteProperty(JSC::ExecState *exec, return false; } + const QMetaObject *meta = qobject->metaObject(); { QHash::iterator it = data->cachedMembers.find(name); if (it != data->cachedMembers.end()) { + if (GeneratePropertyFunctions && (meta->indexOfProperty(name) != -1)) + return false; data->cachedMembers.erase(it); return true; } } const QScriptEngine::QObjectWrapOptions &opt = data->options; - const QMetaObject *meta = qobject->metaObject(); int index = meta->indexOfProperty(name); if (index != -1) { QMetaProperty prop = meta->property(index); diff --git a/tests/auto/qscriptqobject/tst_qscriptqobject.cpp b/tests/auto/qscriptqobject/tst_qscriptqobject.cpp index b046caa..b62deea 100644 --- a/tests/auto/qscriptqobject/tst_qscriptqobject.cpp +++ b/tests/auto/qscriptqobject/tst_qscriptqobject.cpp @@ -597,9 +597,7 @@ void tst_QScriptExtQObject::getSetStaticProperty() QScriptValue mobj = m_engine->globalObject().property("myObject"); QVERIFY(!(mobj.propertyFlags("intProperty") & QScriptValue::ReadOnly)); QVERIFY(mobj.propertyFlags("intProperty") & QScriptValue::Undeletable); - QEXPECT_FAIL("", "Qt properties should have the Getter flag", Continue); QVERIFY(mobj.propertyFlags("intProperty") & QScriptValue::PropertyGetter); - QEXPECT_FAIL("", "Qt properties should have the Setter flag", Continue); QVERIFY(mobj.propertyFlags("intProperty") & QScriptValue::PropertySetter); QVERIFY(!(mobj.propertyFlags("intProperty") & QScriptValue::SkipInEnumeration)); QVERIFY(mobj.propertyFlags("intProperty") & QScriptValue::QObjectMember); -- cgit v0.12