Test metatype registration errors with non-metatypes.
[profile/ivi/qtdeclarative.git] / tests / auto / qml / qqmlecmascript / tst_qqmlecmascript.cpp
index 6fa6c3b..96c0ec1 100644 (file)
@@ -79,6 +79,7 @@ private slots:
     void boolPropertiesEvaluateAsBool();
     void methods();
     void signalAssignment();
+    void signalArguments();
     void bindingLoop();
     void basicExpressions();
     void basicExpressions_data();
@@ -152,11 +153,10 @@ private slots:
     void signalWithQJSValue();
     void singletonType_data();
     void singletonType();
+    void singletonTypeCaching_data();
+    void singletonTypeCaching();
     void singletonTypeImportOrder();
     void singletonTypeResolution();
-    void singletonTypeConflicts1();
-    void singletonTypeConflicts2();
-    void singletonTypeConflicts3();
     void importScripts_data();
     void importScripts();
     void scarceResources();
@@ -281,6 +281,8 @@ private slots:
     void overrideDataAssert();
     void fallbackBindings_data();
     void fallbackBindings();
+    void propertyOverride();
+    void concatenatedStringPropertyAccess();
 
 private:
     static void propertyVarWeakRefCallback(v8::Persistent<v8::Value> object, void* parameter);
@@ -512,21 +514,42 @@ void tst_qqmlecmascript::signalAssignment()
 
     {
         QQmlComponent component(&engine, testFileUrl("signalAssignment.3.qml"));
+        QVERIFY(component.isError());
+        QString expectedErrorString = component.url().toString() + QLatin1String(":4 Signal uses unnamed parameter followed by named parameter.\n");
+        QCOMPARE(component.errorString(), expectedErrorString);
+    }
+
+    {
+        QQmlComponent component(&engine, testFileUrl("signalAssignment.4.qml"));
+        QVERIFY(component.isError());
+        QString expectedErrorString = component.url().toString() + QLatin1String(":5 Signal parameter \"parseInt\" hides global variable.\n");
+        QCOMPARE(component.errorString(), expectedErrorString);
+    }
+}
+
+void tst_qqmlecmascript::signalArguments()
+{
+    {
+        QQmlComponent component(&engine, testFileUrl("signalArguments.1.qml"));
         MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
         QVERIFY(object != 0);
         QCOMPARE(object->string(), QString());
-        emit object->unnamedArgumentSignal(19, 10.25, "Hello world!");
-        QCOMPARE(object->string(), QString("pass 19 Hello world!"));
+        emit object->basicSignal();
+        QCOMPARE(object->string(), QString("pass"));
+        QCOMPARE(object->property("argumentCount").toInt(), 0);
+        QCOMPARE(object->property("calleeCorrect").toBool(), true);
         delete object;
     }
 
     {
-        QQmlComponent component(&engine, testFileUrl("signalAssignment.4.qml"));
+        QQmlComponent component(&engine, testFileUrl("signalArguments.2.qml"));
         MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
         QVERIFY(object != 0);
         QCOMPARE(object->string(), QString());
-        emit object->signalWithGlobalName(19);
-        QCOMPARE(object->string(), QString("pass 5"));
+        emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton);
+        QCOMPARE(object->string(), QString("pass 19 Hello world! 10.25 3 2"));
+        QCOMPARE(object->property("argumentCount").toInt(), 5);
+        QCOMPARE(object->property("calleeCorrect").toBool(), true);
         delete object;
     }
 }
@@ -2216,7 +2239,9 @@ static inline v8::Handle<v8::Value> evaluate(QV8Engine *engine, v8::Handle<v8::O
 
 void tst_qqmlecmascript::callQtInvokables()
 {
-    MyInvokableObject o;
+    // This object has JS ownership, as the call to method_NoArgs_QObject() in this test will return
+    // it, which will set the indestructible flag to false.
+    MyInvokableObject *o = new MyInvokableObject();
 
     QQmlEngine qmlengine;
     QQmlEnginePrivate *ep = QQmlEnginePrivate::get(&qmlengine);
@@ -2226,548 +2251,548 @@ void tst_qqmlecmascript::callQtInvokables()
     v8::HandleScope handle_scope;
     v8::Context::Scope scope(engine->context());
 
-    v8::Local<v8::Object> object = engine->newQObject(&o)->ToObject();
+    v8::Local<v8::Object> object = engine->newQObject(o)->ToObject();
 
     // Non-existent methods
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_ERROR("object.method_nonexistent()"));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), -1);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), -1);
+    QCOMPARE(o->actuals().count(), 0);
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_ERROR("object.method_nonexistent(10, 11)"));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), -1);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), -1);
+    QCOMPARE(o->actuals().count(), 0);
 
     // Insufficient arguments
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_ERROR("object.method_int()"));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), -1);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), -1);
+    QCOMPARE(o->actuals().count(), 0);
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_ERROR("object.method_intint(10)"));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), -1);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), -1);
+    QCOMPARE(o->actuals().count(), 0);
 
     // Excessive arguments
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_int(10, 11)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 8);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(10));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 8);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(10));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_intint(10, 11, 12)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 9);
-    QCOMPARE(o.actuals().count(), 2);
-    QCOMPARE(o.actuals().at(0), QVariant(10));
-    QCOMPARE(o.actuals().at(1), QVariant(11));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 9);
+    QCOMPARE(o->actuals().count(), 2);
+    QCOMPARE(o->actuals().at(0), QVariant(10));
+    QCOMPARE(o->actuals().at(1), QVariant(11));
 
     // Test return types
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_NoArgs()", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 0);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 0);
+    QCOMPARE(o->actuals().count(), 0);
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_NoArgs_int()", v8::Integer::New(6)));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 1);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 1);
+    QCOMPARE(o->actuals().count(), 0);
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_NoArgs_real()", v8::Number::New(19.75)));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 2);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 2);
+    QCOMPARE(o->actuals().count(), 0);
 
