فهرست منبع

* fixed ncgutil.gen_load_vmt_register and tcgloadvmtaddrnode.pass_generate_code
for i8086 far data memory models by using the high level code generator

git-svn-id: trunk@27326 -

nickysn 11 سال پیش
والد
کامیت
891ab86254
2فایلهای تغییر یافته به همراه12 افزوده شده و 12 حذف شده
  1. 6 6
      compiler/ncgmem.pas
  2. 6 6
      compiler/ncgutil.pas

+ 6 - 6
compiler/ncgmem.pas

@@ -102,16 +102,16 @@ implementation
         entry   : PHashSetItem;
 
       begin
-         location_reset(location,LOC_REGISTER,OS_ADDR);
+         location_reset(location,LOC_REGISTER,def_cgsize(voidpointertype));
          if (left.nodetype=typen) then
            begin
-             location.register:=cg.getaddressregister(current_asmdata.CurrAsmList);
+             location.register:=hlcg.getaddressregister(current_asmdata.CurrAsmList,voidpointertype);
              if not is_objcclass(left.resultdef) then
                begin
                  reference_reset_symbol(href,
                    current_asmdata.RefAsmSymbol(tobjectdef(tclassrefdef(resultdef).pointeddef).vmt_mangledname,AT_DATA),0,
-                   sizeof(pint));
-                 cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,location.register);
+                   voidpointertype.size);
+                 hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,voidpointertype,voidpointertype,href,location.register);
                end
              else
                begin
@@ -127,8 +127,8 @@ implementation
                      { find/add necessary classref/classname pool entries }
                      objcfinishstringrefpoolentry(entry,sp_objcclassnames,sec_objc_cls_refs,sec_objc_class_names);
                    end;
-                 reference_reset_symbol(href,tasmlabel(entry^.Data),0,sizeof(pint));
-                 cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,href,location.register);
+                 reference_reset_symbol(href,tasmlabel(entry^.Data),0,voidpointertype.size);
+                 hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,voidpointertype,voidpointertype,href,location.register);
                end;
            end
          else

+ 6 - 6
compiler/ncgutil.pas

@@ -1900,8 +1900,8 @@ implementation
               LOC_CREFERENCE,
               LOC_REFERENCE:
                 begin
-                  reference_reset_base(href,cg.getaddressregister(list),objdef.vmt_offset,sizeof(pint));
-                  cg.a_loadaddr_ref_reg(list,selfloc.reference,href.base);
+                  hlcg.reference_reset_base(href,voidpointertype,hlcg.getaddressregister(list,voidpointertype),objdef.vmt_offset,voidpointertype.size);
+                  hlcg.a_loadaddr_ref_reg(list,voidpointertype,voidpointertype,selfloc.reference,href.base);
                   selfdef:=getpointerdef(objdef);
                 end;
               else
@@ -1925,7 +1925,7 @@ implementation
                     end
                   else
 {$endif cpu_uses_separate_address_registers}
-                    reference_reset_base(href,selfloc.register,objdef.vmt_offset,sizeof(pint));
+                    hlcg.reference_reset_base(href,voidpointertype,selfloc.register,objdef.vmt_offset,voidpointertype.size);
                 end;
               LOC_CONSTANT,
               LOC_CREGISTER,
@@ -1936,7 +1936,7 @@ implementation
               LOC_CSUBSETREF,
               LOC_SUBSETREF:
                 begin
-                  reference_reset_base(href,cg.getaddressregister(list),objdef.vmt_offset,sizeof(pint));
+                  hlcg.reference_reset_base(href,voidpointertype,hlcg.getaddressregister(list,voidpointertype),objdef.vmt_offset,voidpointertype.size);
                   { todo: pass actual vmt pointer type to hlcg }
                   hlcg.a_load_loc_reg(list,voidpointertype,voidpointertype,selfloc,href.base);
                 end;
@@ -1944,9 +1944,9 @@ implementation
                 internalerror(200305057);
             end;
           end;
-        vmtreg:=cg.getaddressregister(list);
+        vmtreg:=hlcg.getaddressregister(list,voidpointertype);
         hlcg.g_maybe_testself(list,selfdef,href.base);
-        cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,vmtreg);
+        hlcg.a_load_ref_reg(list,voidpointertype,voidpointertype,href,vmtreg);
 
         { test validity of VMT }
         if not(is_interface(objdef)) and