summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJedrzej Nowacki <jedrzej.nowacki@nokia.com>2009-07-09 11:03:48 (GMT)
committerJedrzej Nowacki <jedrzej.nowacki@nokia.com>2009-07-09 11:33:23 (GMT)
commit5bf417cf836636aab1dcadffaa73f26966880dff (patch)
tree7a98577d2399a06631666a5b2249d5d574bf76bc
parentdadfb997897141ccd47808b2e9b38807f0042c53 (diff)
downloadQt-5bf417cf836636aab1dcadffaa73f26966880dff.zip
Qt-5bf417cf836636aab1dcadffaa73f26966880dff.tar.gz
Qt-5bf417cf836636aab1dcadffaa73f26966880dff.tar.bz2
Fix autotest checking QScriptValue::objectId method.
(QScriptValue::objectId() and QScriptEnigne::objectById)
-rw-r--r--src/script/api/qscriptengine.cpp17
-rw-r--r--src/script/api/qscriptengine_p.h11
-rw-r--r--src/script/api/qscriptvalue.cpp9
-rw-r--r--src/script/api/qscriptvalue_p.h11
-rw-r--r--tests/auto/qscriptvalue/tst_qscriptvalue.cpp2
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<QScriptValuePrivate*>::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<QString> importedExtensions;
QSet<QString> extensionsBeingImported;
- QSet<QScriptValuePrivate*> attachedScriptValues;
+ QSet<QScriptValuePrivate*> attachedScriptValues; //keep trace to all QScriptValue evalueted
+
+ QAtomicInt idGenerator; //generate id for QScriptValue
#ifndef QT_NO_QOBJECT
QHash<QObject*, QScript::QObjectData*> 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);