Browse Source

* correctly handle ShortString, object and array fields that are part of a record/object

git-svn-id: trunk@39891 -
svenbarth 6 years ago
parent
commit
3bdb4aa1a2
1 changed files with 18 additions and 4 deletions
  1. 18 4
      packages/libffi/src/ffi.manager.pp

+ 18 - 4
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;