testfail.pp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. {$R+}
  2. program test_fail;
  3. type
  4. parrayobj = ^tarrayobj;
  5. tarrayobj = object
  6. ar : array [1..4] of real;
  7. constructor init(do_fail : boolean);
  8. procedure test;virtual;
  9. destructor done;virtual;
  10. end;
  11. pbigarrayobj = ^tbigarrayobj;
  12. tbigarrayobj = object(tarrayobj)
  13. ar2 : array [1..10000] of real;
  14. constructor good_init;
  15. constructor wrong_init;
  16. procedure test;virtual;
  17. end;
  18. var
  19. pa1, pa2 : parrayobj;
  20. ta1, ta2 : tarrayobj;
  21. availmem : longint;
  22. constructor tarrayobj.init(do_fail : boolean);
  23. begin
  24. ar[1]:=1;
  25. if do_fail then
  26. fail;
  27. ar[2]:=2;
  28. end;
  29. destructor tarrayobj.done;
  30. begin
  31. end;
  32. procedure tarrayobj.test;
  33. begin
  34. Writeln('@self = ',longint(@self));
  35. Writeln('typeof = ',longint(typeof(self)));
  36. if ar[1]=1 then
  37. Writeln('Init called');
  38. if ar[2]=2 then
  39. Writeln('Init successful');
  40. end;
  41. constructor tbigarrayobj.good_init;
  42. begin
  43. inherited init(false);
  44. Writeln('End of tbigarrayobj.good_init');
  45. end;
  46. constructor tbigarrayobj.wrong_init;
  47. begin
  48. inherited init(true);
  49. Writeln('End of tbigarrayobj.wrong_init');
  50. end;
  51. procedure tbigarrayobj.test;
  52. begin
  53. Writeln('tbigarrayobj.test called');
  54. Inherited test;
  55. end;
  56. begin
  57. availmem:=memavail;
  58. new(pa1,init(false));
  59. writeln('After successful new(pa1,init), memory used = ',availmem - memavail);
  60. new(pa2,init(true));
  61. writeln('After unsuccessful new(pa2,init), memory used = ',availmem - memavail);
  62. writeln('pa1 = ',longint(pa1),' pa2 = ',longint(pa2));
  63. writeln('Call to pa1^.test after successful init');
  64. pa1^.test;
  65. dispose(pa1,done);
  66. writeln('After release of pa1, memory used = ',availmem - memavail);
  67. pa1:=new(pbigarrayobj,good_init);
  68. writeln('After successful pa1:=new(pbigarrayobj,good_init), memory used = ',availmem - memavail);
  69. pa2:=new(pbigarrayobj,wrong_init);
  70. writeln('After unsuccessful pa2:=new(pbigarrayobj,wrong_init), memory used = ',availmem - memavail);
  71. writeln('pa1 = ',longint(pa1),' pa2 = ',longint(pa2));
  72. writeln('Call to pa1^.test after successful init');
  73. pa1^.test;
  74. ta1.init(false);
  75. writeln('Call to ta1.test after successful init');
  76. ta1.test;
  77. ta2.init(true);
  78. writeln('typeof(ta2) = ',longint(typeof(ta2)),' after unsuccessful init');
  79. Writeln('Trying to call ta2.test (should generate a Run Time Error)');
  80. ta2.test;
  81. end.