Remove QJSValue::instanceOf() function
authorKent Hansen <kent.hansen@nokia.com>
Tue, 17 Jan 2012 08:12:10 +0000 (09:12 +0100)
committerQt by Nokia <qt-info@nokia.com>
Wed, 1 Feb 2012 07:37:49 +0000 (08:37 +0100)
Rationale: This is a remnant from QtScript. There is no good reason
for providing this type of low-level "prototype inheritance chain"
checks in this high-level QJSValue class. If you want to check if an
object is of the "right type", you can check if it has the
properties you require using property().

Task-number: QTBUG-23604
Change-Id: I3a274212cc57c38228fab73423af481e1b95d8a5
Reviewed-by: Simon Hausmann <simon.hausmann@nokia.com>
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@nokia.com>
src/declarative/qml/v8/qjsvalue.cpp
src/declarative/qml/v8/qjsvalue.h
src/declarative/qml/v8/qjsvalue_impl_p.h
src/declarative/qml/v8/qjsvalue_p.h
tests/auto/declarative/qjsengine/tst_qjsengine.cpp
tests/auto/declarative/qjsvalue/tst_qjsvalue.cpp
tests/auto/declarative/qjsvalue/tst_qjsvalue.h

index b1e31b4..3a49e94 100644 (file)
@@ -891,28 +891,6 @@ bool QJSValue::strictlyEquals(const QJSValue& other) const
     return d_ptr->strictlyEquals(o);
 }
 
