diff --git a/harbour/ChangeLog b/harbour/ChangeLog index de1a47d0b8..4bdf24015c 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,12 @@ 2002-12-01 23:12 UTC+0100 Foo Bar */ +2002-09-17 21:55 UTC-01 jf lefebvre (mafact) + * source/rdd/dbfcdx\dbfcdx1.c + ! Added needed typecasting for M$soft C + * source/vm/classes.c + ! Minor cosmetic change and syncro with xHarbour + 2002-09-13 23:30 UTC-0400 David G. Holm * source/rtl/dbdelim.prg ! Bug fix for fields that have an embedded delimiter. diff --git a/harbour/source/rdd/dbfcdx/dbfcdx1.c b/harbour/source/rdd/dbfcdx/dbfcdx1.c index a0b87970a1..e781c6b212 100644 --- a/harbour/source/rdd/dbfcdx/dbfcdx1.c +++ b/harbour/source/rdd/dbfcdx/dbfcdx1.c @@ -3025,7 +3025,7 @@ static void hb_cdxSortFree( LPSORTINFO pSort ) } if ( pSort->szTempFileName ) { - hb_fsDelete( pSort->szTempFileName ); + hb_fsDelete( (unsigned char *) pSort->szTempFileName ); hb_xfree( pSort->szTempFileName ); pSort->szTempFileName = NULL; } @@ -3306,7 +3306,7 @@ static int hb_cdxSortSwapBuildIndex( LPSORTINFO pSort ) USHORT nKeyLen; BOOL lCont; - pSort->pSwapPage = hb_xgrab( pSort->nSwapPages * sizeof( SORTSWAPPAGE ) ); + pSort->pSwapPage = (_SORTSWAPPAGE *) hb_xgrab( pSort->nSwapPages * sizeof( SORTSWAPPAGE ) ); if ( !pSort->pSwapPage ) hb_errInternal( HB_EI_ERRUNRECOV, "hb_cdxTagDoIndex: Not enough memory for index merging", "hb_cdxTagDoIndex", NULL ); diff --git a/harbour/source/vm/classes.c b/harbour/source/vm/classes.c index 3f01f056e5..e08b7f75b5 100644 --- a/harbour/source/vm/classes.c +++ b/harbour/source/vm/classes.c @@ -138,6 +138,7 @@ */ #include "hbapi.h" + #include "hbstack.h" #include "hbapierr.h" #include "hbapiitm.h" @@ -246,7 +247,7 @@ static void hb_clsDictRealloc( PCLASS pClass ) if( pClass ) { PMETHOD pNewMethods; - USHORT uiNewHashKey = pClass->uiHashKey; + USHORT uiNewHashKey = pClass->uiHashKey * 2 ; USHORT ui; USHORT uiLimit = ( USHORT ) ( pClass->uiHashKey * BUCKET ); @@ -319,17 +320,18 @@ static void hb_clsRelease( PCLASS pClass ) HB_TRACE(HB_TR_DEBUG, ("hb_clsRelease(%p)", pClass)); for( uiAt = 0; uiAt < uiLimit; uiAt++, pMeth++ ) - { - if( pMeth->pInitValue ) - hb_itemRelease( pMeth->pInitValue ); - } + { + if( pMeth->pInitValue ) + { + hb_itemRelease( pMeth->pInitValue ); + } + } hb_xfree( pClass->szName ); hb_xfree( pClass->pMethods ); hb_itemRelease( pClass->pClassDatas ); hb_itemRelease( pClass->pInlines ); - } @@ -344,17 +346,38 @@ void hb_clsReleaseAll( void ) HB_TRACE(HB_TR_DEBUG, ("hb_clsReleaseAll()")); -/* for( uiClass = 0 ; uiClass < s_uiClasses ; uiClass++ ) */ -/* hb_clsRelease( s_pClasses + uiClass ); */ + for( uiClass = 0 ; uiClass < s_uiClasses ; uiClass++ ) + { - uiClass = (SHORT) (s_uiClasses-1) ; - s_uiClasses = 0 ; - for( ; uiClass >= 0 ; uiClass-- ) - hb_clsRelease( s_pClasses + uiClass ); + + + + + + hb_clsRelease( s_pClasses + uiClass ); + + + + + + + + + + + + + + + + + } if( s_pClasses ) + { hb_xfree( s_pClasses ); + } s_uiClasses = 0; s_pClasses = NULL; @@ -377,18 +400,24 @@ void hb_clsIsClassRef( void ) while( uiClass-- ) { if( pClass->pInlines ) + { hb_gcItemRef( pClass->pInlines ); + } if( pClass->pClassDatas ) + { hb_gcItemRef( pClass->pClassDatas ); + } uiLimit = ( USHORT ) ( pClass->uiHashKey * BUCKET ); pMeth = pClass->pMethods; for( uiAt = 0; uiAt < uiLimit; uiAt++, pMeth++ ) - { + { if( pMeth->pInitValue ) + { hb_gcItemRef( pMeth->pInitValue ); - } + } + } ++pClass; } @@ -669,9 +698,11 @@ char * hb_objGetRealClsName( PHB_ITEM pObject, char * szName ) if( HB_IS_ARRAY( pObject ) ) { if( ! pObject->item.asArray.value->uiClass ) + { szClassName = "ARRAY"; + } else - { + { PHB_DYNS pMsg = hb_dynsymFindName( szName ); USHORT uiClass; USHORT uiCurCls; @@ -708,23 +739,33 @@ char * hb_objGetRealClsName( PHB_ITEM pObject, char * szName ) uiClsTree=1; /* Flag Value */ break; } + uiAt++; + if( uiAt == uiMask ) + { uiAt = 0; + } } } if (-- uiClsTree) + { uiCurCls = pObject->item.asArray.value->puiClsTree[uiClsTree] ; + } } if( uiClass && uiClass <= s_uiClasses ) + { szClassName = ( s_pClasses + uiClass - 1 )->szName; + } else + { szClassName = "UNKNOWN"; + } - } + } } else /* built in types */ { @@ -790,9 +831,13 @@ PHB_FUNC hb_objGetMthd( PHB_ITEM pObject, PHB_SYMB pMessage, BOOL lAllowErrFunc HB_TRACE(HB_TR_DEBUG, ("hb_objGetMthd(%p, %p)", pObject, pMessage)); if( pObject->type == HB_IT_ARRAY ) + { uiClass = pObject->item.asArray.value->uiClass; + } else + { uiClass = 0; + } if( uiClass && uiClass <= s_uiClasses ) { @@ -803,7 +848,6 @@ PHB_FUNC hb_objGetMthd( PHB_ITEM pObject, PHB_SYMB pMessage, BOOL lAllowErrFunc while( uiAt != uiLimit ) { - if( pClass->pMethods[ uiAt ].pMessage == pMsg ) { pMethod = pClass->pMethods + uiAt; @@ -812,7 +856,9 @@ PHB_FUNC hb_objGetMthd( PHB_ITEM pObject, PHB_SYMB pMessage, BOOL lAllowErrFunc s_pMethod = pMethod ; if( hb_bProfiler ) + { pMethod->ulCalls++; /* Profiler */ + } return pFunction; } @@ -913,9 +959,13 @@ ULONG hb_objHasMsg( PHB_ITEM pObject, char *szString ) HB_TRACE(HB_TR_DEBUG, ("hb_objHasMsg(%p, %s)", pObject, szString)); if( pDynSym ) + { return ( ULONG ) hb_objGetMthd( pObject, pDynSym->pSymbol, FALSE ); + } else + { return 0; + } } @@ -1477,12 +1527,13 @@ HB_FUNC( __CLSDELMSG ) /* Move messages */ while( pClass->pMethods[ uiAt ].pMessage && uiAt != uiLimit ) { - hb_xmemcpy( pClass->pMethods + uiAt, - pClass->pMethods + ( ( uiAt == uiMask ) ? 0 : uiAt + 1 ), - sizeof( METHOD ) ); + hb_xmemcpy( pClass->pMethods + uiAt, pClass->pMethods + ( uiAt == uiMask ? 0 : uiAt + 1 ), sizeof( METHOD ) ); uiAt++; + if( uiAt == uiMask ) + { uiAt = 0; + } } memset( pClass->pMethods + uiAt, 0, sizeof( METHOD ) ); pClass->uiMethods--; /* Decrease number messages */ @@ -1504,7 +1555,9 @@ HB_FUNC( __CLSINST ) pSelf = hb_clsInst( ( USHORT ) hb_parni( 1 )); if( pSelf ) + { hb_itemRelease( hb_itemReturn( pSelf ) ); + } } @@ -1533,9 +1586,6 @@ static PHB_ITEM hb_clsInst( USHORT uiClass ) pSelf->item.asArray.value->puiClsTree = NULL; - /* pSelf->item.asArray.value->puiClsTree = ( USHORT * ) hb_xgrab( sizeof( USHORT ) ); */ - /* pSelf->item.asArray.value->puiClsTree[0]=0; */ - /* Initialise value if initialisation was requested */ pMeth = pClass->pMethods; for( uiAt = 0; uiAt < uiLimit; uiAt++, pMeth++ ) @@ -1550,13 +1600,16 @@ static PHB_ITEM hb_clsInst( USHORT uiClass ) HB_ITEM init; PHB_ITEM pInit; - hb_itemInit( &init ); + ( &init )->type = HB_IT_NIL; // hb_itemInit( &init ); + hb_arrayGet( pClass->pClassDatas, pMeth->uiData, &init ); + if( init.type == HB_IT_NIL ) { - if( HB_IS_ARRAY( pMeth->pInitValue ) ) + { pInit = hb_arrayClone( pMeth->pInitValue, NULL ); + } else { pInit = hb_itemNew( NULL ); @@ -1568,7 +1621,11 @@ static PHB_ITEM hb_clsInst( USHORT uiClass ) pMeth->bClsDataInitiated = 1; } + + + hb_itemClear( &init ); + } else if( pMeth->pFunction == hb___msgGetData ) /* is a DATA but not herited */ { @@ -1595,7 +1652,8 @@ static PHB_ITEM hb_clsInst( USHORT uiClass ) HB_ITEM init; PHB_ITEM pInit; - hb_itemInit( &init ); + ( &init )->type = HB_IT_NIL; + hb_arrayGet( pClass->pClassDatas, pMeth->uiData, &init ); if( init.type == HB_IT_NIL ) { @@ -1613,7 +1671,11 @@ static PHB_ITEM hb_clsInst( USHORT uiClass ) hb_itemRelease(pInit); pMeth->bClsDataInitiated = 1; } + + + hb_itemClear( &init ); + } } } @@ -1661,16 +1723,22 @@ HB_FUNC( __CLSMODMSG ) PHB_ITEM pBlock = hb_param( 3, HB_IT_BLOCK ); if( pBlock == NULL ) + { hb_errRT_BASE( EG_ARG, 3000, NULL, "__CLSMODMSG", 0 ); + } else + { hb_arraySet( pClass->pInlines, pClass->pMethods[ uiAt ].uiData, pBlock ); + } } else if( ( pFunc == hb___msgSetData ) || ( pFunc == hb___msgGetData ) ) { /* Not allowed for DATA */ hb_errRT_BASE( EG_ARG, 3004, "Cannot modify a DATA item", "__CLSMODMSG", 0 ); } else /* Modify METHOD */ + { pClass->pMethods[ uiAt ].pFunction = ( PHB_FUNC ) hb_parnl( 3 ); + } } } } @@ -1700,7 +1768,7 @@ HB_FUNC( __OBJGETCLSNAME ) if( uiClass <= s_uiClasses ) hb_retc( s_pClasses[ uiClass - 1 ].szName ); else - hb_retc( NULL ); + hb_retc( "" ); } } @@ -1716,9 +1784,14 @@ HB_FUNC( __OBJHASMSG ) PHB_ITEM pString = hb_param( 2, HB_IT_STRING ); if( pObject && pString ) - hb_retl( hb_objHasMsg( pObject, pString->item.asString.value ) != 0 ); + { + hb_retl( hb_objHasMsg( pObject, pString->item.asString.value ) ); + } else - hb_errRT_BASE( EG_ARG, 3000, NULL, "__OBJHASMSG", 0 ); + { + /*hb_errRT_BASE( EG_ARG, 3000, NULL, "__OBJHASMSG", 0 );*/ + hb_errRT_BASE_SubstR( EG_ARG, 1099, NULL, "__ObjHasMsg", 2, hb_paramError( 1 ), hb_paramError( 2 ) ); + } } @@ -1743,7 +1816,9 @@ HB_FUNC( __OBJCLONE ) hb_itemRelease( hb_itemReturn( pDstObject ) ); } else + { hb_errRT_BASE( EG_ARG, 3001, NULL, "__OBJCLONE", 0 ); + } } @@ -1767,16 +1842,21 @@ HB_FUNC( __OBJSENDMSG ) USHORT uiParam; hb_vmPushSymbol( pMsg->pSymbol ); /* Push message symbol */ + hb_vmPush( pObject ); /* Push object */ for( uiParam = 3; uiParam <= uiPCount; uiParam++ ) /* Push arguments on stack */ + { hb_vmPush( hb_param( uiParam, HB_IT_ANY ) ); + } hb_vmDo( ( USHORT ) ( uiPCount - 2 ) ); /* Execute message */ } } else + { hb_errRT_BASE( EG_ARG, 3000, NULL, "__OBJSENDMSG", 0 ); + } } /* @@ -1802,7 +1882,7 @@ HB_FUNC( __CLSINSTSUPER ) hb_vmPushNil(); hb_vmFunction( 0 ); /* Execute super class */ - if( HB_IS_OBJECT( &hb_stack.Return ) ) + if( HB_IS_OBJECT( hb_stackItemFromTop( -1 ) ) ) // &hb_stack.Return { for( uiClass = 0; ! bFound && uiClass < s_uiClasses; uiClass++ ) { /* Locate the entry */ @@ -1814,18 +1894,22 @@ HB_FUNC( __CLSINSTSUPER ) } } else + { hb_errRT_BASE( EG_ARG, 3002, "Super class does not return an object", "__CLSINSTSUPER", 0 ); + } } else + { hb_errRT_BASE( EG_ARG, 3003, "Cannot find super class", "__CLSINSTSUPER", 0 ); + } } if( ! bFound ) + { hb_retni( 0 ); + } } - - /* * = __cls_CntClsData( ) * @@ -1887,11 +1971,13 @@ HB_FUNC( __CLS_INCDATA ) /* NOTE: Undocumented Clipper function */ +/* see for parameter compatibility with Clipper. */ HB_FUNC( __CLASSNEW ) { HB_FUNCNAME( __CLSNEW )(); } + /* NOTE: Undocumented Clipper function */ HB_FUNC( __CLASSINSTANCE ) @@ -1899,6 +1985,7 @@ HB_FUNC( __CLASSINSTANCE ) HB_FUNCNAME( __CLSINST )(); } + /* NOTE: Undocumented Clipper function */ HB_FUNC( __CLASSADD ) @@ -1906,6 +1993,7 @@ HB_FUNC( __CLASSADD ) HB_FUNCNAME( __CLSADDMSG )(); } + /* NOTE: Undocumented Clipper function */ HB_FUNC( __CLASSNAME ) @@ -1978,7 +2066,9 @@ HB_FUNC( __SENDER ) } if( iLevel == 0 && oSender != NULL && oSender->type == HB_IT_OBJECT ) + { hb_itemReturn( oSender ); + } } /* @@ -2189,21 +2279,24 @@ static HARBOUR hb___msgEvalInline( void ) USHORT uiParam; USHORT uiPCount=hb_pcount(); - hb_itemInit( &block ); + ( &block )->type = HB_IT_NIL; // hb_itemInit( &block ); + hb_arrayGet( s_pClasses[ uiClass - 1 ].pInlines, s_pMethod->uiData, &block ); hb_vmPushSymbol( &hb_symEval ); hb_vmPush( &block ); hb_vmPush( hb_stackSelfItem() ); /* Push self */ + for( uiParam = 1; uiParam <= uiPCount; uiParam++ ) + { hb_vmPush( hb_stackItemFromBase( uiParam ) ); + } hb_vmDo( ( USHORT ) (uiPCount + 1 ) ); /* Self is also an argument */ hb_itemClear( &block ); /* Release block */ } - /* * __msgEval() * @@ -2258,9 +2351,7 @@ static HARBOUR hb___msgSuper( void ) /* And transform it into a fake object */ pCopy->item.asArray.value->uiPrevCls = pObject->item.asArray.value->uiClass; /* backup of actual handel */ pCopy->item.asArray.value->uiClass = s_pMethod->uiSprClass; /* superclass handel casting */ - - pCopy->item.asArray.value->puiClsTree = 0 ; - + pCopy->item.asArray.value->puiClsTree = NULL ; hb_itemRelease(hb_itemReturn( pCopy )); } @@ -2303,8 +2394,9 @@ static HARBOUR hb___msgSetClsData( void ) PHB_ITEM pReturn = hb_stackItemFromBase( 1 ); if( uiClass && uiClass <= s_uiClasses ) - hb_arraySet( s_pClasses[ uiClass - 1 ].pClassDatas, - s_pMethod->uiData, pReturn ); + { + hb_arraySet( s_pClasses[ uiClass - 1 ].pClassDatas, s_pMethod->uiData, pReturn ); + } hb_itemReturn( pReturn ); } @@ -2334,8 +2426,9 @@ static HARBOUR hb___msgSetShrData( void ) PHB_ITEM pReturn = hb_stackItemFromBase( 1 ); if( uiSprCls && uiSprCls <= s_uiClasses ) - hb_arraySet( s_pClasses[ uiSprCls - 1 ].pClassDatas, - s_pMethod->uiDataShared, pReturn ); + { + hb_arraySet( s_pClasses[ uiSprCls - 1 ].pClassDatas, s_pMethod->uiDataShared, pReturn ); + } hb_itemReturn( pReturn ); } @@ -2370,7 +2463,9 @@ static HARBOUR hb___msgSetData( void ) /* will arise only if the class has been modified after first instance */ if( uiIndex > ( USHORT ) hb_arrayLen( pObject ) ) /* Resize needed ? */ + { hb_arraySize( pObject, uiIndex ); /* Make large enough */ + } hb_arraySet( pObject, uiIndex, pReturn );