2014-01-29 09:38 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)

* include/harbour.hbx
  * src/vm/dynsym.c
    + added PRG function which verifies internal global symbol table
      structure:
         __dynsVerify() -> <nError> (0 => no errors detected)

  * include/harbour.hbx
  * src/vm/hvm.c
    + added PRG function which verifies internal module symbol tables:
         __vmModulesVerify() -> <acBrokenSymbols>

  * include/harbour.hbx
  * src/vm/classes.c
    + added PRG function which verifies given class internal structure:
         __clsVerify( <nClassH> ) -> <acBrokenMessages> | NIL
This commit is contained in:
Przemysław Czerpak
2014-01-29 09:38:38 +01:00
parent a193cca9ad
commit c5d3403da5
5 changed files with 135 additions and 2 deletions

View File

@@ -10,6 +10,23 @@
* Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment
*/
2014-01-29 09:38 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
* include/harbour.hbx
* src/vm/dynsym.c
+ added PRG function which verifies internal global symbol table
structure:
__dynsVerify() -> <nError> (0 => no errors detected)
* include/harbour.hbx
* src/vm/hvm.c
+ added PRG function which verifies internal module symbol tables:
__vmModulesVerify() -> <acBrokenSymbols>
* include/harbour.hbx
* src/vm/classes.c
+ added PRG function which verifies given class internal structure:
__clsVerify( <nClassH> ) -> <acBrokenMessages> | NIL
2014-01-27 15:04 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
* src/3rd/zlib/zutil.c
! do not define dummy errno variable in WinCE builds - it's probably

View File

@@ -1283,6 +1283,7 @@ DYNAMIC __clsPreallocate
DYNAMIC __clsSyncSignal
DYNAMIC __clsSyncWait
DYNAMIC __clsUnlockDef
DYNAMIC __clsVerify
DYNAMIC __cls_CntClsData
DYNAMIC __cls_CntData
DYNAMIC __cls_CntShrData
@@ -1370,6 +1371,7 @@ DYNAMIC __dynsIsFun
DYNAMIC __dynsN2Ptr
DYNAMIC __dynsN2Sym
DYNAMIC __dynsP2Name
DYNAMIC __dynsVerify
DYNAMIC __eInstVar52
DYNAMIC __eInstVar53
DYNAMIC __Eject
@@ -1499,6 +1501,7 @@ DYNAMIC __TextSave
DYNAMIC __TracePrgCalls
DYNAMIC __TypeFile
DYNAMIC __vmItemID
DYNAMIC __vmModulesVerify
DYNAMIC __vmNoInternals
DYNAMIC __Wait
DYNAMIC __wapi_GetACP

View File

