Browse Source

+ add method tprocsym.Find_procdef_by_funcrefdef to find a procdef that's compatible with the specified function reference

Sven/Sarah Barth 3 years ago
parent
commit
702f79ec8c
1 changed files with 16 additions and 0 deletions
  1. 16 0
      compiler/symsym.pas

+ 16 - 0
compiler/symsym.pas

@@ -138,6 +138,7 @@ interface
 
 
           function find_procdef_with_comparer(comparer:tprocdefcomparer;arg:tobject):tprocdef;
           function find_procdef_with_comparer(comparer:tprocdefcomparer;arg:tobject):tprocdef;
           class function compare_procvardef(pd:tprocdef;arg:tobject):tequaltype;static;
           class function compare_procvardef(pd:tprocdef;arg:tobject):tequaltype;static;
+          class function compare_funcrefdef(pd:tprocdef;arg:tobject):tequaltype;static;
        public
        public
           constructor create(const n : TSymStr);virtual;
           constructor create(const n : TSymStr);virtual;
           constructor ppuload(ppufile:tcompilerppufile);
           constructor ppuload(ppufile:tcompilerppufile);
@@ -158,6 +159,7 @@ interface
           function find_procdef_bytype_and_para(pt:Tproctypeoption;para:TFPObjectList;retdef:tdef;cpoptions:tcompare_paras_options):Tprocdef;
           function find_procdef_bytype_and_para(pt:Tproctypeoption;para:TFPObjectList;retdef:tdef;cpoptions:tcompare_paras_options):Tprocdef;
           function find_procdef_byoptions(ops:tprocoptions): Tprocdef;
           function find_procdef_byoptions(ops:tprocoptions): Tprocdef;
           function find_procdef_byprocvardef(d:Tprocvardef):Tprocdef;
           function find_procdef_byprocvardef(d:Tprocvardef):Tprocdef;
+          function find_procdef_byfuncrefdef(d:tobjectdef):tprocdef;
           function find_procdef_assignment_operator(fromdef,todef:tdef;var besteq:tequaltype;isexplicit:boolean):Tprocdef;
           function find_procdef_assignment_operator(fromdef,todef:tdef;var besteq:tequaltype;isexplicit:boolean):Tprocdef;
           function find_procdef_enumerator_operator(fromdef,todef:tdef;var besteq:tequaltype):Tprocdef;
           function find_procdef_enumerator_operator(fromdef,todef:tdef;var besteq:tequaltype):Tprocdef;
           procedure add_generic_overload(sym:tprocsym);
           procedure add_generic_overload(sym:tprocsym);
@@ -1300,12 +1302,26 @@ implementation
       end;
       end;
 
 
 
 
+    class function Tprocsym.compare_funcrefdef(pd:tprocdef;arg:tobject):tequaltype;
+      begin
+        result:=proc_to_funcref_equal(pd,tobjectdef(arg));
+      end;
+
+
     function Tprocsym.Find_procdef_byprocvardef(d:Tprocvardef):Tprocdef;
     function Tprocsym.Find_procdef_byprocvardef(d:Tprocvardef):Tprocdef;
       begin
       begin
         result:=find_procdef_with_comparer(@compare_procvardef,d);
         result:=find_procdef_with_comparer(@compare_procvardef,d);
       end;
       end;
 
 
 
 
+    function Tprocsym.Find_procdef_byfuncrefdef(d:tobjectdef):Tprocdef;
+      begin
+        if not is_invokable(d) then
+          internalerror(2022033001);
+        result:=find_procdef_with_comparer(@compare_funcrefdef,d);
+      end;
+
+
     function Tprocsym.Find_procdef_assignment_operator(fromdef,todef:tdef;var besteq:tequaltype;isexplicit:boolean):Tprocdef;
     function Tprocsym.Find_procdef_assignment_operator(fromdef,todef:tdef;var besteq:tequaltype;isexplicit:boolean):Tprocdef;
       var
       var
         paraidx, realparamcount,
         paraidx, realparamcount,