From 563a0dc818136e25afe71141919a20c1ccd39000 Mon Sep 17 00:00:00 2001 From: peter Date: Sat, 24 Aug 2002 18:41:52 +0000 Subject: [PATCH] * fixed wrong label in jump of except block (was also in n386flw wrong) * fixed wrong pushing of raise parameters * fixed wrong compare in finally --- compiler/ncgflw.pas | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/compiler/ncgflw.pas b/compiler/ncgflw.pas index cdc8e2a6c3..689add5c95 100644 --- a/compiler/ncgflw.pas +++ b/compiler/ncgflw.pas @@ -97,6 +97,9 @@ implementation tgobj,rgobj,paramgr, regvars,cgobj,cgcpu,cg64f32; + const + EXCEPT_BUF_SIZE = 12; + {***************************************************************************** Second_While_RepeatN *****************************************************************************} @@ -662,11 +665,14 @@ do_jmp: end else begin + { get current address } objectlibrary.getaddrlabel(a); cg.a_label(exprasmlist,a); reference_reset_symbol(href2,a,0); - cg.a_paramaddr_ref(exprasmlist,href2,paramanager.getintparaloc(2)); - cg.a_param_reg(exprasmlist,OS_ADDR,FRAME_POINTER_REG,paramanager.getintparaloc(3)); + { push current frame } + cg.a_param_reg(exprasmlist,OS_ADDR,FRAME_POINTER_REG,paramanager.getintparaloc(2)); + { push current address } + cg.a_paramaddr_ref(exprasmlist,href2,paramanager.getintparaloc(1)); end; { push object } secondpass(left); @@ -694,8 +700,8 @@ do_jmp: procedure try_new_exception(list : taasmoutput;var jmpbuf,envbuf, href : treference; a : aword; exceptlabel : tasmlabel); begin + tg.GetTemp(list,EXCEPT_BUF_SIZE,tt_persistant,envbuf); tg.GetTemp(list,JMP_BUF_SIZE,tt_persistant,jmpbuf); - tg.GetTemp(list,12,tt_persistant,envbuf); tg.GetTemp(list,sizeof(aword),tt_persistant,href); new_exception(list, jmpbuf,envbuf, href, a, exceptlabel); end; @@ -705,6 +711,7 @@ do_jmp: a : aword ; endexceptlabel : tasmlabel; onlyfree : boolean); begin free_exception(list, jmpbuf, envbuf, href, a, endexceptlabel, onlyfree); + tg.ungettemp(list,href); tg.Ungettemp(list,jmpbuf); tg.ungettemp(list,envbuf); end; @@ -835,7 +842,7 @@ do_jmp: objectlibrary.getlabel(doobjectdestroy); objectlibrary.getlabel(doobjectdestroyandreraise); - try_new_exception(exprasmlist,tempbuf,tempaddr,href,1,exceptlabel); + try_new_exception(exprasmlist,tempbuf,tempaddr,href,1,doobjectdestroyandreraise); { here we don't have to reset flowcontrol } { the default and on flowcontrols are handled equal } @@ -1143,7 +1150,7 @@ do_jmp: { the value should now be in the exception handler } cg.g_exception_reason_load(exprasmlist,href); - cg.a_cmp_reg_reg_label(exprasmlist,OS_S32,OC_NE,accumulator,accumulator,finallylabel); + cg.a_cmp_const_reg_label(exprasmlist,OS_S32,OC_EQ,0,accumulator,endfinallylabel); cg.a_op_const_reg(exprasmlist,OP_SUB,1,accumulator); cg.a_cmp_const_reg_label(exprasmlist,OS_S32,OC_EQ,0,accumulator,reraiselabel); if fc_exit in tryflowcontrol then @@ -1224,7 +1231,12 @@ begin end. { $Log$ - Revision 1.38 2002-08-23 16:14:48 peter + Revision 1.39 2002-08-24 18:41:52 peter + * fixed wrong label in jump of except block (was also in n386flw wrong) + * fixed wrong pushing of raise parameters + * fixed wrong compare in finally + + Revision 1.38 2002/08/23 16:14:48 peter * tempgen cleanup * tt_noreuse temp type added that will be used in genentrycode