2009-06-18 21:18 UTC+0200 Jean lefebvre (jfl at mafact dot com)

This commit is contained in:
Jean-Francois Lefebvre
2009-06-18 19:25:56 +00:00
parent 390543ea06
commit 0c36fe41df
4 changed files with 185 additions and 21 deletions

View File

@@ -17,6 +17,31 @@
past entries belonging to author(s): Viktor Szakats.
*/
2009-06-18 21:18 UTC+0200 Jean lefebvre (jfl at mafact dot com)
* vm/runner.c
+ Added options to HB_HRBLOAD() :
HB_HRB_DEFAULT 0 // do not overwrite any functions, ignore
// public HRB functions if functions with
// the same names already exist in HVM
HB_HRB_KEEP_LOCAL 1 // do not overwrite any functions
// but keep local references, so
// if module has public function FOO and
// this function exists also in HVM
// then the function in HRB is converted
// to STATIC one
HB_HRB_KEEP_GLOBAL 2 // overload all existing public functions
// will disable HB_HRBUNLOAD()
* vm/hvm.c
+ added function hb_vmSetFunction( PHB_SYMB pOldSym, PHB_SYMB pNewSym )
(Thanks to Przemek)
* include/hvm.h
+ added function hb_vmSetFunction( PHB_SYMB pOldSym, PHB_SYMB pNewSym )
(Thanks to Przemek)
2009-06-18 18:25 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
* contrib/gtwvg/wvgscrlb.prg
* contrib/gtwvg/wvgclass.prg

View File