-    o.reset();
+    o->reset();
     {
     v8::Handle<v8::Value> ret = EVALUATE("object.method_NoArgs_QPointF()");
     QVERIFY(!ret.IsEmpty());
     QCOMPARE(engine->toVariant(ret, -1), QVariant(QPointF(123, 4.5)));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 3);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 3);
+    QCOMPARE(o->actuals().count(), 0);
     }
 
-    o.reset();
+    o->reset();
     {
     v8::Handle<v8::Value> ret = EVALUATE("object.method_NoArgs_QObject()");
-    QCOMPARE(engine->toQObject(ret), (QObject *)&o);
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 4);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(engine->toQObject(ret), (QObject *)o);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 4);
+    QCOMPARE(o->actuals().count(), 0);
     }
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_ERROR("object.method_NoArgs_unknown()"));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), -1);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), -1);
+    QCOMPARE(o->actuals().count(), 0);
 
-    o.reset();
+    o->reset();
     {
     v8::Handle<v8::Value> ret = EVALUATE("object.method_NoArgs_QScriptValue()");
     QVERIFY(ret->IsString());
     QCOMPARE(engine->toString(ret), QString("Hello world"));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 6);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 6);
+    QCOMPARE(o->actuals().count(), 0);
     }
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_NoArgs_QVariant()", engine->toString("QML rocks")));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 7);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 7);
+    QCOMPARE(o->actuals().count(), 0);
 
     // Test arg types
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_int(94)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 8);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(94));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 8);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(94));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_int(\"94\")", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 8);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(94));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 8);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(94));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_int(\"not a number\")", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 8);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(0));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 8);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(0));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_int(null)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 8);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(0));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 8);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(0));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_int(undefined)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 8);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(0));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 8);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(0));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_int(object)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 8);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(0));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 8);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(0));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_intint(122, 9)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 9);
-    QCOMPARE(o.actuals().count(), 2);
-    QCOMPARE(o.actuals().at(0), QVariant(122));
-    QCOMPARE(o.actuals().at(1), QVariant(9));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 9);
+    QCOMPARE(o->actuals().count(), 2);
+    QCOMPARE(o->actuals().at(0), QVariant(122));
+    QCOMPARE(o->actuals().at(1), QVariant(9));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_real(94.3)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 10);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(94.3));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 10);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(94.3));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_real(\"94.3\")", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 10);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(94.3));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 10);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(94.3));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_real(\"not a number\")", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 10);
-    QCOMPARE(o.actuals().count(), 1);
-    QVERIFY(qIsNaN(o.actuals().at(0).toDouble()));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 10);
+    QCOMPARE(o->actuals().count(), 1);
+    QVERIFY(qIsNaN(o->actuals().at(0).toDouble()));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_real(null)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 10);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(0));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 10);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(0));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_real(undefined)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 10);
-    QCOMPARE(o.actuals().count(), 1);
-    QVERIFY(qIsNaN(o.actuals().at(0).toDouble()));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 10);
+    QCOMPARE(o->actuals().count(), 1);
+    QVERIFY(qIsNaN(o->actuals().at(0).toDouble()));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_real(object)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 10);
-    QCOMPARE(o.actuals().count(), 1);
-    QVERIFY(qIsNaN(o.actuals().at(0).toDouble()));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 10);
+    QCOMPARE(o->actuals().count(), 1);
+    QVERIFY(qIsNaN(o->actuals().at(0).toDouble()));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QString(\"Hello world\")", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 11);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant("Hello world"));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 11);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant("Hello world"));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QString(19)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 11);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant("19"));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 11);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant("19"));
 
