Marco van de Voort via fpc-devel
2021-05-29 22:53:42 UTC
Before the 3.2.2 release I looked into mantis 0038496 and now I come
back to it.
I noticed that custom variants are completely undocumented, is this know
(IOW should I file a bug?). What I wanted to look up are the rules for
implementing binaryop, since that is where the problem is.
The bug is for the following code:
{$ifdef fpc}
{$mode delphi}
{$else}
{$apptype console}
{$endif}
uses variants,fmtbcd;
var
fBCD1: TBcd;
V1, V2, V3:Variant;
L1: Integer;
begin
L1:=123;
fBCD1:=1234.345;
V1:=123;
V2:=VarFmtBCDCreate(fBCD1);
V3:=V1 + V2;
writeln(v3);
readln;
end.
The addition finally ends up in TFMTBcdFactory.BinaryOp which is
declared as follows
procedure TFMTBcdFactory.BinaryOp(var Left: TVarData; const Right:
TVarData; const Operation: TVarOp);
i.e. not a 3 operand action, but a two operand. This probably means
that in the case of v3:=v1+v2 this is encoded as v1:=v1,v2,add,
modifying V1.
The fmtbcd binaryop code however says that the left type (integer) is
not either double or a a FMTBCD custom variant and thus throws an exception.
I think it is allowed to change the result type of the variant passed in
binaryop(), but am not 100% sure, and also not sure if there are other
things to keep an eye for (e.g. finalization of the existing value).
Does anybody know open source custom variant examples other than fmtbcd ?
_______________________________________________
fpc-devel maillist - fpc-***@lists.freepascal.org
https://lists.freepascal.
back to it.
I noticed that custom variants are completely undocumented, is this know
(IOW should I file a bug?). What I wanted to look up are the rules for
implementing binaryop, since that is where the problem is.
The bug is for the following code:
{$ifdef fpc}
{$mode delphi}
{$else}
{$apptype console}
{$endif}
uses variants,fmtbcd;
var
fBCD1: TBcd;
V1, V2, V3:Variant;
L1: Integer;
begin
L1:=123;
fBCD1:=1234.345;
V1:=123;
V2:=VarFmtBCDCreate(fBCD1);
V3:=V1 + V2;
writeln(v3);
readln;
end.
The addition finally ends up in TFMTBcdFactory.BinaryOp which is
declared as follows
procedure TFMTBcdFactory.BinaryOp(var Left: TVarData; const Right:
TVarData; const Operation: TVarOp);
i.e. not a 3 operand action, but a two operand. This probably means
that in the case of v3:=v1+v2 this is encoded as v1:=v1,v2,add,
modifying V1.
The fmtbcd binaryop code however says that the left type (integer) is
not either double or a a FMTBCD custom variant and thus throws an exception.
I think it is allowed to change the result type of the variant passed in
binaryop(), but am not 100% sure, and also not sure if there are other
things to keep an eye for (e.g. finalization of the existing value).
Does anybody know open source custom variant examples other than fmtbcd ?
_______________________________________________
fpc-devel maillist - fpc-***@lists.freepascal.org
https://lists.freepascal.