mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-19 00:39:34 +02:00
* 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 -
This commit is contained in:
parent
003487baab
commit
481a8ec58d
@ -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
|
||||
****************************************************************************}
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user