mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-16 02:29:12 +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
|
else
|
||||||
raise EInvocationError.CreateFmt(SErrTypeKindNotSupported, [TypeKindName]);
|
raise EInvocationError.CreateFmt(SErrTypeKindNotSupported, [TypeKindName]);
|
||||||
end;
|
end;
|
||||||
end;
|
end else if aFlags * [pfOut, pfVar, pfConst, pfConstRef] <> [] then
|
||||||
|
Result := @ffi_type_pointer;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function ValueToFFIValue(constref aValue: Pointer; aKind: TTypeKind; aFlags: TParamFlags; aIsResult: Boolean): Pointer;
|
function ValueToFFIValue(constref aValue: Pointer; aKind: TTypeKind; aFlags: TParamFlags; aIsResult: Boolean): Pointer;
|
||||||
@ -292,7 +293,8 @@ begin
|
|||||||
Result := aValue;
|
Result := aValue;
|
||||||
if (aKind = tkSString) or
|
if (aKind = tkSString) or
|
||||||
(aIsResult and (aKind in ResultTypeNeedsIndirection)) 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;
|
Result := @aValue;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -412,6 +414,7 @@ var
|
|||||||
i, arglen, argoffset, retidx, argstart: LongInt;
|
i, arglen, argoffset, retidx, argstart: LongInt;
|
||||||
cif: ffi_cif;
|
cif: ffi_cif;
|
||||||
retparam: Boolean;
|
retparam: Boolean;
|
||||||
|
kind: TTypeKind;
|
||||||
{$ifdef USE_EXTENDED_AS_COMP_CURRENCY_RES}
|
{$ifdef USE_EXTENDED_AS_COMP_CURRENCY_RES}
|
||||||
restypedata: PTypeData;
|
restypedata: PTypeData;
|
||||||
resextended: Extended;
|
resextended: Extended;
|
||||||
@ -473,7 +476,11 @@ begin
|
|||||||
|
|
||||||
if not (fcfStatic in aFlags) and retparam then begin
|
if not (fcfStatic in aFlags) and retparam then begin
|
||||||
argtypes[0] := TypeInfoToFFIType(aArgs[0].Info.ParamType, aArgs[0].Info.ParamFlags);
|
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
|
if retparam then
|
||||||
Inc(retidx);
|
Inc(retidx);
|
||||||
argstart := 1;
|
argstart := 1;
|
||||||
@ -482,7 +489,11 @@ begin
|
|||||||
|
|
||||||
for i := Low(aArgs) + argstart to High(aArgs) do 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);
|
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;
|
end;
|
||||||
|
|
||||||
if retparam then begin
|
if retparam then begin
|
||||||
|
Loading…
Reference in New Issue
Block a user