[fpc-devel] mantis 0038496 custom variants and documentation

Marco van de Voort fpc at pascalprogramming.org
Sun May 30 00:53:42 CEST 2021


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 ?








More information about the fpc-devel mailing list