From 5bf417cf836636aab1dcadffaa73f26966880dff Mon Sep 17 00:00:00 2001 From: Jedrzej Nowacki Date: Thu, 9 Jul 2009 13:03:48 +0200 Subject: Fix autotest checking QScriptValue::objectId method. (QScriptValue::objectId() and QScriptEnigne::objectById) --- src/script/api/qscriptengine.cpp | 17 +++++++++++++---- src/script/api/qscriptengine_p.h | 11 ++++------- src/script/api/qscriptvalue.cpp | 9 ++------- src/script/api/qscriptvalue_p.h | 11 ++++++++++- tests/auto/qscriptvalue/tst_qscriptvalue.cpp | 2 -- 5 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp index 13e21d2..f2b0cac 100644 --- a/src/script/api/qscriptengine.cpp +++ b/src/script/api/qscriptengine.cpp @@ -826,7 +826,7 @@ ASSERT_CLASS_FITS_IN_CELL(QScript::GlobalObject); } // namespace JSC -QScriptEnginePrivate::QScriptEnginePrivate() +QScriptEnginePrivate::QScriptEnginePrivate() : idGenerator(1) { JSC::initializeThreading(); // ### hmmm @@ -1216,6 +1216,11 @@ bool QScriptEnginePrivate::scriptDisconnect(JSC::JSValue signal, JSC::JSValue re } #endif +void QScriptEnginePrivate::registerScriptValue(QScriptValuePrivate *value) +{ + value->id=idGenerator.fetchAndAddRelaxed(1); + attachedScriptValues.insert(value); +} void QScriptEnginePrivate::detachAllRegisteredScriptValues() { @@ -3328,9 +3333,13 @@ QScriptValue QScriptEngine::toObject(const QScriptValue &value) */ QScriptValue QScriptEngine::objectById(qint64 id) const { - Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); - // mapping from id to JSObject*? - Q_UNUSED(id); + Q_D(const QScriptEngine); + QSet::const_iterator i = d->attachedScriptValues.constBegin(); + while(i != d->attachedScriptValues.constEnd()) { + if ( (*i)->id == id ) + return (*i)->toPublic(); + i++; + } return QScriptValue(); } diff --git a/src/script/api/qscriptengine_p.h b/src/script/api/qscriptengine_p.h index 0c1840e..c601922 100644 --- a/src/script/api/qscriptengine_p.h +++ b/src/script/api/qscriptengine_p.h @@ -140,16 +140,11 @@ public: bool scriptDisconnect(JSC::JSValue signal, JSC::JSValue receiver, JSC::JSValue function); - void registerScriptValue(QScriptValuePrivate *value) - { - attachedScriptValues.insert(value); - } - + void registerScriptValue(QScriptValuePrivate *value); void unregisterScriptValue(QScriptValuePrivate *value) { attachedScriptValues.remove(value); } - void detachAllRegisteredScriptValues(); // private slots @@ -181,7 +176,9 @@ public: QSet importedExtensions; QSet extensionsBeingImported; - QSet attachedScriptValues; + QSet attachedScriptValues; //keep trace to all QScriptValue evalueted + + QAtomicInt idGenerator; //generate id for QScriptValue #ifndef QT_NO_QOBJECT QHash m_qobjectData; diff --git a/src/script/api/qscriptvalue.cpp b/src/script/api/qscriptvalue.cpp index dbab779..13cef76 100644 --- a/src/script/api/qscriptvalue.cpp +++ b/src/script/api/qscriptvalue.cpp @@ -243,7 +243,7 @@ qsreal ToInteger(qsreal n) } // namespace QScript -QScriptValuePrivate::QScriptValuePrivate() : engine(this), valid(true) +QScriptValuePrivate::QScriptValuePrivate() : engine(this), valid(true), id(-1) { ref = 0; } @@ -2480,13 +2480,8 @@ void QScriptValue::setScriptClass(QScriptClass *scriptClass) */ qint64 QScriptValue::objectId() const { - if (!isObject()) - return -1; - Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); - // lazily initialized mapping from JSObject* to id? - return -1; + return d_ptr?d_ptr->id:-1; } - QT_END_NAMESPACE #endif // QT_NO_SCRIPT diff --git a/src/script/api/qscriptvalue_p.h b/src/script/api/qscriptvalue_p.h index f0c13a4..bbd54fa 100644 --- a/src/script/api/qscriptvalue_p.h +++ b/src/script/api/qscriptvalue_p.h @@ -107,6 +107,12 @@ public: QScriptValue property(const QString &name, int resolveMode) const; QScriptValue property(quint32 index, int resolveMode) const; + QScriptValue toPublic() { + QScriptValue tmp; + tmp.d_ptr = this; + return tmp; + }; + bool isValid() const {return valid;} void detachEngine() { @@ -123,9 +129,12 @@ public: QString *stringValue; QBasicAtomicInt ref; - bool valid; + bool valid; //object is valid ? + + qint64 id; //object unique id number }; + QT_END_NAMESPACE #endif // QT_NO_SCRIPT diff --git a/tests/auto/qscriptvalue/tst_qscriptvalue.cpp b/tests/auto/qscriptvalue/tst_qscriptvalue.cpp index ca0c98c..6560cfe 100644 --- a/tests/auto/qscriptvalue/tst_qscriptvalue.cpp +++ b/tests/auto/qscriptvalue/tst_qscriptvalue.cpp @@ -3279,8 +3279,6 @@ void tst_QScriptValue::valueOfWithClosure() void tst_QScriptValue::objectId() { - QFAIL("Not implemented"); - QCOMPARE(QScriptValue().objectId(), (qint64)-1); QCOMPARE(QScriptValue(QScriptValue::UndefinedValue).objectId(), (qint64)-1); QCOMPARE(QScriptValue(QScriptValue::NullValue).objectId(), (qint64)-1); -- cgit v0.12