diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 228ebd3973..a4794ca6b0 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,21 @@ 2002-12-01 13:30 UTC+0100 Foo Bar */ + ! generate internal error if ErrorNew() function does not return an object + +2006-09-07 16:05 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/source/vm/memvars.c + ! fixed memvar creation in __MVPUT() + +2006-09-07 01:55 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/source/rdd/dbcmd.c + ! always initialize all members in RDD structures to avoid GPF when + some RDD will try to access uninitialized data + + * harbour/source/rdd/usrrdd/usrrdd.c + ! added some additional validation in RDD structures <-> item conversions + +2006-09-06 14:45 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/source/vm/itemapi.c * modified hb_itemClear() to be reentrant safe - the new version can be also better optimized by C compiler so should be also faster diff --git a/harbour/source/rdd/dbcmd.c b/harbour/source/rdd/dbcmd.c index a6e0edb769..a2c5dfc76e 100644 --- a/harbour/source/rdd/dbcmd.c +++ b/harbour/source/rdd/dbcmd.c @@ -2877,6 +2877,8 @@ HB_FUNC( ORDCREATE ) dbOrderInfo.lpdbConstraintInfo = NULL; } + dbOrderInfo.lpdbOrdCondInfo = pArea->lpdbOrdCondInfo; + SELF_ORDCREATE( pArea, &dbOrderInfo ); } else diff --git a/harbour/source/vm/fm.c b/harbour/source/vm/fm.c index a0c79753a4..f6c90d75f8 100644 --- a/harbour/source/vm/fm.c +++ b/harbour/source/vm/fm.c @@ -320,7 +320,7 @@ HB_EXPORT void * hb_xrealloc( void * pMem, ULONG ulSize ) /* reallocates m if( ulSize > ulMemSize ) { memcpy( pMem, pMemBlock, HB_ALLOC_SIZE( ulMemSize ) ); - memset( ( BYTE * ) pMem + HB_ALLOC_SIZE( ulMemSize ), ulSize - ulMemSize ); + memset( ( BYTE * ) pMem + HB_ALLOC_SIZE( ulMemSize ), HB_MEMFILER, ulSize - ulMemSize ); } else memcpy( pMem, pMemBlock, HB_ALLOC_SIZE( ulSize ) ); diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index 2e06ee21d1..da69bf9e3c 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -3120,7 +3120,7 @@ static void hb_vmEnumStart( BYTE nVars, BYTE nDescend ) } } - hb_vmPushLong( nVars ); /* number of iterators */ + hb_vmPushInteger( nVars ); /* number of iterators */ /* empty array/string - do not start enumerations loop */ hb_vmPushLogical( ulMax != 0 ); } @@ -3137,7 +3137,7 @@ static void hb_vmEnumNext( void ) HB_ITEM_PTR pEnum; int i; - for( i = ( int ) hb_stackItemFromTop( -1 )->item.asLong.value; i > 0; --i ) + for( i = ( int ) hb_stackItemFromTop( -1 )->item.asInteger.value; i > 0; --i ) { pEnum = hb_itemUnRefOnce( hb_stackItemFromTop( -( i << 1 ) ) ); if( HB_IS_ARRAY( pEnum->item.asEnum.basePtr ) ) @@ -3175,7 +3175,7 @@ static void hb_vmEnumPrev( void ) HB_ITEM_PTR pEnum; int i; - for( i = hb_stackItemFromTop( -1 )->item.asLong.value; i > 0; --i ) + for( i = hb_stackItemFromTop( -1 )->item.asInteger.value; i > 0; --i ) { pEnum = hb_itemUnRefOnce( hb_stackItemFromTop( -( i << 1 ) ) ); if( HB_IS_ARRAY( pEnum->item.asEnum.basePtr ) ) @@ -3208,13 +3208,13 @@ static void hb_vmEnumPrev( void ) */ static void hb_vmEnumEnd( void ) { - LONG lVars; + int iVars; /* remove number of iterators */ - lVars = hb_stackItemFromTop( -1 )->item.asLong.value; + iVars = hb_stackItemFromTop( -1 )->item.asInteger.value; hb_stackDec(); - while( --lVars >= 0 ) + while( --iVars >= 0 ) { hb_stackPop(); hb_stackPop(); diff --git a/harbour/source/vm/itemapi.c b/harbour/source/vm/itemapi.c index eb0c3c66e6..d193fe9e8f 100644 --- a/harbour/source/vm/itemapi.c +++ b/harbour/source/vm/itemapi.c @@ -1253,28 +1253,33 @@ HB_EXPORT void hb_itemInit( PHB_ITEM pItem ) HB_EXPORT void hb_itemClear( PHB_ITEM pItem ) { + HB_TYPE type; + HB_TRACE(HB_TR_DEBUG, ("hb_itemClear(%p)", pItem)); - if( HB_IS_STRING( pItem ) ) + type = pItem->type; + pItem->type = HB_IT_NIL; + + if( type & HB_IT_STRING ) { if( pItem->item.asString.allocated ) hb_xRefFree( pItem->item.asString.value ); } - else if( HB_IS_ARRAY( pItem ) ) + else if( type & HB_IT_ARRAY ) hb_gcRefFree( pItem->item.asArray.value ); - else if( HB_IS_BLOCK( pItem ) ) + else if( type & HB_IT_BLOCK ) hb_gcRefFree( pItem->item.asBlock.value ); - else if( HB_IS_MEMVAR( pItem ) ) + else if( type & HB_IT_MEMVAR ) hb_memvarValueDecRef( pItem->item.asMemvar.value ); - else if( HB_IS_POINTER( pItem ) ) + else if( type & HB_IT_POINTER ) { if( pItem->item.asPointer.collect ) hb_gcRefFree( pItem->item.asPointer.value ); } - else if( HB_IS_ENUM( pItem ) ) /* FOR EACH control variable */ + else if( type & HB_IT_ENUM ) /* FOR EACH control variable */ { /* * pItem->item.asEnum.valuePtr is intentionally assigned to pValue to @@ -1284,17 +1289,11 @@ HB_EXPORT void hb_itemClear( PHB_ITEM pItem ) */ PHB_ITEM pValue = pItem->item.asEnum.valuePtr; + pItem->type = HB_IT_NIL; hb_itemRelease( pItem->item.asEnum.basePtr ); if( pValue ) hb_itemRelease( pValue ); } - -#if defined( HB_FM_STATISTICS ) && defined( HB_PARANOID_MEM_CHECK ) - else if( HB_IS_BADITEM( pItem ) ) - hb_errInternal( HB_EI_VMPOPINVITEM, NULL, "hb_itemClear()", NULL ); -#endif - - pItem->type = HB_IT_NIL; } /* Internal API, not standard Clipper */