Browse Source

compiler: prepare collect_overloads_in_struct to work with operators, replace tprocsym argument in proc_add to tsymtable because tprocsym is only used to get the symtable

git-svn-id: trunk@16623 -
paul 14 years ago
parent
commit
525f4fea43
1 changed files with 21 additions and 13 deletions
  1. 21 13
      compiler/htypechk.pas

+ 21 - 13
compiler/htypechk.pas

@@ -66,10 +66,10 @@ interface
         FParaNode   : tnode;
         FParaNode   : tnode;
         FParaLength : smallint;
         FParaLength : smallint;
         FAllowVariant : boolean;
         FAllowVariant : boolean;
-        procedure collect_overloads_in_struct(ProcdefOverloadList:TFPObjectList);
+        procedure collect_overloads_in_struct(structdef:tabstractrecorddef;ProcdefOverloadList:TFPObjectList);
         procedure collect_overloads_in_units(ProcdefOverloadList:TFPObjectList; objcidcall,explicitunit: boolean);
         procedure collect_overloads_in_units(ProcdefOverloadList:TFPObjectList; objcidcall,explicitunit: boolean);
         procedure create_candidate_list(ignorevisibility,allowdefaultparas,objcidcall,explicitunit:boolean);
         procedure create_candidate_list(ignorevisibility,allowdefaultparas,objcidcall,explicitunit:boolean);
-        function  proc_add(ps:tprocsym;pd:tprocdef;objcidcall: boolean):pcandidate;
+        function  proc_add(st:tsymtable;pd:tprocdef;objcidcall: boolean):pcandidate;
       public
       public
         constructor create(sym:tprocsym;st:TSymtable;ppn:tnode;ignorevisibility,allowdefaultparas,objcidcall,explicitunit:boolean);
         constructor create(sym:tprocsym;st:TSymtable;ppn:tnode;ignorevisibility,allowdefaultparas,objcidcall,explicitunit:boolean);
         constructor create_operator(op:ttoken;ppn:tnode);
         constructor create_operator(op:ttoken;ppn:tnode);
@@ -1742,17 +1742,18 @@ implementation
       end;
       end;
 
 
 
 
-    procedure tcallcandidates.collect_overloads_in_struct(ProcdefOverloadList:TFPObjectList);
+    procedure tcallcandidates.collect_overloads_in_struct(structdef:tabstractrecorddef;ProcdefOverloadList:TFPObjectList);
       var
       var
         j          : integer;
         j          : integer;
         pd         : tprocdef;
         pd         : tprocdef;
         srsym      : tsym;
         srsym      : tsym;
-        structdef  : tabstractrecorddef;
         hashedid   : THashedIDString;
         hashedid   : THashedIDString;
         hasoverload : boolean;
         hasoverload : boolean;
       begin
       begin
-        structdef:=tabstractrecorddef(fprocsym.owner.defowner);
-        hashedid.id:=fprocsym.name;
+        if FOperator=NOTOKEN then
+          hashedid.id:=FProcsym.name
+        else
+          hashedid.id:=overloaded_names[FOperator];
         hasoverload:=false;
         hasoverload:=false;
         while assigned(structdef) do
         while assigned(structdef) do
          begin
          begin
@@ -1761,6 +1762,9 @@ implementation
               { Delphi allows hiding a property by a procedure with the same name }
               { Delphi allows hiding a property by a procedure with the same name }
               (srsym.typ=procsym) then
               (srsym.typ=procsym) then
              begin
              begin
+               { Store first procsym found }
+               if not assigned(FProcsym) then
+                 FProcsym:=tprocsym(srsym);
                { add all definitions }
                { add all definitions }
                hasoverload:=false;
                hasoverload:=false;
                for j:=0 to tprocsym(srsym).ProcdefList.Count-1 do
                for j:=0 to tprocsym(srsym).ProcdefList.Count-1 do
@@ -1861,6 +1865,7 @@ implementation
         hp    : pcandidate;
         hp    : pcandidate;
         pt    : tcallparanode;
         pt    : tcallparanode;
         found : boolean;
         found : boolean;
+        st    : TSymtable;
         contextstructdef : tabstractrecorddef;
         contextstructdef : tabstractrecorddef;
         ProcdefOverloadList : TFPObjectList;
         ProcdefOverloadList : TFPObjectList;
       begin
       begin
@@ -1871,7 +1876,7 @@ implementation
         if not objcidcall and
         if not objcidcall and
            (FOperator=NOTOKEN) and
            (FOperator=NOTOKEN) and
            (FProcsym.owner.symtabletype in [objectsymtable,recordsymtable]) then
            (FProcsym.owner.symtabletype in [objectsymtable,recordsymtable]) then
-          collect_overloads_in_struct(ProcdefOverloadList)
+          collect_overloads_in_struct(tabstractrecorddef(FProcsym.owner.defowner),ProcdefOverloadList)
         else
         else
           collect_overloads_in_units(ProcdefOverloadList,objcidcall,explicitunit);
           collect_overloads_in_units(ProcdefOverloadList,objcidcall,explicitunit);
 
 
@@ -1905,6 +1910,11 @@ implementation
         else
         else
           contextstructdef:=current_structdef;
           contextstructdef:=current_structdef;
 
 
+        { symtable is needed later to calculate the distance }
+        if assigned(FProcsym) then
+          st:=FProcsym.Owner
+        else
+          st:=nil;
         { Process all found overloads }
         { Process all found overloads }
         for j:=0 to ProcdefOverloadList.Count-1 do
         for j:=0 to ProcdefOverloadList.Count-1 do
           begin
           begin
@@ -1947,7 +1957,7 @@ implementation
                     hp:=hp^.next;
                     hp:=hp^.next;
                   end;
                   end;
                 if not found then
                 if not found then
-                  proc_add(fprocsym,pd,objcidcall);
+                  proc_add(st,pd,objcidcall);
               end;
               end;
           end;
           end;
 
 
@@ -1955,10 +1965,9 @@ implementation
       end;
       end;
 
 
 
 
-    function tcallcandidates.proc_add(ps:tprocsym;pd:tprocdef;objcidcall: boolean):pcandidate;
+    function tcallcandidates.proc_add(st:tsymtable;pd:tprocdef;objcidcall: boolean):pcandidate;
       var
       var
         defaultparacnt : integer;
         defaultparacnt : integer;
-        parentst        : tsymtable;
       begin
       begin
         { generate new candidate entry }
         { generate new candidate entry }
         new(result);
         new(result);
@@ -1985,15 +1994,14 @@ implementation
          end;
          end;
         { Give a small penalty for overloaded methods not in
         { Give a small penalty for overloaded methods not in
           defined the current class/unit }
           defined the current class/unit }
-        parentst:=ps.owner;
         {  when calling Objective-C methods via id.method, then the found
         {  when calling Objective-C methods via id.method, then the found
            procsym will be inside an arbitrary ObjectSymtable, and we don't
            procsym will be inside an arbitrary ObjectSymtable, and we don't
            want togive the methods of that particular objcclass precedence over
            want togive the methods of that particular objcclass precedence over
            other methods, so instead check against the symtable in which this
            other methods, so instead check against the symtable in which this
            objcclass is defined }
            objcclass is defined }
         if objcidcall then
         if objcidcall then
-          parentst:=parentst.defowner.owner;
-        if (parentst<>pd.owner) then
+          st:=st.defowner.owner;
+        if (st<>pd.owner) then
           result^.ordinal_distance:=result^.ordinal_distance+1.0;
           result^.ordinal_distance:=result^.ordinal_distance+1.0;
       end;
       end;