From 44e3b8862cb0927637d841d276850fbac1681745 Mon Sep 17 00:00:00 2001
From: Kent Hansen <kent.hansen@nokia.com>
Date: Wed, 27 Jan 2010 11:35:32 +0100
Subject: Don't crash when comparing JSCore value without engine to non-JSCore
 value

Task-number: None, discovering while doing test refactoring
Reviewed-by: Jedrzej Nowacki
---
 src/script/api/qscriptvalue.cpp              | 13 +++++++++----
 tests/auto/qscriptvalue/tst_qscriptvalue.cpp | 14 ++++++++++++++
 2 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/src/script/api/qscriptvalue.cpp b/src/script/api/qscriptvalue.cpp
index 1db2e1b..5bfe46a 100644
--- a/src/script/api/qscriptvalue.cpp
+++ b/src/script/api/qscriptvalue.cpp
@@ -1148,10 +1148,15 @@ bool QScriptValue::strictlyEquals(const QScriptValue &other) const
     }
 
     if (d->type != other.d_ptr->type) {
-        if (d->type == QScriptValuePrivate::JavaScriptCore)
-            return JSC::JSValue::strictEqual(d->jscValue, d->engine->scriptValueToJSCValue(other));
-        else if (other.d_ptr->type == QScriptValuePrivate::JavaScriptCore)
-            return JSC::JSValue::strictEqual(other.d_ptr->engine->scriptValueToJSCValue(*this), other.d_ptr->jscValue);
+        if (d->type == QScriptValuePrivate::JavaScriptCore) {
+            QScriptEnginePrivate *eng_p = d->engine ? d->engine : other.d_ptr->engine;
+            if (eng_p)
+                return JSC::JSValue::strictEqual(d->jscValue, eng_p->scriptValueToJSCValue(other));
+        } else if (other.d_ptr->type == QScriptValuePrivate::JavaScriptCore) {
+            QScriptEnginePrivate *eng_p = other.d_ptr->engine ? other.d_ptr->engine : d->engine;
+            if (eng_p)
+                return JSC::JSValue::strictEqual(eng_p->scriptValueToJSCValue(*this), other.d_ptr->jscValue);
+        }
 
         return false;
     }
diff --git a/tests/auto/qscriptvalue/tst_qscriptvalue.cpp b/tests/auto/qscriptvalue/tst_qscriptvalue.cpp
index b384a55..2aeabf0 100644
--- a/tests/auto/qscriptvalue/tst_qscriptvalue.cpp
+++ b/tests/auto/qscriptvalue/tst_qscriptvalue.cpp
@@ -3091,6 +3091,20 @@ void tst_QScriptValue::strictlyEquals()
     QVERIFY(!falskt.strictlyEquals(null));
     QVERIFY(!falskt.strictlyEquals(QScriptValue()));
 
+    QVERIFY(!QScriptValue(false).strictlyEquals(123));
+    QVERIFY(!QScriptValue(QScriptValue::UndefinedValue).strictlyEquals(123));
+    QVERIFY(!QScriptValue(QScriptValue::NullValue).strictlyEquals(123));
+    QVERIFY(!QScriptValue(false).strictlyEquals("ciao"));
+    QVERIFY(!QScriptValue(QScriptValue::UndefinedValue).strictlyEquals("ciao"));
+    QVERIFY(!QScriptValue(QScriptValue::NullValue).strictlyEquals("ciao"));
+    QVERIFY(QScriptValue(&eng, "ciao").strictlyEquals("ciao"));
+    QVERIFY(QScriptValue("ciao").strictlyEquals(QScriptValue(&eng, "ciao")));
+    QVERIFY(!QScriptValue("ciao").strictlyEquals(123));
+    QVERIFY(!QScriptValue("ciao").strictlyEquals(QScriptValue(&eng, 123)));
+    QVERIFY(!QScriptValue(123).strictlyEquals("ciao"));
+    QVERIFY(!QScriptValue(123).strictlyEquals(QScriptValue(&eng, "ciao")));
+    QVERIFY(!QScriptValue(&eng, 123).strictlyEquals("ciao"));
+
     QScriptValue obj1 = eng.newObject();
     QScriptValue obj2 = eng.newObject();
     QCOMPARE(obj1.strictlyEquals(obj2), false);
-- 
cgit v0.12