Browse Source

* fixed tb0403

Jonas Maebe 23 years ago
parent
commit
dc44063472
1 changed files with 25 additions and 11 deletions
  1. 25 11
      compiler/ncgld.pas

+ 25 - 11
compiler/ncgld.pas

@@ -332,16 +332,27 @@ implementation
                        if (po_virtualmethod in tprocdef(resulttype.def).procoptions) then
                          begin
                             if not freereg then
-                             internalerror(200205161);
-                            { load vmt pointer }
-                            reference_reset_base(href,hregister,0);
-                            reference_release(exprasmlist,href);
-                            hregister:=rg.getaddressregister(exprasmlist);
-                            cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
-                            { load method address }
-                            reference_reset_base(href,hregister,tprocdef(resulttype.def)._class.vmtmethodoffset(
+                              begin
+                                if left.nodetype <> typen then
+                                  internalerror(200205161);
+                                reference_reset_symbol(href,newasmsymbol(tobjectdef(left.resulttype.def).vmt_mangledname),
+                                  tprocdef(resulttype.def)._class.vmtmethodoffset(tprocdef(resulttype.def).extnumber));
+                              end
+                            else
+                              begin
+                                { load vmt pointer }
+                                reference_reset_base(href,hregister,0);
+                                reference_release(exprasmlist,href);
+                                hregister:=rg.getaddressregister(exprasmlist);
+                                cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
+
+
+                                reference_reset_base(href,hregister,tprocdef(resulttype.def)._class.vmtmethodoffset(
                                                  tprocdef(resulttype.def).extnumber));
-                            reference_release(exprasmlist,href);
+                                reference_release(exprasmlist,href);
+                              end;
+
+                            { load method address }
                             hregister:=rg.getaddressregister(exprasmlist);
                             cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
                             { ... and store it }
@@ -352,7 +363,7 @@ implementation
                          begin
                             { we don't use the hregister }
                             if freereg then
-                             rg.ungetregisterint(exprasmlist,hregister);
+                             rg.ungetregister(exprasmlist,hregister);
                             { load address of the function }
                             reference_reset_symbol(href,objectlibrary.newasmsymbol(tprocdef(resulttype.def).mangledname),0);
                             hregister:=cg.get_scratch_reg_address(exprasmlist);
@@ -931,7 +942,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.21  2002-08-13 21:40:56  florian
+  Revision 1.22  2002-08-14 18:00:42  jonas
+    * fixed tb0403
+
+  Revision 1.21  2002/08/13 21:40:56  florian
     * more fixes for ppc calling conventions
 
   Revision 1.20  2002/08/11 14:32:26  peter