tstack.pp 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. {$S+}
  2. { Program to check that an infinite recursion
  3. does generate a RTE ... }
  4. {$R-}
  5. { make that recursion really infinite
  6. needs that range check is disabled }
  7. const
  8. level : longint = 0;
  9. function inf_rec(x : longint) : longint;
  10. begin
  11. inc(level);
  12. inf_rec:=x+inf_rec(x-1);
  13. end;
  14. const
  15. saveexit : pointer = nil;
  16. x : longint = 0;
  17. procedure stack_check_exit;
  18. begin
  19. exitproc:=saveexit;
  20. if errorcode<>0 then
  21. begin
  22. Writeln('An error occured at level ',level);
  23. if errorcode=202 then
  24. begin
  25. Writeln('Stack overflow correctly handled');
  26. erroraddr:=nil;
  27. errorcode:=0;
  28. exitcode:=0;
  29. end
  30. else if errorcode=216 then
  31. begin
  32. Writeln('RTL returns an RTE 216 on stack overflow');
  33. Writeln('Not perfect, but acceptable');
  34. erroraddr:=nil;
  35. errorcode:=0;
  36. exitcode:=0;
  37. end;
  38. end
  39. else
  40. begin
  41. exitcode:=1;
  42. errorcode:=1;
  43. end;
  44. exitproc:=saveexit;
  45. end;
  46. begin
  47. saveexit:=exitproc;
  48. exitproc:=@stack_check_exit;
  49. x:=inf_rec(5000);
  50. end.