Răsfoiți Sursa

* ignore vs_hidden parameters when choosing overloaded proc

peter 22 ani în urmă
părinte
comite
a2a1a36e83
3 a modificat fișierele cu 51 adăugiri și 20 ștergeri
  1. 27 10
      compiler/ncal.pas
  2. 5 2
      compiler/symconst.pas
  3. 19 8
      compiler/symdef.pas

+ 27 - 10
compiler/ncal.pas

@@ -1248,15 +1248,17 @@ type
         hp:=procs;
         hp:=procs;
         while assigned(hp) do
         while assigned(hp) do
          begin
          begin
+           { Setup first parameter to compare }
            currparanr:=paralength;
            currparanr:=paralength;
            currpara:=hp^.firstpara;
            currpara:=hp^.firstpara;
+           while assigned(currpara) and (currpara.paratyp=vs_hidden) do
+             currpara:=tparaitem(currpara.next);
            pt:=tcallparanode(left);
            pt:=tcallparanode(left);
-           while assigned(pt) do
+           while assigned(pt) and assigned(currpara) do
             begin
             begin
               { retrieve current parameter definitions to compares }
               { retrieve current parameter definitions to compares }
               def_from:=pt.resulttype.def;
               def_from:=pt.resulttype.def;
               def_to:=currpara.paratype.def;
               def_to:=currpara.paratype.def;
-{$ifdef extdebug}
               if not(assigned(def_from)) then
               if not(assigned(def_from)) then
                internalerror(200212091);
                internalerror(200212091);
               if not(
               if not(
@@ -1265,7 +1267,6 @@ type
                       (currparanr>hp^.data.minparacount))
                       (currparanr>hp^.data.minparacount))
                     ) then
                     ) then
                internalerror(200212092);
                internalerror(200212092);
-{$endif extdebug}
 
 
               { varargs are always equal, but not exact }
               { varargs are always equal, but not exact }
               if (po_varargs in hp^.data.procoptions) and
               if (po_varargs in hp^.data.procoptions) and
@@ -1289,9 +1290,9 @@ type
                  begin
                  begin
                    inc(hp^.equal_count);
                    inc(hp^.equal_count);
                    hp^.ordinal_distance:=hp^.ordinal_distance+
                    hp^.ordinal_distance:=hp^.ordinal_distance+
-                     abs(bestreal(torddef(def_from).low-torddef(def_to).low));
+                     abs(bestreal(torddef(def_from).low)-bestreal(torddef(def_to).low));
                    hp^.ordinal_distance:=hp^.ordinal_distance+
                    hp^.ordinal_distance:=hp^.ordinal_distance+
-                     abs(bestreal(torddef(def_to).high-torddef(def_from).high));
+                     abs(bestreal(torddef(def_to).high)-bestreal(torddef(def_from).high));
                  end
                  end
               else
               else
               { generic type comparision }
               { generic type comparision }
@@ -1350,10 +1351,17 @@ type
                 if we're out of the varargs }
                 if we're out of the varargs }
               if not(po_varargs in hp^.data.procoptions) or
               if not(po_varargs in hp^.data.procoptions) or
                  (currparanr<=hp^.data.maxparacount) then
                  (currparanr<=hp^.data.maxparacount) then
-                currpara:=tparaitem(currpara.next);
+               begin
+                 { Ignore vs_hidden parameters }
+                 repeat
+                   currpara:=tparaitem(currpara.next);
+                 until (not assigned(currpara)) or (currpara.paratyp<>vs_hidden);
+               end;
               dec(currparanr);
               dec(currparanr);
             end;
             end;
-
+           if not(hp^.invalid) and
+              (assigned(pt) or assigned(currpara) or (currparanr<>0)) then
+             internalerror(200212141);
            { next candidate }
            { next candidate }
            hp:=hp^.next;
            hp:=hp^.next;
          end;
          end;
@@ -1497,6 +1505,8 @@ type
 
 
               { check the amount of parameters }
               { check the amount of parameters }
               pdc:=tparaitem(procdefinition.Para.first);
               pdc:=tparaitem(procdefinition.Para.first);
+              while assigned(pdc) and (pdc.paratyp=vs_hidden) do
+                pdc:=tparaitem(pdc.next);
               pt:=tcallparanode(left);
               pt:=tcallparanode(left);
               lastpara:=paralength;
               lastpara:=paralength;
               while assigned(pdc) and assigned(pt) do
               while assigned(pdc) and assigned(pt) do