-    o.reset();
+    o->reset();
     {
-    QString expected = "MyInvokableObject(0x" + QString::number((quintptr)&o, 16) + ")";
+    QString expected = "MyInvokableObject(0x" + QString::number((quintptr)o, 16) + ")";
     QVERIFY(EVALUATE_VALUE("object.method_QString(object)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 11);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(expected));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 11);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(expected));
     }
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QString(null)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 11);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(QString()));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 11);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(QString()));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QString(undefined)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 11);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(QString()));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 11);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(QString()));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QPointF(0)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 12);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(QPointF()));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 12);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(QPointF()));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QPointF(null)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 12);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(QPointF()));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 12);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(QPointF()));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QPointF(undefined)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 12);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(QPointF()));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 12);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(QPointF()));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QPointF(object)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 12);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(QPointF()));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 12);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(QPointF()));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QPointF(object.method_get_QPointF())", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 12);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(QPointF(99.3, -10.2)));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 12);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(QPointF(99.3, -10.2)));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QPointF(object.method_get_QPoint())", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 12);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(QPointF(9, 12)));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 12);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(QPointF(9, 12)));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QObject(0)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 13);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), qVariantFromValue((QObject *)0));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 13);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), qVariantFromValue((QObject *)0));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QObject(\"Hello world\")", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 13);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), qVariantFromValue((QObject *)0));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 13);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), qVariantFromValue((QObject *)0));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QObject(null)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 13);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), qVariantFromValue((QObject *)0));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 13);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), qVariantFromValue((QObject *)0));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QObject(undefined)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 13);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), qVariantFromValue((QObject *)0));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 13);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), qVariantFromValue((QObject *)0));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QObject(object)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 13);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), qVariantFromValue((QObject *)&o));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 13);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), qVariantFromValue((QObject *)o));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QScriptValue(null)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 14);
-    QCOMPARE(o.actuals().count(), 1);
-    QVERIFY(qvariant_cast<QJSValue>(o.actuals().at(0)).isNull());
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 14);
+    QCOMPARE(o->actuals().count(), 1);
+    QVERIFY(qvariant_cast<QJSValue>(o->actuals().at(0)).isNull());
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QScriptValue(undefined)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 14);
-    QCOMPARE(o.actuals().count(), 1);
-    QVERIFY(qvariant_cast<QJSValue>(o.actuals().at(0)).isUndefined());
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 14);
+    QCOMPARE(o->actuals().count(), 1);
+    QVERIFY(qvariant_cast<QJSValue>(o->actuals().at(0)).isUndefined());
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QScriptValue(19)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 14);
-    QCOMPARE(o.actuals().count(), 1);
-    QVERIFY(qvariant_cast<QJSValue>(o.actuals().at(0)).strictlyEquals(QJSValue(19)));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 14);
+    QCOMPARE(o->actuals().count(), 1);
+    QVERIFY(qvariant_cast<QJSValue>(o->actuals().at(0)).strictlyEquals(QJSValue(19)));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QScriptValue([19, 20])", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 14);
-    QCOMPARE(o.actuals().count(), 1);
-    QVERIFY(qvariant_cast<QJSValue>(o.actuals().at(0)).isArray());
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 14);
+    QCOMPARE(o->actuals().count(), 1);
+    QVERIFY(qvariant_cast<QJSValue>(o->actuals().at(0)).isArray());
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_intQScriptValue(4, null)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 15);
-    QCOMPARE(o.actuals().count(), 2);
-    QCOMPARE(o.actuals().at(0), QVariant(4));
-    QVERIFY(qvariant_cast<QJSValue>(o.actuals().at(1)).isNull());
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 15);
+    QCOMPARE(o->actuals().count(), 2);
+    QCOMPARE(o->actuals().at(0), QVariant(4));
+    QVERIFY(qvariant_cast<QJSValue>(o->actuals().at(1)).isNull());
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_intQScriptValue(8, undefined)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 15);
-    QCOMPARE(o.actuals().count(), 2);
-    QCOMPARE(o.actuals().at(0), QVariant(8));
-    QVERIFY(qvariant_cast<QJSValue>(o.actuals().at(1)).isUndefined());
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 15);
+    QCOMPARE(o->actuals().count(), 2);
+    QCOMPARE(o->actuals().at(0), QVariant(8));
+    QVERIFY(qvariant_cast<QJSValue>(o->actuals().at(1)).isUndefined());
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_intQScriptValue(3, 19)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 15);
-    QCOMPARE(o.actuals().count(), 2);
-    QCOMPARE(o.actuals().at(0), QVariant(3));
-    QVERIFY(qvariant_cast<QJSValue>(o.actuals().at(1)).strictlyEquals(QJSValue(19)));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 15);
+    QCOMPARE(o->actuals().count(), 2);
+    QCOMPARE(o->actuals().at(0), QVariant(3));
+    QVERIFY(qvariant_cast<QJSValue>(o->actuals().at(1)).strictlyEquals(QJSValue(19)));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_intQScriptValue(44, [19, 20])", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 15);
-    QCOMPARE(o.actuals().count(), 2);
-    QCOMPARE(o.actuals().at(0), QVariant(44));
-    QVERIFY(qvariant_cast<QJSValue>(o.actuals().at(1)).isArray());
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 15);
+    QCOMPARE(o->actuals().count(), 2);
+    QCOMPARE(o->actuals().at(0), QVariant(44));
+    QVERIFY(qvariant_cast<QJSValue>(o->actuals().at(1)).isArray());
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_ERROR("object.method_overload()"));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), -1);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), -1);
+    QCOMPARE(o->actuals().count(), 0);
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_overload(10)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 16);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(10));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 16);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(10));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_overload(10, 11)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 17);
-    QCOMPARE(o.actuals().count(), 2);
-    QCOMPARE(o.actuals().at(0), QVariant(10));
-    QCOMPARE(o.actuals().at(1), QVariant(11));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 17);
+    QCOMPARE(o->actuals().count(), 2);
+    QCOMPARE(o->actuals().at(0), QVariant(10));
+    QCOMPARE(o->actuals().at(1), QVariant(11));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_overload(\"Hello\")", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 18);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(QString("Hello")));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 18);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(QString("Hello")));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_with_enum(9)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 19);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(9));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 19);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(9));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_default(10)", v8::Integer::New(19)));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 20);
-    QCOMPARE(o.actuals().count(), 2);
-    QCOMPARE(o.actuals().at(0), QVariant(10));
-    QCOMPARE(o.actuals().at(1), QVariant(19));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 20);
+    QCOMPARE(o->actuals().count(), 2);
+    QCOMPARE(o->actuals().at(0), QVariant(10));
+    QCOMPARE(o->actuals().at(1), QVariant(19));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_default(10, 13)", v8::Integer::New(13)));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 20);
-    QCOMPARE(o.actuals().count(), 2);
-    QCOMPARE(o.actuals().at(0), QVariant(10));
-    QCOMPARE(o.actuals().at(1), QVariant(13));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 20);
+    QCOMPARE(o->actuals().count(), 2);
+    QCOMPARE(o->actuals().at(0), QVariant(10));
+    QCOMPARE(o->actuals().at(1), QVariant(13));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_inherited(9)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), -3);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(9));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), -3);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(9));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QVariant(9)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 21);
-    QCOMPARE(o.actuals().count(), 2);
-    QCOMPARE(o.actuals().at(0), QVariant(9));
-    QCOMPARE(o.actuals().at(1), QVariant());
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 21);
+    QCOMPARE(o->actuals().count(), 2);
+    QCOMPARE(o->actuals().at(0), QVariant(9));
+    QCOMPARE(o->actuals().at(1), QVariant());
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QVariant(\"Hello\", \"World\")", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 21);
-    QCOMPARE(o.actuals().count(), 2);
-    QCOMPARE(o.actuals().at(0), QVariant(QString("Hello")));
-    QCOMPARE(o.actuals().at(1), QVariant(QString("World")));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 21);
+    QCOMPARE(o->actuals().count(), 2);
+    QCOMPARE(o->actuals().at(0), QVariant(QString("Hello")));
+    QCOMPARE(o->actuals().at(1), QVariant(QString("World")));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QJsonObject({foo:123})", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 22);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonObject>(o.actuals().at(0)), QJsonDocument::fromJson("{\"foo\":123}").object());
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 22);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonObject>(o->actuals().at(0)), QJsonDocument::fromJson("{\"foo\":123}").object());
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QJsonArray([123])", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 23);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonArray>(o.actuals().at(0)), QJsonDocument::fromJson("[123]").array());
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 23);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonArray>(o->actuals().at(0)), QJsonDocument::fromJson("[123]").array());
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(123)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 24);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonValue>(o.actuals().at(0)), QJsonValue(123));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 24);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(123));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(42.35)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 24);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonValue>(o.actuals().at(0)), QJsonValue(42.35));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 24);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(42.35));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QJsonValue('ciao')", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 24);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonValue>(o.actuals().at(0)), QJsonValue(QStringLiteral("ciao")));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 24);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(QStringLiteral("ciao")));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(true)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 24);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonValue>(o.actuals().at(0)), QJsonValue(true));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 24);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(true));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(false)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 24);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonValue>(o.actuals().at(0)), QJsonValue(false));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 24);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(false));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(null)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 24);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonValue>(o.actuals().at(0)), QJsonValue(QJsonValue::Null));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 24);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(QJsonValue::Null));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(undefined)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 24);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonValue>(o.actuals().at(0)), QJsonValue(QJsonValue::Undefined));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 24);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(QJsonValue::Undefined));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_overload({foo:123})", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 25);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonObject>(o.actuals().at(0)), QJsonDocument::fromJson("{\"foo\":123}").object());
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 25);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonObject>(o->actuals().at(0)), QJsonDocument::fromJson("{\"foo\":123}").object());
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_overload([123])", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 26);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonArray>(o.actuals().at(0)), QJsonDocument::fromJson("[123]").array());
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 26);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonArray>(o->actuals().at(0)), QJsonDocument::fromJson("[123]").array());
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_overload(null)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 27);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonValue>(o.actuals().at(0)), QJsonValue(QJsonValue::Null));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 27);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(QJsonValue::Null));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_overload(undefined)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 27);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonValue>(o.actuals().at(0)), QJsonValue(QJsonValue::Undefined));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 27);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(QJsonValue::Undefined));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_ERROR("object.method_unknown(null)"));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), -1);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), -1);
+    QCOMPARE(o->actuals().count(), 0);
 }
 
 // QTBUG-13047 (check that you can pass registered object types as args)
