瀏覽代碼

* maybe_testvmt added

peter 22 年之前
父節點
當前提交
a3c3fb9282
共有 1 個文件被更改,包括 29 次插入5 次删除
  1. 29 5
      compiler/cgobj.pas

+ 29 - 5
compiler/cgobj.pas

@@ -41,7 +41,7 @@ unit cgobj;
        cclasses,aasmbase,aasmtai,aasmcpu,symtable,
        cpubase,cpuinfo,cpupara,
        cginfo,
-       symconst,symbase,symtype,node
+       symconst,symbase,symtype,symdef,node
 {$ifdef delphi}
        ,dmisc
 {$endif}
@@ -304,7 +304,8 @@ unit cgobj;
 
 
           procedure g_maybe_loadself(list : taasmoutput);virtual;
-          procedure g_maybe_testself(list : taasmoutput);virtual;
+          procedure g_maybe_testself(list : taasmoutput;reg:tregister);
+          procedure g_maybe_testvmt(list : taasmoutput;reg:tregister;objdef:tobjectdef);
           {# This should emit the opcode to copy len bytes from the source
              to destination, if loadref is true, it assumes that it first must load
              the source address from the memory location where
@@ -499,7 +500,7 @@ unit cgobj;
 
     uses
        globals,globtype,options,systems,cgbase,
-       verbose,defutil,tgobj,symdef,paramgr,
+       verbose,defutil,tgobj,paramgr,
        rgobj,cutils;
 
     const
@@ -1464,7 +1465,7 @@ unit cgobj;
       end;
 
 
-    procedure tcg.g_maybe_testself(list : taasmoutput);
+    procedure tcg.g_maybe_testself(list : taasmoutput;reg:tregister);
       var
         OKLabel : tasmlabel;
         dummyloc : tparalocation;
@@ -1483,6 +1484,26 @@ unit cgobj;
       end;
 
 
+    procedure tcg.g_maybe_testvmt(list : taasmoutput;reg:tregister;objdef:tobjectdef);
+      var
+        hrefvmt : treference;
+      begin
+        if (cs_check_object in aktlocalswitches) then
+         begin
+           reference_reset_symbol(hrefvmt,objectlibrary.newasmsymbol(objdef.vmt_mangledname),0);
+           a_paramaddr_ref(exprasmlist,hrefvmt,paramanager.getintparaloc(2));
+           a_param_reg(exprasmlist,OS_ADDR,reg,paramanager.getintparaloc(1));
+           a_call_name(exprasmlist,'FPC_CHECK_OBJECT_EXT');
+         end
+        else
+         if (cs_check_range in aktlocalswitches) then
+          begin
+            a_param_reg(exprasmlist,OS_ADDR,reg,paramanager.getintparaloc(1));
+            a_call_name(exprasmlist,'FPC_CHECK_OBJECT');
+          end;
+      end;
+
+
 {*****************************************************************************
                             Entry/Exit Code Functions
 *****************************************************************************}
@@ -1705,7 +1726,10 @@ finalization
 end.
 {
   $Log$
-  Revision 1.74  2003-01-17 12:45:40  daniel
+  Revision 1.75  2003-01-30 21:46:35  peter
+    * maybe_testvmt added
+
+  Revision 1.74  2003/01/17 12:45:40  daniel
     * Fixed internalerror 200301081 problem
 
   Revision 1.73  2003/01/13 14:54:34  daniel