mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-24 11:29:16 +02:00
* nested try blocks work again
This commit is contained in:
parent
9de2afcbac
commit
68c2c36d36
@ -605,18 +605,20 @@ do_jmp:
|
||||
{ we modify EAX }
|
||||
usedinproc:=usedinproc or ($80 shr byte(R_EAX));
|
||||
|
||||
oldaktcontinuelabel:=aktcontinuelabel;
|
||||
oldaktbreaklabel:=aktbreaklabel;
|
||||
oldaktexitlabel:=aktexitlabel;
|
||||
oldaktexit2label:=aktexit2label;
|
||||
getlabel(exitexceptlabel);
|
||||
getlabel(breakexceptlabel);
|
||||
getlabel(continueexceptlabel);
|
||||
aktcontinuelabel:=continueexceptlabel;
|
||||
aktbreaklabel:=breakexceptlabel;
|
||||
aktexitlabel:=exitexceptlabel;
|
||||
aktexit2label:=exitexceptlabel;
|
||||
|
||||
if assigned(aktbreaklabel) then
|
||||
begin
|
||||
oldaktcontinuelabel:=aktcontinuelabel;
|
||||
oldaktbreaklabel:=aktbreaklabel;
|
||||
getlabel(breakexceptlabel);
|
||||
getlabel(continueexceptlabel);
|
||||
aktcontinuelabel:=continueexceptlabel;
|
||||
aktbreaklabel:=breakexceptlabel;
|
||||
end;
|
||||
getlabel(exceptlabel);
|
||||
getlabel(doexceptlabel);
|
||||
getlabel(endexceptlabel);
|
||||
@ -681,16 +683,12 @@ do_jmp:
|
||||
emit_reg(A_POP,S_L,R_EAX);
|
||||
emitjmp(C_None,oldaktexitlabel);
|
||||
|
||||
if assigned(oldaktbreaklabel) then
|
||||
if assigned(aktbreaklabel) then
|
||||
begin
|
||||
emitlab(breakexceptlabel);
|
||||
emitcall('FPC_POPADDRSTACK');
|
||||
emit_reg(A_POP,S_L,R_EAX);
|
||||
emitjmp(C_None,oldaktbreaklabel);
|
||||
end;
|
||||
|
||||
if assigned(oldaktcontinuelabel) then
|
||||
begin
|
||||
emitlab(continueexceptlabel);
|
||||
emitcall('FPC_POPADDRSTACK');
|
||||
emit_reg(A_POP,S_L,R_EAX);
|
||||
@ -699,11 +697,14 @@ do_jmp:
|
||||
|
||||
emitlab(endexceptlabel);
|
||||
|
||||
endexceptlabel:=oldendexceptlabel;
|
||||
aktexitlabel:=oldaktexitlabel;
|
||||
aktexit2label:=oldaktexit2label;
|
||||
aktcontinuelabel:=oldaktcontinuelabel;
|
||||
aktbreaklabel:=oldaktbreaklabel;
|
||||
endexceptlabel:=oldendexceptlabel;
|
||||
if assigned(aktbreaklabel) then
|
||||
begin
|
||||
aktcontinuelabel:=oldaktcontinuelabel;
|
||||
aktbreaklabel:=oldaktbreaklabel;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure secondon(var p : ptree);
|
||||
@ -781,18 +782,21 @@ do_jmp:
|
||||
usedinproc:=usedinproc or ($80 shr byte(R_EAX));
|
||||
getlabel(finallylabel);
|
||||
getlabel(endfinallylabel);
|
||||
oldaktcontinuelabel:=aktcontinuelabel;
|
||||
oldaktbreaklabel:=aktbreaklabel;
|
||||
oldaktexitlabel:=aktexitlabel;
|
||||
oldaktexit2label:=aktexit2label;
|
||||
getlabel(reraiselabel);
|
||||
getlabel(exitfinallylabel);
|
||||
getlabel(breakfinallylabel);
|
||||
getlabel(continuefinallylabel);
|
||||
aktcontinuelabel:=continuefinallylabel;
|
||||
aktbreaklabel:=breakfinallylabel;
|
||||
aktexitlabel:=exitfinallylabel;
|
||||
aktexit2label:=exitfinallylabel;
|
||||
if assigned(aktbreaklabel) then
|
||||
begin
|
||||
oldaktcontinuelabel:=aktcontinuelabel;
|
||||
oldaktbreaklabel:=aktbreaklabel;
|
||||
getlabel(breakfinallylabel);
|
||||
getlabel(continuefinallylabel);
|
||||
aktcontinuelabel:=continuefinallylabel;
|
||||
aktbreaklabel:=breakfinallylabel;
|
||||
end;
|
||||
|
||||
push_int(1); { Type of stack-frame must be pushed}
|
||||
emitcall('FPC_PUSHEXCEPTADDR');
|
||||
@ -829,7 +833,7 @@ do_jmp:
|
||||
emitjmp(C_Z,reraiselabel);
|
||||
emit_reg(A_DEC,S_L,R_EAX);
|
||||
emitjmp(C_Z,oldaktexitlabel);
|
||||
if assigned(oldaktbreaklabel) then
|
||||
if assigned(aktbreaklabel) then
|
||||
begin
|
||||
emit_reg(A_DEC,S_L,R_EAX);
|
||||
emitjmp(C_Z,oldaktbreaklabel);
|
||||
@ -844,7 +848,7 @@ do_jmp:
|
||||
emit_reg(A_POP,S_L,R_EAX);
|
||||
emit_const(A_PUSH,S_L,2);
|
||||
emitjmp(C_NONE,finallylabel);
|
||||
if assigned(oldaktbreaklabel) then
|
||||
if assigned(aktbreaklabel) then
|
||||
begin
|
||||
emitlab(breakfinallylabel);
|
||||
emit_reg(A_POP,S_L,R_EAX);
|
||||
@ -860,8 +864,11 @@ do_jmp:
|
||||
|
||||
aktexitlabel:=oldaktexitlabel;
|
||||
aktexit2label:=oldaktexit2label;
|
||||
aktcontinuelabel:=oldaktcontinuelabel;
|
||||
aktbreaklabel:=oldaktbreaklabel;
|
||||
if assigned(aktbreaklabel) then
|
||||
begin
|
||||
aktcontinuelabel:=oldaktcontinuelabel;
|
||||
aktbreaklabel:=oldaktbreaklabel;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
@ -878,7 +885,10 @@ do_jmp:
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.64 1999-12-22 01:01:46 peter
|
||||
Revision 1.65 1999-12-22 23:30:06 peter
|
||||
* nested try blocks work again
|
||||
|
||||
Revision 1.64 1999/12/22 01:01:46 peter
|
||||
- removed freelabel()
|
||||
* added undefined label detection in internal assembler, this prevents
|
||||
a lot of ld crashes and wrong .o files
|
||||
|
Loading…
Reference in New Issue
Block a user