fpc/tests/test/trtti9.pp
sergei 23cb216435 * RTTI fix for alignment-sensitive targets:
* typinfo.pp: the newly introduced records were added into {$PACKRECORDS 1} area of effect, which  effectively made all records packed, entirely defeating FPC_REQUIRES_PROPER_ALIGNMENT purpose. 
  * added alignment between TProcedureParam records, adjusted TProcedureSignature.GetParam() appropriately.
   * ncgrtti.pas: added two missing alignments and removed a redundant one.
   * tests/test/trtti9.pp: modified to use TProcedureSignature.GetParam() and endian-independent check for parameter flags.

git-svn-id: trunk@24562 -
2013-05-23 16:03:42 +00:00

39 lines
953 B
ObjectPascal

program trtti9;
{$mode delphi}
uses
typinfo;
type
PProcedureParam = ^TProcedureParam;
TProc = procedure(var A: Integer; S: String); stdcall;
function TestParam(Param: PProcedureParam; Flags: TParamFlags; ParamType: Pointer; Name: ShortString): Boolean;
begin
Result := (Param^.Flags = PByte(@Flags)^) and (Param^.ParamType = ParamType) and (Param^.Name = Name);
end;
var
Info: PTypeInfo;
Data: PTypeData;
Param: PProcedureParam;
begin
Info := TypeInfo(TProc);
if Info^.Kind <> tkProcedure then
halt(1);
Data := GetTypeData(Info);
if Data^.ProcSig.CC <> ccStdCall then
halt(2);
if Data^.ProcSig.ResultType <> nil then
halt(3);
if Data^.ProcSig.ParamCount <> 2 then
halt(4);
Param := Data^.ProcSig.GetParam(0);
if not TestParam(Param, [pfVar], TypeInfo(Integer), 'A') then
halt(5);
Param := Data^.ProcSig.GetParam(1);
if not TestParam(Param, [], TypeInfo(String), 'S') then
halt(6);
end.