@@ -1917,7 +1917,7 @@ PHB_SYMB hb_objGetMethod( PHB_ITEM pObject, PHB_SYMB pMessage,
}
#else
{
PMETHOD pMethod = hb_clsFindMsg( pClass, pMsg );
PMETHOD pMethod = b_clsFindMsg( pClass, pMsg );
if( pMethod )
{
pStack->uiMethod = ( HB_USHORT ) ( pMethod - pClass->pMethods );
@@ -5681,6 +5681,39 @@ void hb_clsAssociate( HB_USHORT usClassH )
}
}
HB_FUNC( __CLSVERIFY )
{
HB_USHORT uiClass = ( HB_USHORT ) hb_parni( 1 );
PHB_ITEM pReturn = hb_itemNew( NULL );
if( uiClass && uiClass <= s_uiClasses )
{
PCLASS pClass = s_pClasses[ uiClass ];
PMETHOD pMethod = pClass->pMethods;
HB_SIZE nLimit = hb_clsMthNum( pClass ), nPos = 0;
hb_arrayNew( pReturn, pClass->uiMethods );
do
{
if( pMethod->pMessage )
{
PHB_DYNS pDynSym = hb_dynsymFind( pMethod->pMessage->pSymbol->szName );
if( pMethod->pMessage != pDynSym ||
hb_clsFindMsg( pClass, pDynSym ) != pMethod )
hb_arraySetC( pReturn, ++nPos, pMethod->pMessage->pSymbol->szName );
}
++pMethod;
}
while( --nLimit );
if( nPos < ( HB_SIZE ) pClass->uiMethods )
hb_arraySize( pReturn, nPos );
}
hb_itemReturnRelease( pReturn );
}
#if 0
/*
* return real function name ignoring aliasing

View File

@@ -772,3 +772,43 @@ HB_FUNC( __DYNSP2NAME )
hb_retc( pDynSym != NULL ? pDynSym->pSymbol->szName : NULL );
}
/* internal function used to debug dynamic symbol integrity */
static int hb_dynsymVerify( void )
{
HB_USHORT uiPos = 0;
int iResult = 0;
HB_TRACE( HB_TR_DEBUG, ( "hb_dynsymVerify()" ) );
HB_DYNSYM_LOCK();
while( iResult == 0 && uiPos < s_uiDynSymbols )
{
PHB_DYNS pDynSym = s_pDynItems[ uiPos ].pDynSym;
HB_UINT uiAt;
int iCmp;
if( uiPos > 0 &&
( iCmp = strcmp( s_pDynItems[ uiPos - 1 ].pDynSym->pSymbol->szName,
pDynSym->pSymbol->szName ) ) <= 0 )
iResult = iCmp == 0 ? -1 : -2;
else if( hb_dynsymPos( pDynSym->pSymbol->szName, &uiAt ) != pDynSym )
iResult = -3;
else if( uiAt != uiPos )
iResult = -4;
else
++uiPos;
}
HB_DYNSYM_UNLOCK();
return iResult;
}
HB_FUNC( __DYNSVERIFY )
{
HB_STACK_TLS_PRELOAD
hb_retni( hb_dynsymVerify() );
}

View File

@@ -8008,6 +8008,40 @@ PHB_SYMBOLS hb_vmRegisterSymbols( PHB_SYMB pModuleSymbols, HB_USHORT uiSymbols,
return pNewSymbols;
}
static void hb_vmVerifySymbols( PHB_ITEM pArray )
{
PHB_SYMBOLS pLastSymbols = s_pSymbols;
PHB_ITEM pItem = NULL;
HB_TRACE( HB_TR_DEBUG, ( "hb_vmVerifySymbols(%p)", pArray ) );
hb_arrayNew( pArray, 0 );
while( pLastSymbols )
{
HB_USHORT ui, uiSymbols = pLastSymbols->uiModuleSymbols;
for( ui = 0; ui < uiSymbols; ++ui )
{
PHB_SYMB pSym = pLastSymbols->pModuleSymbols + ui;
if( pSym->pDynSym &&
hb_dynsymFind( pSym->szName ) != pSym->pDynSym )
{
char szText[ 256 ];
hb_snprintf( szText, sizeof( szText ), "%s->%s",
pLastSymbols->szModuleName, pSym->szName );
pItem = hb_itemPutC( pItem, szText );
hb_arrayAddForward( pArray, pItem );
}
}
pLastSymbols = pLastSymbols->pNext;
}
if( pItem )
hb_itemRelease( pItem );
}
static void hb_vmVerifyPCodeVersion( const char * szModuleName, HB_USHORT uiPCodeVer )
{
if( uiPCodeVer != 0 )
@@ -8023,7 +8057,6 @@ static void hb_vmVerifyPCodeVersion( const char * szModuleName, HB_USHORT uiPCod
"Please recompile.", szModuleName, szPCode );
}
}
}
/*
@@ -12138,6 +12171,13 @@ HB_FUNC( __VMITEMID )
}
}
HB_FUNC( __VMMODULESVERIFY )
{
HB_STACK_TLS_PRELOAD
hb_vmVerifySymbols( hb_stackReturnItem() );
}
HB_FUNC( HB_ARRAYTOPARAMS )
{
HB_STACK_TLS_PRELOAD