mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-10 02:28:22 +02:00
* correctly handle untyped parameters
git-svn-id: trunk@41839 -
This commit is contained in:
parent
9e9aca6fea
commit
4e0cc65c63
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user