tb0309.pp 841 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. {$R+}
  2. type
  3. ta = object
  4. constructor init;
  5. destructor done;
  6. procedure p;virtual;
  7. end;
  8. pa = ^ta;
  9. constructor ta.init;
  10. begin
  11. end;
  12. destructor ta.done;
  13. begin
  14. end;
  15. procedure ta.p;
  16. begin
  17. end;
  18. type
  19. plongint = ^longint;
  20. var
  21. p : pa;
  22. data : array[0..4] of longint;
  23. saveexit : pointer;
  24. procedure testerror;
  25. begin
  26. exitproc:=saveexit;
  27. if errorcode=210 then
  28. begin
  29. errorcode:=0;
  30. writeln('Object valid VMT check works');
  31. runerror(0);
  32. end
  33. else
  34. halt(1);
  35. end;
  36. begin
  37. saveexit:=exitproc;
  38. exitproc:=@testerror;
  39. fillchar(data,sizeof(data),12);
  40. p:=new(pa,init);
  41. p^.p;
  42. { the vmt pointer gets an invalid value: }
  43. plongint(p)^:=longint(@data);
  44. { causes runerror }
  45. p^.p;
  46. halt(1);
  47. end.