From 1820ba8248bf431c985b291b3e90c8f5f58631aa Mon Sep 17 00:00:00 2001 From: Przemyslaw Czerpak Date: Mon, 17 May 2010 11:37:27 +0000 Subject: [PATCH] 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 --- harbour/ChangeLog | 9 +++++++ harbour/include/hbapi.h | 2 ++ harbour/src/vm/dynsym.c | 53 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 33f75b9a24..c8b9d84e68 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -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 diff --git a/harbour/include/hbapi.h b/harbour/include/hbapi.h index 674f49d26e..6bd32113bf 100644 --- a/harbour/include/hbapi.h +++ b/harbour/include/hbapi.h @@ -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 */ diff --git a/harbour/src/vm/dynsym.c b/harbour/src/vm/dynsym.c index b3b934a002..b0165dac69 100644 --- a/harbour/src/vm/dynsym.c +++ b/harbour/src/vm/dynsym.c @@ -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