mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-14 03:19:27 +02:00

* fixed size calculation of vardatetime arguments on 32 bit systems with variant dispatching git-svn-id: trunk@29319 -
162 lines
3.1 KiB
ObjectPascal
162 lines
3.1 KiB
ObjectPascal
program SourceBug;
|
|
|
|
{$APPTYPE CONSOLE}
|
|
|
|
{$ifdef FPC}
|
|
{$MODE Delphi}
|
|
{$endif}
|
|
|
|
uses
|
|
Variants,
|
|
SysUtils;
|
|
|
|
type
|
|
TSampleVariant = class(TInvokeableVariantType)
|
|
protected
|
|
{$ifndef FPC}
|
|
function FixupIdent(const AText: string): string; override;
|
|
{$endif}
|
|
public
|
|
procedure Clear(var V: TVarData); override;
|
|
procedure Copy(var Dest: TVarData; const Source: TVarData; const Indirect: Boolean ); override;
|
|
function GetProperty(var Dest: TVarData; const V: TVarData;
|
|
const Name: string): Boolean; override;
|
|
function SetProperty(var V: TVarData; const Name: string;
|
|
const Value: TVarData): Boolean; override;
|
|
end;
|
|
|
|
procedure TSampleVariant.Clear(var V: TVarData);
|
|
begin
|
|
V.VType:=varEmpty;
|
|
end;
|
|
|
|
procedure TSampleVariant.Copy(var Dest: TVarData; const Source: TVarData; const Indirect: Boolean);
|
|
begin
|
|
if Indirect and VarDataIsByRef(Source) then
|
|
VarDataCopyNoInd(Dest, Source)
|
|
else with Dest do
|
|
VType:=Source.VType;
|
|
end;
|
|
|
|
{$ifndef FPC}
|
|
function TSampleVariant.FixupIdent(const AText: string): string;
|
|
begin
|
|
result := AText; // we do not want any uppercase names
|
|
end;
|
|
{$endif}
|
|
|
|
function TSampleVariant.GetProperty(var Dest: TVarData; const V: TVarData;
|
|
const Name: string): Boolean;
|
|
begin
|
|
assert(V.VType=varType);
|
|
if Name='IntField' then
|
|
begin
|
|
variant(Dest) := V.VInt64;
|
|
result := true;
|
|
end
|
|
else if Name='FloatField' then
|
|
begin
|
|
variant(Dest) := V.VDouble;
|
|
result := true;
|
|
end
|
|
else if Name='BoolField' then
|
|
begin
|
|
variant(Dest) := V.VBoolean;
|
|
result := true;
|
|
end
|
|
else
|
|
result := false;
|
|
end;
|
|
|
|
function TSampleVariant.SetProperty(var V: TVarData; const Name: string;
|
|
const Value: TVarData): Boolean;
|
|
begin
|
|
assert(V.VType=varType);
|
|
if Name='IntField' then
|
|
begin
|
|
PVarData(@V)^.VInt64 := variant(Value);
|
|
result := true;
|
|
end
|
|
else if Name='FloatField' then
|
|
begin
|
|
PVarData(@V)^.VDouble := variant(Value);
|
|
result := true;
|
|
end
|
|
else if Name='BoolField' then
|
|
begin
|
|
PVarData(@V)^.VBoolean := variant(Value);
|
|
result := true;
|
|
end
|
|
else
|
|
result := false;
|
|
end;
|
|
|
|
var
|
|
SampleVariant: TSampleVariant;
|
|
v: Variant;
|
|
|
|
GB1 : Byte;
|
|
GS1 : Shortint;
|
|
GW : Word;
|
|
GL : longint;
|
|
gsi : single;
|
|
gd : double;
|
|
gi64 : int64;
|
|
gdate: tdatetime;
|
|
gb: boolean;
|
|
begin
|
|
SampleVariant:=TSampleVariant.Create;
|
|
v := null;
|
|
TVarData(v).VType:=SampleVariant.VarType;
|
|
v.IntField := 100;
|
|
if v.IntField<>100 then
|
|
halt(1);
|
|
|
|
gb1:=128;
|
|
gs1:=127;
|
|
gw:=32768;
|
|
gl:=longint($b100dbad);
|
|
gsi:=12345789.5;
|
|
gd:=999991234889879.5;
|
|
gi64:=$813245678901234;
|
|
gdate:=now;
|
|
gb:=false;
|
|
|
|
v.IntField:=gb1;
|
|
if v.IntField<>gb1 then
|
|
halt(2);
|
|
|
|
v.IntField:=gs1;
|
|
if v.IntField<>gs1 then
|
|
halt(3);
|
|
|
|
v.IntField:=gw;
|
|
if v.IntField<>gw then
|
|
halt(4);
|
|
|
|
v.IntField:=gl;
|
|
if v.IntField<>gl then
|
|
halt(5);
|
|
|
|
v.FloatField:=gsi;
|
|
if v.FloatField<>gsi then
|
|
halt(6);
|
|
|
|
v.FloatField:=gd;
|
|
if v.FloatField<>gd then
|
|
halt(7);
|
|
|
|
v.IntField:=gi64;
|
|
if v.IntField<>gi64 then
|
|
halt(8);
|
|
|
|
v.FloatField:=gdate;
|
|
if v.FloatField<>gdate then
|
|
halt(9);
|
|
|
|
v.BoolField:=gb;
|
|
if boolean(v.BoolField)<>gb then
|
|
halt(10);
|
|
|
|
end.
|