mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-10-21 22:41:49 +02:00
133 lines
2.4 KiB
ObjectPascal
133 lines
2.4 KiB
ObjectPascal
{
|
|
$Id$
|
|
This program tries to test any aspect of procedure variables and related
|
|
stuff in FPC mode
|
|
}
|
|
|
|
{$ifdef go32v2}
|
|
uses
|
|
dpmiexcp;
|
|
{$endif go32v2}
|
|
|
|
procedure do_error(i : longint);
|
|
|
|
begin
|
|
writeln('Error near: ',i);
|
|
halt(1);
|
|
end;
|
|
|
|
var
|
|
globalvar : longint;
|
|
|
|
type
|
|
tpoo_rec = record
|
|
procpointer : pointer;
|
|
s : pointer;
|
|
end;
|
|
|
|
procedure callmethodparam(s : pointer;addr : pointer;param : longint);
|
|
|
|
var
|
|
p : procedure(param : longint) of object;
|
|
|
|
begin
|
|
tpoo_rec(p).procpointer:=addr;
|
|
tpoo_rec(p).s:=s;
|
|
p(param);
|
|
end;
|
|
|
|
type
|
|
to1 = object
|
|
constructor init;
|
|
procedure test1;
|
|
procedure test2(l : longint);
|
|
procedure test3(l : longint);virtual;abstract;
|
|
end;
|
|
|
|
to2 = object(to1)
|
|
procedure test3(l : longint);virtual;
|
|
end;
|
|
|
|
constructor to1.init;
|
|
|
|
begin
|
|
end;
|
|
|
|
procedure to1.test1;
|
|
var
|
|
p:pointer;
|
|
begin
|
|
// useless only a semantic test
|
|
p:=@to1.test1;
|
|
// this do we use to do some testing
|
|
p:=@to1.test2;
|
|
globalvar:=0;
|
|
callmethodparam(@self,p,1234);
|
|
if globalvar<>1234 then
|
|
do_error(1000);
|
|
end;
|
|
|
|
procedure to1.test2(l : longint);
|
|
|
|
begin
|
|
globalvar:=l;
|
|
end;
|
|
|
|
procedure to2.test3(l : longint);
|
|
|
|
begin
|
|
globalvar:=l;
|
|
end;
|
|
|
|
const
|
|
constmethodaddr : pointer = @to1.test2;
|
|
|
|
var
|
|
o1 : to1;
|
|
o2 : to2;
|
|
p : procedure(l : longint) of object;
|
|
|
|
begin
|
|
{ }
|
|
{ Procedures of objects }
|
|
{ }
|
|
o1.init;
|
|
o2.init;
|
|
writeln('Procedures of objects');
|
|
p:=@o1.test2;
|
|
globalvar:=0;
|
|
p(12);
|
|
if globalvar<>12 then
|
|
do_error(1002);
|
|
writeln('Ok');
|
|
p:=@o2.test3;
|
|
globalvar:=0;
|
|
p(12);
|
|
if globalvar<>12 then
|
|
do_error(1004);
|
|
writeln('Ok');
|
|
{ }
|
|
{ Pointers and addresses of procedures }
|
|
{ }
|
|
writeln('Getting an address of a method as pointer');
|
|
o1.test1;
|
|
globalvar:=0;
|
|
callmethodparam(@o1,constmethodaddr,34);
|
|
if globalvar<>34 then
|
|
do_error(1001);
|
|
writeln('Ok');
|
|
end.
|
|
{
|
|
$Log$
|
|
Revision 1.1 1999-12-02 17:37:45 peter
|
|
* moved *.pp into subdirs
|
|
* fpcmaked
|
|
|
|
Revision 1.2 1999/11/29 22:55:25 florian
|
|
* small update
|
|
|
|
Revision 1.1 1999/09/11 19:45:33 florian
|
|
* first version, please keep it up-to-date
|
|
|
|
}
|