diff --git a/harbour/ChangeLog b/harbour/ChangeLog index c4058375b8..4a85a8750a 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,11 @@ 2009-12-31 13:59 UTC+0100 Foo Bar (foo.bar foobar.org) */ +2009-04-23 14:42 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/source/vm/hvm.c + % optimized memory allocation in cloned symbol tables to store + whole symbol table with all symbol names in single memory block + 2009-04-23 11:53 UTC+0200 Viktor Szakats (harbour.01 syenar hu) * contrib/hbqt/tests/hbqt.hbp * Minor adjustment to supc++ lib inclusion filter. diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index 9fc462afcd..b7f8c7c967 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -7523,13 +7523,21 @@ PHB_SYMBOLS hb_vmRegisterSymbols( PHB_SYMB pModuleSymbols, USHORT uiSymbols, if( fClone ) { - PHB_SYMB pSymbols = ( PHB_SYMB ) hb_xgrab( uiSymbols * sizeof( HB_SYMB ) ); - memcpy( pSymbols, pModuleSymbols, uiSymbols * sizeof( HB_SYMB ) ); + ULONG ulSymSize = ( ULONG ) uiSymbols * sizeof( HB_SYMB ), ulSize; + char * buffer; + + ulSize = ulSymSize; + for( ui = 0; ui < uiSymbols; ui++ ) + ulSize += ( ULONG ) strlen( pModuleSymbols[ ui ].szName ) + 1; + buffer = ( char * ) memcpy( hb_xgrab( ulSize ), pModuleSymbols, ulSymSize ); + pModuleSymbols = ( PHB_SYMB ) buffer; for( ui = 0; ui < uiSymbols; ui++ ) { - pSymbols[ ui ].szName = hb_strdup( pSymbols[ ui ].szName ); + buffer += ulSymSize; + ulSymSize = ( ULONG ) strlen( pModuleSymbols[ ui ].szName ) + 1; + memcpy( buffer, pModuleSymbols[ ui ].szName, ulSymSize ); + pModuleSymbols[ ui ].szName = buffer; } - pModuleSymbols = pSymbols; } pNewSymbols = ( PHB_SYMBOLS ) hb_xgrab( sizeof( HB_SYMBOLS ) ); @@ -7725,25 +7733,10 @@ static void hb_vmReleaseLocalSymbols( void ) pDestroy = s_pSymbols; s_pSymbols = s_pSymbols->pNext; - if( pDestroy->szModuleName ) - { hb_xfree( pDestroy->szModuleName ); - } if( pDestroy->fAllocated ) - { - USHORT ui; - for( ui = 0; ui < pDestroy->uiModuleSymbols; ++ui ) - { - PHB_SYMB pSymbol = pDestroy->pModuleSymbols + ui; - if( pSymbol->pDynSym && pSymbol->pDynSym->pSymbol == pSymbol ) - { - pSymbol->pDynSym->pSymbol = NULL; - } - hb_xfree( ( void * ) pSymbol->szName ); - } hb_xfree( pDestroy->pModuleSymbols ); - } hb_xfree( pDestroy ); } }