mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-03 00:30:18 +02:00
+ added type parentfpvoidpointertype, which is a void pointer with the same size
as the hidden parentfp parameter, passed to nested procs. On i8086 it is always a near pointer, unlike voidpointer (which changes according to the memory model). This fixes nested procs in i8086 far data memory models. git-svn-id: trunk@26934 -
This commit is contained in:
parent
9321d9916d
commit
2908fa9123
@ -164,7 +164,7 @@ implementation
|
||||
hsym:=tparavarsym(currpi.procdef.parast.Find('parentfp'));
|
||||
if not assigned(hsym) then
|
||||
internalerror(200309281);
|
||||
hlcg.a_load_loc_reg(current_asmdata.CurrAsmList,voidpointertype,voidpointertype,hsym.localloc,location.register);
|
||||
hlcg.a_load_loc_reg(current_asmdata.CurrAsmList,parentfpvoidpointertype,parentfpvoidpointertype,hsym.localloc,location.register);
|
||||
{ walk parents }
|
||||
while (currpi.procdef.owner.symtablelevel>parentpd.parast.symtablelevel) do
|
||||
begin
|
||||
|
@ -367,7 +367,7 @@ implementation
|
||||
{$endif dummy}
|
||||
begin
|
||||
result:=nil;
|
||||
resultdef:=voidpointertype;
|
||||
resultdef:=parentfpvoidpointertype;
|
||||
{$ifdef dummy}
|
||||
{ currently parentfps are never loaded in registers (FK) }
|
||||
if (current_procinfo.procdef.parast.symtablelevel<>parentpd.parast.symtablelevel) then
|
||||
|
@ -119,7 +119,7 @@ implementation
|
||||
(pd.owner.defowner.typ<>procdef) then
|
||||
begin
|
||||
vs:=tparavarsym.create('$parentfp',paranr,vs_value
|
||||
,voidpointertype,[vo_is_parentfp,vo_is_hidden_para]);
|
||||
,parentfpvoidpointertype,[vo_is_parentfp,vo_is_hidden_para]);
|
||||
vs.varregable:=vr_none;
|
||||
end
|
||||
else
|
||||
|
@ -273,6 +273,11 @@ implementation
|
||||
voidpointertype:=tpointerdef.create(voidtype);
|
||||
charpointertype:=tpointerdef.create(cansichartype);
|
||||
widecharpointertype:=tpointerdef.create(cwidechartype);
|
||||
{$ifdef i8086}
|
||||
parentfpvoidpointertype:=tpointerdef.createx86(voidtype,x86pt_near);
|
||||
{$else i8086}
|
||||
parentfpvoidpointertype:=tpointerdef.create(voidtype);
|
||||
{$endif i8086}
|
||||
{$ifdef x86}
|
||||
voidnearpointertype:=tpointerdef.createx86(voidtype,x86pt_near);
|
||||
voidnearcspointertype:=tpointerdef.createx86(voidtype,x86pt_near_cs);
|
||||
@ -410,6 +415,7 @@ implementation
|
||||
addtype('$void_pointer',voidpointertype);
|
||||
addtype('$char_pointer',charpointertype);
|
||||
addtype('$widechar_pointer',widecharpointertype);
|
||||
addtype('$parentfp_void_pointer',parentfpvoidpointertype);
|
||||
{$ifdef x86}
|
||||
addtype('$void_nearpointer',voidnearpointertype);
|
||||
addtype('$void_nearcspointer',voidnearcspointertype);
|
||||
@ -545,6 +551,7 @@ implementation
|
||||
loadtype('void_pointer',voidpointertype);
|
||||
loadtype('char_pointer',charpointertype);
|
||||
loadtype('widechar_pointer',widecharpointertype);
|
||||
loadtype('parentfp_void_pointer',parentfpvoidpointertype);
|
||||
{$ifdef x86}
|
||||
loadtype('void_nearpointer',voidnearpointertype);
|
||||
loadtype('void_nearcspointer',voidnearcspointertype);
|
||||
|
@ -885,6 +885,7 @@ interface
|
||||
voidpointertype, { pointer for Void-pointeddef }
|
||||
charpointertype, { pointer for Char-pointeddef }
|
||||
widecharpointertype, { pointer for WideChar-pointeddef }
|
||||
parentfpvoidpointertype, { void pointer with the size of the hidden parentfp parameter, passed to nested functions }
|
||||
{$ifdef x86}
|
||||
voidnearpointertype,
|
||||
voidnearcspointertype,
|
||||
|
Loading…
Reference in New Issue
Block a user