From 1d9fdf35aa5332ed3ac450eb44cde0cfdc556d62 Mon Sep 17 00:00:00 2001 From: Ron Pinkas Date: Sun, 9 Jul 2000 08:34:21 +0000 Subject: [PATCH] 2000-07-09 01:02 UTC+0800 Ron Pinkas * include/hbcomp.h + Added: external BOOL hb_comp_bSimpLex * source/compiler/harbour.c + Added: BOOL hb_comp_bSimpLex + Added: if( hb_comp_bSimpLex ) tests before releasing name strings of vars, and symbols. + Added: call to hb_compReleaseStrings(), if hb_comp_SimpLes is TRUE, after code generation. * source/compiler/harbour.slx + Added: logic to resuse same allocated strings when string for identifier was perviously allocated. + Added: INIT_ACTION macro to set hb_comp_bSimpLex to TRUE. + Added: Function hb_compReleaseStrings() * source/compiler/harbour.l + Added: empty Function hb_compReleaseStrings() to avoid link error. * source/compiler/hbslex.c * source/compiler/simplex.c * Moved standard #includes from simplex to hbslex. --- harbour/ChangeLog | 21 +++++++++++ harbour/include/hbcomp.h | 1 + harbour/source/compiler/harbour.c | 50 +++++++++++++++++++------ harbour/source/compiler/harbour.l | 4 ++ harbour/source/compiler/harbour.slx | 57 ++++++++++++++++++++++++----- harbour/source/compiler/hbslex.c | 6 +++ harbour/source/compiler/simplex.c | 14 ++++--- 7 files changed, 127 insertions(+), 26 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index e09e89ad0a..76637962e1 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,24 @@ +2000-07-09 01:02 UTC+0800 Ron Pinkas + * include/hbcomp.h + + Added: external BOOL hb_comp_bSimpLex + + * source/compiler/harbour.c + + Added: BOOL hb_comp_bSimpLex + + Added: if( hb_comp_bSimpLex ) tests before releasing name strings of vars, and symbols. + + Added: call to hb_compReleaseStrings(), if hb_comp_SimpLes is TRUE, after code generation. + + * source/compiler/harbour.slx + + Added: logic to resuse same allocated strings when string for identifier was perviously allocated. + + Added: INIT_ACTION macro to set hb_comp_bSimpLex to TRUE. + + Added: Function hb_compReleaseStrings() + + * source/compiler/harbour.l + + Added: empty Function hb_compReleaseStrings() to avoid link error. + + * source/compiler/hbslex.c + * source/compiler/simplex.c + * Moved standard #includes from simplex to hbslex. + 2000-07-08 19:50 UTC+0800 Ron Pinkas * source\compiler\simplex.c * source\compiler\harbour.slx diff --git a/harbour/include/hbcomp.h b/harbour/include/hbcomp.h index ee325c0239..77455cec07 100644 --- a/harbour/include/hbcomp.h +++ b/harbour/include/hbcomp.h @@ -476,6 +476,7 @@ extern char * hb_comp_szWarnings[]; extern char * hb_pp_STD_CH; extern BOOL hb_comp_bAutoOpen; extern BOOL hb_comp_bError; +extern BOOL hb_comp_bSimpLex; /* /GC command line setting types */ #define HB_COMPGENC_COMPACT 0 diff --git a/harbour/source/compiler/harbour.c b/harbour/source/compiler/harbour.c index 6b7c5833e6..ce6498bc35 100644 --- a/harbour/source/compiler/harbour.c +++ b/harbour/source/compiler/harbour.c @@ -129,6 +129,7 @@ char * hb_comp_szDeclaredFun = NULL; BOOL hb_comp_bAutoOpen = TRUE; BOOL hb_comp_bError = FALSE; +BOOL hb_comp_bSimpLex = FALSE; /* EXTERNAL statement can be placed into any place in a function - this flag is * used to suppress error report generation @@ -1126,7 +1127,9 @@ PFUNCTION hb_compFunctionKill( PFUNCTION pFunc ) pVar = pFunc->pLocals; pFunc->pLocals = pVar->pNext; - hb_xfree( ( void * ) pVar->szName ); + if( ! hb_comp_bSimpLex ) + hb_xfree( ( void * ) pVar->szName ); + hb_xfree( ( void * ) pVar ); } @@ -1135,7 +1138,9 @@ PFUNCTION hb_compFunctionKill( PFUNCTION pFunc ) pVar = pFunc->pStatics; pFunc->pStatics = pVar->pNext; - hb_xfree( ( void * ) pVar->szName ); + if( ! hb_comp_bSimpLex ) + hb_xfree( ( void * ) pVar->szName ); + hb_xfree( ( void * ) pVar ); } @@ -1144,11 +1149,15 @@ PFUNCTION hb_compFunctionKill( PFUNCTION pFunc ) pVar = pFunc->pFields; pFunc->pFields = pVar->pNext; - hb_xfree( ( void * ) pVar->szName ); + if( ! hb_comp_bSimpLex ) + hb_xfree( ( void * ) pVar->szName ); + if( pVar->szAlias ) { - hb_xfree( ( void * ) pVar->szAlias ); + if( ! hb_comp_bSimpLex ) + hb_xfree( ( void * ) pVar->szAlias ); } + hb_xfree( ( void * ) pVar ); } @@ -1157,11 +1166,15 @@ PFUNCTION hb_compFunctionKill( PFUNCTION pFunc ) pVar = pFunc->pMemvars; pFunc->pMemvars = pVar->pNext; - hb_xfree( ( void * ) pVar->szName ); + if( ! hb_comp_bSimpLex ) + hb_xfree( ( void * ) pVar->szName ); + if( pVar->szAlias ) { - hb_xfree( ( void * ) pVar->szAlias ); + if( ! hb_comp_bSimpLex ) + hb_xfree( ( void * ) pVar->szAlias ); } + hb_xfree( ( void * ) pVar ); } @@ -1170,11 +1183,15 @@ PFUNCTION hb_compFunctionKill( PFUNCTION pFunc ) pVar = pFunc->pPrivates; pFunc->pPrivates = pVar->pNext; - hb_xfree( ( void * ) pVar->szName ); + if( ! hb_comp_bSimpLex ) + hb_xfree( ( void * ) pVar->szName ); + if( pVar->szAlias ) { - hb_xfree( ( void * ) pVar->szAlias ); + if( ! hb_comp_bSimpLex ) + hb_xfree( ( void * ) pVar->szAlias ); } + hb_xfree( ( void * ) pVar ); } @@ -1197,7 +1214,9 @@ PCOMSYMBOL hb_compSymbolKill( PCOMSYMBOL pSym ) { PCOMSYMBOL pNext = pSym->pNext; - hb_xfree( ( void * ) pSym->szName ); + if( ! hb_comp_bSimpLex ) + hb_xfree( ( void * ) pSym->szName ); + hb_xfree( ( void * ) pSym ); return pNext; @@ -3247,7 +3266,10 @@ void hb_compCodeBlockEnd( void ) hb_compGenPCode2( HB_LOBYTE( wPos ), HB_HIBYTE( wPos ), ( BOOL ) 0 ); pFree = pVar; - hb_xfree( ( void * ) pFree->szName ); + + if( ! hb_comp_bSimpLex ) + hb_xfree( ( void * ) pFree->szName ); + pVar = pVar->pNext; hb_xfree( ( void * ) pFree ); } @@ -3265,7 +3287,10 @@ void hb_compCodeBlockEnd( void ) /* free used variables */ pFree = pVar; - hb_xfree( ( void * ) pFree->szName ); + + if( ! hb_comp_bSimpLex ) + hb_xfree( ( void * ) pFree->szName ); + pVar = pVar->pNext; hb_xfree( ( void * ) pFree ); } @@ -3610,6 +3635,9 @@ int hb_compCompile( char * szPrg, int argc, char * argv[] ) printf( "\rLines %i, Functions/Procedures %i\n", hb_comp_iLine, hb_comp_iFunctionCnt ); hb_compGenOutput( hb_comp_iLanguage ); + + if( hb_comp_bSimpLex ) + hb_compReleaseStrings(); } } else diff --git a/harbour/source/compiler/harbour.l b/harbour/source/compiler/harbour.l index 3acdd4e3a4..5eefd8a702 100644 --- a/harbour/source/compiler/harbour.l +++ b/harbour/source/compiler/harbour.l @@ -1915,6 +1915,10 @@ static int yy_ConvertNumber( char * szBuffer ) } } +void hb_compReleaseStrings( void ) +{ +} + #ifdef HB_NESTED_COMPILE void * hb_compGet_YY_CURRENT_BUFFER() { diff --git a/harbour/source/compiler/harbour.slx b/harbour/source/compiler/harbour.slx index abb11220da..05eecae2d7 100644 --- a/harbour/source/compiler/harbour.slx +++ b/harbour/source/compiler/harbour.slx @@ -44,8 +44,10 @@ int yy_lex_input( char *, int ); #define YY_INPUT( buf, result, max_size ) result = yy_lex_input( buf, max_size ); -static int iTexts = 0; -char * aTexts[256]; +static int iTexts = 0, iStrings = 0, iString; +static char * aTexts[256]; +static char * aStrings[16384]; +static char * pString; /* ----------------------------------------------------- Language Definitions. ---------------------------------------------------- */ @@ -834,7 +836,7 @@ LANGUAGE_RULES_ARE { #define NEW_LINE_ACTION() \ while( iTexts ) \ { \ - /* printf( "Releasing Text: %i = %s At: %i\n", iTexts, aTexts[iTexts - 1], aTexts[iTexts - 1] ); */ \ + DEBUG_INFO( printf( "Releasing short term Text: %i = %s At: %i\n", iTexts, aTexts[iTexts - 1], aTexts[iTexts - 1] ) ); \ iTexts--; \ hb_xfree( aTexts[iTexts] ); \ }\ @@ -953,15 +955,35 @@ LANGUAGE_RULES_ARE { }\ else\ {\ - DEBUG_INFO( printf( "Element \"%s\" is IDENTIFIER\n", sToken ) );\ + DEBUG_INFO( printf( "Element \"%s\" is IDENTIFIER\n", yytext ) );\ \ - /* Plain Var. */\ - yytext = hb_strdup( yytext );\ - /* aTexts[iTexts++] = yytext; */\ - /* printf( "Text %i At: %i for %s\n", iTexts, aTexts[iTexts - 1], aTexts[iTexts - 1] ); */\ + iString = 0; \ + while( iString < iStrings ) \ + { \ + if( strcmp( yytext, aStrings[ iString ] ) == 0 ) \ + { \ + pString = aStrings[ iString ]; \ + break; \ + } \ + iString++; \ + } \ \ - yylval.string = yytext;\ - iRet = IDENTIFIER;\ + if( iString < iStrings ) \ + { \ + yytext = pString; \ + DEBUG_INFO( printf( "Re-Using Allocation for String \"%s\"\n", yytext ) ); \ + } \ + else \ + { \ + yytext = hb_strdup( yytext ); \ + aStrings[iStrings++] = yytext; \ +\ + /* aTexts[iTexts++] = yytext; */ \ + DEBUG_INFO( printf( "Allocated long term String \"%s\"\n", yytext ) ); \ + } \ +\ + yylval.string = yytext; \ + iRet = IDENTIFIER; \ }\ }\ else\ @@ -1377,6 +1399,9 @@ LANGUAGE_RULES_ARE { x = 0;\ } +#undef INIT_ACTION() + #define INIT_ACTION() hb_comp_bSimpLex = TRUE; + int yy_lex_input( char *buffer, int iBufferSize ) { HB_SYMBOL_UNUSED( buffer ); @@ -1384,3 +1409,15 @@ int yy_lex_input( char *buffer, int iBufferSize ) return hb_pp_Internal( hb_comp_bPPO ? hb_comp_yyppo : NULL, buffer ); } + +void hb_compReleaseStrings( void ) +{ + DEBUG_INFO( printf( "Releasing: %i Strings\n", iStrings ) ); + + iString = 0; + while( iString < iStrings ) + { + hb_xfree( aStrings[ iString ] ); + iString++; + } +} diff --git a/harbour/source/compiler/hbslex.c b/harbour/source/compiler/hbslex.c index 2198669868..1aecc18ff8 100644 --- a/harbour/source/compiler/hbslex.c +++ b/harbour/source/compiler/hbslex.c @@ -1,3 +1,9 @@ +#include "hbcomp.h" +#include "harboury.h" +#include "hbsetup.h" +#include "hberrors.h" +#include "hbdefs.h" + #define SLX_RULES "harbour.slx" #include "simplex.c" diff --git a/harbour/source/compiler/simplex.c b/harbour/source/compiler/simplex.c index 3838e36620..f774343639 100644 --- a/harbour/source/compiler/simplex.c +++ b/harbour/source/compiler/simplex.c @@ -23,11 +23,6 @@ #include #include #include -#include "hbcomp.h" -#include "harboury.h" -#include "hbsetup.h" -#include "hberrors.h" -#include "hbdefs.h" /* These are NOT overidable (yet). */ #define MAX_MATCH 4 @@ -90,6 +85,9 @@ typedef struct _LEX_PAIR #define LEX_CUSTOM_ACTION -65 #define ERR_TOO_COMPLEX_RULE -66 #define YY_BUF_SIZE 16384 + + +#define INIT_ACTION() #define INTERCEPT_ACTION(x) #define CUSTOM_ACTION(x) #define NEW_LINE_ACTION() @@ -832,6 +830,12 @@ int yylex( void /*YYSTYPE * yylval*/ ) } */ + if( bStart ) + { + bStart = FALSE; + INIT_ACTION(); + } + YY_INPUT( (char*) szLexBuffer, iSize, YY_BUF_SIZE ); if( iSize )