Ver código fonte

Split RecordRTTI into FinalizeRecordFields and AddRefRecordFields.

Rika Ichinose 1 semana atrás
pai
commit
e4e58c383e
3 arquivos alterados com 20 adições e 13 exclusões
  1. 1 4
      rtl/inc/aliases.inc
  2. 2 2
      rtl/inc/objpas.inc
  3. 17 7
      rtl/inc/rtti.inc

+ 1 - 4
rtl/inc/aliases.inc

@@ -36,8 +36,5 @@ Function int_Copy_with_move_semantics(Src, Dest, TypeInfo : Pointer) : SizeInt;[
 {$endif}
 
 {$if defined(FPC_HAS_FEATURE_RTTI) and not defined(cpujvm)}
-type
-  TRTTIProc=procedure(Data,TypeInfo:Pointer);
-
-procedure RecordRTTI(Data:Pointer;Ri:PRecordInfoInit;rttiproc:TRTTIProc); forward;
+procedure FinalizeRecordFields(Data:Pointer;Ri:PRecordInfoInit); forward;
 {$endif FPC_HAS_FEATURE_RTTI and not cpujvm}

+ 2 - 2
rtl/inc/objpas.inc

@@ -920,9 +920,9 @@ end;
                Temp:= vmt^.vInitTable;
 {$ifdef FPC_HAS_FEATURE_RTTI}
                { The RTTI format matches one for records, except the type is tkClass.
-                 Since RecordRTTI does not check the type, calling it yields the desired result. }
+                 Since FinalizeRecordFields does not check the type, calling it yields the desired result. }
                if Assigned(Temp) then
-                 RecordRTTI(Self,aligntoqword(Temp+2+PByte(Temp)[1]),@int_finalize);
+                 FinalizeRecordFields(Self,aligntoqword(Temp+2+PByte(Temp)[1]));
 {$endif def FPC_HAS_FEATURE_RTTI}
                vmt:= vmt^.vParent;
              end;

+ 17 - 7
rtl/inc/rtti.inc

@@ -80,18 +80,28 @@ begin
     end;
 end;
 
-{ if you modify this procedure, fpc_copy must be probably modified as well }
-procedure RecordRTTI(Data:Pointer;Ri:PRecordInfoInit;rttiproc:TRTTIProc);
+procedure FinalizeRecordFields(Data:Pointer;Ri:PRecordInfoInit);
 var
   i : longint;
   Re : PRecordElement;
 begin
-  { Get element info, hacky, but what else can we do? }
   Re:=AlignTypeData(Pointer(@Ri^.Count)+SizeOf(Ri^.Count));
-  { Process elements }
   for i:=Ri^.Count downto 1 Do
     begin
-      rttiproc(Data+Re^.Offset,Re^.TypeInfo^);
+      int_finalize(Data+Re^.Offset,Re^.TypeInfo^);
+      Inc(Re);
+    end;
+end;
+
+procedure AddRefRecordFields(Data:Pointer;Ri:PRecordInfoInit);
+var
+  i : longint;
+  Re : PRecordElement;
+begin
+  Re:=AlignTypeData(Pointer(@Ri^.Count)+SizeOf(Ri^.Count));
+  for i:=Ri^.Count downto 1 Do
+    begin
+      int_addref(Data+Re^.Offset,Re^.TypeInfo^);
       Inc(Re);
     end;
 end;
@@ -184,7 +194,7 @@ begin
         ri:=RTTIRecordInfoInit(typeinfo);
         if Assigned(ri^.recordop) and Assigned(ri^.recordop^.Finalize) then
           ri^.recordop^.Finalize(data);
-        recordrtti(data,ri,@int_finalize);
+        FinalizeRecordFields(data,ri);
       end;
 {$ifdef FPC_HAS_FEATURE_CLASSES}
     tkInterface:
@@ -228,7 +238,7 @@ begin
     tkrecord :
       begin
         ri:=RTTIRecordInfoInit(typeinfo);
-        recordrtti(data,ri,@int_addref);
+        AddRefRecordFields(data,ri);
         if Assigned(ri^.recordop) and Assigned(ri^.recordop^.AddRef) then
           ri^.recordop^.AddRef(Data);
       end;