* 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:
nickysn 2014-07-24 14:18:57 +00:00
parent bb48761652
commit 33dac14554
4 changed files with 27 additions and 23 deletions

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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;