@@ -1504,7 +1514,11 @@ type
                   { only goto next para if we're out of the varargs }
                   { only goto next para if we're out of the varargs }
                   if not(po_varargs in procdefinition.procoptions) or
                   if not(po_varargs in procdefinition.procoptions) or
                      (lastpara<=procdefinition.maxparacount) then
                      (lastpara<=procdefinition.maxparacount) then
-                    pdc:=tparaitem(pdc.next);
+                   begin
+                     repeat
+                       pdc:=tparaitem(pdc.next);
+                     until (not assigned(pdc)) or (pdc.paratyp<>vs_hidden);
+                   end;
                   pt:=tcallparanode(pt.right);
                   pt:=tcallparanode(pt.right);
                   dec(lastpara);
                   dec(lastpara);
                 end;
                 end;
@@ -1633,7 +1647,7 @@ type
                  while assigned(pdc) do
                  while assigned(pdc) do
                   begin
                   begin
                     if not assigned(pdc.defaultvalue) then
                     if not assigned(pdc.defaultvalue) then
-                     internalerror(751349858);
+                     internalerror(200212142);
                     left:=ccallparanode.create(genconstsymtree(tconstsym(pdc.defaultvalue)),left);
                     left:=ccallparanode.create(genconstsymtree(tconstsym(pdc.defaultvalue)),left);
                     pdc:=tparaitem(pdc.previous);
                     pdc:=tparaitem(pdc.previous);
                   end;
                   end;
@@ -2178,7 +2192,10 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.117  2002-12-11 22:42:28  peter
+  Revision 1.118  2002-12-15 11:26:02  peter
+    * ignore vs_hidden parameters when choosing overloaded proc
+
+  Revision 1.117  2002/12/11 22:42:28  peter
     * tcallnode.det_resulttype rewrite, merged code from nice_ncal and
     * tcallnode.det_resulttype rewrite, merged code from nice_ncal and
       the old code. The new code collects the information about possible
       the old code. The new code collects the information about possible
       candidates only once resultting in much less calls to type compare
       candidates only once resultting in much less calls to type compare

+ 5 - 2
compiler/symconst.pas

@@ -278,7 +278,7 @@ type
     vs_set_but_first_not_passed,vs_assigned,vs_used
     vs_set_but_first_not_passed,vs_assigned,vs_used
   );
   );
 
 
-  tvarspez = (vs_value,vs_const,vs_var,vs_out);
+  tvarspez = (vs_value,vs_const,vs_var,vs_out,vs_hidden);
 
 
   targconvtyp = (act_convertable,act_equal,act_exact);
   targconvtyp = (act_convertable,act_equal,act_exact);
 
 
@@ -339,7 +339,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.38  2002-12-05 14:44:38  florian
+  Revision 1.39  2002-12-15 11:26:02  peter
+    * ignore vs_hidden parameters when choosing overloaded proc
+
+  Revision 1.38  2002/12/05 14:44:38  florian
     + oo_dispinterface added
     + oo_dispinterface added
 
 
   Revision 1.37  2002/11/29 22:31:20  carl
   Revision 1.37  2002/11/29 22:31:20  carl

+ 19 - 8
compiler/symdef.pas

@@ -522,7 +522,7 @@ interface
           procedure setmangledname(const s : string);
           procedure setmangledname(const s : string);
           procedure load_references(ppufile:tcompilerppufile;locals:boolean);
           procedure load_references(ppufile:tcompilerppufile;locals:boolean);
           function  write_references(ppufile:tcompilerppufile;locals:boolean):boolean;
           function  write_references(ppufile:tcompilerppufile;locals:boolean):boolean;
-          { inserts the local symbol table, if this is not 
+          { inserts the local symbol table, if this is not
             no local symbol table is built. Should be called only
             no local symbol table is built. Should be called only
             when we are sure that a local symbol table will be required.
             when we are sure that a local symbol table will be required.
           }
           }
@@ -3045,9 +3045,13 @@ implementation
         hp.paratype:=tt;
         hp.paratype:=tt;
         hp.defaultvalue:=defval;
         hp.defaultvalue:=defval;
         Para.insert(hp);
         Para.insert(hp);
-        if not assigned(defval) then
-         inc(minparacount);
-        inc(maxparacount);
+        { Don't count hidden parameters }
+        if (vsp<>vs_hidden) then
+         begin
+           if not assigned(defval) then
+            inc(minparacount);
+           inc(maxparacount);
+         end;
       end;
       end;
 
 
 
 
@@ -3109,9 +3113,13 @@ implementation
             hp.parasym:=tsym(ppufile.getderef);
             hp.parasym:=tsym(ppufile.getderef);
             { later, we'll gerate this on the fly (FK) }
             { later, we'll gerate this on the fly (FK) }
             ppufile.getdata(hp.paraloc,sizeof(tparalocation));
             ppufile.getdata(hp.paraloc,sizeof(tparalocation));
-            if not assigned(hp.defaultvalue) then
-             inc(minparacount);
-            inc(maxparacount);
+            { Don't count hidden parameters }
+            if (hp.paratyp<>vs_hidden) then
+             begin
+               if not assigned(hp.defaultvalue) then
+                inc(minparacount);
+               inc(maxparacount);
+             end;
             Para.concat(hp);
             Para.concat(hp);
           end;
           end;
       end;
       end;
@@ -5514,7 +5522,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.115  2002-12-07 14:27:09  carl
+  Revision 1.116  2002-12-15 11:26:02  peter
+    * ignore vs_hidden parameters when choosing overloaded proc
+
+  Revision 1.115  2002/12/07 14:27:09  carl
     * 3% memory optimization
     * 3% memory optimization
     * changed some types
     * changed some types
     + added type checking with different size for call node and for
     + added type checking with different size for call node and for