> On Aug 1, 2018, at 9:17 AM, Sven Barth via fpc-devel 
> <fpc-devel@lists.freepascal.org> wrote:
> 
> Search the compiler's source for the string 'FREEINSTANCE'; you'll find two 
> locations, one in ngenutil and one in psub. The latter is the one you want. 
> 

Yeah, this is the first place I looked but current_structdef is always nil so 
it never progresses past that point.

Is this test program not enough to get FreeInstance called? 

program test;
var
        obj1: TObject;
begin
        obj1 := TObject.Create;
        obj1.Free;
end.


===========

    function generate_bodyexit_block:tnode;
      var
        srsym : tsym;
        para : tcallparanode;
        newstatement : tstatementnode;
        oldlocalswitches: tlocalswitches;
      begin
        result:=internalstatements(newstatement);

        if assigned(current_structdef) then
          begin
            { Don't test self and the vmt here. The reason is that  }
            { a constructor already checks whether these are valid  }
            { before. Further, in case of TThread the thread may    }
            { free the class instance right after AfterConstruction }
            { has been called, so it may no longer be valid (JM)    }
            oldlocalswitches:=current_settings.localswitches;
            
current_settings.localswitches:=oldlocalswitches-[cs_check_object,cs_check_range];

            { a destructor needs a help procedure }
            if (current_procinfo.procdef.proctypeoption=potype_destructor) then
              begin
                if is_class(current_structdef) then
                  begin
                    
srsym:=search_struct_member(current_structdef,'FREEINSTANCE');

Regards,
        Ryan Joseph

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to