mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-23 19:29:33 +02:00
* defutil.get_int_type_for_pointer_arithmetic replaced with a virtual method
tpointerdef.pointer_arithmetic_int_type git-svn-id: trunk@28258 -
This commit is contained in:
parent
bb48761652
commit
33dac14554
compiler
@ -331,13 +331,6 @@ interface
|
||||
{ returns true of def is a methodpointer }
|
||||
function is_methodpointer(def : tdef) : boolean;
|
||||
|
||||
{# returns the appropriate int type for pointer arithmetic with the given pointer type.
|
||||
When adding or subtracting a number to/from a pointer, this function returns the
|
||||
int type to which that number has to be converted, before the operation can be performed.
|
||||
Normally, this is sinttype, except on i8086, where it takes into account the
|
||||
special i8086 pointer types (near, far, huge). }
|
||||
function get_int_type_for_pointer_arithmetic(p : tdef) : tdef;
|
||||
|
||||
{$ifdef i8086}
|
||||
{# Returns true if p is a far pointer def }
|
||||
function is_farpointer(p : tdef) : boolean;
|
||||
@ -1440,17 +1433,6 @@ implementation
|
||||
result:=(def.typ=procvardef) and (po_methodpointer in tprocvardef(def).procoptions);
|
||||
end;
|
||||
|
||||
|
||||
function get_int_type_for_pointer_arithmetic(p : tdef) : tdef;
|
||||
begin
|
||||
{$ifdef i8086}
|
||||
if is_hugepointer(p) then
|
||||
result:=s32inttype
|
||||
else
|
||||
{$endif i8086}
|
||||
result:=sinttype;
|
||||
end;
|
||||
|
||||
{$ifdef i8086}
|
||||
{ true if p is a far pointer def }
|
||||
function is_farpointer(p : tdef) : boolean;
|
||||
|
@ -57,6 +57,7 @@ type
|
||||
|
||||
tcpupointerdef = class(tx86pointerdef)
|
||||
class function default_x86_data_pointer_type: tx86pointertyp; override;
|
||||
function pointer_arithmetic_int_type:tdef; override;
|
||||
function pointer_subtraction_result_type:tdef; override;
|
||||
end;
|
||||
tcpupointerdefclass = class of tcpupointerdef;
|
||||
@ -312,6 +313,15 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
function tcpupointerdef.pointer_arithmetic_int_type:tdef;
|
||||
begin
|
||||
if x86pointertyp=x86pt_huge then
|
||||
result:=s32inttype
|
||||
else
|
||||
result:=inherited;
|
||||
end;
|
||||
|
||||
|
||||
function tcpupointerdef.pointer_subtraction_result_type:tdef;
|
||||
begin
|
||||
case x86pointertyp of
|
||||
|
@ -1967,7 +1967,7 @@ implementation
|
||||
end
|
||||
else
|
||||
resultdef:=right.resultdef;
|
||||
inserttypeconv(left,get_int_type_for_pointer_arithmetic(right.resultdef));
|
||||
inserttypeconv(left,tpointerdef(right.resultdef).pointer_arithmetic_int_type);
|
||||
if nodetype=addn then
|
||||
begin
|
||||
if (rt=niln) then
|
||||
@ -1981,7 +1981,7 @@ implementation
|
||||
(tpointerdef(rd).pointeddef.size>1) then
|
||||
begin
|
||||
left:=caddnode.create(muln,left,
|
||||
cordconstnode.create(tpointerdef(rd).pointeddef.size,get_int_type_for_pointer_arithmetic(right.resultdef),true));
|
||||
cordconstnode.create(tpointerdef(rd).pointeddef.size,tpointerdef(right.resultdef).pointer_arithmetic_int_type,true));
|
||||
typecheckpass(left);
|
||||
end;
|
||||
end
|
||||
@ -2000,7 +2000,7 @@ implementation
|
||||
else
|
||||
resultdef:=left.resultdef;
|
||||
|
||||
inserttypeconv(right,get_int_type_for_pointer_arithmetic(left.resultdef));
|
||||
inserttypeconv(right,tpointerdef(left.resultdef).pointer_arithmetic_int_type);
|
||||
if nodetype in [addn,subn] then
|
||||
begin
|
||||
if (lt=niln) then
|
||||
@ -2017,7 +2017,7 @@ implementation
|
||||
if (tpointerdef(ld).pointeddef.size>1) then
|
||||
begin
|
||||
right:=caddnode.create(muln,right,
|
||||
cordconstnode.create(tpointerdef(ld).pointeddef.size,get_int_type_for_pointer_arithmetic(left.resultdef),true));
|
||||
cordconstnode.create(tpointerdef(ld).pointeddef.size,tpointerdef(left.resultdef).pointer_arithmetic_int_type,true));
|
||||
typecheckpass(right);
|
||||
end
|
||||
end else
|
||||
@ -2025,7 +2025,7 @@ implementation
|
||||
(tarraydef(ld).elementdef.size>1) then
|
||||
begin
|
||||
right:=caddnode.create(muln,right,
|
||||
cordconstnode.create(tarraydef(ld).elementdef.size,get_int_type_for_pointer_arithmetic(left.resultdef),true));
|
||||
cordconstnode.create(tarraydef(ld).elementdef.size,tpointerdef(left.resultdef).pointer_arithmetic_int_type,true));
|
||||
typecheckpass(right);
|
||||
end;
|
||||
end
|
||||
|
@ -227,6 +227,12 @@ interface
|
||||
override ppuwrite_platform instead }
|
||||
procedure ppuwrite(ppufile:tcompilerppufile);override;final;
|
||||
function GetTypeName:string;override;
|
||||
{# returns the appropriate int type for pointer arithmetic with the given pointer type.
|
||||
When adding or subtracting a number to/from a pointer, this function returns the
|
||||
int type to which that number has to be converted, before the operation can be performed.
|
||||
Normally, this is sinttype, except on i8086, where it takes into account the
|
||||
special i8086 pointer types (near, far, huge). }
|
||||
function pointer_arithmetic_int_type:tdef;virtual;
|
||||
{# returns the int type produced when subtracting two pointers of the given type.
|
||||
Normally, this is sinttype, except on i8086, where it takes into account the
|
||||
special i8086 pointer types (near, far, huge). }
|
||||
@ -3170,6 +3176,12 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
function tpointerdef.pointer_arithmetic_int_type:tdef;
|
||||
begin
|
||||
result:=sinttype;
|
||||
end;
|
||||
|
||||
|
||||
function tpointerdef.pointer_subtraction_result_type:tdef;
|
||||
begin
|
||||
result:=ptrsinttype;
|
||||
|
Loading…
Reference in New Issue
Block a user