Ver código fonte

* variants.pp, some speed improvements:
* VarTypeIsValidElementType: moved check for custom types after checks for standard types, because it is expensive.
* sysvararrayput, DynArrayToVariant, DynArrayFromVariant: replaced calls to methods of variant manager by appropriate plain calls which still go through the variant manager, but GetVariantManager() is no longer necessary.

git-svn-id: trunk@17169 -

sergei 14 anos atrás
pai
commit
008699eaae
1 arquivos alterados com 8 adições e 19 exclusões
  1. 8 19
      rtl/inc/variants.pp

+ 8 - 19
rtl/inc/variants.pp

@@ -2643,7 +2643,6 @@ var
   valuevtype,
   arrayelementtype : TVarType;
   tempvar : Variant;
-  variantmanager : tvariantmanager;
 begin
   Dest:=TVarData(a);
   { get final Variant }
@@ -2686,8 +2685,7 @@ begin
         end
       else
         begin
-          GetVariantManager(variantmanager);
-          variantmanager.varcast(tempvar,value,arrayelementtype);
+          VarCast(tempvar,value,arrayelementtype);
           if arrayelementtype in [varOleStr,varDispatch,varUnknown] then
             VarResultCheck(SafeArrayPutElement(p,PVarArrayCoorArray(indices),TVarData(tempvar).vPointer))
           else
@@ -3328,17 +3326,13 @@ function VarTypeIsValidElementType(const aVarType: TVarType): Boolean;
   var
     customvarianttype : TCustomVariantType;
   begin
-    if FindCustomVariantType(aVarType,customvarianttype) then
-      Result:=true
-    else
-      begin
-        Result:=(aVarType and not(varByRef) and not(varArray)) in [varEmpty,varNull,varSmallInt,varInteger,
+    Result:=((aVarType and not(varByRef) and not(varArray)) in [varEmpty,varNull,varSmallInt,varInteger,
 {$ifndef FPUNONE}
-          varSingle,varDouble,varDate,
+      varSingle,varDouble,varDate,
 {$endif}
-          varCurrency,varOleStr,varDispatch,varError,varBoolean,
-          varVariant,varUnknown,varShortInt,varByte,varWord,varLongWord,varInt64];
-      end;
+      varCurrency,varOleStr,varDispatch,varError,varBoolean,
+      varVariant,varUnknown,varShortInt,varByte,varWord,varLongWord,varInt64]) or
+    FindCustomVariantType(aVarType,customvarianttype);
   end;
 
 
@@ -3383,7 +3377,6 @@ procedure DynArrayToVariant(var V: Variant; const DynArray: Pointer; TypeInfo: P
     dynarriter : tdynarrayiter;
     p : Pointer;
     temp : Variant;
-    variantmanager : tvariantmanager;
     dynarraybounds : tdynarraybounds;
   type
     TDynArray = array of Pointer;
@@ -3398,8 +3391,6 @@ procedure DynArrayToVariant(var V: Variant; const DynArray: Pointer; TypeInfo: P
     if (Dims>1) and not(DynamicArrayIsRectangular(DynArray,TypeInfo)) then
       exit;
 
-    GetVariantManager(variantmanager);
-
     { retrieve Bounds array }
     Setlength(dynarraybounds,Dims);
     GetMem(vararraybounds,Dims*SizeOf(TVarArrayBound));
@@ -3466,7 +3457,7 @@ procedure DynArrayToVariant(var V: Variant; const DynArray: Pointer; TypeInfo: P
               VarClear(temp);
           end;
           dynarriter.next;
-          variantmanager.VarArrayPut(V,temp,Dims,PLongint(iter.Coords));
+          VarArrayPut(V,temp,Slice(iter.Coords^,Dims));
         until not(iter.next);
       finally
         iter.done;
@@ -3487,7 +3478,6 @@ procedure DynArrayFromVariant(var DynArray: Pointer; const V: Variant; TypeInfo:
     dynarriter : tdynarrayiter;
     temp : Variant;
     dynarrvartype : LongInt;
-    variantmanager : tvariantmanager;
     vararraybounds : PVarArrayBoundArray;
     dynarraybounds : tdynarraybounds;
     i : SizeInt;
@@ -3513,14 +3503,13 @@ procedure DynArrayFromVariant(var DynArray: Pointer; const V: Variant; TypeInfo:
           dynarraybounds[i]:=vararraybounds^[i].ElementCount;
         end;
       DynArraySetLength(DynArray,TypeInfo,VarArrayDims,PSizeInt(dynarraybounds));
-      GetVariantManager(variantmanager);
       VarArrayLock(V);
       try
         iter.init(VarArrayDims,PVarArrayBoundArray(vararraybounds));
         dynarriter.init(DynArray,TypeInfo,VarArrayDims,dynarraybounds);
         if not iter.AtEnd then
         repeat
-          temp:=variantmanager.VarArrayGet(V,VarArrayDims,PLongint(iter.Coords));
+          temp:=VarArrayGet(V,Slice(iter.Coords^,VarArrayDims));
           case dynarrvartype of
             varSmallInt:
               PSmallInt(dynarriter.data)^:=temp;