Browse Source

Refactor tobjectdef.find_implemented_interface out into unit defcmp so that the recently introduced cycle between symdef and defcmp can be broken again.

defcmp.pas:
  + add function "find_implemented_interface"
  * change method call of "find_implemented_interface" into function call
symdef.pas:
  - tobjectdef: remove method "find_implemented_interface"
  - remove use of unit "defcmp"
pgenutil.pas:
  * change method call of "find_implemented_interface" into function call
  + add use of unit "defcmp"
ncgcnv.pas, ncnv.pas, pdecobj.pas, pdecsub.pas, pdecvar.pas:
  * change method call of "find_implemented_interface" into function call

git-svn-id: trunk@25844 -
svenbarth 11 years ago
parent
commit
76f6de5cf1

+ 28 - 1
compiler/defcmp.pas

@@ -152,6 +152,10 @@ interface
     { parentdef's resultdef                                                          }
     { parentdef's resultdef                                                          }
     function compatible_childmethod_resultdef(parentretdef, childretdef: tdef): boolean;
     function compatible_childmethod_resultdef(parentretdef, childretdef: tdef): boolean;
 
 
+    { Checks whether the class impldef or one of its parent classes implements }
+    { the interface intfdef and returns the corresponding "implementation link }
+    function find_implemented_interface(impldef,intfdef:tobjectdef):timplementedinterface;
+
 
 
 implementation
 implementation
 
 
@@ -1588,7 +1592,7 @@ implementation
                         hobjdef:=tobjectdef(def_from);
                         hobjdef:=tobjectdef(def_from);
                         while assigned(hobjdef) do
                         while assigned(hobjdef) do
                           begin
                           begin
-                             if hobjdef.find_implemented_interface(tobjectdef(def_to))<>nil then
+                             if find_implemented_interface(hobjdef,tobjectdef(def_to))<>nil then
                                begin
                                begin
                                   if is_interface(def_to) then
                                   if is_interface(def_to) then
                                     doconv:=tc_class_2_intf
                                     doconv:=tc_class_2_intf
@@ -2193,4 +2197,27 @@ implementation
       end;
       end;
 
 
 
 
+    function find_implemented_interface(impldef,intfdef:tobjectdef):timplementedinterface;
+      var
+        implintf : timplementedinterface;
+        i : longint;
+      begin
+        if not assigned(impldef) then
+          internalerror(2013102301);
+        if not assigned(intfdef) then
+          internalerror(2013102302);
+        result:=nil;
+        if not assigned(impldef.implementedinterfaces) then
+          exit;
+        for i:=0 to impldef.implementedinterfaces.count-1 do
+          begin
+            implintf:=timplementedinterface(impldef.implementedinterfaces[i]);
+            if equal_defs(implintf.intfdef,intfdef) then
+              begin
+                result:=implintf;
+                exit;
+              end;
+          end;
+      end;
+
 end.
 end.

+ 1 - 1
compiler/ncgcnv.pas

@@ -708,7 +708,7 @@ interface
          hd:=tobjectdef(left.resultdef);
          hd:=tobjectdef(left.resultdef);
          while assigned(hd) do
          while assigned(hd) do
            begin
            begin
-             ImplIntf:=hd.find_implemented_interface(tobjectdef(resultdef));
+             ImplIntf:=find_implemented_interface(hd,tobjectdef(resultdef));
              if assigned(ImplIntf) then
              if assigned(ImplIntf) then
                begin
                begin
                  case ImplIntf.IType of
                  case ImplIntf.IType of

+ 1 - 1
compiler/ncnv.pas

@@ -3241,7 +3241,7 @@ implementation
          hd:=tobjectdef(left.resultdef);
          hd:=tobjectdef(left.resultdef);
          while assigned(hd) do
          while assigned(hd) do
            begin
            begin
-             ImplIntf:=hd.find_implemented_interface(tobjectdef(resultdef));
+             ImplIntf:=find_implemented_interface(hd,tobjectdef(resultdef));
              if assigned(ImplIntf) then
              if assigned(ImplIntf) then
                begin
                begin
                  case ImplIntf.IType of
                  case ImplIntf.IType of

+ 2 - 2
compiler/pdecobj.pas

@@ -321,7 +321,7 @@ implementation
              Message1(parser_e_forward_intf_declaration_must_be_resolved,intfdef.objrealname^);
              Message1(parser_e_forward_intf_declaration_must_be_resolved,intfdef.objrealname^);
              exit;
              exit;
           end;
           end;
-        if current_objectdef.find_implemented_interface(intfdef)<>nil then
+        if find_implemented_interface(current_objectdef,intfdef)<>nil then
           Message1(sym_e_duplicate_id,intfdef.objname^)
           Message1(sym_e_duplicate_id,intfdef.objname^)
         else
         else
           begin
           begin
@@ -361,7 +361,7 @@ implementation
              Message1(parser_e_forward_intf_declaration_must_be_resolved,intfdef.objrealname^);
              Message1(parser_e_forward_intf_declaration_must_be_resolved,intfdef.objrealname^);
              exit;
              exit;
           end;
           end;
-        if current_objectdef.find_implemented_interface(intfdef)<>nil then
+        if find_implemented_interface(current_objectdef,intfdef)<>nil then
           Message1(sym_e_duplicate_id,intfdef.objname^)
           Message1(sym_e_duplicate_id,intfdef.objname^)
         else
         else
           begin
           begin

+ 1 - 1
compiler/pdecsub.pas

@@ -783,7 +783,7 @@ implementation
            ImplIntf:=nil;
            ImplIntf:=nil;
            if (srsym.typ=typesym) and
            if (srsym.typ=typesym) and
               (ttypesym(srsym).typedef.typ=objectdef) then
               (ttypesym(srsym).typedef.typ=objectdef) then
-             ImplIntf:=tobjectdef(astruct).find_implemented_interface(tobjectdef(ttypesym(srsym).typedef));
+             ImplIntf:=find_implemented_interface(tobjectdef(astruct),tobjectdef(ttypesym(srsym).typedef));
            if ImplIntf=nil then
            if ImplIntf=nil then
              Message(parser_e_interface_id_expected)
              Message(parser_e_interface_id_expected)
            else
            else

+ 1 - 1
compiler/pdecvar.pas

@@ -831,7 +831,7 @@ implementation
                end
                end
              else if is_class(p.propdef) then
              else if is_class(p.propdef) then
                begin
                begin
-                 ImplIntf:=tobjectdef(p.propdef).find_implemented_interface(tobjectdef(def));
+                 ImplIntf:=find_implemented_interface(tobjectdef(p.propdef),tobjectdef(def));
                  if assigned(ImplIntf) then
                  if assigned(ImplIntf) then
                    begin
                    begin
                      if compare_defs(ImplIntf.IntfDef,def,nothingn)<te_equal then
                      if compare_defs(ImplIntf.IntfDef,def,nothingn)<te_equal then

+ 2 - 2
compiler/pgenutil.pas

@@ -63,7 +63,7 @@ uses
   { global }
   { global }
   globals,tokens,verbose,finput,
   globals,tokens,verbose,finput,
   { symtable }
   { symtable }
-  symconst,symsym,symtable,
+  symconst,symsym,symtable,defcmp,
   { modules }
   { modules }
   fmodule,
   fmodule,
   { pass 1 }
   { pass 1 }
@@ -238,7 +238,7 @@ uses
                             while assigned(objdef) do
                             while assigned(objdef) do
                               begin
                               begin
                                 intffound:=assigned(
                                 intffound:=assigned(
-                                             objdef.find_implemented_interface(
+                                             find_implemented_interface(objdef,
                                                timplementedinterface(formalobjdef.implementedinterfaces[j]).intfdef
                                                timplementedinterface(formalobjdef.implementedinterfaces[j]).intfdef
                                              )
                                              )
                                            );
                                            );

+ 1 - 22
compiler/symdef.pas

@@ -396,7 +396,6 @@ interface
           function  alignment:shortint;override;
           function  alignment:shortint;override;
           function  vmtmethodoffset(index:longint):longint;
           function  vmtmethodoffset(index:longint):longint;
           function  members_need_inittable : boolean;
           function  members_need_inittable : boolean;
-          function  find_implemented_interface(aintfdef:tobjectdef):TImplementedInterface;
           { this should be called when this class implements an interface }
           { this should be called when this class implements an interface }
           procedure prepareguid;
           procedure prepareguid;
           function  is_publishable : boolean;override;
           function  is_publishable : boolean;override;
@@ -1087,7 +1086,7 @@ implementation
       { target }
       { target }
       systems,paramgr,
       systems,paramgr,
       { symtable }
       { symtable }
-      symsym,symtable,defutil,objcdef,defcmp,
+      symsym,symtable,defutil,objcdef,
 {$ifdef jvm}
 {$ifdef jvm}
       jvmdef,
       jvmdef,
 {$endif}
 {$endif}
@@ -6477,26 +6476,6 @@ implementation
       end;
       end;
 
 
 
 
-    function tobjectdef.find_implemented_interface(aintfdef:tobjectdef):TImplementedInterface;
-      var
-        ImplIntf : TImplementedInterface;
-        i : longint;
-      begin
-        result:=nil;
-        if not assigned(ImplementedInterfaces) then
-          exit;
-        for i:=0 to ImplementedInterfaces.Count-1 do
-          begin
-            ImplIntf:=TImplementedInterface(ImplementedInterfaces[i]);
-            if equal_defs(implintf.intfdef,aintfdef) then
-              begin
-                result:=ImplIntf;
-                exit;
-              end;
-          end;
-      end;
-
-
     function tobjectdef.is_publishable : boolean;
     function tobjectdef.is_publishable : boolean;
       begin
       begin
          is_publishable:=objecttype in [odt_class,odt_interfacecom,odt_interfacecorba,odt_dispinterface];
          is_publishable:=objecttype in [odt_class,odt_interfacecom,odt_interfacecorba,odt_dispinterface];