@@ -3431,6 +3456,11 @@ void tst_qqmlecmascript::signalWithUnknownTypes()
 
     QCOMPARE(result.value, type.value);
 
+    MyQmlObject::MyOtherType othertype;
+    othertype.value = 17;
+    emit object->signalWithCompletelyUnknownType(othertype);
+
+    QVERIFY(!object->variant().isValid());
 
     delete object;
 }
@@ -3571,8 +3601,9 @@ void tst_qqmlecmascript::singletonType_data()
             << QString()
             << QStringList()
             << (QStringList() << "existingUriTest" << "qobjectTest" << "qobjectMethodTest"
-                   << "qobjectMinorVersionTest" << "qobjectMajorVersionTest" << "qobjectParentedTest")
-            << (QVariantList() << 20 << 20 << 2 << 20 << 20 << 26)
+                   << "qobjectMinorVersionMethodTest" << "qobjectMinorVersionTest"
+                   << "qobjectMajorVersionTest" << "qobjectParentedTest")
+            << (QVariantList() << 20 << 20 << 2 << 1 << 20 << 20 << 26)
             << QStringList()
             << QVariantList()
             << QStringList()
@@ -3583,29 +3614,7 @@ void tst_qqmlecmascript::singletonType_data()
             << QString()
             << QStringList()
             << (QStringList() << "scriptTest")
