mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-16 16:59:12 +02:00
* correctly handle untyped parameters (for those the ParamType is Nil)
git-svn-id: trunk@41830 -
This commit is contained in:
parent
307ff071e6
commit
db5c8e1f0d
@ -1984,7 +1984,7 @@ begin
|
|||||||
if Assigned(aArgs[unhidden].TypeInfo) and not aArgs[unhidden].IsArray and (aArgs[unhidden].Kind <> param.ParamType.TypeKind) then
|
if Assigned(aArgs[unhidden].TypeInfo) and not aArgs[unhidden].IsArray and (aArgs[unhidden].Kind <> param.ParamType.TypeKind) then
|
||||||
raise EInvocationError.CreateFmt(SErrInvokeArrayArgExpected, [param.Name, aName]);
|
raise EInvocationError.CreateFmt(SErrInvokeArrayArgExpected, [param.Name, aName]);
|
||||||
end else if not (pfHidden in param.Flags) then begin
|
end else if not (pfHidden in param.Flags) then begin
|
||||||
if aArgs[unhidden].Kind <> param.ParamType.TypeKind then
|
if Assigned(param.ParamType) and (aArgs[unhidden].Kind <> param.ParamType.TypeKind) then
|
||||||
raise EInvocationError.CreateFmt(SErrInvokeArgInvalidType, [param.Name, aName]);
|
raise EInvocationError.CreateFmt(SErrInvokeArgInvalidType, [param.Name, aName]);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -2014,7 +2014,10 @@ begin
|
|||||||
|
|
||||||
for i := 0 to High(aParams) do begin
|
for i := 0 to High(aParams) do begin
|
||||||
param := aParams[i];
|
param := aParams[i];
|
||||||
args[i].Info.ParamType := param.ParamType.FTypeInfo;
|
if Assigned(param.ParamType) then
|
||||||
|
args[i].Info.ParamType := param.ParamType.FTypeInfo
|
||||||
|
else
|
||||||
|
args[i].Info.ParamType := Nil;
|
||||||
args[i].Info.ParamFlags := param.Flags;
|
args[i].Info.ParamFlags := param.Flags;
|
||||||
args[i].Info.ParaLocs := Nil;
|
args[i].Info.ParaLocs := Nil;
|
||||||
|
|
||||||
@ -2535,7 +2538,10 @@ begin
|
|||||||
Assert((i < Length(fArgs)) and (pfHigh in fArgs[i].ParamFlags), 'Expected high parameter after open array parameter');
|
Assert((i < Length(fArgs)) and (pfHigh in fArgs[i].ParamFlags), 'Expected high parameter after open array parameter');
|
||||||
TValue.MakeOpenArray(aArgs[i - 1], SizeInt(aArgs[i]), fArgs[i].ParamType, args[argidx]);
|
TValue.MakeOpenArray(aArgs[i - 1], SizeInt(aArgs[i]), fArgs[i].ParamType, args[argidx]);
|
||||||
end else if not (pfHidden in fArgs[i].ParamFlags) or (pfSelf in fArgs[i].ParamFlags) then begin
|
end else if not (pfHidden in fArgs[i].ParamFlags) or (pfSelf in fArgs[i].ParamFlags) then begin
|
||||||
TValue.Make(aArgs[i], fArgs[i].ParamType, args[argidx]);
|
if Assigned(fArgs[i].ParamType) then
|
||||||
|
TValue.Make(aArgs[i], fArgs[i].ParamType, args[argidx])
|
||||||
|
else
|
||||||
|
TValue.Make(@aArgs[i], TypeInfo(Pointer), args[argidx]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Inc(i);
|
Inc(i);
|
||||||
@ -2727,7 +2733,10 @@ begin
|
|||||||
params := GetParameters(True);
|
params := GetParameters(True);
|
||||||
SetLength(args, Length(params));
|
SetLength(args, Length(params));
|
||||||
for i := 0 to High(params) do begin
|
for i := 0 to High(params) do begin
|
||||||
args[i].ParamType := params[i].ParamType.FTypeInfo;
|
if Assigned(params[i].ParamType) then
|
||||||
|
args[i].ParamType := params[i].ParamType.FTypeInfo
|
||||||
|
else
|
||||||
|
args[i].ParamType := Nil;
|
||||||
args[i].ParamFlags := params[i].Flags;
|
args[i].ParamFlags := params[i].Flags;
|
||||||
args[i].ParaLocs := Nil;
|
args[i].ParaLocs := Nil;
|
||||||
if pfResult in params[i].Flags then
|
if pfResult in params[i].Flags then
|
||||||
@ -2759,7 +2768,10 @@ begin
|
|||||||
params := GetParameters(True);
|
params := GetParameters(True);
|
||||||
SetLength(args, Length(params));
|
SetLength(args, Length(params));
|
||||||
for i := 0 to High(params) do begin
|
for i := 0 to High(params) do begin
|
||||||
args[i].ParamType := params[i].ParamType.FTypeInfo;
|
if Assigned(params[i].ParamType) then
|
||||||
|
args[i].ParamType := params[i].ParamType.FTypeInfo
|
||||||
|
else
|
||||||
|
args[i].ParamType := Nil;
|
||||||
args[i].ParamFlags := params[i].Flags;
|
args[i].ParamFlags := params[i].Flags;
|
||||||
args[i].ParaLocs := Nil;
|
args[i].ParaLocs := Nil;
|
||||||
if pfResult in params[i].Flags then
|
if pfResult in params[i].Flags then
|
||||||
@ -2794,6 +2806,7 @@ var
|
|||||||
total, visible, i: SizeInt;
|
total, visible, i: SizeInt;
|
||||||
ptr: PByte;
|
ptr: PByte;
|
||||||
paramtypes: PPPTypeInfo;
|
paramtypes: PPPTypeInfo;
|
||||||
|
paramtype: PTypeInfo;
|
||||||
context: TRttiContext;
|
context: TRttiContext;
|
||||||
obj: TRttiObject;
|
obj: TRttiObject;
|
||||||
begin
|
begin
|
||||||
@ -2850,7 +2863,11 @@ begin
|
|||||||
if Assigned(obj) then
|
if Assigned(obj) then
|
||||||
FParamsAll[i] := obj as TRttiMethodTypeParameter
|
FParamsAll[i] := obj as TRttiMethodTypeParameter
|
||||||
else begin
|
else begin
|
||||||
FParamsAll[i] := TRttiMethodTypeParameter.Create(infos[i].Handle, infos[i].Name, infos[i].Flags, paramtypes[i]^);
|
if Assigned(paramtypes[i]) then
|
||||||
|
paramtype := paramtypes[i]^
|
||||||
|
else
|
||||||
|
paramtype := Nil;
|
||||||
|
FParamsAll[i] := TRttiMethodTypeParameter.Create(infos[i].Handle, infos[i].Name, infos[i].Flags, paramtype);
|
||||||
context.AddObject(FParamsAll[i]);
|
context.AddObject(FParamsAll[i]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user