-#ifdef QT_DEPRECATED
-
-/*!
-    \obsolete
-
-    Returns true if this QJSValue is an instance of
-    \a other; otherwise returns false.
-
-    This QJSValue is considered to be an instance of \a other if
-    \a other is a function and the value of the \c{prototype}
-    property of \a other is in the prototype chain of this
-    QJSValue.
-*/
-bool QJSValue::instanceOf(const QJSValue &other) const
-{
-    Q_D(const QJSValue);
-    QScriptIsolate api(d->engine());
-    return d->instanceOf(QJSValuePrivate::get(other));
-}
-
-#endif // QT_DEPRECATED
-
 /*!
   Returns the value of this QJSValue's property with the given \a name.
   If no such property exists, an invalid QJSValue is returned.
index 98d04f9..f0be07e 100644 (file)
@@ -142,8 +142,6 @@ public:
     QT_DEPRECATED qint32 toInt32() const;
     QT_DEPRECATED quint32 toUInt32() const;
 
-    QT_DEPRECATED bool instanceOf(const QJSValue &other) const;
-
     QT_DEPRECATED QJSValue::PropertyFlags propertyFlags(const QString &name) const;
 
     QT_DEPRECATED QJSValue call(const QJSValue &thisObject = QJSValue(),
index 304ed34..386b203 100644 (file)
@@ -603,37 +603,6 @@ inline bool QJSValuePrivate::lessThan(QJSValuePrivate *other) const
     return nthis < nother;
 }
 
-inline bool QJSValuePrivate::instanceOf(QJSValuePrivate* other) const
-{
-    if (!isObject() || !other->isFunction())
-        return false;
-    if (engine() != other->engine()) {
-        qWarning("QJSValue::instanceof: cannot perform operation on a value created in a different engine");
-        return false;
-    }
-    v8::HandleScope handleScope;
-    return instanceOf(v8::Handle<v8::Object>::Cast(other->m_value));
-}
-
-inline bool QJSValuePrivate::instanceOf(v8::Handle<v8::Object> other) const
-{
-    Q_ASSERT(isObject());
-    Q_ASSERT(other->IsFunction());
-
-    v8::Handle<v8::Object> self = v8::Handle<v8::Object>::Cast(m_value);
-    v8::Handle<v8::Value> selfPrototype = self->GetPrototype();
-    v8::Handle<v8::Value> otherPrototype = other->Get(v8::String::New("prototype"));
-
-    while (!selfPrototype->IsNull()) {
-        if (selfPrototype->StrictEquals(otherPrototype))
-            return true;
-        // In general a prototype can be an object or null, but in the loop it can't be null, so
-        // we can cast it safely.
-        selfPrototype = v8::Handle<v8::Object>::Cast(selfPrototype)->GetPrototype();
-    }
-    return false;
-}
-
 inline QScriptPassPointer<QJSValuePrivate> QJSValuePrivate::prototype() const
 {
     if (isObject()) {
index ca349d2..fd32a14 100644 (file)
@@ -112,8 +112,6 @@ public:
     inline bool equals(QJSValuePrivate* other);
     inline bool strictlyEquals(QJSValuePrivate* other);
     inline bool lessThan(QJSValuePrivate *other) const;
-    inline bool instanceOf(QJSValuePrivate*) const;
-    inline bool instanceOf(v8::Handle<v8::Object> other) const;
 
     inline QScriptPassPointer<QJSValuePrivate> prototype() const;
     inline void setPrototype(QJSValuePrivate* prototype);
index b24aad8..2aed67a 100644 (file)
@@ -4090,7 +4090,6 @@ void tst_QJSEngine::jsNumberClass()
         QVERIFY(ctor.property("POSITIVE_INFINITY").isNumber());
         QCOMPARE(ctor.propertyFlags("POSITIVE_INFINITY"), flags);
     }
-    QVERIFY(proto.instanceOf(eng.globalObject().property("Object")));
     QCOMPARE(proto.toNumber(), qreal(0));
     QVERIFY(proto.property("constructor").strictlyEquals(ctor));
 
index c7396c9..88be29c 100644 (file)
@@ -1242,47 +1242,6 @@ void tst_QJSValue::toRegExp()
     QVERIFY(qjsvalue_cast<QRegExp>(eng.undefinedValue()).isEmpty());
 }
 
-void tst_QJSValue::instanceOf_twoEngines()
-{
-    QJSEngine eng;
-    QJSValue obj = eng.newObject();
-    QJSEngine otherEngine;
-    QTest::ignoreMessage(QtWarningMsg, "QJSValue::instanceof: cannot perform operation on a value created in a different engine");
-    QCOMPARE(obj.instanceOf(otherEngine.globalObject().property("Object")), false);
-}
-
-void tst_QJSValue::instanceOf()
-{
-    QJSEngine eng;
-    QJSValue obj = eng.newObject();
-    QCOMPARE(obj.instanceOf(eng.evaluate("Object.prototype")), false);
-    QCOMPARE(obj.instanceOf(eng.evaluate("Array.prototype")), false);
-    QCOMPARE(obj.instanceOf(eng.evaluate("Function.prototype")), false);
-    QCOMPARE(obj.instanceOf(eng.evaluate("QObject.prototype")), false);
-    QCOMPARE(obj.instanceOf(QJSValue(&eng, 123)), false);
-    QCOMPARE(obj.instanceOf(eng.undefinedValue()), false);
-    QCOMPARE(obj.instanceOf(eng.nullValue()), false);
-    QCOMPARE(obj.instanceOf(QJSValue()), false);
-
-    QCOMPARE(obj.instanceOf(eng.evaluate("Object")), true);
-    QCOMPARE(obj.instanceOf(eng.evaluate("Array")), false);
-    QCOMPARE(obj.instanceOf(eng.evaluate("Function")), false);
-    QCOMPARE(obj.instanceOf(eng.evaluate("QObject")), false);
-
-    QJSValue arr = eng.newArray();
-    QVERIFY(arr.isArray());
-    QCOMPARE(arr.instanceOf(eng.evaluate("Object.prototype")), false);
-    QCOMPARE(arr.instanceOf(eng.evaluate("Array.prototype")), false);
-    QCOMPARE(arr.instanceOf(eng.evaluate("Function.prototype")), false);
-    QCOMPARE(arr.instanceOf(eng.evaluate("QObject.prototype")), false);
-    QCOMPARE(arr.instanceOf(eng.evaluate("Object")), true);
-    QCOMPARE(arr.instanceOf(eng.evaluate("Array")), true);
-    QCOMPARE(arr.instanceOf(eng.evaluate("Function")), false);
-    QCOMPARE(arr.instanceOf(eng.evaluate("QObject")), false);
-
-    QCOMPARE(QJSValue().instanceOf(arr), false);
-}
-
 void tst_QJSValue::isArray_data()
 {
     newEngine();
@@ -2823,7 +2782,7 @@ void tst_QJSValue::construct_simple()
     QVERIFY(fun.isCallable());
     QJSValue ret = fun.callAsConstructor();
     QVERIFY(ret.isObject());
-    QVERIFY(ret.instanceOf(fun));
+    QVERIFY(ret.prototype().strictlyEquals(fun.property("prototype")));
     QCOMPARE(ret.property("foo").toInt(), 123);
 }
 
@@ -2835,7 +2794,7 @@ void tst_QJSValue::construct_newObjectJS()
     QVERIFY(fun.isCallable());
     QJSValue ret = fun.callAsConstructor();
     QVERIFY(ret.isObject());
-    QVERIFY(!ret.instanceOf(fun));
+    QVERIFY(!ret.prototype().strictlyEquals(fun.property("prototype")));
     QCOMPARE(ret.property("bar").toInt(), 456);
 }
 
index b008377..5fcd768 100644 (file)
@@ -91,8 +91,6 @@ private slots:
     void toQObject();
     void toDateTime();
     void toRegExp();
-    void instanceOf_twoEngines();
-    void instanceOf();
     void isArray_data();
     void isArray();
     void isDate();