2010-05-17 13:37 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)

* harbour/include/hbapi.h
  * harbour/src/vm/dynsym.c
    + added to C functions:
         int hb_dynsymToNum( PHB_DYNS pDynSym );
         PHB_DYNS hb_dynsymFromNum( int iSymNum );
      which can be used to make conversion between dynamic symbols and
      numbers
This commit is contained in:
Przemyslaw Czerpak
2010-05-17 11:37:27 +00:00
parent f093d0a28b
commit 1820ba8248
3 changed files with 64 additions and 0 deletions

View File

@@ -17,6 +17,15 @@
past entries belonging to author(s): Viktor Szakats.
*/
2010-05-17 13:37 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbapi.h
* harbour/src/vm/dynsym.c
+ added to C functions:
int hb_dynsymToNum( PHB_DYNS pDynSym );
PHB_DYNS hb_dynsymFromNum( int iSymNum );
which can be used to make conversion between dynamic symbols and
numbers
2010-15-16 23:02 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com)
* contrib/hbide/hbide.prg
* contrib/hbide/idemisc.prg

View File

@@ -987,6 +987,8 @@ extern HB_EXPORT HB_BOOL hb_dynsymIsFunction( PHB_DYNS pDynSym );
extern HB_EXPORT HB_BOOL hb_dynsymIsMemvar( PHB_DYNS pDynSym );
extern HB_EXPORT int hb_dynsymAreaHandle( PHB_DYNS pDynSym ); /* return work area number bound with given dynamic symbol */
extern HB_EXPORT void hb_dynsymSetAreaHandle( PHB_DYNS pDynSym, int iArea ); /* set work area number for a given dynamic symbol */
extern HB_EXPORT int hb_dynsymToNum( PHB_DYNS pDynSym );
extern HB_EXPORT PHB_DYNS hb_dynsymFromNum( int iSymNum );
#ifdef _HB_API_INTERNAL_
extern PHB_ITEM hb_dynsymGetMemvar( PHB_DYNS pDynSym ); /* return memvar handle number bound with given dynamic symbol */
extern void hb_dynsymSetMemvar( PHB_DYNS pDynSym, PHB_ITEM pMemvar ); /* set memvar handle for a given dynamic symbol */

View File

@@ -94,6 +94,10 @@ static HB_USHORT s_uiDynSymbols = 0; /* Number of symbols present */
static PHB_SYM_HOLDER s_pAllocSyms = NULL;/* symbols allocated dynamically */
/* table index for dynamic symbol to number conversions */
static PDYNHB_ITEM s_pDynIndex = NULL;
static int s_iDynIdxSize = 0;
/* Insert new symbol into dynamic symbol table.
* In MT mode caller should protected it by HB_DYNSYM_LOCK
*/
@@ -528,6 +532,48 @@ long hb_dynsymCount( void )
return s_uiDynSymbols;
}
int hb_dynsymToNum( PHB_DYNS pDynSym )
{
int iSymNum;
HB_TRACE(HB_TR_DEBUG, ("hb_dynsymToNum(%p)", pDynSym));
HB_DYNSYM_LOCK
iSymNum = pDynSym->uiSymNum;
if( iSymNum > s_iDynIdxSize )
{
s_pDynIndex = hb_xrealloc( s_pDynIndex, iSymNum * sizeof( DYNHB_ITEM ) );
memset( &s_pDynIndex[ s_iDynIdxSize ], 0, ( iSymNum - s_iDynIdxSize ) *
sizeof( DYNHB_ITEM ) );
s_iDynIdxSize = iSymNum;
}
if( s_pDynIndex[ iSymNum - 1 ].pDynSym == NULL )
s_pDynIndex[ iSymNum - 1 ].pDynSym = pDynSym;
HB_DYNSYM_UNLOCK
return iSymNum;
}
PHB_DYNS hb_dynsymFromNum( int iSymNum )
{
PHB_DYNS pDynSym;
HB_TRACE(HB_TR_DEBUG, ("hb_dynsymFromNum(%d)", iSymNum));
HB_DYNSYM_LOCK
pDynSym = iSymNum > 0 && iSymNum <= s_iDynIdxSize ?
s_pDynIndex[ iSymNum - 1 ].pDynSym : NULL;
HB_DYNSYM_UNLOCK
return pDynSym;
}
void hb_dynsymEval( PHB_DYNS_FUNC pFunction, void * Cargo )
{
PHB_DYNS pDynSym = NULL;
@@ -586,6 +632,13 @@ void hb_dynsymRelease( void )
HB_DYNSYM_LOCK
if( s_iDynIdxSize )
{
hb_xfree( s_pDynIndex );
s_pDynIndex = NULL;
s_iDynIdxSize = 0;
}
if( s_uiDynSymbols )
{
do