diff --git a/ChangeLog.txt b/ChangeLog.txt index b05fb11212..dffa0b1584 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -10,6 +10,20 @@ * Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment */ +2014-09-19 15:22 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) + * src/common/hbdate.c + ! fixed typo in hb_timeUTCOffset() - this code was used in POSIX + systems which do not support gmtime_r()/localtime_r() - many + thanks to Teo. + + * src/debug/dbgentry.c + * src/debug/debugger.prg + * prepare the code to return error object when evaluated expression + fails as proposed by Teo. This functionality is not enabled yet. + I'm waiting for information about current public debugger API used + in 3-rd party projects before I decide to change it. + + 2014-09-18 00:23 UTC-0800 Pritpal Bedi (bedipritpal/at/hotmail.com) * contrib/gtwvg/gtwgud.c + Added: hb_gtInfo( HB_GTI_SETPOS_XY, { nRow|nX, nCol|nY } ) diff --git a/src/common/hbdate.c b/src/common/hbdate.c index ae3ce38f72..c720a9eaef 100644 --- a/src/common/hbdate.c +++ b/src/common/hbdate.c @@ -934,7 +934,7 @@ long hb_timeUTCOffset( void ) /* in seconds */ utc = mktime( gmtime_r( ¤t, &timeinfo ) ); local = mktime( localtime_r( ¤t, &timeinfo ) ); #else - timeinfo = *gmtime( &local ); + timeinfo = *gmtime( ¤t ); utc = mktime( &timeinfo ); timeinfo = *localtime( ¤t ); local = mktime( &timeinfo ); diff --git a/src/debug/dbgentry.c b/src/debug/dbgentry.c index 2d5db9930f..78f475e52b 100644 --- a/src/debug/dbgentry.c +++ b/src/debug/dbgentry.c @@ -189,7 +189,7 @@ static void hb_dbgAddStatic( HB_DEBUGINFO * info, const char * szName, int n static void hb_dbgAddVar( int * nVars, HB_VARINFO ** aVars, const char * szName, char cType, int nIndex, int nFrame, PHB_ITEM pFrame ); static void hb_dbgAddStopLines( PHB_ITEM pItem ); static void hb_dbgEndProc( HB_DEBUGINFO * info ); -static PHB_ITEM hb_dbgEval( HB_DEBUGINFO * info, HB_WATCHPOINT * watch ); +static PHB_ITEM hb_dbgEval( HB_DEBUGINFO * info, HB_WATCHPOINT * watch, HB_BOOL * valid ); static PHB_ITEM hb_dbgEvalMakeBlock( HB_WATCHPOINT * watch ); static PHB_ITEM hb_dbgEvalResolve( HB_DEBUGINFO * info, HB_WATCHPOINT * watch ); static HB_BOOL hb_dbgIsAltD( void ); @@ -346,17 +346,18 @@ static PHB_ITEM hb_dbgActivateWatchArray( HB_DEBUGINFO * info ) for( i = 0; i < info->nWatchPoints; i++ ) { PHB_ITEM pWatch = hb_arrayGetItemPtr( pArray, i + 1 ), xValue; + HB_BOOL fValid; for( j = 0; j < info->nTracePoints; j++ ) { if( info->aTrace[ j ].nIndex == i ) break; } - xValue = hb_dbgEval( info, &info->aWatch[ i ] ); + xValue = hb_dbgEval( info, &info->aWatch[ i ], &fValid ); hb_arrayNew( pWatch, HB_DBG_WP_LEN ); hb_arraySetC( pWatch, HB_DBG_WP_EXPR, info->aWatch[ i ].szExpr ); hb_arraySetL( pWatch, HB_DBG_WP_ISTRACE, j < info->nTracePoints ); - hb_arraySetL( pWatch, HB_DBG_WP_VALID, xValue != NULL ); + hb_arraySetL( pWatch, HB_DBG_WP_VALID, fValid ); if( xValue ) { hb_arraySetForward( pWatch, HB_DBG_WP_RESULT, xValue ); @@ -572,7 +573,7 @@ void hb_dbgEntry( int nMode, int nLine, const char * szName, int nIndex, PHB_ITE HB_TRACEPOINT * tp = &info->aTrace[ i ]; PHB_ITEM xValue; - xValue = hb_dbgEval( info, &info->aWatch[ tp->nIndex ] ); + xValue = hb_dbgEval( info, &info->aWatch[ tp->nIndex ], NULL ); if( xValue != tp->xValue && ( xValue == NULL || tp->xValue == NULL || @@ -972,7 +973,7 @@ void hb_dbgAddWatch( void * handle, const char * szExpr, HB_BOOL bTrace ) HB_TRACEPOINT * pTrace = ARRAY_ADD( HB_TRACEPOINT, info->aTrace, info->nTracePoints ); pTrace->nIndex = info->nWatchPoints - 1; - pTrace->xValue = hb_dbgEval( info, pWatch ); + pTrace->xValue = hb_dbgEval( info, pWatch, NULL ); } } } @@ -1108,7 +1109,7 @@ static HB_BOOL hb_dbgEqual( PHB_ITEM pItem1, PHB_ITEM pItem2 ) } -static PHB_ITEM hb_dbgEval( HB_DEBUGINFO * info, HB_WATCHPOINT * watch ) +static PHB_ITEM hb_dbgEval( HB_DEBUGINFO * info, HB_WATCHPOINT * watch, HB_BOOL * valid ) { PHB_ITEM xResult = NULL; @@ -1118,6 +1119,9 @@ static PHB_ITEM hb_dbgEval( HB_DEBUGINFO * info, HB_WATCHPOINT * watch ) if( ! watch->pBlock ) watch->pBlock = hb_dbgEvalMakeBlock( watch ); + if( valid != NULL ) + * valid = HB_FALSE; + if( watch->pBlock ) { PHB_ITEM aVars = hb_dbgEvalResolve( info, watch ); @@ -1126,11 +1130,18 @@ static PHB_ITEM hb_dbgEval( HB_DEBUGINFO * info, HB_WATCHPOINT * watch ) int i; info->bInside = HB_TRUE; - if( ! hb_vmTryEval( &xResult, watch->pBlock, 1, aNewVars ) ) + + if( hb_vmTryEval( &xResult, watch->pBlock, 1, aNewVars ) ) + { + if( valid != NULL ) + * valid = HB_TRUE; + } + else if( valid == NULL ) { hb_itemRelease( xResult ); xResult = NULL; } + info->bInside = bInside; for( i = 0; i < watch->nVars; i++ ) @@ -1506,7 +1517,7 @@ PHB_ITEM hb_dbgGetExpressionValue( void * handle, const char * expression ) point.pBlock = NULL; point.nVars = 0; - result = hb_dbgEval( info, &point ); + result = hb_dbgEval( info, &point, NULL ); hb_dbgClearWatch( &point ); @@ -1519,7 +1530,7 @@ PHB_ITEM hb_dbgGetWatchValue( void * handle, int nWatch ) HB_DEBUGINFO * info = ( HB_DEBUGINFO * ) handle; if( nWatch >= 0 && nWatch < info->nWatchPoints ) - return hb_dbgEval( info, &( info->aWatch[ nWatch ] ) ); + return hb_dbgEval( info, &info->aWatch[ nWatch ], NULL ); else return NULL; } @@ -1773,7 +1784,7 @@ void hb_dbgSetWatch( void * handle, int nWatch, const char * szExpr, HB_BOOL bTr HB_TRACEPOINT * pTrace = ARRAY_ADD( HB_TRACEPOINT, info->aTrace, info->nTracePoints ); pTrace->nIndex = nWatch; - pTrace->xValue = hb_dbgEval( info, pWatch ); + pTrace->xValue = hb_dbgEval( info, pWatch, NULL ); } } } diff --git a/src/debug/debugger.prg b/src/debug/debugger.prg index 79549f7582..640f09cc6a 100644 --- a/src/debug/debugger.prg +++ b/src/debug/debugger.prg @@ -880,8 +880,8 @@ METHOD DoCommand( cCommand ) CLASS HBDebugger IF aCmnd[ WP_TYPE ] == "??" IF lValid ::Inspect( aCmnd[ WP_EXPR ], cResult ) + cResult := "" // discard result ENDIF - cResult := "" // discard result ELSEIF lValid cResult := __dbgValToStr( cResult ) ENDIF @@ -1347,20 +1347,20 @@ METHOD GetExprValue( xExpr, lValid ) CLASS HBDebugger lValid := .F. - BEGIN SEQUENCE WITH {| oErr | Break( oErr ) } - xResult := __dbgGetExprValue( ::pInfo, xExpr, @lValid ) - IF ! lValid + xResult := __dbgGetExprValue( ::pInfo, xExpr, @lValid ) + IF ! lValid + oErr := xResult + IF oErr:ClassName() == "ERROR" + xResult := oErr:operation + ": " + oErr:description + IF HB_ISARRAY( oErr:args ) + xResult += "; arguments:" + AEval( oErr:args, {| x, i | xResult += iif( i == 1, " ", ", " ) + ; + __dbgValToStr( x ) } ) + ENDIF + ELSE xResult := "Syntax error" ENDIF - RECOVER USING oErr - xResult := oErr:operation + ": " + oErr:description - IF HB_ISARRAY( oErr:args ) - xResult += "; arguments:" - AEval( oErr:args, {| x, i | xResult += iif( i == 1, " ", ", " ) + ; - AllTrim( __dbgValToStr( x ) ) } ) - ENDIF - lValid := .F. - END SEQUENCE + ENDIF RETURN xResult