From 3a70811b1a3b44cd08f57c34416210bac469e014 Mon Sep 17 00:00:00 2001 From: carl Date: Fri, 9 Aug 2002 19:10:59 +0000 Subject: [PATCH] * fixed generic exception management --- compiler/ncgflw.pas | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/compiler/ncgflw.pas b/compiler/ncgflw.pas index d347bd8b5f..9566646c51 100644 --- a/compiler/ncgflw.pas +++ b/compiler/ncgflw.pas @@ -693,6 +693,23 @@ do_jmp: endexceptlabel : tasmlabel; + procedure try_new_exception(list : taasmoutput;var jmpbuf,envbuf, href : treference; + a : aword; exceptlabel : tasmlabel); + begin + tg.gettempofsizereferencepersistant(list,24,jmpbuf); + tg.gettempofsizereferencepersistant(list,12,envbuf); + tg.gettempofsizereferencepersistant(list,sizeof(aword),href); + new_exception(list, jmpbuf,envbuf, href, a, exceptlabel); + end; + + + procedure try_free_exception(list : taasmoutput;var jmpbuf, envbuf, href : treference; + a : aword ; endexceptlabel : tasmlabel; onlyfree : boolean); + begin + free_exception(list, jmpbuf, envbuf, href, a, endexceptlabel, onlyfree); + tg.ungetpersistanttempreference(list,jmpbuf); + tg.ungetpersistanttempreference(list,envbuf); + end; @@ -763,7 +780,7 @@ do_jmp: getlabel(endexceptlabel); getlabel(lastonlabel); - cg.g_new_exception(exprasmlist,tempbuf,tempaddr,href,1,exceptlabel); + try_new_exception(exprasmlist,tempbuf,tempaddr,href,1,exceptlabel); { try block } { set control flow labels for the try block } @@ -784,7 +801,7 @@ do_jmp: cg.a_label(exprasmlist,exceptlabel); - cg.g_free_exception(exprasmlist,tempbuf,tempaddr,href,0,endexceptlabel,false); + try_free_exception(exprasmlist,tempbuf,tempaddr,href,0,endexceptlabel,false); cg.a_label(exprasmlist,doexceptlabel); @@ -820,7 +837,7 @@ do_jmp: getlabel(doobjectdestroy); getlabel(doobjectdestroyandreraise); - cg.g_new_exception(exprasmlist,tempbuf,tempaddr,href,1,exceptlabel); + try_new_exception(exprasmlist,tempbuf,tempaddr,href,1,exceptlabel); { here we don't have to reset flowcontrol } { the default and on flowcontrols are handled equal } @@ -829,7 +846,7 @@ do_jmp: cg.a_label(exprasmlist,doobjectdestroyandreraise); - cg.g_free_exception(exprasmlist,tempbuf,tempaddr,href,0,doobjectdestroy,false); + try_free_exception(exprasmlist,tempbuf,tempaddr,href,0,doobjectdestroy,false); cg.a_call_name(exprasmlist,'FPC_POPSECONDOBJECTSTACK'); @@ -972,7 +989,7 @@ do_jmp: getlabel(doobjectdestroyandreraise); { call setjmp, and jump to finally label on non-zero result } - cg.g_new_exception(exprasmlist,tempbuf,tempaddr,href,1,doobjectdestroyandreraise); + try_new_exception(exprasmlist,tempbuf,tempaddr,href,1,doobjectdestroyandreraise); if assigned(right) then begin @@ -998,7 +1015,7 @@ do_jmp: getlabel(doobjectdestroy); cg.a_label(exprasmlist,doobjectdestroyandreraise); - cg.g_free_exception(exprasmlist,tempbuf,tempaddr,href,0,doobjectdestroy,false); + try_free_exception(exprasmlist,tempbuf,tempaddr,href,0,doobjectdestroy,false); cg.a_call_name(exprasmlist,'FPC_POPSECONDOBJECTSTACK'); cg.a_param_reg(exprasmlist, OS_ADDR, accumulator, paramanager.getintparaloc(1)); @@ -1103,7 +1120,7 @@ do_jmp: end; { call setjmp, and jump to finally label on non-zero result } - cg.g_new_exception(exprasmlist,tempbuf,tempaddr,href,1,finallylabel); + try_new_exception(exprasmlist,tempbuf,tempaddr,href,1,finallylabel); { try code } if assigned(left) then @@ -1116,7 +1133,7 @@ do_jmp: cg.a_label(exprasmlist,finallylabel); { just free the frame information } - cg.g_free_exception(exprasmlist,tempbuf,tempaddr,href,1,finallylabel,true); + try_free_exception(exprasmlist,tempbuf,tempaddr,href,1,finallylabel,true); { finally code } flowcontrol:=[]; @@ -1209,7 +1226,10 @@ begin end. { $Log$ - Revision 1.31 2002-08-04 19:06:41 carl + Revision 1.32 2002-08-09 19:10:59 carl + * fixed generic exception management + + Revision 1.31 2002/08/04 19:06:41 carl + added generic exception support (still does not work!) + more documentation