2013-09-24 16:59 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
* include/hbvm.h
* src/vm/hvm.c
* added new 7-th parameter fOverLoad to hb_vmRegisterSymbols() function.
When it's TRUE then new public function symbols overload existing ones.
* src/vm/runner.c
! use new fOverLoad parameter of hb_vmRegisterSymbols() function to
overload existing functions (HB_HRB_BIND_OVERLOAD) instead of making
local modifications in global symbol table. It fixes memory corruption
when the same HRB module is reloaded with HB_HRB_BIND_OVERLOAD parameter.
This was very old bug which has existed from the beginning when I added
support for HB_HRB_BIND_* flags.
This commit is contained in:
@@ -10,6 +10,20 @@
|
||||
* Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment
|
||||
*/
|
||||
|
||||
2013-09-24 16:59 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
|
||||
* include/hbvm.h
|
||||
* src/vm/hvm.c
|
||||
* added new 7-th parameter fOverLoad to hb_vmRegisterSymbols() function.
|
||||
When it's TRUE then new public function symbols overload existing ones.
|
||||
|
||||
* src/vm/runner.c
|
||||
! use new fOverLoad parameter of hb_vmRegisterSymbols() function to
|
||||
overload existing functions (HB_HRB_BIND_OVERLOAD) instead of making
|
||||
local modifications in global symbol table. It fixes memory corruption
|
||||
when the same HRB module is reloaded with HB_HRB_BIND_OVERLOAD parameter.
|
||||
This was very old bug which has existed from the beginning when I added
|
||||
support for HB_HRB_BIND_* flags.
|
||||
|
||||
2013-09-20 15:42 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
|
||||
* src/rdd/dbcmd.c
|
||||
! fixed dbRSelect() to be compatible with undocumented Cl*pper behavior:
|
||||
|
||||
@@ -90,7 +90,7 @@ extern HB_EXPORT PHB_SYMB hb_vmProcessDynLibSymbols( PHB_SYMB pSymbols, HB_USHOR
|
||||
HB_ULONG ulID; /* module unique identifier */
|
||||
} HB_SYMBOLS, * PHB_SYMBOLS; /* structure to keep track of all modules symbol tables */
|
||||
|
||||
extern PHB_SYMBOLS hb_vmRegisterSymbols( PHB_SYMB pModuleSymbols, HB_USHORT uiSymbols, const char * szModuleName, HB_ULONG ulID, HB_BOOL fDynLib, HB_BOOL fClone );
|
||||
extern PHB_SYMBOLS hb_vmRegisterSymbols( PHB_SYMB pModuleSymbols, HB_USHORT uiSymbols, const char * szModuleName, HB_ULONG ulID, HB_BOOL fDynLib, HB_BOOL fClone, HB_BOOL fOverLoad );
|
||||
extern HB_BOOL hb_vmLockModuleSymbols( void );
|
||||
extern void hb_vmUnlockModuleSymbols( void );
|
||||
extern void hb_vmFreeSymbols( PHB_SYMBOLS pSymbols );
|
||||
|
||||
17
src/vm/hvm.c
17
src/vm/hvm.c
@@ -7841,13 +7841,14 @@ void hb_vmExitSymbolGroup( void * hDynLib )
|
||||
|
||||
PHB_SYMBOLS hb_vmRegisterSymbols( PHB_SYMB pModuleSymbols, HB_USHORT uiSymbols,
|
||||
const char * szModuleName, HB_ULONG ulID,
|
||||
HB_BOOL fDynLib, HB_BOOL fClone )
|
||||
HB_BOOL fDynLib, HB_BOOL fClone,
|
||||
HB_BOOL fOverLoad )
|
||||
{
|
||||
PHB_SYMBOLS pNewSymbols;
|
||||
HB_BOOL fRecycled, fInitStatics = HB_FALSE;
|
||||
HB_USHORT ui;
|
||||
|
||||
HB_TRACE( HB_TR_DEBUG, ( "hb_vmRegisterSymbols(%p,%hu,%s,%lu,%d,%d)", pModuleSymbols, uiSymbols, szModuleName, ulID, ( int ) fDynLib, ( int ) fClone ) );
|
||||
HB_TRACE( HB_TR_DEBUG, ( "hb_vmRegisterSymbols(%p,%hu,%s,%lu,%d,%d,%d)", pModuleSymbols, uiSymbols, szModuleName, ulID, ( int ) fDynLib, ( int ) fClone, ( int ) fOverLoad ) );
|
||||
|
||||
pNewSymbols = s_ulFreeSymbols == 0 ? NULL :
|
||||
hb_vmFindFreeModule( pModuleSymbols, uiSymbols, szModuleName, ulID );
|
||||
@@ -7972,6 +7973,13 @@ PHB_SYMBOLS hb_vmRegisterSymbols( PHB_SYMB pModuleSymbols, HB_USHORT uiSymbols,
|
||||
|
||||
if( pDynSym )
|
||||
{
|
||||
if( fOverLoad && ( pSymbol->scope.value & HB_FS_LOCAL ) != 0 )
|
||||
{
|
||||
/* overload existing public function */
|
||||
pDynSym->pSymbol = pSymbol;
|
||||
hb_vmSetDynFunc( pDynSym );
|
||||
continue;
|
||||
}
|
||||
pSymbol->pDynSym = pDynSym;
|
||||
if( pDynSym->pSymbol != pSymbol && HB_VM_ISFUNC( pDynSym->pSymbol ) &&
|
||||
( pDynSym->pSymbol->value.pFunPtr != pSymbol->value.pFunPtr ||
|
||||
@@ -8033,7 +8041,8 @@ PHB_SYMB hb_vmProcessSymbols( PHB_SYMB pSymbols, HB_USHORT uiModuleSymbols,
|
||||
|
||||
hb_vmVerifyPCodeVersion( szModuleName, uiPCodeVer );
|
||||
return hb_vmRegisterSymbols( pSymbols, uiModuleSymbols, szModuleName, ulID,
|
||||
s_fCloneSym, s_fCloneSym )->pModuleSymbols;
|
||||
s_fCloneSym, s_fCloneSym,
|
||||
HB_FALSE )->pModuleSymbols;
|
||||
}
|
||||
|
||||
PHB_SYMB hb_vmProcessDynLibSymbols( PHB_SYMB pSymbols, HB_USHORT uiModuleSymbols,
|
||||
@@ -8044,7 +8053,7 @@ PHB_SYMB hb_vmProcessDynLibSymbols( PHB_SYMB pSymbols, HB_USHORT uiModuleSymbols
|
||||
|
||||
hb_vmVerifyPCodeVersion( szModuleName, uiPCodeVer );
|
||||
return hb_vmRegisterSymbols( pSymbols, uiModuleSymbols, szModuleName, ulID,
|
||||
HB_TRUE, HB_TRUE )->pModuleSymbols;
|
||||
HB_TRUE, HB_TRUE, HB_FALSE )->pModuleSymbols;
|
||||
}
|
||||
|
||||
static void hb_vmReleaseLocalSymbols( void )
|
||||
|
||||
@@ -525,7 +525,7 @@ static PHRB_BODY hb_hrbLoad( const char * szHrbBody, HB_SIZE nBodySize, HB_USHOR
|
||||
|
||||
if( hb_vmLockModuleSymbols() )
|
||||
{
|
||||
if( usBind == HB_HRB_BIND_LOCAL || usBind == HB_HRB_BIND_OVERLOAD )
|
||||
if( usBind == HB_HRB_BIND_LOCAL )
|
||||
{
|
||||
for( ul = 0; ul < pHrbBody->ulSymbols; ul++ )
|
||||
{
|
||||
@@ -535,24 +535,17 @@ static PHRB_BODY hb_hrbLoad( const char * szHrbBody, HB_SIZE nBodySize, HB_USHOR
|
||||
pDynSym = hb_dynsymFind( pSymRead[ ul ].szName );
|
||||
if( pDynSym )
|
||||
{
|
||||
if( usBind == HB_HRB_BIND_LOCAL )
|
||||
{
|
||||
/* convert public function to static one */
|
||||
pSymRead[ ul ].scope.value |= HB_FS_STATIC;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* overload existing public function */
|
||||
pDynSym->pSymbol = &pSymRead[ ul ];
|
||||
hb_vmSetDynFunc( pDynSym );
|
||||
}
|
||||
/* convert public function to static one */
|
||||
pSymRead[ ul ].scope.value |= HB_FS_STATIC;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pHrbBody->pModuleSymbols = hb_vmRegisterSymbols( pHrbBody->pSymRead,
|
||||
( HB_USHORT ) pHrbBody->ulSymbols, szFileName ? szFileName : "pcode.hrb", 0, HB_TRUE, HB_FALSE );
|
||||
( HB_USHORT ) pHrbBody->ulSymbols,
|
||||
szFileName ? szFileName : "pcode.hrb", 0,
|
||||
HB_TRUE, HB_FALSE, usBind == HB_HRB_BIND_OVERLOAD );
|
||||
|
||||
if( pHrbBody->pModuleSymbols->pModuleSymbols != pSymRead )
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user