Ver código fonte

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

nickysn 11 anos atrás
pai
commit
2908fa9123
5 arquivos alterados com 11 adições e 3 exclusões
  1. 1 1
      compiler/ncgmem.pas
  2. 1 1
      compiler/nmem.pas
  3. 1 1
      compiler/pparautl.pas
  4. 7 0
      compiler/psystem.pas
  5. 1 0
      compiler/symdef.pas

+ 1 - 1
compiler/ncgmem.pas

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

+ 1 - 1
compiler/nmem.pas

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

+ 1 - 1
compiler/pparautl.pas

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

+ 7 - 0
compiler/psystem.pas

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

+ 1 - 0
compiler/symdef.pas

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