From 3216fe93a400980ec9d1a4eeafa1c700db56ded2 Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Mon, 31 Aug 2009 11:08:23 +0200 Subject: fix crash due to double deletion Needed due to commit 3636e666528b72de79f8c7012690bb9e279f0863 --- src/script/api/qscriptvalue.cpp | 1 - tests/auto/qscriptvalue/tst_qscriptvalue.cpp | 22 ++++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/script/api/qscriptvalue.cpp b/src/script/api/qscriptvalue.cpp index d5aaed7..eb0460a 100644 --- a/src/script/api/qscriptvalue.cpp +++ b/src/script/api/qscriptvalue.cpp @@ -2431,7 +2431,6 @@ void QScriptValue::setScriptClass(QScriptClass *scriptClass) QScriptObject *scriptObject = static_cast(JSC::asObject(d->jscValue)); QScriptObjectDelegate *delegate = scriptObject->delegate(); if (!delegate || (delegate->type() != QScriptObjectDelegate::ClassObject)) { - delete delegate; delegate = new QScript::ClassObjectDelegate(scriptClass); scriptObject->setDelegate(delegate); } diff --git a/tests/auto/qscriptvalue/tst_qscriptvalue.cpp b/tests/auto/qscriptvalue/tst_qscriptvalue.cpp index 1c09693..beba26a 100644 --- a/tests/auto/qscriptvalue/tst_qscriptvalue.cpp +++ b/tests/auto/qscriptvalue/tst_qscriptvalue.cpp @@ -2243,9 +2243,31 @@ void tst_QScriptValue::getSetScriptClass() obj.setScriptClass(&testClass); QEXPECT_FAIL("", "With JSC back-end, the class of a plain object created in JS can't be changed", Continue); QCOMPARE(obj.scriptClass(), (QScriptClass*)&testClass); + QTest::ignoreMessage(QtWarningMsg, "QScriptValue::setScriptClass() failed: cannot change class of non-QScriptObject"); obj.setScriptClass(0); QCOMPARE(obj.scriptClass(), (QScriptClass*)0); } + // object that already has a(n internal) class + { + QScriptValue obj = eng.newVariant(QUrl("http://example.com")); + QVERIFY(obj.isVariant()); + QCOMPARE(obj.scriptClass(), (QScriptClass*)0); + obj.setScriptClass(&testClass); + QCOMPARE(obj.scriptClass(), &testClass); + QVERIFY(obj.isObject()); + QVERIFY(!obj.isVariant()); + QVERIFY(!obj.toVariant().isValid()); + } + { + QScriptValue obj = eng.newQObject(this); + QVERIFY(obj.isQObject()); + QCOMPARE(obj.scriptClass(), (QScriptClass*)0); + obj.setScriptClass(&testClass); + QCOMPARE(obj.scriptClass(), &testClass); + QVERIFY(obj.isObject()); + QVERIFY(!obj.isQObject()); + QVERIFY(obj.toQObject() == 0); + } } static QScriptValue getArg(QScriptContext *ctx, QScriptEngine *) -- cgit v0.12