-            << (QVariantList() << 13)
-            << QStringList()
-            << QVariantList()
-            << QStringList()
-            << QVariantList();
-
-    QTest::newRow("qobject, caching + read")
-            << testFileUrl("singletontype/qobjectSingletonTypeCaching.qml")
-            << QString()
-            << QStringList()
-            << (QStringList() << "existingUriTest" << "qobjectParentedTest")
-            << (QVariantList() << 20 << 26) // 26, shouldn't have incremented to 27.
-            << QStringList()
-            << QVariantList()
-            << QStringList()
-            << QVariantList();
-
-    QTest::newRow("script, caching + read")
-            << testFileUrl("singletontype/scriptSingletonTypeCaching.qml")
-            << QString()
-            << QStringList()
-            << (QStringList() << "scriptTest")
-            << (QVariantList() << 13) // 13, shouldn't have incremented to 14.
+            << (QVariantList() << 14) // will have incremented, since we create a new engine each row in this test.
             << QStringList()
             << QVariantList()
             << QStringList()
@@ -3627,7 +3636,7 @@ void tst_qqmlecmascript::singletonType_data()
             << QString()
             << (QStringList() << QString(testFileUrl("singletontype/scriptSingletonTypeWriting.qml").toString() + QLatin1String(":21: Error: Cannot assign to read-only property \"scriptTestProperty\"")))
             << (QStringList() << "readBack" << "unchanged")
-            << (QVariantList() << 13 << 42)
+            << (QVariantList() << 15 << 42)
             << (QStringList() << "firstProperty" << "secondProperty")
             << (QVariantList() << 30 << 30)
             << (QStringList() << "readBack" << "unchanged")
@@ -3665,6 +3674,17 @@ void tst_qqmlecmascript::singletonType_data()
             << QVariantList()
             << QStringList()
             << QVariantList();
+
+    QTest::newRow("qobject, multiple in namespace")
+            << testFileUrl("singletontype/singletonTypeMultiple.qml")
+            << QString()
+            << QStringList()
+            << (QStringList() << "first" << "second")
+            << (QVariantList() << 35 << 42)
+            << QStringList()
+            << QVariantList()
+            << QStringList()
+            << QVariantList();
 }
 
 void tst_qqmlecmascript::singletonType()
@@ -3679,7 +3699,8 @@ void tst_qqmlecmascript::singletonType()
     QFETCH(QStringList, readBackProperties);
     QFETCH(QVariantList, readBackExpectedValues);
 
-    QQmlComponent component(&engine, testfile);
+    QQmlEngine cleanEngine; // so tests don't interfere which each other, as singleton types are engine-singletons only.
+    QQmlComponent component(&cleanEngine, testfile);
 
     if (!errorMessage.isEmpty())
         QTest::ignoreMessage(QtWarningMsg, errorMessage.toLatin1().constData());
@@ -3703,6 +3724,45 @@ void tst_qqmlecmascript::singletonType()
     }
 }
 
