tprocvar1.pp 2.7 KB

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