fpc/api/test/testcall.pas
2000-01-06 01:20:30 +00:00

156 lines
2.9 KiB
ObjectPascal

program testcall;
uses CallSpec;
{ Testing program for calls of special functions. }
procedure TestLocal;
var
I: Integer;
procedure VoidLocal; {$ifndef FPC}far;{$endif}
begin
Write(I)
end;
procedure PointerLocal(J: LongInt); {$ifndef FPC}far;{$endif}
begin
Write('(', I, ',', J, ')')
end;
begin
I := 4711;
Write('VoidLocal test: ');
VoidLocal;
Write(' = ');
CallVoidLocal(@VoidLocal, CurrentFramePointer);
WriteLn;
Write('PointerLocal test: ');
PointerLocal(0815);
Write(' = ');
CallPointerLocal(@PointerLocal, CurrentFramePointer, pointer(0815));
WriteLn
end;
type
TTest = object
K: Integer;
procedure TestMethodLocal;
end;
var
Test: TTest;
procedure TTest.TestMethodLocal;
var
I: Integer;
procedure VoidMethodLocal; {$ifndef FPC}far;{$endif}
var
t: Integer;
begin
t := K;
Write('(', K, ',', I, ',', t, ')')
end;
procedure PointerMethodLocal(J: LongInt); {$ifndef FPC}far;{$endif}
var
t: Integer;
begin
t := K;
Write('(', K, ',', I, ',', J, ',', t, ')')
end;
begin
I := 123;
Write('VoidMethodLocal test: ');
VoidMethodLocal;
Write(' = ');
CallVoidMethodLocal(@VoidMethodLocal,
CurrentFramePointer, @Self);
WriteLn;
Write('PointerMethodLocal test: ');
PointerMethodLocal(987);
Write(' = ');
CallPointerMethodLocal(@PointerMethodLocal,
CurrentFramePointer, @Self, pointer(987));
WriteLn
end;
type
PA = ^TA;
TA = object
I: LongInt;
constructor VoidInit;
constructor PointerInit(P: Pointer);
destructor Done;
procedure VoidMethod;
procedure PointerMethod(P: Pointer);
end;
constructor TA.VoidInit;
begin
I := 2718
end;
constructor TA.PointerInit(P: Pointer);
begin
I := LongInt(P)
end;
destructor TA.Done;
begin
end;
procedure TestConstructor;
var
P, Q: PA;
begin
P := CallVoidConstructor(@TA.VoidInit, nil, TypeOf(TA));
WriteLn('CallVoidConstructor test: 2718 = ', P^.I);
Dispose(P,Done);
Q := CallPointerConstructor(@TA.PointerInit, nil, TypeOf(TA), pointer(14142));
WriteLn('CallPointerConstructor test: 14142 = ', Q^.I);
Dispose(Q,Done);
end;
procedure TA.VoidMethod;
begin
I := 2718;
end;
procedure TA.PointerMethod(P: Pointer);
begin
I := LongInt(P)
end;
procedure TestMethod;
var
A: TA;
begin
CallVoidMethod(@TA.VoidMethod, @A);
WriteLn('CallVoidMethod test: 2718 = ', A.I);
CallPointerMethod(@TA.PointerMethod, @A, pointer(14142));
WriteLn('CallPointerMethod test: 14142 = ', A.I);
end;
begin
WriteLn('If the CallSpec unit is implemented properly for your');
WriteLn('Pascal compiler, you will see 8 correct equations, and');
WriteLn('this program will terminate without error.');
WriteLn;
TestLocal;
Test.K := 3141;
Test.TestMethodLocal;
TestConstructor;
TestMethod;
WriteLn;
WriteLn('Finished.');
end.