#267: Array of const broken?
This commit is contained in:
parent
5530baf4f1
commit
29622984a4
@ -1,3 +1,68 @@
|
|||||||
|
function PSVariantIFCToTValue(aValue: PPSVariantIFC; var aValues: TArray<TValue>): Boolean;
|
||||||
|
var
|
||||||
|
l_len: Integer;
|
||||||
|
i: Integer;
|
||||||
|
arr: TArray<TValue>;
|
||||||
|
arr_varrec: TArray<TVarRec>;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Result := True;
|
||||||
|
case aValue^.aType.BaseType of
|
||||||
|
{$IFNDEF PS_NOWIDESTRING}
|
||||||
|
btWidestring,
|
||||||
|
btUnicodestring,
|
||||||
|
{$ENDIF}
|
||||||
|
btString: aValues := aValues + [TValue.From<String>(pstring(aValue^.dta)^)];
|
||||||
|
btU8, btS8: aValues := aValues + [TValue.From<Byte>(pbyte(aValue^.dta)^)];
|
||||||
|
btU16, BtS16: aValues := aValues + [TValue.From<Word>(pword(aValue^.dta)^)];
|
||||||
|
btU32, btS32: aValues := aValues + [TValue.From<Cardinal>(pCardinal(aValue^.dta)^)];
|
||||||
|
{$IFNDEF PS_NOINT64}bts64:{$ENDIF} aValues := aValues + [TValue.From<Int64>(pint64(aValue^.dta)^)];
|
||||||
|
btSingle: aValues := aValues + [TValue.From<Single>(PSingle(aValue^.dta)^)];
|
||||||
|
btDouble: aValues := aValues + [TValue.From<Double>(PDouble(aValue^.dta)^)];
|
||||||
|
btExtended: aValues := aValues + [TValue.From<Extended>(PExtended(aValue^.dta)^)];
|
||||||
|
btPChar: aValues := aValues + [TValue.From<PChar>(ppchar(aValue^.dta)^)];
|
||||||
|
btChar: aValues := aValues + [TValue.From<Char>(pchar(aValue^.dta)^)];
|
||||||
|
btClass: aValues := aValues + [TValue.From<TObject>(TObject(aValue^.dta^))];
|
||||||
|
btRecord: aValues := aValues + [TValue.From<Pointer>(aValue^.dta)];
|
||||||
|
btStaticArray: aValues := aValues + [TValue.From<Pointer>(aValue^.dta)];
|
||||||
|
btVariant:
|
||||||
|
aValues := aValues + [TValue.From(Variant(aValue^.dta^))];
|
||||||
|
btArray:
|
||||||
|
begin
|
||||||
|
if Copy(aValue^.aType.ExportName, 1, 10) = '!OPENARRAY' then begin
|
||||||
|
l_len := PSDynArrayGetLength(Pointer(aValue^.Dta^), aValue^.aType) - 1;
|
||||||
|
SetLength(arr, 0);
|
||||||
|
for i := 0 to l_len do begin
|
||||||
|
if not PSVariantIFCToTValue(PPSVariantIFC(IPointer(aValue^.Dta^) + IPointer(i) * 3 * SizeOf(Pointer)), arr) then begin
|
||||||
|
Result := False;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
arr_varrec := TValueArrayToArrayOfConst(arr);
|
||||||
|
//in case of openarray we should provide TWO params: first is pointer to array,
|
||||||
|
aValues := aValues + [TValue.From<Pointer>(@arr_varrec[0])];
|
||||||
|
//2nd - integer with arraylength - 1 (high)
|
||||||
|
aValues := aValues + [TValue.From<Integer>(l_len)];// = High of OpenArray
|
||||||
|
end
|
||||||
|
else //dynarray = just push pointer
|
||||||
|
aValues := aValues + [TValue.From<Pointer>(aValue^.dta)];
|
||||||
|
end;
|
||||||
|
btSet:
|
||||||
|
begin
|
||||||
|
case TPSTypeRec_Set(aValue^.aType).aByteSize of
|
||||||
|
1: aValues := aValues + [TValue.From<Byte>(pbyte(aValue^.dta)^)];
|
||||||
|
2: aValues := aValues + [TValue.From<Word>(pWord(aValue^.dta)^)];
|
||||||
|
3,
|
||||||
|
4: aValues := aValues + [TValue.From<Cardinal>(pCardinal(aValue^.dta)^)];
|
||||||
|
else
|
||||||
|
aValues := aValues + [TValue.From<Pointer>(aValue^.dta)];
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
else
|
||||||
|
Result := False;
|
||||||
|
end; { case }
|
||||||
|
end;
|
||||||
|
|
||||||
function TPSExec.InnerfuseCall(_Self, Address: Pointer; CallingConv: TPSCallingConvention; Params: TPSList; res: PPSVariantIFC): Boolean;
|
function TPSExec.InnerfuseCall(_Self, Address: Pointer; CallingConv: TPSCallingConvention; Params: TPSList; res: PPSVariantIFC): Boolean;
|
||||||
var SysCalConv : TCallConv;
|
var SysCalConv : TCallConv;
|
||||||
Args: TArray<TValue>;
|
Args: TArray<TValue>;
|
||||||
@ -48,59 +113,11 @@ begin
|
|||||||
Exit;
|
Exit;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
Args := Args + [Arg];
|
||||||
end
|
end
|
||||||
else
|
else begin
|
||||||
begin { not a var param }
|
if not PSVariantIFCToTValue(fvar, Args) then Exit;
|
||||||
case fvar.aType.BaseType of
|
|
||||||
{ add normal params here }
|
|
||||||
{$IFNDEF PS_NOWIDESTRING}
|
|
||||||
btWidestring,
|
|
||||||
btUnicodestring,
|
|
||||||
{$ENDIF}
|
|
||||||
btString: Arg := TValue.From<String>(pstring(fvar.dta)^);
|
|
||||||
btU8, btS8: Arg := TValue.From<Byte>(pbyte(fvar.dta)^);
|
|
||||||
btU16, BtS16: Arg := TValue.From<Word>(pword(fvar.dta)^);
|
|
||||||
btU32, btS32: Arg := TValue.From<Cardinal>(pCardinal(fvar.dta)^);
|
|
||||||
{$IFNDEF PS_NOINT64}bts64:{$ENDIF} Arg := TValue.From<Int64>(pint64(fvar.dta)^);
|
|
||||||
btSingle: Arg := TValue.From<Single>(PSingle(fvar.dta)^);
|
|
||||||
btDouble: Arg := TValue.From<Double>(PDouble(fvar.dta)^);
|
|
||||||
btExtended: Arg := TValue.From<Extended>(PExtended(fvar.dta)^);
|
|
||||||
btPChar: Arg := TValue.From<PChar>(ppchar(fvar.dta)^);
|
|
||||||
btChar: Arg := TValue.From<Char>(pchar(fvar.dta)^);
|
|
||||||
btClass: Arg := TValue.From<TObject>(TObject(fvar.dta^));
|
|
||||||
btRecord: Arg := TValue.From<Pointer>(fvar.dta);
|
|
||||||
btStaticArray: Arg := TValue.From<Pointer>(fvar.dta);
|
|
||||||
btVariant:
|
|
||||||
Arg := TValue.From(Variant(fvar.dta^));
|
|
||||||
btArray:
|
|
||||||
begin
|
|
||||||
if Copy(fvar.aType.ExportName, 1, 10) = '!OPENARRAY' then
|
|
||||||
begin //openarray
|
|
||||||
//in case of openarray we should provide TWO params: first is pointer to array,
|
|
||||||
Args := Args + [TValue.From<Pointer>(Pointer(fvar.Dta^))];
|
|
||||||
//2nd - integer with arraylength - 1 (high)
|
|
||||||
Arg := TValue.From<Integer>(PSDynArrayGetLength(Pointer(fvar.Dta^), fvar.aType)-1);// = High of OpenArray
|
|
||||||
end
|
|
||||||
else //dynarray = just push pointer
|
|
||||||
Arg := TValue.From<Pointer>(fvar.dta);
|
|
||||||
end;
|
|
||||||
btSet:
|
|
||||||
begin
|
|
||||||
case TPSTypeRec_Set(fvar.aType).aByteSize of
|
|
||||||
1: Arg := TValue.From<Byte>(pbyte(fvar.dta)^);
|
|
||||||
2: Arg := TValue.From<Word>(pWord(fvar.dta)^);
|
|
||||||
3,
|
|
||||||
4: Arg := TValue.From<Cardinal>(pCardinal(fvar.dta)^);
|
|
||||||
else
|
|
||||||
Arg := TValue.From<Pointer>(fvar.dta);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
else
|
|
||||||
// writeln(stderr, 'Parameter type not implemented!');
|
|
||||||
Exit;
|
|
||||||
end; { case }
|
|
||||||
end;
|
end;
|
||||||
Args := Args + [Arg];
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{$IFDEF CPUX86}
|
{$IFDEF CPUX86}
|
||||||
|
Loading…
Reference in New Issue
Block a user