12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- {$R+}
- type
- ta = object
- constructor init;
- destructor done;
- procedure p;virtual;
- end;
- pa = ^ta;
- constructor ta.init;
- begin
- end;
- destructor ta.done;
- begin
- end;
- procedure ta.p;
- begin
- end;
- type
- plongint = ^longint;
- var
- p : pa;
- data : array[0..4] of longint;
- saveexit : pointer;
- procedure testerror;
- begin
- exitproc:=saveexit;
- if errorcode=210 then
- begin
- errorcode:=0;
- writeln('Object valid VMT check works');
- runerror(0);
- end
- else
- halt(1);
- end;
- begin
- saveexit:=exitproc;
- exitproc:=@testerror;
- fillchar(data,sizeof(data),12);
- p:=new(pa,init);
- p^.p;
- { the vmt pointer gets an invalid value: }
- plongint(p)^:=longint(@data);
- { causes runerror }
- p^.p;
- halt(1);
- end.
|