Details
-
Bug
-
Resolution: Done
-
P3: Somewhat important
-
4.7.1
-
None
Description
The attached projects consists of two C++ classes that are exported to QML.
One of the classes contains an enum, that is exported.
Using that enum in a method of class A works, but fails in class B, with a valgrind error.
Also, running the test under valgrind makes it suddenly work.
Output when running normally:
Calling Foo::foo with TypeA...
Foo::foo() called with TypeA
Foo::foo() called with TypeB
Bar::bar() called with unknown type 1970654936 . This is a bug.
Bar::bar() called with unknown type 1970655320 . This is a bug.
Output when running under valgrind:
valgrind --track-origins=yes ./enum
==21920== Memcheck, a memory error detector
==21920== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==21920== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info
==21920== Command: ./enum
==21920==
Calling Foo::foo with TypeA...
Foo::foo() called with TypeA
Foo::foo() called with TypeB
==21920== Conditional jump or move depends on uninitialised value(s)
==21920== at 0x403A1D: Bar::bar(Foo::Type) (bar.cpp:7)
==21920== by 0x403D84: Bar::qt_metacall(QMetaObject::Call, int, void**) (moc_bar.cpp:72)
==21920== by 0x7D7766E: QMetaObject::metacall(QObject*, QMetaObject::Call, int, void**) (qmetaobject.cpp:237)
==21920== by 0x50BA7EA: QDeclarativeObjectMethodScriptClass::call(QScriptDeclarativeClass::Object*, QScriptContext*) (qdeclarativeobjectscriptclass.cpp:864)
==21920== by 0x56C4148: QScript::DeclarativeObjectDelegate::call(QTJSC::ExecState*, QTJSC::JSObject*, QTJSC::JSValue, QTJSC::ArgList const&) (qscriptdeclarativeobject.cpp:154)
==21920== by 0x55C71BF: QTJSC::NativeFuncWrapper::operator()(QTJSC::ExecState*, QTJSC::JSObject*, QTJSC::JSValue, QTJSC::ArgList const&) const (CallData.cpp:46)
==21920== by 0x559B841: cti_op_call_NotJSFunction (JITStubs.cpp:1771)
==21920== by 0xCC06C2A: ???
==21920== by 0x5547B97: QTJSC::JITCode::execute(QTJSC::RegisterFile*, QTJSC::ExecState*, QTJSC::JSGlobalData*, QTJSC::JSValue*) (JITCode.h:79)
==21920== by 0x5533E6C: QTJSC::Interpreter::execute(QTJSC::FunctionExecutable*, QTJSC::ExecState*, QTJSC::JSFunction*, QTJSC::JSObject*, QTJSC::ArgList const&, QTJSC::ScopeChainNode*, QTJSC::JSValue*) (Interpreter.cpp:716)
==21920== by 0x55EFC7F: QTJSC::JSFunction::call(QTJSC::ExecState*, QTJSC::JSValue, QTJSC::ArgList const&) (JSFunction.cpp:122)
==21920== by 0x55C7274: QTJSC::call(QTJSC::ExecState*, QTJSC::JSValue, QTJSC::CallType, QTJSC::CallData const&, QTJSC::JSValue, QTJSC::ArgList const&) (CallData.cpp:62)
==21920== by 0x56A86F4: QScriptValue::call(QScriptValue const&, QList<QScriptValue> const&) (qscriptvalue.cpp:1605)
==21920== by 0x5006340: QDeclarativeQtScriptExpression::eval(QObject*, bool*) (qdeclarativeexpression.cpp:479)
==21920== by 0x5006072: QDeclarativeQtScriptExpression::scriptValue(QObject*, bool*) (qdeclarativeexpression.cpp:434)
==21920== by 0x5006E2C: QDeclarativeExpressionPrivate::scriptValue(QObject*, bool*) (qdeclarativeexpression.cpp:614)
==21920== by 0x5006F69: QDeclarativeExpressionPrivate::value(QObject*, bool*) (qdeclarativeexpression.cpp:628)
==21920== by 0x504768A: QDeclarativeBoundSignal::qt_metacall(QMetaObject::Call, int, void**) (qdeclarativeboundsignal.cpp:177)
==21920== by 0x7D7766E: QMetaObject::metacall(QObject*, QMetaObject::Call, int, void**) (qmetaobject.cpp:237)
==21920== by 0x7D8C4C4: QMetaObject::activate(QObject*, QMetaObject const*, int, void**) (qobject.cpp:3280)
==21920== by 0x51251CA: QDeclarativeComponentAttached::completed() (moc_qdeclarativecomponent_p.cpp:86)
==21920== by 0x50131C0: QDeclarativeComponentPrivate::complete(QDeclarativeEnginePrivate*, QDeclarativeComponentPrivate::ConstructionState*) (qdeclarativecomponent.cpp:878)
==21920== by 0x501333F: QDeclarativeComponentPrivate::completeCreate() (qdeclarativecomponent.cpp:914)
==21920== by 0x50132F1: QDeclarativeComponent::completeCreate() (qdeclarativecomponent.cpp:907)
==21920== by 0x501261E: QDeclarativeComponent::create(QDeclarativeContext*) (qdeclarativecomponent.cpp:658)
==21920== by 0x4EEB486: QDeclarativeView::continueExecute() (qdeclarativeview.cpp:536)
==21920== by 0x4EEA484: QDeclarativeViewPrivate::execute() (qdeclarativeview.cpp:175)
==21920== by 0x4EEA985: QDeclarativeView::setSource(QUrl const&) (qdeclarativeview.cpp:324)
==21920== by 0x402288: main (main.cpp:20)
==21920== Uninitialised value was created by a heap allocation
==21920== at 0x4C267D0: operator new(unsigned long) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==21920== by 0x402DEB: void* qMetaTypeConstructHelper<Foo::Type>(Foo::Type const*) (qmetatype.h:141)
==21920== by 0x7D7F3E5: QMetaType::construct(int, void const*) (qmetatype.cpp:1236)
==21920== by 0x7D97F74: construct(QVariant::Private*, void const*) (qvariant.cpp:183)
==21920== by 0x6E75C02: construct(QVariant::Private*, void const*) (qguivariant.cpp:182)
==21920== by 0x7D9BB8C: QVariant::create(int, void const*) (qvariant.cpp:1391)
==21920== by 0x7D9BDFB: QVariant::QVariant(int, void const*) (qvariant.cpp:1670)
==21920== by 0x50B9A08: (anonymous namespace)::MetaCallArgument::fromScriptValue(int, QDeclarativeEngine*, QScriptValue const&) (qdeclarativeobjectscriptclass.cpp:766)
==21920== by 0x50BA701: QDeclarativeObjectMethodScriptClass::call(QScriptDeclarativeClass::Object*, QScriptContext*) (qdeclarativeobjectscriptclass.cpp:858)
==21920== by 0x56C4148: QScript::DeclarativeObjectDelegate::call(QTJSC::ExecState*, QTJSC::JSObject*, QTJSC::JSValue, QTJSC::ArgList const&) (qscriptdeclarativeobject.cpp:154)
==21920== by 0x55C71BF: QTJSC::NativeFuncWrapper::operator()(QTJSC::ExecState*, QTJSC::JSObject*, QTJSC::JSValue, QTJSC::ArgList const&) const (CallData.cpp:46)
==21920== by 0x559B841: cti_op_call_NotJSFunction (JITStubs.cpp:1771)
==21920== by 0xCC06C2A: ???
==21920== by 0x5547B97: QTJSC::JITCode::execute(QTJSC::RegisterFile*, QTJSC::ExecState*, QTJSC::JSGlobalData*, QTJSC::JSValue*) (JITCode.h:79)
==21920== by 0x5533E6C: QTJSC::Interpreter::execute(QTJSC::FunctionExecutable*, QTJSC::ExecState*, QTJSC::JSFunction*, QTJSC::JSObject*, QTJSC::ArgList const&, QTJSC::ScopeChainNode*, QTJSC::JSValue*) (Interpreter.cpp:716)
==21920== by 0x55EFC7F: QTJSC::JSFunction::call(QTJSC::ExecState*, QTJSC::JSValue, QTJSC::ArgList const&) (JSFunction.cpp:122)
==21920== by 0x55C7274: QTJSC::call(QTJSC::ExecState*, QTJSC::JSValue, QTJSC::CallType, QTJSC::CallData const&, QTJSC::JSValue, QTJSC::ArgList const&) (CallData.cpp:62)
==21920== by 0x56A86F4: QScriptValue::call(QScriptValue const&, QList<QScriptValue> const&) (qscriptvalue.cpp:1605)
==21920== by 0x5006340: QDeclarativeQtScriptExpression::eval(QObject*, bool*) (qdeclarativeexpression.cpp:479)
==21920== by 0x5006072: QDeclarativeQtScriptExpression::scriptValue(QObject*, bool*) (qdeclarativeexpression.cpp:434)
==21920== by 0x5006E2C: QDeclarativeExpressionPrivate::scriptValue(QObject*, bool*) (qdeclarativeexpression.cpp:614)
==21920== by 0x5006F69: QDeclarativeExpressionPrivate::value(QObject*, bool*) (qdeclarativeexpression.cpp:628)
==21920== by 0x504768A: QDeclarativeBoundSignal::qt_metacall(QMetaObject::Call, int, void**) (qdeclarativeboundsignal.cpp:177)
==21920== by 0x7D7766E: QMetaObject::metacall(QObject*, QMetaObject::Call, int, void**) (qmetaobject.cpp:237)
==21920== by 0x7D8C4C4: QMetaObject::activate(QObject*, QMetaObject const*, int, void**) (qobject.cpp:3280)
==21920== by 0x51251CA: QDeclarativeComponentAttached::completed() (moc_qdeclarativecomponent_p.cpp:86)
==21920== by 0x50131C0: QDeclarativeComponentPrivate::complete(QDeclarativeEnginePrivate*, QDeclarativeComponentPrivate::ConstructionState*) (qdeclarativecomponent.cpp:878)
==21920== by 0x501333F: QDeclarativeComponentPrivate::completeCreate() (qdeclarativecomponent.cpp:914)
==21920== by 0x50132F1: QDeclarativeComponent::completeCreate() (qdeclarativecomponent.cpp:907)
==21920== by 0x501261E: QDeclarativeComponent::create(QDeclarativeContext*) (qdeclarativecomponent.cpp:658)
==21920== by 0x4EEB486: QDeclarativeView::continueExecute() (qdeclarativeview.cpp:536)
==21920== by 0x4EEA484: QDeclarativeViewPrivate::execute() (qdeclarativeview.cpp:175)
==21920== by 0x4EEA985: QDeclarativeView::setSource(QUrl const&) (qdeclarativeview.cpp:324)
==21920== by 0x402288: main (main.cpp:20)
==21920==
Bar::bar() called with TypeA
Bar::bar() called with TypeA
Expected outcome: Both function calls should work the same.