testpvar.pp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. {
  2. $Id$
  3. This program tries to test any aspect of procedure variables and related
  4. stuff in FPC mode
  5. }
  6. {$ifdef go32v2}
  7. uses
  8. dpmiexcp;
  9. {$endif go32v2}
  10. procedure do_error(i : longint);
  11. begin
  12. writeln('Error near: ',i);
  13. halt(1);
  14. end;
  15. var
  16. globalvar : longint;
  17. type
  18. tpoo_rec = record
  19. procpointer : pointer;
  20. s : pointer;
  21. end;
  22. procedure callmethodparam(s : pointer;addr : pointer;param : longint);
  23. var
  24. p : procedure(param : longint) of object;
  25. begin
  26. tpoo_rec(p).procpointer:=addr;
  27. tpoo_rec(p).s:=s;
  28. p(param);
  29. end;
  30. type
  31. to1 = object
  32. constructor init;
  33. procedure test1;
  34. procedure test2(l : longint);
  35. procedure test3(l : longint);virtual;abstract;
  36. end;
  37. to2 = object(to1)
  38. procedure test3(l : longint);virtual;
  39. end;
  40. constructor to1.init;
  41. begin
  42. end;
  43. procedure to1.test1;
  44. var
  45. p:pointer;
  46. begin
  47. // useless only a semantic test
  48. p:[email protected];
  49. // this do we use to do some testing
  50. p:[email protected];
  51. globalvar:=0;
  52. callmethodparam(@self,p,1234);
  53. if globalvar<>1234 then
  54. do_error(1000);
  55. end;
  56. procedure to1.test2(l : longint);
  57. begin
  58. globalvar:=l;
  59. end;
  60. procedure to2.test3(l : longint);
  61. begin
  62. globalvar:=l;
  63. end;
  64. const
  65. constmethodaddr : pointer = @to1.test2;
  66. var
  67. o1 : to1;
  68. o2 : to2;
  69. p : procedure(l : longint) of object;
  70. begin
  71. { }
  72. { Procedures of objects }
  73. { }
  74. o1.init;
  75. o2.init;
  76. writeln('Procedures of objects');
  77. p:[email protected];
  78. globalvar:=0;
  79. p(12);
  80. if globalvar<>12 then
  81. do_error(1002);
  82. writeln('Ok');
  83. p:[email protected];
  84. globalvar:=0;
  85. p(12);
  86. if globalvar<>12 then
  87. do_error(1004);
  88. writeln('Ok');
  89. { }
  90. { Pointers and addresses of procedures }
  91. { }
  92. writeln('Getting an address of a method as pointer');
  93. o1.test1;
  94. globalvar:=0;
  95. callmethodparam(@o1,constmethodaddr,34);
  96. if globalvar<>34 then
  97. do_error(1001);
  98. writeln('Ok');
  99. end.
  100. {
  101. $Log$
  102. Revision 1.1 1999-12-02 17:37:45 peter
  103. * moved *.pp into subdirs
  104. * fpcmaked
  105. Revision 1.2 1999/11/29 22:55:25 florian
  106. * small update
  107. Revision 1.1 1999/09/11 19:45:33 florian
  108. * first version, please keep it up-to-date
  109. }