Browse Source

* fixed temp allocation for arrayconstructor

peter 26 years ago
parent
commit
8e5c13cf47
2 changed files with 21 additions and 11 deletions
  1. 9 3
      compiler/cg386ld.pas
  2. 12 8
      compiler/cgai386.pas

+ 9 - 3
compiler/cg386ld.pas

@@ -841,6 +841,7 @@ implementation
         lt    : pdef;
         vaddr : boolean;
         vtype : longint;
+        freetemp,
         dovariant : boolean;
         elesize : longint;
       begin
@@ -869,6 +870,7 @@ implementation
          begin
            if assigned(hp^.left) then
             begin
+              freetemp:=true;
               secondpass(hp^.left);
               if codegenerror then
                exit;
@@ -917,6 +919,7 @@ implementation
                         begin
                           vtype:=vtString;
                           vaddr:=true;
+                          freetemp:=false;
                         end
                        else
                         if is_ansistring(lt) then
@@ -931,7 +934,7 @@ implementation
                     if vaddr then
                      begin
                        emit_to_reference(hp^.left);
-                       emit_push_lea_loc(hp^.left^.location);
+                       emit_push_lea_loc(hp^.left^.location,freetemp);
                      end
                     else
                      emit_push_loc(hp^.left^.location);
@@ -946,7 +949,7 @@ implementation
                     if vaddr then
                      begin
                        emit_to_reference(hp^.left);
-                       emit_lea_loc_ref(hp^.left^.location,href);
+                       emit_lea_loc_ref(hp^.left^.location,href,freetemp);
                      end
                     else
                      emit_mov_loc_ref(hp^.left^.location,href,S_L);
@@ -978,7 +981,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.81  1999-08-28 15:34:17  florian
+  Revision 1.82  1999-09-01 09:26:21  peter
+    * fixed temp allocation for arrayconstructor
+
+  Revision 1.81  1999/08/28 15:34:17  florian
     * bug 519 fixed
 
   Revision 1.80  1999/08/26 20:24:37  michael

+ 12 - 8
compiler/cgai386.pas

@@ -78,8 +78,8 @@ unit cgai386;
     procedure release_loc(const t : tlocation);
 
     procedure emit_pushw_loc(const t:tlocation);
-    procedure emit_lea_loc_ref(const t:tlocation;const ref:treference);
-    procedure emit_push_lea_loc(const t:tlocation);
+    procedure emit_lea_loc_ref(const t:tlocation;const ref:treference;freetemp:boolean);
+    procedure emit_push_lea_loc(const t:tlocation;freetemp:boolean);
     procedure emit_to_reference(var p:ptree);
     procedure emit_to_reg16(var hr:tregister);
     procedure emit_to_reg32(var hr:tregister);
@@ -644,7 +644,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
       end;
 
 
-    procedure emit_lea_loc_ref(const t:tlocation;const ref:treference);
+    procedure emit_lea_loc_ref(const t:tlocation;const ref:treference;freetemp:boolean);
       begin
         case t.loc of
                LOC_MEM,
@@ -658,7 +658,8 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                                exprasmlist^.concat(new(paicpu,op_reg_ref(A_MOV,S_L,
                                  R_EDI,newreference(ref))));
                              end;
-                           ungetiftemp(t.reference);
+                           if freetemp then
+                            ungetiftemp(t.reference);
                          end;
         else
          internalerror(332);
@@ -666,7 +667,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
       end;
 
 
-    procedure emit_push_lea_loc(const t:tlocation);
+    procedure emit_push_lea_loc(const t:tlocation;freetemp:boolean);
       begin
         case t.loc of
                LOC_MEM,
@@ -679,8 +680,8 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                                  newreference(t.reference),R_EDI);
                                exprasmlist^.concat(new(paicpu,op_reg(A_PUSH,S_L,R_EDI)));
                              end;
-                           {   Wrong !!
-                           ungetiftemp(t.reference);}
+                           if freetemp then
+                            ungetiftemp(t.reference);
                          end;
         else
          internalerror(332);
@@ -3293,7 +3294,10 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
 end.
 {
   $Log$
-  Revision 1.35  1999-08-30 12:00:44  pierre
+  Revision 1.36  1999-09-01 09:26:23  peter
+    * fixed temp allocation for arrayconstructor
+
+  Revision 1.35  1999/08/30 12:00:44  pierre
    * problem with maybe_push/restore solved hopefully
 
   Revision 1.34  1999/08/30 09:41:31  pierre