On 01.12.2019 19:15, bla...@blaise.ru wrote:
With the following two exceptions, there are no other assigned(vmtentries) 
checks before dereferencing.

And one assertion @ TVMTBuilder.generate_vmt :
        if assigned(_class.childof) then
          begin
                if not assigned(_class.childof.vmtentries) then
                  internalerror(200810281);
                _class.copyvmtentries(_class.childof);
          end;

Patch is amended.
(Originally, that was a part of another changeset, but I reckon it makes more 
sense here.)

--
βþ
# HG changeset patch
# User Blaise.ru
# Date 1575215603 -10800
#      01.12.2019 18:53:23 +0300
# Node ID 932f6f48e6c6a5726ff45882e9e64db773a9b979
# Parent  2ae482b988eb0d4f0eac5ce091b2c134d5998fd3
! memory leak @ tobjectdef.getcopy
= tobjectdef.vmtentries is never nil; no point in checking

diff -r 2ae482b988eb -r 932f6f48e6c6 ncgvmt.pas
--- a/ncgvmt.pas        01.12.2019 12:23:49 +0300
+++ b/ncgvmt.pas        01.12.2019 18:53:23 +0300
@@ -966,8 +966,6 @@
          hs : string;
 {$endif vtentry}
       begin
-        if not assigned(_class.VMTEntries) then
-          exit;
         for i:=0 to _class.VMTEntries.Count-1 do
          begin
            vmtentry:=pvmtentry(_class.vmtentries[i]);
diff -r 2ae482b988eb -r 932f6f48e6c6 nobj.pas
--- a/nobj.pas  01.12.2019 12:23:49 +0300
+++ b/nobj.pas  01.12.2019 18:53:23 +0300
@@ -910,11 +910,7 @@
 
         { inherit (copy) VMT from parent object }
         if assigned(_class.childof) then
-          begin
-            if not assigned(_class.childof.vmtentries) then
-              internalerror(200810281);
-            _class.copyvmtentries(_class.childof);
-          end;
+          _class.copyvmtentries(_class.childof);
 
         { process all procdefs, we must process the defs to
           keep the same order as that is written in the source
diff -r 2ae482b988eb -r 932f6f48e6c6 symdef.pas
--- a/symdef.pas        01.12.2019 12:23:49 +0300
+++ b/symdef.pas        01.12.2019 18:53:23 +0300
@@ -7287,7 +7287,7 @@
          if assigned(vmtentries) then
            begin
              resetvmtentries;
-             vmtentries.free;
+             vmtentries.Destroy;
              vmtentries:=nil;
            end;
          if assigned(vmcallstaticinfo) then
@@ -7330,11 +7330,7 @@
             for i:=0 to ImplementedInterfaces.count-1 do
               
tobjectdef(result).ImplementedInterfaces.Add(TImplementedInterface(ImplementedInterfaces[i]).Getcopy);
           end;
-        if assigned(vmtentries) then
-          begin
-            tobjectdef(result).vmtentries:=TFPList.Create;
-            tobjectdef(result).copyvmtentries(self);
-          end;
+        tobjectdef(result).copyvmtentries(self);
       end;
 
 
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to