From cb836d8481a3c453e7baf088408b667ccba1619c Mon Sep 17 00:00:00 2001 From: Przemyslaw Czerpak Date: Thu, 9 Oct 2008 12:11:49 +0000 Subject: [PATCH] 2008-10-09 14:11 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/source/vm/hvm.c * changed the place where exception handles are set/remove. Now it's set at the beginning of hb_vmInit() and removed at the end of hb_vmQuit() * harbour/source/rdd/dbcmd.c * harbour/source/rdd/dbf1.c ! added workaround for problem with EVAL block used in PACK command * harbour/source/compiler/hbmain.c * minor simplification --- harbour/ChangeLog | 14 +++++++++ harbour/source/compiler/hbmain.c | 17 ++--------- harbour/source/rdd/dbcmd.c | 6 ++-- harbour/source/rdd/dbf1.c | 50 +++++++++++++++++++++++++++----- harbour/source/vm/hvm.c | 8 +++-- 5 files changed, 68 insertions(+), 27 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 0de27f9214..1d58442c04 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,20 @@ 2008-12-31 13:59 UTC+0100 Foo Bar (foo.bar foobar.org) */ +2008-10-09 14:11 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/source/vm/hvm.c + * changed the place where exception handles are set/remove. + Now it's set at the beginning of hb_vmInit() and removed + at the end of hb_vmQuit() + + * harbour/source/rdd/dbcmd.c + * harbour/source/rdd/dbf1.c + ! added workaround for problem with EVAL block used in PACK + command + + * harbour/source/compiler/hbmain.c + * minor simplification + 2008-10-09 05:02 UTC-0500 Teo Fonrouge (teo/at/windtelsoft/dot/com) * bin/hb_flst.tmp * bin/pack_src.sh diff --git a/harbour/source/compiler/hbmain.c b/harbour/source/compiler/hbmain.c index 484744d241..061b46eae5 100644 --- a/harbour/source/compiler/hbmain.c +++ b/harbour/source/compiler/hbmain.c @@ -333,16 +333,6 @@ static PCOMSYMBOL hb_compSymbolFind( HB_COMP_DECL, const char * szSymbolName, US return NULL; } -/* NOTE: Name of symbols are released in hbident.c on exit */ -static PCOMSYMBOL hb_compSymbolKill( PCOMSYMBOL pSym ) -{ - PCOMSYMBOL pNext = pSym->pNext; - - hb_xfree( ( void * ) pSym ); - - return pNext; -} - /* returns a symbol name based on its index on the symbol table * index starts from 0 */ @@ -4133,12 +4123,11 @@ void hb_compCompileEnd( HB_COMP_DECL ) } HB_COMP_PARAM->pLastClass = NULL; - if( HB_COMP_PARAM->symbols.pFirst ) + while( HB_COMP_PARAM->symbols.pFirst ) { PCOMSYMBOL pSym = HB_COMP_PARAM->symbols.pFirst; - while( pSym ) - pSym = hb_compSymbolKill( pSym ); - HB_COMP_PARAM->symbols.pFirst = NULL; + HB_COMP_PARAM->symbols.pFirst = pSym->pNext; + hb_xfree( ( void * ) pSym ); } } diff --git a/harbour/source/rdd/dbcmd.c b/harbour/source/rdd/dbcmd.c index bfee05c0e5..da042445cc 100644 --- a/harbour/source/rdd/dbcmd.c +++ b/harbour/source/rdd/dbcmd.c @@ -600,9 +600,11 @@ HB_FUNC( __DBPACK ) hb_itemRelease( pArea->valResult ); pArea->valResult = hb_itemArrayNew( 2 ); hb_arraySet( pArea->valResult, 1, pBlock ); - pEvery = hb_param( 2, HB_IT_ANY ); - if( pEvery && HB_IS_NUMERIC( pEvery ) ) + pEvery = hb_param( 2, HB_IT_NUMERIC ); + if( pEvery ) hb_arraySet( pArea->valResult, 2, pEvery ); + else + hb_arraySetNI( pArea->valResult, 2, 0 ); } else { diff --git a/harbour/source/rdd/dbf1.c b/harbour/source/rdd/dbf1.c index 67786a985a..91dabbd219 100644 --- a/harbour/source/rdd/dbf1.c +++ b/harbour/source/rdd/dbf1.c @@ -4168,17 +4168,25 @@ static ERRCODE hb_dbfPack( DBFAREAP pArea ) if( SELF_GOCOLD( ( AREAP ) pArea ) != SUCCESS ) return FAILURE; - if( HB_IS_ARRAY( pArea->valResult ) && hb_arrayLen( pArea->valResult ) == 2 ) + /* This is bad hack but looks that people begins to use it :-( + * so I'll add workaround to make it m ore safe + */ + if( pArea->valResult && HB_IS_ARRAY( pArea->valResult ) && + hb_arrayLen( pArea->valResult ) == 2 && + ( hb_arrayGetType( pArea->valResult, 1 ) & HB_IT_BLOCK ) != 0 && + ( hb_arrayGetType( pArea->valResult, 2 ) & HB_IT_NUMERIC ) != 0 ) { - pBlock = hb_arrayGetItemPtr( pArea->valResult, 1 ); - ulUserEvery = hb_arrayGetNL( pArea->valResult, 2 ); - if( ulUserEvery < 1 ) + pBlock = hb_itemNew( NULL ); + hb_arrayGet( pArea->valResult, 1, pBlock ); + if( hb_arrayGetND( pArea->valResult, 2 ) >= 1 ) + ulUserEvery = hb_arrayGetNL( pArea->valResult, 2 ); + else ulUserEvery = 1; } else { pBlock = NULL; - ulUserEvery = 1; + ulUserEvery = 0; } ulRecOut = ulEvery = 0; @@ -4186,9 +4194,17 @@ static ERRCODE hb_dbfPack( DBFAREAP pArea ) while( ulRecIn <= pArea->ulRecCount ) { if( SELF_GOTO( ( AREAP ) pArea, ulRecIn ) != SUCCESS ) + { + if( pBlock ) + hb_itemRelease( pBlock ); return FAILURE; + } if( !hb_dbfReadRecord( pArea ) ) + { + if( pBlock ) + hb_itemRelease( pBlock ); return FAILURE; + } /* Execute the Code Block */ if( pBlock ) @@ -4197,12 +4213,19 @@ static ERRCODE hb_dbfPack( DBFAREAP pArea ) { ulEvery = 0; if( SELF_EVALBLOCK( ( AREAP ) pArea, pBlock ) != SUCCESS ) + { + hb_itemRelease( pBlock ); return FAILURE; + } } } if( SELF_PACKREC( ( AREAP ) pArea, ulRecOut + 1, &fWritten ) != SUCCESS ) + { + if( pBlock ) + hb_itemRelease( pBlock ); return FAILURE; + } if( fWritten ) { @@ -4212,17 +4235,28 @@ static ERRCODE hb_dbfPack( DBFAREAP pArea ) pArea->ulRecNo = ulRecOut; pArea->fRecordChanged = TRUE; if( ! hb_dbfWriteRecord( pArea ) ) + { + if( pBlock ) + hb_itemRelease( pBlock ); return FAILURE; + } } } ulRecIn++; } /* Execute the Code Block for pending record */ - if( pBlock && ulEvery > 0 ) + if( pBlock ) { - if( SELF_EVALBLOCK( ( AREAP ) pArea, pBlock ) != SUCCESS ) - return FAILURE; + if( ulEvery > 0 ) + { + if( SELF_EVALBLOCK( ( AREAP ) pArea, pBlock ) != SUCCESS ) + { + hb_itemRelease( pBlock ); + return FAILURE; + } + } + hb_itemRelease( pBlock ); } if( pArea->ulRecCount != ulRecOut ) diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index 8a7c1449b5..37906a85a6 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -835,6 +835,8 @@ HB_EXPORT void hb_vmInit( BOOL bStartMainProc ) hb_xinit(); + hb_vmSetExceptionHandler(); + #if defined( HB_MT_VM ) hb_threadInit(); hb_vmStackInit( hb_threadStateNew() ); /* initialize HVM thread stack */ @@ -956,8 +958,6 @@ HB_EXPORT void hb_vmInit( BOOL bStartMainProc ) int i; int iArgCount; - hb_vmSetExceptionHandler(); - hb_vmPushSymbol( s_pSymStart ); /* pushes first HB_FS_PUBLIC defined symbol to the stack */ hb_vmPushNil(); /* places NIL at self */ @@ -976,7 +976,6 @@ HB_EXPORT void hb_vmInit( BOOL bStartMainProc ) hb_vmDo( ( USHORT ) iArgCount ); /* invoke it with number of supplied parameters */ - hb_vmUnsetExceptionHandler(); } } @@ -1050,6 +1049,9 @@ HB_EXPORT int hb_vmQuit( void ) /* release all known garbage */ if( hb_xquery( HB_MEM_USEDMAX ) == 0 ) /* check if fmstat is ON */ hb_gcReleaseAll(); + + hb_vmUnsetExceptionHandler(); + hb_xexit(); return s_nErrorLevel;