Răsfoiți Sursa

* for pointers, converted to arrays, use a newly added virtual method
tpointerdef.converted_pointer_to_array_range_type to obtain their integer
range type, instead of using ptrsinttype

git-svn-id: trunk@34612 -

nickysn 8 ani în urmă
părinte
comite
481a8ec58d
2 a modificat fișierele cu 33 adăugiri și 14 ștergeri
  1. 23 13
      compiler/i8086/symcpu.pas
  2. 10 1
      compiler/symdef.pas

+ 23 - 13
compiler/i8086/symcpu.pas

@@ -60,6 +60,7 @@ type
     function alignment:shortint;override;
     function pointer_arithmetic_int_type:tdef; override;
     function pointer_subtraction_result_type:tdef; override;
+    function converted_pointer_to_array_range_type: tdef; override;
   end;
   tcpupointerdefclass = class of tcpupointerdef;
 
@@ -275,19 +276,8 @@ implementation
 
   constructor tcpuarraydef.create_from_pointer(def: tpointerdef);
     begin
-      if tcpupointerdef(def).x86pointertyp=x86pt_huge then
-        begin
-          huge:=true;
-          { use -1 so that the elecount will not overflow }
-          self.create(0,high(asizeint)-1,s32inttype);
-          arrayoptions:=[ado_IsConvertedPointer];
-          setelementdef(def.pointeddef);
-        end
-      else
-        begin
-          huge:=false;
-          inherited create_from_pointer(def);
-        end;
+      huge:=tcpupointerdef(def).x86pointertyp=x86pt_huge;
+      inherited create_from_pointer(def);
     end;
 
 
@@ -453,6 +443,26 @@ implementation
       end;
 
 
+    function tcpupointerdef.converted_pointer_to_array_range_type: tdef;
+      begin
+        case x86pointertyp of
+          x86pt_huge:
+            result:=s32inttype;
+          x86pt_far,
+          x86pt_near,
+          x86pt_near_cs,
+          x86pt_near_ds,
+          x86pt_near_ss,
+          x86pt_near_es,
+          x86pt_near_fs,
+          x86pt_near_gs:
+            result:=s16inttype;
+          else
+            internalerror(2016100401);
+        end;
+      end;
+
+
 {****************************************************************************
                              tcpuabsolutevarsym
 ****************************************************************************}

+ 10 - 1
compiler/symdef.pas

@@ -260,6 +260,8 @@ interface
              special i8086 pointer types (near, far, huge). }
           function pointer_subtraction_result_type:tdef;virtual;
           function compatible_with_pointerdef_size(ptr: tpointerdef): boolean; virtual;
+          {# the integer index type used to convert the pointer to array (i.e. denotes int_type in: ptr[int_type]) }
+          function converted_pointer_to_array_range_type:tdef;virtual;
        end;
        tpointerdefclass = class of tpointerdef;
 
@@ -3380,6 +3382,12 @@ implementation
       end;
 
 
+    function tpointerdef.converted_pointer_to_array_range_type:tdef;
+      begin
+        result:=ptrsinttype;
+      end;
+
+
 {****************************************************************************
                               TCLASSREFDEF
 ****************************************************************************}
@@ -3648,7 +3656,8 @@ implementation
          { divide by the element size and do -1 so the array will have a valid size,
            further, the element size might be 0 e.g. for empty records, so use max(...,1)
            to avoid a division by zero }
-         self.create(0,(high(asizeint) div max(def.pointeddef.size,1))-1,ptrsinttype);
+         self.create(0,(high(asizeint) div max(def.pointeddef.size,1))-1,
+           def.converted_pointer_to_array_range_type);
          arrayoptions:=[ado_IsConvertedPointer];
          setelementdef(def.pointeddef);
       end;