+void tst_qqmlecmascript::singletonTypeCaching_data()
+{
+    QTest::addColumn<QUrl>("testfile");
+    QTest::addColumn<QStringList>("readProperties");
+
+    QTest::newRow("qobject, caching + read")
+            << testFileUrl("singletontype/qobjectSingletonTypeCaching.qml")
+            << (QStringList() << "existingUriTest" << "qobjectParentedTest");
+
+    QTest::newRow("script, caching + read")
+            << testFileUrl("singletontype/scriptSingletonTypeCaching.qml")
+            << (QStringList() << "scriptTest");
+}
+
+void tst_qqmlecmascript::singletonTypeCaching()
+{
+    QFETCH(QUrl, testfile);
+    QFETCH(QStringList, readProperties);
+
+    // ensure that the singleton type instances are cached per-engine.
+
+    QQmlEngine cleanEngine;
+    QQmlComponent component(&cleanEngine, testfile);
+    QObject *object = component.create();
+    QVERIFY(object != 0);
+    QList<QVariant> firstValues;
+    QMetaObject::invokeMethod(object, "modifyValues");
+    for (int i = 0; i < readProperties.size(); ++i)
+        firstValues << object->property(readProperties.at(i).toLatin1().constData());
+    delete object;
+
+    QQmlComponent component2(&cleanEngine, testfile);
+    QObject *object2 = component2.create();
+    QVERIFY(object2 != 0);
+    for (int i = 0; i < readProperties.size(); ++i)
+        QCOMPARE(object2->property(readProperties.at(i).toLatin1().constData()), firstValues.at(i)); // cached, shouldn't have changed.
+    delete object2;
+}
+
 void tst_qqmlecmascript::singletonTypeImportOrder()
 {
     QQmlComponent component(&engine, testFileUrl("singletontype/singletonTypeImportOrder.qml"));
@@ -3721,72 +3781,6 @@ void tst_qqmlecmascript::singletonTypeResolution()
     delete object;
 }
 
