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:
Przemysław Czerpak
2013-09-24 16:59:52 +02:00
parent 65bf59cd3b
commit 344bedfe68
4 changed files with 34 additions and 18 deletions

View File

@@ -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:

View File

@@ -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 );

View File

@@ -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 )

View File

@@ -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 )
{