tprocvar1.pp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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. Type
  11. TMyRecord = Record
  12. MyProc1,MyProc2 : Procedure(l : longint);
  13. MyVar : longint;
  14. end;
  15. procedure do_error(i : longint);
  16. begin
  17. writeln('Error near: ',i);
  18. halt(1);
  19. end;
  20. var
  21. globalvar : longint;
  22. type
  23. tpoo_rec = record
  24. procpointer : pointer;
  25. s : pointer;
  26. end;
  27. procedure callmethodparam(s : pointer;addr : pointer;param : longint);
  28. var
  29. p : procedure(param : longint) of object;
  30. begin
  31. tpoo_rec(p).procpointer:=addr;
  32. tpoo_rec(p).s:=s;
  33. p(param);
  34. end;
  35. type
  36. to1 = object
  37. constructor init;
  38. procedure test1;
  39. procedure test2(l : longint);
  40. procedure test3(l : longint);virtual;abstract;
  41. end;
  42. to2 = object(to1)
  43. procedure test3(l : longint);virtual;
  44. end;
  45. constructor to1.init;
  46. begin
  47. end;
  48. procedure to1.test1;
  49. var
  50. p:pointer;
  51. begin
  52. // useless only a semantic test
  53. p:[email protected];
  54. // this do we use to do some testing
  55. p:[email protected];
  56. globalvar:=0;
  57. callmethodparam(@self,p,1234);
  58. if globalvar<>1234 then
  59. do_error(1000);
  60. end;
  61. procedure to1.test2(l : longint);
  62. begin
  63. globalvar:=l;
  64. end;
  65. procedure to2.test3(l : longint);
  66. begin
  67. globalvar:=l;
  68. end;
  69. procedure testproc(l : longint);
  70. begin
  71. globalvar:=l;
  72. end;
  73. const
  74. constmethodaddr : pointer = @to1.test2;
  75. MyRecord : TMyRecord = (
  76. MyProc1 : @TestProc;
  77. MyProc2 : @TestProc;
  78. MyVar : 0;
  79. );
  80. var
  81. o1 : to1;
  82. o2 : to2;
  83. p : procedure(l : longint) of object;
  84. begin
  85. { Simple procedure variables }
  86. writeln('Procedure variables');
  87. globalvar:=0;
  88. MyRecord.MyProc1(1234);
  89. if globalvar<>1234 then
  90. do_error(2000);
  91. globalvar:=0;
  92. MyRecord.MyProc2(4321);
  93. if globalvar<>4321 then
  94. do_error(2001);
  95. writeln('Ok');
  96. { }
  97. { Procedures of objects }
  98. { }
  99. o1.init;
  100. o2.init;
  101. writeln('Procedures of objects');
  102. p:[email protected];
  103. globalvar:=0;
  104. p(12);
  105. if globalvar<>12 then
  106. do_error(1002);
  107. writeln('Ok');
  108. p:[email protected];
  109. globalvar:=0;
  110. p(12);
  111. if globalvar<>12 then
  112. do_error(1004);
  113. writeln('Ok');
  114. { }
  115. { Pointers and addresses of procedures }
  116. { }
  117. writeln('Getting an address of a method as pointer');
  118. o1.test1;
  119. globalvar:=0;
  120. callmethodparam(@o1,constmethodaddr,34);
  121. if globalvar<>34 then
  122. do_error(1001);
  123. writeln('Ok');
  124. end.
  125. {
  126. $Log$
  127. Revision 1.6 2002-09-07 15:40:49 peter
  128. * old logs removed and tabs fixed
  129. }