From 3bdb4aa1a2e18d0495d4492651391a5273a0f72d Mon Sep 17 00:00:00 2001 From: svenbarth Date: Sun, 7 Oct 2018 12:25:52 +0000 Subject: [PATCH] * correctly handle ShortString, object and array fields that are part of a record/object git-svn-id: trunk@39891 - --- packages/libffi/src/ffi.manager.pp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/libffi/src/ffi.manager.pp b/packages/libffi/src/ffi.manager.pp index 5c2bfbaadd..ec5636aa57 100644 --- a/packages/libffi/src/ffi.manager.pp +++ b/packages/libffi/src/ffi.manager.pp @@ -58,9 +58,10 @@ var end; var - td: PTypeData; - i, curoffset, remoffset: SizeInt; + td, fieldtd: PTypeData; + i, j, curoffset, remoffset: SizeInt; field: PManagedField; + ffitype: pffi_type; begin td := GetTypeData(aTypeInfo); if td^.TotalFieldCount = 0 then @@ -98,8 +99,21 @@ begin AddElement(@ffi_type_uint8); Dec(remoffset, SizeOf(Byte)) end; - { now add the real field type } - AddElement(TypeInfoToFFIType(field^.TypeRef, [])); + { now add the real field type (Note: some are handled differently from + being passed as arguments, so we handle those here) } + if field^.TypeRef^.Kind = tkObject then + AddElement(RecordOrObjectToFFIType(field^.TypeRef)) + else if field^.TypeRef^.Kind = tkSString then begin + fieldtd := GetTypeData(field^.TypeRef); + for j := 0 to fieldtd^.MaxLength + 1 do + AddElement(@ffi_type_uint8); + end else if field^.TypeRef^.Kind = tkArray then begin + fieldtd := GetTypeData(field^.TypeRef); + ffitype := TypeInfoToFFIType(fieldtd^.ArrayData.ElType, []); + for j := 0 to fieldtd^.ArrayData.ElCount - 1 do + AddElement(ffitype); + end else + AddElement(TypeInfoToFFIType(field^.TypeRef, [])); Inc(field); curoffset := field^.FldOffset; end;