tstack.pp 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. {$S-}
  18. { the stack overflowed already so don't do much here and depend on stack_margin }
  19. procedure stack_check_exit;
  20. begin
  21. exitproc:=saveexit;
  22. if errorcode<>0 then
  23. begin
  24. Writeln('An error occured at level ',level);
  25. if errorcode=202 then
  26. begin
  27. Writeln('Stack overflow correctly handled');
  28. erroraddr:=nil;
  29. errorcode:=0;
  30. exitcode:=0;
  31. end
  32. else if errorcode=216 then
  33. begin
  34. Writeln('RTL returns an RTE 216 on stack overflow');
  35. Writeln('Not perfect, but acceptable');
  36. erroraddr:=nil;
  37. errorcode:=0;
  38. exitcode:=0;
  39. end;
  40. end
  41. else
  42. begin
  43. exitcode:=1;
  44. errorcode:=1;
  45. end;
  46. exitproc:=saveexit;
  47. end;
  48. begin
  49. saveexit:=exitproc;
  50. exitproc:=@stack_check_exit;
  51. x:=inf_rec(5000);
  52. end.