mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-09 22:29:21 +02:00
* fixed wrong label in jump of except block (was also in n386flw wrong)
* fixed wrong pushing of raise parameters * fixed wrong compare in finally
This commit is contained in:
parent
46731a77ab
commit
563a0dc818
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user