-void tst_qqmlecmascript::singletonTypeConflicts1()
-{
-    const char *warning = "Cannot register singleton type TypeName in uri Test.Conflict1 1.5 (a conflicting singleton type already exists)";
-    QTest::ignoreMessage(QtWarningMsg, warning);
-
-    int i0 = qmlRegisterSingletonType<testImportOrderApi>("Test.Conflict1", 1, 5, "TypeName", 0);
-    QVERIFY(i0 != -1);
-
-    int i1 = qmlRegisterSingletonType<testImportOrderApi>("Test.Conflict1", 2, 0, "TypeName", 0);
-    QVERIFY(i1 != -1);
-
-    int i2 = qmlRegisterSingletonType<testImportOrderApi>("Test.Conflict1", 1, 5, "TypeName", 0);
-    QVERIFY(i2 == -1);
-
-    int i3 = qmlRegisterSingletonType<testImportOrderApi>("Test.Conflict1", 1, 2, "TypeName", 0);
-    QVERIFY(i3 != -1);
-
-    int i4 = qmlRegisterSingletonType<testImportOrderApi>("Test.Conflict1", 1, 8, "TypeName", 0);
-    QVERIFY(i4 != -1);
-}
-
-void tst_qqmlecmascript::singletonTypeConflicts2()
-{
-    int i0 = qmlRegisterType<MyQmlObject>("Test.Conflict2", 1, 5, "TypeName");
-    QVERIFY(i0 != -1);
-
-    int i2 = qmlRegisterType<MyQmlObject>("Test.Conflict2", 1, 8, "TypeName");
-    QVERIFY(i2 != -1);
-
-    int i3 = qmlRegisterType<MyQmlObject>("Test.Conflict2", 2, 0, "TypeName");
-    QVERIFY(i3 != -1);
-
-    int i4 = qmlRegisterSingletonType<testImportOrderApi>("Test.Conflict2", 1, 0, "TypeName", 0);
-    QVERIFY(i4 != -1);
-
-    const char *warning2 = "Cannot register singleton type TypeName in uri Test.Conflict2 1.9 (a conflicting type already exists)";
-    QTest::ignoreMessage(QtWarningMsg, warning2);
-
-    int i5 = qmlRegisterSingletonType<testImportOrderApi>("Test.Conflict2", 1, 9, "TypeName", 0);
-    QVERIFY(i5 == -1);
-}
-
-void tst_qqmlecmascript::singletonTypeConflicts3()
-{
-    int i0 = qmlRegisterSingletonType<testImportOrderApi>("Test.Conflict3", 1, 0, "TypeName", 0);
-    QVERIFY(i0 != -1);
-
-    int i1 = qmlRegisterSingletonType<testImportOrderApi>("Test.Conflict3", 1, 5, "TypeName", 0);
-    QVERIFY(i1 != -1);
-
-    int i2 = qmlRegisterSingletonType<testImportOrderApi>("Test.Conflict3", 1, 8, "TypeName", 0);
-    QVERIFY(i2 != -1);
-
-    int i3 = qmlRegisterSingletonType<testImportOrderApi>("Test.Conflict3", 2, 0, "TypeName", 0);
-    QVERIFY(i3 != -1);
-
-    const char *warning = "Cannot register type TypeName in uri Test.Conflict3 1.0 (a conflicting singleton type already exists)";
-    QTest::ignoreMessage(QtWarningMsg, warning);
-
-    int i4 = qmlRegisterType<MyQmlObject>("Test.Conflict3", 1, 0, "TypeName");
-    QVERIFY(i4 == -1);
-
-    int i5 = qmlRegisterType<MyQmlObject>("Test.Conflict3", 1, 3, "TypeName");
-    QVERIFY(i5 != -1);
-}
-
 void tst_qqmlecmascript::importScripts_data()
 {
     QTest::addColumn<QUrl>("testfile");
@@ -3917,70 +3911,70 @@ void tst_qqmlecmascript::importScripts_data()
     QTest::newRow("malformed file name")
             << testFileUrl("jsimportfail/malformedFile.qml")
             << QString()
-            << (QStringList() << testFileUrl("jsimportfail/malformedFile.js").toString() + QLatin1String(":0:1: Imported file must be a script"))
+            << (QStringList() << testFileUrl("jsimportfail/malformedFile.js").toString() + QLatin1String(":1:9: Imported file must be a script"))
             << QStringList()
             << QVariantList();
 
     QTest::newRow("missing file qualifier")
             << testFileUrl("jsimportfail/missingFileQualifier.qml")
             << QString()
-            << (QStringList() << testFileUrl("jsimportfail/missingFileQualifier.js").toString() + QLatin1String(":0:1: File import requires a qualifier"))
+            << (QStringList() << testFileUrl("jsimportfail/missingFileQualifier.js").toString() + QLatin1String(":1:1: File import requires a qualifier"))
             << QStringList()
             << QVariantList();
 
     QTest::newRow("malformed file qualifier")
             << testFileUrl("jsimportfail/malformedFileQualifier.qml")
             << QString()
-            << (QStringList() << testFileUrl("jsimportfail/malformedFileQualifier.js").toString() + QLatin1String(":0:1: File import requires a qualifier"))
+            << (QStringList() << testFileUrl("jsimportfail/malformedFileQualifier.js").toString() + QLatin1String(":1:20: File import requires a qualifier"))
             << QStringList()
             << QVariantList();
 
     QTest::newRow("malformed module qualifier 2")
             << testFileUrl("jsimportfail/malformedFileQualifier.2.qml")
             << QString()
-            << (QStringList() << testFileUrl("jsimportfail/malformedFileQualifier.2.js").toString() + QLatin1String(":0:1: Invalid import qualifier"))
+            << (QStringList() << testFileUrl("jsimportfail/malformedFileQualifier.2.js").toString() + QLatin1String(":1:1: Invalid import qualifier"))
             << QStringList()
             << QVariantList();
 
     QTest::newRow("malformed module uri")
             << testFileUrl("jsimportfail/malformedModule.qml")
             << QString()
-            << (QStringList() << testFileUrl("jsimportfail/malformedModule.js").toString() + QLatin1String(":0:1: Invalid module URI"))
+            << (QStringList() << testFileUrl("jsimportfail/malformedModule.js").toString() + QLatin1String(":1:17: Invalid module URI"))
             << QStringList()
             << QVariantList();
 
     QTest::newRow("missing module version")
             << testFileUrl("jsimportfail/missingModuleVersion.qml")
             << QString()
-            << (QStringList() << testFileUrl("jsimportfail/missingModuleVersion.js").toString() + QLatin1String(":0:1: Module import requires a version"))
+            << (QStringList() << testFileUrl("jsimportfail/missingModuleVersion.js").toString() + QLatin1String(":1:17: Module import requires a version"))
             << QStringList()
             << QVariantList();
 
     QTest::newRow("malformed module version")
             << testFileUrl("jsimportfail/malformedModuleVersion.qml")
             << QString()
-            << (QStringList() << testFileUrl("jsimportfail/malformedModuleVersion.js").toString() + QLatin1String(":0:1: Module import requires a version"))
+            << (QStringList() << testFileUrl("jsimportfail/malformedModuleVersion.js").toString() + QLatin1String(":1:17: Module import requires a version"))
             << QStringList()
             << QVariantList();
 
     QTest::newRow("missing module qualifier")
             << testFileUrl("jsimportfail/missingModuleQualifier.qml")
             << QString()
-            << (QStringList() << testFileUrl("jsimportfail/missingModuleQualifier.js").toString() + QLatin1String(":0:1: Module import requires a qualifier"))
+            << (QStringList() << testFileUrl("jsimportfail/missingModuleQualifier.js").toString() + QLatin1String(":1:1: Module import requires a qualifier"))
             << QStringList()
             << QVariantList();
 
     QTest::newRow("malformed module qualifier")
             << testFileUrl("jsimportfail/malformedModuleQualifier.qml")
             << QString()
-            << (QStringList() << testFileUrl("jsimportfail/malformedModuleQualifier.js").toString() + QLatin1String(":0:1: Module import requires a qualifier"))
+            << (QStringList() << testFileUrl("jsimportfail/malformedModuleQualifier.js").toString() + QLatin1String(":1:21: Module import requires a qualifier"))
             << QStringList()
             << QVariantList();
 
     QTest::newRow("malformed module qualifier 2")
             << testFileUrl("jsimportfail/malformedModuleQualifier.2.qml")
             << QString()
-            << (QStringList() << testFileUrl("jsimportfail/malformedModuleQualifier.2.js").toString() + QLatin1String(":0:1: Invalid import qualifier"))
+            << (QStringList() << testFileUrl("jsimportfail/malformedModuleQualifier.2.js").toString() + QLatin1String(":1:1: Invalid import qualifier"))
             << QStringList()
             << QVariantList();
 }
