فهرست منبع

* rtti.pp: Update IsManaged function for management operators. Record without managed fields but with management operators is treated as managed record. tests.rtti.pas update.

git-svn-id: trunk@35485 -
maciej-izak 8 سال پیش
والد
کامیت
ffd6465563
2فایلهای تغییر یافته به همراه13 افزوده شده و 2 حذف شده
  1. 4 2
      packages/rtl-objpas/src/inc/rtti.pp
  2. 9 0
      packages/rtl-objpas/tests/tests.rtti.pas

+ 4 - 2
packages/rtl-objpas/src/inc/rtti.pp

@@ -294,12 +294,14 @@ begin
       tkLString,
       tkWString,
       tkUString,
-      tkInterface, 
+      tkInterface,
       tkVariant,
       tkDynArray  : Result := true;
       tkArray     : Result := IsManaged(GetTypeData(TypeInfo)^.ArrayData.ElType);
       tkRecord,
-      tkObject    : Result := GetTypeData(TypeInfo)^.RecInitData^.ManagedFieldCount > 0;
+      tkObject    :
+        with GetTypeData(TypeInfo)^.RecInitData^ do
+          Result := (ManagedFieldCount > 0) or Assigned(ManagementOp);
     else
       Result := false;
     end

+ 9 - 0
packages/rtl-objpas/tests/tests.rtti.pas

@@ -2,6 +2,7 @@ unit tests.rtti;
 
 {$ifdef fpc}
 {$mode objfpc}{$H+}
+{$modeswitch advancedrecords}
 {$endif}
 
 interface
@@ -94,6 +95,10 @@ type
     s: string;
   end;
 
+  TManagedRecOp = record
+    class operator AddRef(var a: TManagedRecOp);
+  end;
+
   TNonManagedRec = record
     i: Integer;
   end;
@@ -127,6 +132,9 @@ type
 
 {$POP}
 
+class operator TManagedRecOp.AddRef(var  a: TManagedRecOp);
+begin
+end;
 
 { TTestValueClass }
 
@@ -737,6 +745,7 @@ begin
   CheckEquals(true, IsManaged(TypeInfo(TArrayOfString)),
     'IsManaged for tkArray (with managed ElType)');
   CheckEquals(true, IsManaged(TypeInfo(TManagedRec)), 'IsManaged for tkRecord');
+  CheckEquals(true, IsManaged(TypeInfo(TManagedRecOp)), 'IsManaged for tkRecord');
   CheckEquals(true, IsManaged(TypeInfo(IInterface)), 'IsManaged for tkInterface');
   CheckEquals(true, IsManaged(TypeInfo(TManagedObj)), 'IsManaged for tkObject');
   {$ifdef fpc}