浏览代码

* Dyn array for interference bitmap

Michaël Van Canneyt 4 月之前
父节点
当前提交
b67e6ed75e
共有 1 个文件被更改,包括 17 次插入16 次删除
  1. 17 16
      compiler/rgobj.pas

+ 17 - 16
compiler/rgobj.pas

@@ -42,22 +42,25 @@ unit rgobj;
       aasmtai,aasmdata,aasmsym,aasmcpu,
       cclasses,globtype,cgbase,cgutils;
 
+    const
+      interferenceBitmap2Size = 256;
+
     type
       {
         The interference bitmap contains of 2 layers:
           layer 1 - 256*256 blocks with pointers to layer 2 blocks
           layer 2 - blocks of 32*256 (32 bytes = 256 bits)
       }
-      Tinterferencebitmap2 = array[byte] of set of byte;
-      Pinterferencebitmap2 = ^Tinterferencebitmap2;
-      Tinterferencebitmap1 = array[byte] of Pinterferencebitmap2;
-      pinterferencebitmap1 = ^tinterferencebitmap1;
+
+      Tinterferencebitmap2 = array of set of byte;
+      Tinterferencebitmap1 = array[byte] of Tinterferencebitmap2;
+      tinterferencebitmap1Array = array of tinterferencebitmap1;
 
       Tinterferencebitmap=class
       private
         maxx1,
         maxy1    : byte;
-        fbitmap  : pinterferencebitmap1;
+        fbitmap  : tinterferencebitmap1Array;
         function getbitmap(x,y:tsuperregister):boolean;
         procedure setbitmap(x,y:tsuperregister;b:boolean);
       public
@@ -367,7 +370,7 @@ unit rgobj;
       begin
         inherited create;
         maxx1:=1;
-        fbitmap:=AllocMem(sizeof(tinterferencebitmap1)*2);
+        SetLength(fbitmap,2);
       end;
 
 
@@ -379,21 +382,21 @@ unit rgobj;
       for i:=0 to maxx1 do
         for j:=0 to maxy1 do
           if assigned(fbitmap[i,j]) then
-            dispose(fbitmap[i,j]);
-      freemem(fbitmap);
+            fbitmap[i,j]:=nil;
+      fbitmap:=nil;
     end;
 
 
     function tinterferencebitmap.getbitmap(x,y:tsuperregister):boolean;
       var
-        page : pinterferencebitmap2;
+        page : TInterferencebitmap2;
       begin
         result:=false;
         if (x shr 8>maxx1) then
           exit;
         page:=fbitmap[x shr 8,y shr 8];
         result:=assigned(page) and
-          ((x and $ff) in page^[y and $ff]);
+          ((x and $ff) in page[y and $ff]);
       end;
 
 
@@ -405,21 +408,19 @@ unit rgobj;
         y1:=y shr 8;
         if x1>maxx1 then
           begin
-            reallocmem(fbitmap,sizeof(tinterferencebitmap1)*(x1+1));
-            fillchar(fbitmap[maxx1+1],sizeof(tinterferencebitmap1)*(x1-maxx1),0);
+            Setlength(fbitmap,x1+1);
             maxx1:=x1;
           end;
         if not assigned(fbitmap[x1,y1]) then
           begin
             if y1>maxy1 then
               maxy1:=y1;
-            new(fbitmap[x1,y1]);
-            fillchar(fbitmap[x1,y1]^,sizeof(tinterferencebitmap2),0);
+            SetLength(fbitmap[x1,y1],interferenceBitmap2Size);
           end;
         if b then
-          include(fbitmap[x1,y1]^[y and $ff],(x and $ff))
+          include(fbitmap[x1,y1][y and $ff],(x and $ff))
         else
-          exclude(fbitmap[x1,y1]^[y and $ff],(x and $ff));
+          exclude(fbitmap[x1,y1][y and $ff],(x and $ff));
       end;