Am 30.05.2021 um 00:53 schrieb Marco van de Voort via fpc-devel:
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 ?
The only one I'm aware of that makes use of BinaryOp is Python4Delphi (
https://github.com/pyscripter/python4delphi/blob/master/Source/VarPyth.pas
). mORMot derives its TSynInvokeableVariantType and thus its TDocVariant
from TInvokableVariantType, but does not override the operator methods.
Regards,
Sven
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel