Browse Source

fix for bug #312

pierre 25 years ago
parent
commit
0578c906ee
1 changed files with 15 additions and 3 deletions
  1. 15 3
      compiler/cgai386.pas

+ 15 - 3
compiler/cgai386.pas

@@ -3097,6 +3097,8 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
 {$endif GDB}
 {$endif GDB}
       hr : preference;
       hr : preference;
       p : psymtable;
       p : psymtable;
+      hp : preference;
+      pp : pprocinfo;
       r : treference;
       r : treference;
       oldlist,
       oldlist,
       oldexprasmlist : paasmoutput;
       oldexprasmlist : paasmoutput;
@@ -3162,6 +3164,13 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
         end;
         end;
 
 
       { don't load ESI, does the caller }
       { don't load ESI, does the caller }
+      { we must do it for local function }
+      { that can be called from a foreach }
+      { of another object than self !! PM }
+
+         if assigned(procinfo^._class) and
+            (lexlevel>normal_function_level) then
+           maybe_loadesi;
 
 
       { When message method contains self as a parameter,
       { When message method contains self as a parameter,
         we must load it into ESI }
         we must load it into ESI }
@@ -3171,10 +3180,10 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
            reset_reference(hr^);
            reset_reference(hr^);
            hr^.offset:=procinfo^.selfpointer_offset;
            hr^.offset:=procinfo^.selfpointer_offset;
            hr^.base:=procinfo^.framepointer;
            hr^.base:=procinfo^.framepointer;
+           exprasmlist^.insert(new(paicpu,op_ref_reg(A_MOV,S_L,hr,R_ESI)));
 {$ifndef noAllocEdi}
 {$ifndef noAllocEdi}
-           exprasmlist^.concat(new(pairegalloc,alloc(R_ESI)));
+           exprasmlist^.insert(new(pairegalloc,alloc(R_ESI)));
 {$endif noAllocEdi}
 {$endif noAllocEdi}
-           exprasmlist^.insert(new(paicpu,op_ref_reg(A_MOV,S_L,hr,R_ESI)));
         end;
         end;
       { should we save edi,esi,ebx like C ? }
       { should we save edi,esi,ebx like C ? }
       if (po_savestdregs in aktprocsym^.definition^.procoptions) then
       if (po_savestdregs in aktprocsym^.definition^.procoptions) then
@@ -3834,7 +3843,10 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.88  2000-03-19 11:55:08  peter
+  Revision 1.89  2000-03-21 23:36:46  pierre
+   fix for bug 312
+
+  Revision 1.88  2000/03/19 11:55:08  peter
     * fixed temp ansi handling within array constructor
     * fixed temp ansi handling within array constructor
 
 
   Revision 1.87  2000/03/19 08:17:36  peter
   Revision 1.87  2000/03/19 08:17:36  peter