fpc/tests/webtbs/tw26773.pp
Jonas Maebe 476e3fabb7 * fixed big endian bugs in variant dispatching
* fixed size calculation of vardatetime arguments on 32 bit systems with
    variant dispatching

git-svn-id: trunk@29319 -
2014-12-24 14:13:49 +00:00

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.