* correctly handle untyped parameters

git-svn-id: trunk@41839 -
This commit is contained in:
svenbarth 2019-04-04 19:32:29 +00:00
parent 9e9aca6fea
commit 4e0cc65c63

View File

@ -276,7 +276,8 @@ begin
else
raise EInvocationError.CreateFmt(SErrTypeKindNotSupported, [TypeKindName]);
end;
end;
end else if aFlags * [pfOut, pfVar, pfConst, pfConstRef] <> [] then
Result := @ffi_type_pointer;
end;
function ValueToFFIValue(constref aValue: Pointer; aKind: TTypeKind; aFlags: TParamFlags; aIsResult: Boolean): Pointer;
@ -292,7 +293,8 @@ begin
Result := aValue;
if (aKind = tkSString) or
(aIsResult and (aKind in ResultTypeNeedsIndirection)) or
(aFlags * [pfArray, pfOut, pfVar, pfConstRef] <> []) then
(aFlags * [pfArray, pfOut, pfVar, pfConstRef] <> []) or
((aKind = tkUnknown) and (pfConst in aFlags)) then
Result := @aValue;
end;
@ -412,6 +414,7 @@ var
i, arglen, argoffset, retidx, argstart: LongInt;
cif: ffi_cif;
retparam: Boolean;
kind: TTypeKind;
{$ifdef USE_EXTENDED_AS_COMP_CURRENCY_RES}
restypedata: PTypeData;
resextended: Extended;
@ -473,7 +476,11 @@ begin
if not (fcfStatic in aFlags) and retparam then begin
argtypes[0] := TypeInfoToFFIType(aArgs[0].Info.ParamType, aArgs[0].Info.ParamFlags);
argvalues[0] := ValueToFFIValue(aArgs[0].ValueRef, aArgs[0].Info.ParamType^.Kind, aArgs[0].Info.ParamFlags, False);
if Assigned(aArgs[0].Info.ParamType) then
kind := aArgs[0].Info.ParamType^.Kind
else
kind := tkUnknown;
argvalues[0] := ValueToFFIValue(aArgs[0].ValueRef, kind, aArgs[0].Info.ParamFlags, False);
if retparam then
Inc(retidx);
argstart := 1;
@ -482,7 +489,11 @@ begin
for i := Low(aArgs) + argstart to High(aArgs) do begin
argtypes[i - Low(aArgs) + Low(argtypes) + argoffset] := TypeInfoToFFIType(aArgs[i].Info.ParamType, aArgs[i].Info.ParamFlags);
argvalues[i - Low(aArgs) + Low(argtypes) + argoffset] := ValueToFFIValue(aArgs[i].ValueRef, aArgs[i].Info.ParamType^.Kind, aArgs[i].Info.ParamFlags, False);
if Assigned(aArgs[i].Info.ParamType) then
kind := aArgs[i].Info.ParamType^.Kind
else
kind := tkUnknown;
argvalues[i - Low(aArgs) + Low(argtypes) + argoffset] := ValueToFFIValue(aArgs[i].ValueRef, kind, aArgs[i].Info.ParamFlags, False);
end;
if retparam then begin