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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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() );
|
||||
}
|
||||
|
||||
42
src/vm/hvm.c
42
src/vm/hvm.c
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user