Browse Source

* custom variant support for integer types, first part of #39815

marcoonthegit 3 years ago
parent
commit
c67004d929
1 changed files with 32 additions and 0 deletions
  1. 32 0
      packages/rtl-objpas/src/inc/variants.pp

+ 32 - 0
packages/rtl-objpas/src/inc/variants.pp

@@ -594,47 +594,79 @@ end;
 
 
 
 
 function Sysvartoint (const v : Variant) : Longint;
 function Sysvartoint (const v : Variant) : Longint;
+var Handler: TCustomVariantType;
+    dest: TVarData;
 begin
 begin
   if VarType(v) = varNull then
   if VarType(v) = varNull then
     if NullStrictConvert then
     if NullStrictConvert then
       VarCastError(varNull, varInt64)
       VarCastError(varNull, varInt64)
     else
     else
       Result := 0
       Result := 0
+  else if FindCustomVariantType(TVarData(v).vType, Handler) then
+    begin
+      VariantInit(dest);
+      Handler.CastTo(dest, TVarData(v), varInteger);
+      Result := dest.vinteger;
+    end
   else
   else
     Result := VariantToLongInt(TVarData(V));
     Result := VariantToLongInt(TVarData(V));
 end;
 end;
 
 
 function Sysvartoint64 (const v : Variant) : Int64;
 function Sysvartoint64 (const v : Variant) : Int64;
+var Handler: TCustomVariantType;
+    dest: TVarData;
 begin
 begin
   if VarType(v) = varNull then
   if VarType(v) = varNull then
     if NullStrictConvert then
     if NullStrictConvert then
       VarCastError(varNull, varInt64)
       VarCastError(varNull, varInt64)
     else
     else
       Result := 0
       Result := 0
+  else if FindCustomVariantType(TVarData(v).vType, Handler) then
+    begin
+      VariantInit(dest);
+      Handler.CastTo(dest, TVarData(v), varInt64);
+      Result := dest.vint64;
+    end
   else
   else
     Result := VariantToInt64(TVarData(V));
     Result := VariantToInt64(TVarData(V));
 end;
 end;
 
 
 
 
 function sysvartoword64 (const v : Variant) : QWord;
 function sysvartoword64 (const v : Variant) : QWord;
+var Handler: TCustomVariantType;
+    dest: TVarData;
 begin
 begin
   if VarType(v) = varNull then
   if VarType(v) = varNull then
     if NullStrictConvert then
     if NullStrictConvert then
       VarCastError(varNull, varQWord)
       VarCastError(varNull, varQWord)
     else
     else
       Result := 0
       Result := 0
+  else if FindCustomVariantType(TVarData(v).vType, Handler) then
+    begin
+      VariantInit(dest);
+      Handler.CastTo(dest, TVarData(v), varQWord);
+      Result := dest.vqword;
+    end
   else
   else
     Result := VariantToQWord (TVarData(V));
     Result := VariantToQWord (TVarData(V));
 end;
 end;
 
 
 
 
 function sysvartobool (const v : Variant) : Boolean;
 function sysvartobool (const v : Variant) : Boolean;
+var Handler: TCustomVariantType;
+    dest: TVarData;
 begin
 begin
   if VarType(v) = varNull then
   if VarType(v) = varNull then
     if NullStrictConvert then
     if NullStrictConvert then
       VarCastError(varNull, varBoolean)
       VarCastError(varNull, varBoolean)
     else
     else
       Result := False
       Result := False
+  else if FindCustomVariantType(TVarData(v).vType, Handler) then
+    begin
+      VariantInit(dest);
+      Handler.CastTo(dest, TVarData(v), varBoolean);
+      Result := dest.vboolean;
+    end
   else
   else
     Result := VariantToBoolean(TVarData(V));
     Result := VariantToBoolean(TVarData(V));
 end;
 end;