Skip to content

Commit

Permalink
Remove QJSValue::instanceOf() function
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Kent Hansen authored and Qt by Nokia committed Feb 1, 2012
1 parent 3a017cc commit be46366
Show file tree
Hide file tree
Showing 7 changed files with 2 additions and 103 deletions.
22 changes: 0 additions & 22 deletions src/declarative/qml/v8/qjsvalue.cpp
Expand Up @@ -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.
Expand Down
2 changes: 0 additions & 2 deletions src/declarative/qml/v8/qjsvalue.h
Expand Up @@ -142,8 +142,6 @@ class Q_DECLARATIVE_EXPORT QJSValue
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(),
Expand Down
31 changes: 0 additions & 31 deletions src/declarative/qml/v8/qjsvalue_impl_p.h
Expand Up @@ -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()) {
Expand Down
2 changes: 0 additions & 2 deletions src/declarative/qml/v8/qjsvalue_p.h
Expand Up @@ -112,8 +112,6 @@ class QJSValuePrivate
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);
Expand Down
1 change: 0 additions & 1 deletion tests/auto/declarative/qjsengine/tst_qjsengine.cpp
Expand Up @@ -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));

Expand Down
45 changes: 2 additions & 43 deletions tests/auto/declarative/qjsvalue/tst_qjsvalue.cpp
Expand Up @@ -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();
Expand Down Expand Up @@ -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);
}

Expand All @@ -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);
}

Expand Down
2 changes: 0 additions & 2 deletions tests/auto/declarative/qjsvalue/tst_qjsvalue.h
Expand Up @@ -91,8 +91,6 @@ private slots:
void toQObject();
void toDateTime();
void toRegExp();
void instanceOf_twoEngines();
void instanceOf();
void isArray_data();
void isArray();
void isDate();
Expand Down

0 comments on commit be46366

Please sign in to comment.