@@ -78,6 +78,9 @@ extern HB_EXPORT PHB_SYMB hb_vmProcessSymbols( PHB_SYMB pSymbols, USHORT uiSymbo
extern HB_EXPORT PHB_SYMB hb_vmProcessSymbolsEx( PHB_SYMB pSymbols, USHORT uiSymbols, const char * szModuleName, ULONG ulID, USHORT uiPcodeVer ); /* module symbols initialization with extended information */
extern HB_EXPORT PHB_SYMB hb_vmProcessDynLibSymbols( PHB_SYMB pSymbols, USHORT uiSymbols, const char * szModuleName, ULONG ulID, USHORT uiPcodeVer ); /* module symbols initialization with extended information */
extern HB_EXPORT void hb_vmSetFunction( PHB_SYMB pOldSym, PHB_SYMB pNewSym );
#ifdef _HB_API_INTERNAL_
typedef struct _HB_SYMBOLS
{

View File

@@ -859,6 +859,43 @@ void hb_vmThreadQuitRequest( void * Cargo )
#endif
void hb_vmSetFunction( PHB_SYMB pOldSym, PHB_SYMB pNewSym )
{
PHB_SYMBOLS pLastSymbols = s_pSymbols;
HB_SYMB SymOldBuf, SymNewBuf;
/* make copy of symbols to eliminate possible problem with
* dynamic modification of passed parameters inside the loop
*/
memcpy( &SymOldBuf, pOldSym, sizeof( SymOldBuf ) );
pOldSym = &SymOldBuf;
memcpy( &SymNewBuf, pNewSym, sizeof( SymNewBuf ) );
pNewSym = &SymNewBuf;
while( pLastSymbols )
{
if( pLastSymbols->fActive )
{
USHORT ui, uiSymbols = pLastSymbols->uiModuleSymbols;
for( ui = 0; ui < uiSymbols; ++ui )
{
PHB_SYMB pSym = pLastSymbols->pModuleSymbols + ui;
if( pSym->value.pFunPtr == pOldSym->value.pFunPtr &&
( pSym->value.pFunPtr ||
strcmp( pSym->szName, pOldSym->szName ) == 0 ) )
{
pSym->value.pFunPtr = pNewSym->value.pFunPtr;
pSym->scope.value = pNewSym->scope.value;
}
}
}
pLastSymbols = pLastSymbols->pNext;
}
}
/* application entry point */
void hb_vmInit( BOOL bStartMainProc )

View File

@@ -87,6 +87,7 @@ typedef struct
PHB_SYMB pSymRead; /* Symbols read */
PHB_DYNF pDynFunc; /* Functions read */
PHB_SYMBOLS pModuleSymbols;
BOOL CanUnload;
} HRB_BODY, * PHRB_BODY;
static const BYTE s_szHead[ 4 ] = { 192, 'H', 'R', 'B' };
@@ -98,6 +99,9 @@ static const BYTE s_szHead[ 4 ] = { 192, 'H', 'R', 'B' };
#define SYM_DEFERRED 3 /* lately bound function */
#define SYM_NOT_FOUND 0xFFFFFFFFUL /* Symbol not found. */
#define HB_HRB_DEFAULT 0 /* do not overload anything (like before) */
#define HB_HRB_KEEP_LOCAL 1 /* keep local references but convert as static */
#define HB_HRB_KEEP_GLOBAL 2 /* overload all existing public functions */
static int hb_hrbReadHead( char * szBody, ULONG ulBodySize, ULONG * pulBodyOffset )
{
@@ -299,7 +303,9 @@ static void hb_hrbUnLoad( PHRB_BODY pHrbBody )
hb_xfree( pHrbBody );
}
static PHRB_BODY hb_hrbLoad( char* szHrbBody, ULONG ulBodySize )
static PHRB_BODY hb_hrbLoad( char* szHrbBody, ULONG ulBodySize, USHORT suMode )
{
PHRB_BODY pHrbBody = NULL;
@@ -307,12 +313,13 @@ static PHRB_BODY hb_hrbLoad( char* szHrbBody, ULONG ulBodySize )
{
ULONG ulBodyOffset = 0;
ULONG ulSize; /* Size of function */
ULONG ul, ulPos;
ULONG ul, ulPos, ulfunc;
char * buffer, ch;
PHB_SYMB pSymRead; /* Symbols read */
PHB_DYNF pDynFunc; /* Functions read */
PHB_DYNS pDynSym;
PHB_SYMB pSymFuncExe; /* Function duplicated into exe */
int iVersion = hb_hrbReadHead( szHrbBody, ulBodySize, &ulBodyOffset );
@@ -326,6 +333,7 @@ static PHRB_BODY hb_hrbLoad( char* szHrbBody, ULONG ulBodySize )
pHrbBody->fInit = FALSE;
pHrbBody->fExit = FALSE;
pHrbBody->CanUnload = TRUE;
pHrbBody->lSymStart = -1;
pHrbBody->ulFuncs = 0;
pHrbBody->pSymRead = NULL;
@@ -342,6 +350,7 @@ static PHRB_BODY hb_hrbLoad( char* szHrbBody, ULONG ulBodySize )
/* calculate the size of dynamic symbol table */
ulPos = ulBodyOffset;
ulSize = 0;
ulfunc = 0;
for( ul = 0; ul < pHrbBody->ulSymbols; ul++ ) /* Read symbols in .hrb */
{
@@ -400,6 +409,10 @@ static PHRB_BODY hb_hrbLoad( char* szHrbBody, ULONG ulBodySize )
memset( pDynFunc, 0, pHrbBody->ulFuncs * sizeof( HB_DYNF ) );
pHrbBody->pDynFunc = pDynFunc;
/* ok to much space reserved but ... */
pSymFuncExe = ( PHB_SYMB ) hb_xgrab( pHrbBody->ulFuncs * sizeof( _HB_SYMB ) );
memset( pSymFuncExe, 0, pHrbBody->ulFuncs * sizeof( _HB_SYMB ) );
for( ul = 0; ul < pHrbBody->ulFuncs; ul++ )
{
/* Read name of function */
@@ -432,7 +445,6 @@ static PHRB_BODY hb_hrbLoad( char* szHrbBody, ULONG ulBodySize )
}
/* End of PCODE loading, now linking */
for( ul = 0; ul < pHrbBody->ulSymbols; ul++ )
{
if( pSymRead[ ul ].value.pCodeFunc == ( PHB_PCODEFUNC ) SYM_FUNC )
@@ -446,11 +458,34 @@ static PHRB_BODY hb_hrbLoad( char* szHrbBody, ULONG ulBodySize )
else
{
pSymRead[ ul ].value.pCodeFunc = ( PHB_PCODEFUNC ) pHrbBody->pDynFunc[ ulPos ].pCodeFunc;
pSymRead[ ul ].scope.value |= HB_FS_PCODEFUNC | HB_FS_LOCAL;
/* does the function already exist in exe with different func ptr ? */
pDynSym = hb_dynsymFind( pSymRead[ ul ].szName );
if( pDynSym )
{
if (pSymRead[ ul ].value.pFunPtr != pDynSym->pSymbol->value.pFunPtr)
{
if (suMode == HB_HRB_KEEP_LOCAL)
{
/* Public became Static */
pSymRead[ ul ].scope.value |= HB_FS_PCODEFUNC | HB_FS_STATIC ;
}
else if (suMode == HB_HRB_KEEP_GLOBAL)
{
/* Store to overload global one */
pSymRead[ ul ].scope.value |= HB_FS_PCODEFUNC | HB_FS_LOCAL;
pSymFuncExe[ulfunc++] = pSymRead[ ul ];
}
}
}
else
{
pSymRead[ ul ].scope.value |= HB_FS_PCODEFUNC | HB_FS_LOCAL;
}
}
}
else if( pSymRead[ ul ].value.pCodeFunc == ( PHB_PCODEFUNC ) SYM_DEFERRED )
{
{
pSymRead[ ul ].value.pCodeFunc = ( PHB_PCODEFUNC ) SYM_EXTERN;
pSymRead[ ul ].scope.value |= HB_FS_DEFERRED;
}
@@ -505,7 +540,26 @@ static PHRB_BODY hb_hrbLoad( char* szHrbBody, ULONG ulBodySize )
/* initialize static variables */
hb_hrbInitStatic( pHrbBody );
}
hb_vmUnlockModuleSymbols();
/* working now on function to overload */
for( ul = 0; ul < ulfunc ; ul++ )
{
pDynSym = hb_dynsymFind( pSymFuncExe[ul].szName );
if (pDynSym)
{
/* Overload global here ... thanks to Przemek */
pHrbBody->CanUnload = FALSE; // protect from unload
hb_vmSetFunction( pDynSym->pSymbol, ( PHB_SYMB ) pSymFuncExe+ul ) ;
}
}
if (pSymFuncExe)
hb_xfree( pSymFuncExe );
hb_vmUnlockModuleSymbols();
}
else
{
@@ -518,7 +572,7 @@ static PHRB_BODY hb_hrbLoad( char* szHrbBody, ULONG ulBodySize )
return pHrbBody;
}
static PHRB_BODY hb_hrbLoadFromFile( char* szHrb )
static PHRB_BODY hb_hrbLoadFromFile( char* szHrb, USHORT usMode )
{
char szFileName[ HB_PATH_MAX ];
PHRB_BODY pHrbBody = NULL;
@@ -559,7 +613,7 @@ static PHRB_BODY hb_hrbLoadFromFile( char* szHrb )
hb_fsReadLarge( hFile, pbyBuffer, ulBodySize );
pbyBuffer[ ulBodySize ] = '\0';
pHrbBody = hb_hrbLoad( ( char * ) pbyBuffer, ( ULONG ) ulBodySize );
pHrbBody = hb_hrbLoad( ( char * ) pbyBuffer, ( ULONG ) ulBodySize, usMode );
hb_xfree( pbyBuffer );
}
hb_fsClose( hFile );
@@ -644,9 +698,9 @@ HB_FUNC( HB_HRBRUN )
PHRB_BODY pHrbBody;
if( ulLen > 4 && memcmp( s_szHead, fileOrBody, 4 ) == 0 )
pHrbBody = hb_hrbLoad( fileOrBody, ulLen );
pHrbBody = hb_hrbLoad( fileOrBody, ulLen, HB_HRB_DEFAULT );
else
pHrbBody = hb_hrbLoadFromFile( fileOrBody );
pHrbBody = hb_hrbLoadFromFile( fileOrBody, HB_HRB_DEFAULT );
if( pHrbBody )
{
@@ -675,23 +729,66 @@ HB_FUNC( HB_HRBRUN )
hb_errRT_BASE( EG_ARG, 6103, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
}
/*
HB_HRBLOAD( [<nOptions>, ] <cHrb>, [<xparams>] )
We have the following choices for nOptions :
HB_HRB_DEFAULT 0 // do not overwrite any functions, ignore
// public HRB functions if functions with
// the same names already exist in HVM
HB_HRB_KEEP_LOCAL 1 // do not overwrite any functions
// but keep local references, so
// if module has public function FOO and
// this function exists also in HVM
// then the function in HRB is converted
// to STATIC one
HB_HRB_KEEP_GLOBAL 2 // overload all existing public functions
*/
HB_FUNC( HB_HRBLOAD )
{
ULONG ulLen = hb_parclen( 1 );
ULONG ulLen = 0;
USHORT usMode = HB_HRB_DEFAULT;
USHORT nParam = 1;
char * fileOrBody;
if (hb_pcount()>1)
{
if (HB_ISCHAR(1))
{
ulLen = hb_parclen( 1 );
fileOrBody = hb_parc( 1 );
}
else
{
usMode = (USHORT) hb_parni(1);
ulLen = hb_parclen( 2 );
fileOrBody = hb_parc( 2 );
nParam = 2;
}
}
else
{
ulLen = hb_parclen( 1 );
fileOrBody = hb_parc( 1 );
}
if( ulLen > 0 )
{
char * fileOrBody = hb_parc( 1 );
PHRB_BODY pHrbBody;
if( ulLen > 4 && memcmp( s_szHead, fileOrBody, 4 ) == 0 )
pHrbBody = hb_hrbLoad( fileOrBody, ulLen );
pHrbBody = hb_hrbLoad( fileOrBody, ulLen, usMode );
else
pHrbBody = hb_hrbLoadFromFile( fileOrBody );
pHrbBody = hb_hrbLoadFromFile( fileOrBody, usMode );
if( pHrbBody )
{
int iPCount = hb_pcount() - 1;
int iPCount = hb_pcount() - nParam;
PHB_ITEM * pParams = NULL;
int i;
@@ -700,7 +797,7 @@ HB_FUNC( HB_HRBLOAD )
pParams = ( PHB_ITEM * ) hb_xgrab( sizeof( PHB_ITEM ) * iPCount );
for( i = 0; i < iPCount; i++ )
pParams[ i ] = hb_stackItemFromBase( i + 2 );
pParams[ i ] = hb_stackItemFromBase( i + 2 + nParam );
}
hb_hrbInit( pHrbBody, iPCount, pParams );
@@ -745,17 +842,19 @@ HB_FUNC( HB_HRBUNLOAD )
{
PHRB_BODY * pHrbPtr = ( PHRB_BODY * ) hb_parptrGC( hb_hrb_Destructor, 1 );
if( pHrbPtr )
{
if( pHrbPtr )
{
PHRB_BODY pHrbBody = *pHrbPtr;
if( pHrbBody )
{
*pHrbPtr = NULL;
hb_hrbUnLoad( pHrbBody );
if( pHrbBody->CanUnload)
hb_hrbUnLoad( pHrbBody );
}
}
else
}
else
hb_errRT_BASE( EG_ARG, 6105, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
}