@@ -5388,19 +5382,19 @@ void tst_qqmlecmascript::sequenceConversionRead()
         MySequenceConversionObject *seq = object->findChild<MySequenceConversionObject*>("msco");
         QVERIFY(seq != 0);
 
-        // we haven't registered QList<QPoint> as a sequence type.
-        QString warningOne = QLatin1String("QMetaProperty::read: Unable to handle unregistered datatype 'QList<QPoint>' for property 'MySequenceConversionObject::pointListProperty'");
+        // we haven't registered QList<NonRegisteredType> as a sequence type.
+        QString warningOne = QLatin1String("QMetaProperty::read: Unable to handle unregistered datatype 'QList<NonRegisteredType>' for property 'MySequenceConversionObject::typeListProperty'");
         QString warningTwo = qmlFile.toString() + QLatin1String(":18: TypeError: Cannot read property 'length' of undefined");
         QTest::ignoreMessage(QtWarningMsg, warningOne.toLatin1().constData());
         QTest::ignoreMessage(QtWarningMsg, warningTwo.toLatin1().constData());
 
         QMetaObject::invokeMethod(object, "performTest");
 
-        // QList<QPoint> has not been registered as a sequence type.
+        // QList<NonRegisteredType> has not been registered as a sequence type.
         QCOMPARE(object->property("pointListLength").toInt(), 0);
         QVERIFY(!object->property("pointList").isValid());
-        QTest::ignoreMessage(QtWarningMsg, "QMetaProperty::read: Unable to handle unregistered datatype 'QList<QPoint>' for property 'MySequenceConversionObject::pointListProperty'");
-        QQmlProperty seqProp(seq, "pointListProperty", &engine);
+        QTest::ignoreMessage(QtWarningMsg, "QMetaProperty::read: Unable to handle unregistered datatype 'QList<NonRegisteredType>' for property 'MySequenceConversionObject::typeListProperty'");
+        QQmlProperty seqProp(seq, "typeListProperty", &engine);
         QVERIFY(!seqProp.read().isValid()); // not a valid/known sequence type
 
         delete object;
@@ -5569,6 +5563,10 @@ void tst_qqmlecmascript::sequenceConversionCopy()
     QCOMPARE(object->property("success").toBool(), true);
     QMetaObject::invokeMethod(object, "testEqualitySemantics");
     QCOMPARE(object->property("success").toBool(), true);
+    QMetaObject::invokeMethod(object, "testCopyParameters");
+    QCOMPARE(object->property("success").toBool(), true);
+    QMetaObject::invokeMethod(object, "testReferenceParameters");
+    QCOMPARE(object->property("success").toBool(), true);
     delete object;
 }
 
@@ -7221,6 +7219,8 @@ void tst_qqmlecmascript::fallbackBindings_data()
     QTest::newRow("SingletonType fallback") << "fallbackBindings.4.qml";
     QTest::newRow("Attached without fallback") << "fallbackBindings.5.qml";
     QTest::newRow("Attached fallback") << "fallbackBindings.6.qml";
+    QTest::newRow("Subproperty without fallback") << "fallbackBindings.7.qml";
+    QTest::newRow("Subproperty fallback") << "fallbackBindings.8.qml";
 }
 
 void tst_qqmlecmascript::fallbackBindings()
@@ -7234,6 +7234,15 @@ void tst_qqmlecmascript::fallbackBindings()
     QCOMPARE(object->property("success").toBool(), true);
 }
 
+void tst_qqmlecmascript::propertyOverride()
+{
+    QQmlComponent component(&engine, testFileUrl("propertyOverride.qml"));
+    QScopedPointer<QObject> object(component.create());
+    QVERIFY(object != 0);
+
+    QCOMPARE(object->property("success").toBool(), true);
+}
+
 void tst_qqmlecmascript::sequenceSort_data()
 {
     QTest::addColumn<QString>("function");
@@ -7276,6 +7285,15 @@ void tst_qqmlecmascript::sequenceSort()
     delete object;
 }
 
+void tst_qqmlecmascript::concatenatedStringPropertyAccess()
+{
+    QQmlComponent component(&engine, testFileUrl("concatenatedStringPropertyAccess.qml"));
+    QObject *object = component.create();
+    QVERIFY(object);
+    QVERIFY(object->property("success").toBool());
+    delete object;
+}
+
 QTEST_MAIN(tst_qqmlecmascript)
 
 #include "tst_qqmlecmascript.moc"