Fix a few more QJSValue autotests
authorLars Knoll <lars.knoll@digia.com>
Fri, 7 Jun 2013 15:53:44 +0000 (17:53 +0200)
committerSimon Hausmann <simon.hausmann@digia.com>
Fri, 7 Jun 2013 17:20:00 +0000 (19:20 +0200)
Change-Id: Ie870da8f6b8f9e34221bbfd10f328df1dc363294
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/qml/qml/v8/qjsvalue.cpp
src/qml/qml/v8/qjsvalue_p.h
tests/auto/qml/qjsvalue/tst_qjsvalue.cpp

index e0a72ad..88a8ff4 100644 (file)
@@ -488,9 +488,14 @@ QJSValue QJSValue::call(const QJSValueList &args)
     ExecutionEngine *engine = d->engine();
     assert(engine);
 
-    QVarLengthArray<Value> arguments(args.length());
-    for (int i = 0; i < args.size(); ++i)
+    QVarLengthArray<Value, 9> arguments(args.length());
+    for (int i = 0; i < args.size(); ++i) {
+        if (!args.at(i).d->checkEngine(engine)) {
+            qWarning("QJSValue::call() failed: cannot call function with argument created in a different engine");
+            return QJSValue();
+        }
         arguments[i] = args.at(i).d->getValue(engine);
+    }
 
     Value result;
     QV4::ExecutionContext *ctx = engine->current;
@@ -533,9 +538,19 @@ QJSValue QJSValue::callWithInstance(const QJSValue &instance, const QJSValueList
     ExecutionEngine *engine = d->engine();
     assert(engine);
 
-    QVarLengthArray<Value> arguments(args.length());
-    for (int i = 0; i < args.size(); ++i)
+    if (!instance.d->checkEngine(engine)) {
+        qWarning("QJSValue::call() failed: cannot call function with thisObject created in a different engine");
+        return QJSValue();
+    }
+
+    QVarLengthArray<Value, 9> arguments(args.length());
+    for (int i = 0; i < args.size(); ++i) {
+        if (!args.at(i).d->checkEngine(engine)) {
+            qWarning("QJSValue::call() failed: cannot call function with argument created in a different engine");
+            return QJSValue();
+        }
         arguments[i] = args.at(i).d->getValue(engine);
+    }
 
     Value result;
     QV4::ExecutionContext *ctx = engine->current;
@@ -576,9 +591,14 @@ QJSValue QJSValue::callAsConstructor(const QJSValueList &args)
     ExecutionEngine *engine = d->engine();
     assert(engine);
 
-    QVarLengthArray<Value> arguments(args.length());
-    for (int i = 0; i < args.size(); ++i)
+    QVarLengthArray<Value, 9> arguments(args.length());
+    for (int i = 0; i < args.size(); ++i) {
+        if (!args.at(i).d->checkEngine(engine)) {
+            qWarning("QJSValue::callAsConstructor() failed: cannot construct function with argument created in a different engine");
+            return QJSValue();
+        }
         arguments[i] = args.at(i).d->getValue(engine);
+    }
 
     Value result;
     QV4::ExecutionContext *ctx = engine->current;
@@ -821,8 +841,7 @@ void QJSValue::setProperty(const QString& name, const QJSValue& value)
     if (!o)
         return;
 
-    ExecutionEngine *otherEngine = value.d->engine();
-    if (otherEngine && otherEngine != o->engine()) {
+    if (!value.d->checkEngine(o->engine())) {
         qWarning("QJSValue::setProperty(%s) failed: cannot set value created in a different engine", name.toUtf8().constData());
         return;
     }
index cf1148f..bb92010 100644 (file)
@@ -97,6 +97,14 @@ public:
         return value;
     }
 
+    bool checkEngine(QV4::ExecutionEngine *otherEngine) {
+        if (!e) {
+            assert(!value.isObject());
+            e = otherEngine;
+        }
+        return (e == otherEngine);
+    }
+
     QV4::ExecutionEngine *engine() const {
         if (!e)
             e = value.engine();
index 2ee344a..8d13541 100644 (file)
@@ -1783,7 +1783,6 @@ void tst_QJSValue::call_twoEngines()
     QJSEngine otherEngine;
     QJSValue fun = otherEngine.evaluate("(function() { return 1; })");
     QVERIFY(fun.isCallable());
-    QTest::ignoreMessage(QtWarningMsg, "JSValue can't be rassigned to an another engine.");
     QTest::ignoreMessage(QtWarningMsg, "QJSValue::call() failed: "
                          "cannot call function with thisObject created in "
                          "a different engine");