diff --git a/harbour/ChangeLog b/harbour/ChangeLog index cc89cb3bda..a72370fc7e 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,12 @@ 2002-12-01 13:30 UTC+0100 Foo Bar */ +2007-05-14 15:40 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/source/compiler/harbour.y + * harbour/source/compiler/harbour.yyc + * harbour/source/compiler/hbmain.c + ! fixed memory leak when error appears during generating codeblock + 2007-05-13 09:20 UTC+0100 Antonio Linares (alinares@fivetechsoft.com) * contrib/adordd/adordd.prg * Improved ADO_PUTVALUE() diff --git a/harbour/source/compiler/harbour.y b/harbour/source/compiler/harbour.y index 00db84eb29..c78cb48a96 100644 --- a/harbour/source/compiler/harbour.y +++ b/harbour/source/compiler/harbour.y @@ -2653,6 +2653,7 @@ BOOL hb_compCheckUnclosedStru( HB_COMP_DECL ) else if( HB_COMP_PARAM->functions.pLast && ( HB_COMP_PARAM->functions.pLast->bFlags & FUN_EXTBLOCK ) ) { + HB_COMP_PARAM->functions.pLast->bFlags &= ~FUN_EXTBLOCK; hb_compGenError( HB_COMP_PARAM, hb_comp_szErrors, 'E', HB_COMP_ERR_UNCLOSED_STRU, "{||...}", NULL ); } else diff --git a/harbour/source/compiler/harbour.yyc b/harbour/source/compiler/harbour.yyc index 043c4a4839..bd97d200e4 100644 --- a/harbour/source/compiler/harbour.yyc +++ b/harbour/source/compiler/harbour.yyc @@ -7959,6 +7959,7 @@ BOOL hb_compCheckUnclosedStru( HB_COMP_DECL ) else if( HB_COMP_PARAM->functions.pLast && ( HB_COMP_PARAM->functions.pLast->bFlags & FUN_EXTBLOCK ) ) { + HB_COMP_PARAM->functions.pLast->bFlags &= ~FUN_EXTBLOCK; hb_compGenError( HB_COMP_PARAM, hb_comp_szErrors, 'E', HB_COMP_ERR_UNCLOSED_STRU, "{||...}", NULL ); } else diff --git a/harbour/source/compiler/hbmain.c b/harbour/source/compiler/hbmain.c index 25c2e4acef..72f212f49a 100644 --- a/harbour/source/compiler/hbmain.c +++ b/harbour/source/compiler/hbmain.c @@ -2426,6 +2426,24 @@ void hb_compExternAdd( HB_COMP_DECL, char * szExternName, HB_SYMBOLSCOPE cScope } } +static void hb_compAddFunc( HB_COMP_DECL, PFUNCTION pFunc ) +{ + while( HB_COMP_PARAM->functions.pLast && + !HB_COMP_PARAM->functions.pLast->szName ) + { + PFUNCTION pBlock = HB_COMP_PARAM->functions.pLast; + HB_COMP_PARAM->functions.pLast = pBlock->pOwner; + hb_compFunctionKill( pBlock ); + } + + if( HB_COMP_PARAM->functions.iCount == 0 ) + HB_COMP_PARAM->functions.pFirst = pFunc; + else + HB_COMP_PARAM->functions.pLast->pNext = pFunc; + HB_COMP_PARAM->functions.pLast = pFunc; + HB_COMP_PARAM->functions.iCount++; +} + /* * Stores a Clipper defined function/procedure * szFunName - name of a function @@ -2485,17 +2503,7 @@ void hb_compFunctionAdd( HB_COMP_DECL, char * szFunName, HB_SYMBOLSCOPE cScope, pFunc = hb_compFunctionNew( HB_COMP_PARAM, szFunName, cScope ); pFunc->bFlags |= iType; - if( HB_COMP_PARAM->functions.iCount == 0 ) - { - HB_COMP_PARAM->functions.pFirst = pFunc; - HB_COMP_PARAM->functions.pLast = pFunc; - } - else - { - HB_COMP_PARAM->functions.pLast->pNext = pFunc; - HB_COMP_PARAM->functions.pLast = pFunc; - } - HB_COMP_PARAM->functions.iCount++; + hb_compAddFunc( HB_COMP_PARAM, pFunc ); HB_COMP_PARAM->lastLinePos = 0; /* optimization of line numbers opcode generation */ HB_COMP_PARAM->ilastLineErr = 0; /* position of last syntax error (line number) */ @@ -2571,17 +2579,7 @@ void hb_compAnnounce( HB_COMP_DECL, char * szFunName ) pFunc = hb_compFunctionNew( HB_COMP_PARAM, szFunName, pSym->cScope ); pFunc->bFlags |= FUN_PROCEDURE; - if( HB_COMP_PARAM->functions.iCount == 0 ) - { - HB_COMP_PARAM->functions.pFirst = pFunc; - HB_COMP_PARAM->functions.pLast = pFunc; - } - else - { - HB_COMP_PARAM->functions.pLast->pNext = pFunc; - HB_COMP_PARAM->functions.pLast = pFunc; - } - HB_COMP_PARAM->functions.iCount++; + hb_compAddFunc( HB_COMP_PARAM, pFunc ); HB_COMP_PARAM->iFunctionCnt++; /* this function have a very limited functionality @@ -4132,10 +4130,8 @@ static void hb_compAddInitFunc( HB_COMP_DECL, PFUNCTION pFunc ) PCOMSYMBOL pSym = hb_compSymbolAdd( HB_COMP_PARAM, pFunc->szName, NULL, HB_SYM_FUNCNAME ); pSym->cScope |= pFunc->cScope; - HB_COMP_PARAM->functions.pLast->pNext = pFunc; - HB_COMP_PARAM->functions.pLast = pFunc; + hb_compAddFunc( HB_COMP_PARAM, pFunc ); hb_compGenPCode1( HB_P_ENDPROC, HB_COMP_PARAM ); - ++HB_COMP_PARAM->functions.iCount; } static void hb_compCompileEnd( HB_COMP_DECL ) @@ -4160,6 +4156,14 @@ static void hb_compCompileEnd( HB_COMP_DECL ) HB_COMP_PARAM->pFileName = NULL; } + while( HB_COMP_PARAM->functions.pLast && + !HB_COMP_PARAM->functions.pLast->szName ) + { + PFUNCTION pFunc = HB_COMP_PARAM->functions.pLast; + HB_COMP_PARAM->functions.pLast = pFunc->pOwner; + hb_compFunctionKill( pFunc ); + } + if( HB_COMP_PARAM->functions.pFirst ) { PFUNCTION pFunc = HB_COMP_PARAM->functions.pFirst;