tobject1.pp 2.5 KB

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