+ catch RTE 201

This commit is contained in:
pierre 2003-02-20 22:31:30 +00:00
parent 6fee6ddf3c
commit d24fa6492c

View File

@ -28,6 +28,20 @@ var
a,b,c : longint; a,b,c : longint;
d,e,f : cardinal; d,e,f : cardinal;
res,res2 : int64; res,res2 : int64;
RTE201Buf : Jmp_Buf;
OldExit : pointer;
procedure RTE201Exit;
begin
ExitProc:=OldExit;
if ExitCode=201 then
begin
ErrorAddr:=0;
longjmp(RTE201Buf,1);
end;
end;
begin begin
a:=2; a:=2;
b:=-2; b:=-2;
@ -35,104 +49,109 @@ begin
d:=1; d:=1;
e:=$ffffffff; e:=$ffffffff;
f:=$fffffffe; f:=$fffffffe;
oldexit:=exitproc;
exitproc:=@RTE201Exit;
{$R+} {$R+}
res:=a+d; if setjmp(RTE201Buf)=0 then
if res<>3 then begin
fail(a,d,3,res,true); res:=a+d;
if res<>3 then
fail(a,d,3,res,true);
res:=a+e; res:=a+e;
res2:=e; res2:=e;
res2:=res2+a; res2:=res2+a;
if (res-2<>e) or ((res and $ffff) <>1) or (res<>res2) then if (res-2<>e) or ((res and $ffff) <>1) or (res<>res2) then
fail(a,e,res2,res,true); fail(a,e,res2,res,true);
res:=a+f; res:=a+f;
res2:=f; res2:=f;
res2:=res2+a; res2:=res2+a;
if (res-2<>f) or ((res and $ffff) <>0) or (res<>res2) then if (res-2<>f) or ((res and $ffff) <>0) or (res<>res2) then
fail(a,f,res2,res,true); fail(a,f,res2,res,true);
res:=b+d; res:=b+d;
if res<>-1 then if res<>-1 then
fail(b,d,-1,res,true); fail(b,d,-1,res,true);
res:=b+e; res:=b+e;
res2:=e; res2:=e;
res2:=res2+b; res2:=res2+b;
if (res+2<>e) or ((res and $ffff) <>$fffd) or (res<>res2) then if (res+2<>e) or ((res and $ffff) <>$fffd) or (res<>res2) then
fail(b,e,res2,res,true); fail(b,e,res2,res,true);
res:=b+f; res:=b+f;
res2:=f; res2:=f;
res2:=res2+b; res2:=res2+b;
if (res+2<>f) or ((res and $ffff) <>$fffc) or (res<>res2) then if (res+2<>f) or ((res and $ffff) <>$fffc) or (res<>res2) then
fail(b,f,res2,res,true); fail(b,f,res2,res,true);
res:=c+d; res:=c+d;
if res<>-4 then if res<>-4 then
fail(c,d,-4,res,true); fail(c,d,-4,res,true);
res:=c+e; res:=c+e;
res2:=e; res2:=e;
res2:=res2+c; res2:=res2+c;
if (res+5<>e) or ((res and $ffff) <>$fffa) or (res<>res2) then if (res+5<>e) or ((res and $ffff) <>$fffa) or (res<>res2) then
fail(c,e,res2,res,true); fail(c,e,res2,res,true);
res:=c+f; res:=c+f;
res2:=f; res2:=f;
res2:=res2+c; res2:=res2+c;
if (res+5<>f) or ((res and $ffff) <>$fff9) or (res<>res2) then if (res+5<>f) or ((res and $ffff) <>$fff9) or (res<>res2) then
fail(c,f,res2,res,true); fail(c,f,res2,res,true);
res:=d+a; res:=d+a;
if res<>3 then if res<>3 then
fail(d,a,3,res,true); fail(d,a,3,res,true);
res:=e+a; res:=e+a;
res2:=e; res2:=e;
res2:=res2+a; res2:=res2+a;
if (res-2<>e) or ((res and $ffff) <>1) or (res<>res2) then if (res-2<>e) or ((res and $ffff) <>1) or (res<>res2) then
fail(e,a,res2,res,true); fail(e,a,res2,res,true);
res:=f+a; res:=f+a;
res2:=f; res2:=f;
res2:=res2+a; res2:=res2+a;
if (res-2<>f) or ((res and $ffff) <>0) or (res<>res2) then if (res-2<>f) or ((res and $ffff) <>0) or (res<>res2) then
fail(f,a,res2,res,true); fail(f,a,res2,res,true);
res:=d+b; res:=d+b;
if res<>-1 then if res<>-1 then
fail(d,b,-1,res,true); fail(d,b,-1,res,true);
res:=e+b; res:=e+b;
res2:=e; res2:=e;
res2:=res2+b; res2:=res2+b;
if (res+2<>e) or ((res and $ffff) <>$fffd) or (res<>res2) then if (res+2<>e) or ((res and $ffff) <>$fffd) or (res<>res2) then
fail(e,b,res2,res,true); fail(e,b,res2,res,true);
res:=f+b; res:=f+b;
res2:=f; res2:=f;
res2:=res2+b; res2:=res2+b;
if (res+2<>f) or ((res and $ffff) <>$fffc) or (res<>res2) then if (res+2<>f) or ((res and $ffff) <>$fffc) or (res<>res2) then
fail(f,b,res2,res,true); fail(f,b,res2,res,true);
res:=d+c; res:=d+c;
if res<>-4 then if res<>-4 then
fail(d,c,-4,res,true); fail(d,c,-4,res,true);
res:=e+c; res:=e+c;
res2:=e; res2:=e;
res2:=res2+c; res2:=res2+c;
if (res+5<>e) or ((res and $ffff) <>$fffa) or (res<>res2) then if (res+5<>e) or ((res and $ffff) <>$fffa) or (res<>res2) then
fail(e,c,res2,res,true); fail(e,c,res2,res,true);
res:=f+c; res:=f+c;
res2:=f; res2:=f;
res2:=res2+c; res2:=res2+c;
if (res+5<>f) or ((res and $ffff) <>$fff9) or (res<>res2) then if (res+5<>f) or ((res and $ffff) <>$fff9) or (res<>res2) then
fail(f,c,res2,res,true); fail(f,c,res2,res,true);
end;
{$R-} {$R-}
@ -232,8 +251,13 @@ begin
if (res+5<>f) or ((res and $ffff) <>$fff9) or (res<>res2) then if (res+5<>f) or ((res and $ffff) <>$fff9) or (res<>res2) then
fail(f,c,res2,res,false); fail(f,c,res2,res,false);
if {$R-} a+e <> {$R+} a+e then exitproc:=@RTE201Exit;
has_severe_errors:=true; if setjmp(RTE201Buf)=0 then
begin
if {$R-} a+e <> {$R+} a+e then
has_severe_errors:=true;
end;
if has_severe_errors then if has_severe_errors then
halt(1); halt(1);