From cc149201a8aae9fa782b84f0401f387473a34cd8 Mon Sep 17 00:00:00 2001 From: Pritpal Bedi Date: Mon, 9 Jul 2012 06:03:42 +0000 Subject: [PATCH] 2012-07-08 10:56 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) * contrib/hbqt/hbmk2_qt.hb + Added: few more Qt defined variable types. Miss from prev commit. * contrib/hbqt/qtcore/hbqt_bind.cpp ! Fixed: some more rare cases where GPF on exit was there. ; NOTE: with this commit I feel the new engine is working absolutely fine without GPF's and also along the Harbour way of programming practice. If you find any regression, please report. Till then I concentrate on other parts of HbQt. --- harbour/ChangeLog | 14 ++++++ harbour/contrib/hbqt/hbmk2_qt.hb | 7 ++- harbour/contrib/hbqt/qtcore/hbqt_bind.cpp | 60 +++++++++++++++++------ 3 files changed, 65 insertions(+), 16 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 060a72f4c5..04bb1ed4a7 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,20 @@ The license applies to all entries newer than 2009-04-28. */ +2012-07-08 10:56 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) + * contrib/hbqt/hbmk2_qt.hb + + Added: few more Qt defined variable types. + Miss from prev commit. + + * contrib/hbqt/qtcore/hbqt_bind.cpp + ! Fixed: some more rare cases where GPF on exit was there. + + ; NOTE: with this commit I feel the new engine is working + absolutely fine without GPF's and also along the + Harbour way of programming practice. If you find any + regression, please report. Till then I concentrate on + other parts of HbQt. + 2012-07-08 16:17 UTC+0200 Viktor Szakats (harbour syenar.net) * INSTALL + Clarified 'stable' vs 'unstable' in HOW TO GET HARBOUR diff --git a/harbour/contrib/hbqt/hbmk2_qt.hb b/harbour/contrib/hbqt/hbmk2_qt.hb index d0ca4c0ba1..05ce1ed747 100644 --- a/harbour/contrib/hbqt/hbmk2_qt.hb +++ b/harbour/contrib/hbqt/hbmk2_qt.hb @@ -2335,13 +2335,13 @@ METHOD HbQtSource:parseProto( cProto, fBody_ ) oArg:cDoc := "n" + oMtd:cDocNM oArg:cTypeHB := "N" - CASE oArg:cCast $ "double,qreal,float,GLfloat" .AND. oArg:lFar + CASE oArg:cCast $ "double,qreal,float,GLfloat,qsreal" .AND. oArg:lFar AAdd( oMtd:aPre, { oArg:cCast + " qr" + oMtd:cDocNM + " = 0;", oMtd:nHBIdx, "qr" + oMtd:cDocNM, "hb_stornd" } ) oArg:cBody := "&qr" + oMtd:cDocNM oArg:cDoc := "@n" + oMtd:cDocNM oArg:cTypeHB := "N*" - CASE oArg:cCast $ "double,qreal,float,GLfloat" + CASE oArg:cCast $ "double,qreal,float,GLfloat,qsreal" s := "hb_parnd( " + cHBIdx + " )" IF ! Empty( oArg:cDefault ) oArg:cBody := "( HB_ISNUM( " + cHBIdx + " ) ? " + s + " : " + oArg:cDefault + " )" @@ -3402,6 +3402,9 @@ STATIC FUNCTION qth_is_QObject( cWidget ) aadd( aQObjects, "QGLWidget" ) aadd( aQObjects, "QGraphicsSvgItem" ) + + aadd( aQObjects, "QScriptEngine" ) + aadd( aQObjects, "QScriptExtensionPlugin" ) ENDIF RETURN ascan( aQObjects, {|e| e == cWidget } ) > 0 diff --git a/harbour/contrib/hbqt/qtcore/hbqt_bind.cpp b/harbour/contrib/hbqt/qtcore/hbqt_bind.cpp index 43e7127dda..35f15aa675 100644 --- a/harbour/contrib/hbqt/qtcore/hbqt_bind.cpp +++ b/harbour/contrib/hbqt/qtcore/hbqt_bind.cpp @@ -122,6 +122,7 @@ static void hbqt_bindDestroyChildren( void * hbObject, bool fDeleteSelf ); static QList hbqt_bindGetObjectListByThread( int iThreadId ); static PHBQT_BIND hbqt_bindGetBindByQtObject( void * qtObject ); static PHBQT_BIND hbqt_bindGetBindByHbObject( void * hbObject ); +static void hbqt_bindDestroyQtObjectA( void * qtObject, QObject * qObject ); static int s_bind_threadId = 0; @@ -199,14 +200,14 @@ static void hbqt_bindThreadRelease( void * cargo ) HB_TRACE( HB_TR_DEBUG, ( "..." ) ); HB_TRACE( HB_TR_DEBUG, ( ".......hbqt_bindThreadRelease( %i, #.%i )... parent() != NULL && children() > 0", iThreadId, i+1 ) ); hbqt_bindDestroyChildren( bind->hbObject, false ); - hbqt_bindDestroyQtObject( bind->qtObject, ( QObject * ) bind->qtObject ); + hbqt_bindDestroyQtObjectA( bind->qtObject, ( QObject * ) bind->qtObject ); HB_TRACE( HB_TR_DEBUG, ( "..." ) ); } else if( qObject->parent() != NULL && qObject->children().size() == 0 ) { HB_TRACE( HB_TR_DEBUG, ( "..." ) ); HB_TRACE( HB_TR_DEBUG, ( ".......hbqt_bindThreadRelease( %i, #.%i )... parent() != NULL && children() == 0", iThreadId, i+1 ) ); - hbqt_bindDestroyQtObject( bind->qtObject, ( QObject * ) bind->qtObject ); + hbqt_bindDestroyQtObjectA( bind->qtObject, ( QObject * ) bind->qtObject ); HB_TRACE( HB_TR_DEBUG, ( "..." ) ); } else if( qObject->parent() == NULL && qObject->children().size() > 0 ) @@ -214,14 +215,14 @@ static void hbqt_bindThreadRelease( void * cargo ) HB_TRACE( HB_TR_DEBUG, ( "..." ) ); HB_TRACE( HB_TR_DEBUG, ( ".......hbqt_bindThreadRelease( %i, #.%i )... parent() == NULL && children() > 0", iThreadId, i+1 ) ); hbqt_bindDestroyChildren( bind->hbObject, false ); - hbqt_bindDestroyQtObject( bind->qtObject, ( QObject * ) bind->qtObject ); + hbqt_bindDestroyQtObjectA( bind->qtObject, ( QObject * ) bind->qtObject ); HB_TRACE( HB_TR_DEBUG, ( "..." ) ); } else if( qObject->parent() == NULL && qObject->children().size() == 0 ) { HB_TRACE( HB_TR_DEBUG, ( "..." ) ); HB_TRACE( HB_TR_DEBUG, ( ".......hbqt_bindThreadRelease( %i, #.%i )... parent() == NULL && children() == 0", iThreadId, i+1 ) ); - hbqt_bindDestroyQtObject( bind->qtObject, qObject ); + hbqt_bindDestroyQtObjectA( bind->qtObject, qObject ); HB_TRACE( HB_TR_DEBUG, ( "..." ) ); } } @@ -235,11 +236,13 @@ static void hbqt_bindThreadRelease( void * cargo ) { HB_TRACE( HB_TR_DEBUG, ( "..." ) ); HB_TRACE( HB_TR_DEBUG, ( ".......hbqt_bindThreadRelease( %i, #.%i )... else no_qOBJECT", iThreadId, i+1 ) ); - PHB_ITEM pObject = hb_arrayFromId( NULL, bind->hbObject ); - if( pObject != NULL ) + void * qtObject = bind->qtObject; + int iFlags = bind->iFlags; + PHBQT_DEL_FUNC pDelFunc = bind->pDelFunc; + hbqt_bindRemoveBind( bind ); + if( pDelFunc != NULL ) { - hbqt_bindDestroyHbObject( pObject ); - hb_itemRelease( pObject ); + pDelFunc( qtObject, iFlags ); } HB_TRACE( HB_TR_DEBUG, ( "..." ) ); } @@ -498,7 +501,6 @@ PHB_ITEM hbqt_bindGetHbObject( PHB_ITEM pItem, void * qtObject, const char * szC { QObject::connect( obj, SIGNAL( destroyed(QObject*) ), hbqt_bindGetThreadData()->pDestroyer, SLOT( destroyer(QObject*) ) ); } - HB_TRACE( HB_TR_DEBUG, ( "......hbqt_bindGetHbObject_connected_to_destroy()( %p, %s )", qtObject, szClassName ) ); hb_vmPushDynSym( s_dynsym_SETSLOTS ); /* initializes __Slots hash */ hb_vmPush( pObject ); @@ -522,7 +524,7 @@ PHB_ITEM hbqt_bindGetHbObject( PHB_ITEM pItem, void * qtObject, const char * szC void hbqt_bindDestroyHbObject( PHB_ITEM pObject ) { void * hbObject = hb_arrayId( pObject ); - + HB_TRACE( HB_TR_DEBUG, ( ".........HARBOUR_DESTROY_BEGINS..........." ) ); if( hbObject ) { PHBQT_BIND bind = hbqt_bindGetBindByHbObject( hbObject ); @@ -568,7 +570,7 @@ void hbqt_bindDestroyHbObject( PHB_ITEM pObject ) { if( isQObject ) { - HB_TRACE( HB_TR_DEBUG, ( "......... HARBOUR_DESTROYING_QT_OBJECT( %i, %i, %p, %s ) )", bind->iThreadId, iFlags, qtObject, bind->szClassName ) ); + HB_TRACE( HB_TR_DEBUG, ( "......... HARBOUR_DESTROYING_qt_OBJECT( %i, %i, %p, %s ) )", bind->iThreadId, iFlags, qtObject, bind->szClassName ) ); qObject->disconnect(); if( bind->fEventFilterInstalled ) { @@ -577,7 +579,7 @@ void hbqt_bindDestroyHbObject( PHB_ITEM pObject ) } else { - HB_TRACE( HB_TR_DEBUG, ( "......... HARBOUR_DESTROYING_QT_OBJECT( %i, %i, %p, %s ) )", bind->iThreadId, iFlags, qtObject, bind->szClassName ) ); + HB_TRACE( HB_TR_DEBUG, ( "......... HARBOUR_DESTROYING_qt_OBJECT( %i, %i, %p, %s ) )", bind->iThreadId, iFlags, qtObject, bind->szClassName ) ); } hbqt_bindRemoveBind( bind ); pDelFunc( qtObject, iFlags ); @@ -586,7 +588,8 @@ void hbqt_bindDestroyHbObject( PHB_ITEM pObject ) { if( isQObject ) { - HB_TRACE( HB_TR_DEBUG, ( "......... HARBOUR_NOT-DESTROYING_HB_OBJECT( %i, %i, %p, %s ) )", bind->iThreadId, iFlags, qtObject, bind->szClassName ) ); + hbqt_bindRemoveBind( bind ); /* MUST HAVE : hb_arrayFromId() returns NIL onto retained object as such */ + HB_TRACE( HB_TR_DEBUG, ( "......... HARBOUR_NOT-DESTROYING_hb_OBJECT( %i, %i, %p, %s ) )", bind->iThreadId, iFlags, qtObject, bind->szClassName ) ); } } } @@ -594,7 +597,7 @@ void hbqt_bindDestroyHbObject( PHB_ITEM pObject ) { if( isQObject ) { - HB_TRACE( HB_TR_DEBUG, ( "......... HARBOUR_DESTROYING_HB_OBJECT( %i, %i, %p, %s ) )", bind->iThreadId, iFlags, qtObject, bind->szClassName ) ); + HB_TRACE( HB_TR_DEBUG, ( "......... HARBOUR_DESTROYING_hb_OBJECT( %i, %i, %p, %s ) )", bind->iThreadId, iFlags, qtObject, bind->szClassName ) ); } hbqt_bindRemoveBind( bind ); } @@ -605,6 +608,7 @@ void hbqt_bindDestroyHbObject( PHB_ITEM pObject ) void hbqt_bindDestroyQtObject( void * qtObject, QObject * qObject ) { + HB_TRACE( HB_TR_DEBUG, ( "............QT_DESTROY_BEGINS...............%p %p", qtObject, qObject ) ); if( qtObject ) { qObject->disconnect(); @@ -621,6 +625,34 @@ void hbqt_bindDestroyQtObject( void * qtObject, QObject * qObject ) hbqt_bindRemoveBind( bind ); } } + HB_TRACE( HB_TR_DEBUG, ( "............QT_DESTROY_ENDS...............%p %p", qtObject, qObject ) ); +} + +static void hbqt_bindDestroyQtObjectA( void * qtObject, QObject * qObject ) +{ + HB_TRACE( HB_TR_DEBUG, ( "............QT_DESTROY_BEGINS...............%p %p", qtObject, qObject ) ); + if( qtObject ) + { + qObject->disconnect(); + + PHBQT_BIND bind = hbqt_bindGetBindByQtObject( qtObject ); + if( bind != NULL ) + { + HB_TRACE( HB_TR_DEBUG, ( "............QT_DESTROYS( %i, %i, %p, %s )..............", bind->iThreadId, bind->iFlags, bind->qtObject, bind->szClassName ) ); + if( bind->fEventFilterInstalled ) + { + qObject->removeEventFilter( hbqt_bindGetThreadData()->pReceiverEvents ); + } + int iFlags = bind->iFlags; + PHBQT_DEL_FUNC pDelFunc = bind->pDelFunc; + hbqt_bindRemoveBind( bind ); + if( pDelFunc != NULL ) + { + pDelFunc( qtObject, iFlags ); + } + } + } + HB_TRACE( HB_TR_DEBUG, ( "............QT_DESTROY_ENDS...............%p %p", qtObject, qObject ) ); } PHB_ITEM hbqt_bindSetHbObject( PHB_ITEM pItem, void * qtObject, const char * szClassName, PHBQT_DEL_FUNC pDelFunc, int iFlags )