소스 검색

* fixed temp ansi handling within array constructor

peter 25 년 전
부모
커밋
03dcba2fda
3개의 변경된 파일27개의 추가작업 그리고 12개의 파일을 삭제
  1. 14 6
      compiler/cg386ld.pas
  2. 5 2
      compiler/cg386mem.pas
  3. 8 4
      compiler/cgai386.pas

+ 14 - 6
compiler/cg386ld.pas

@@ -921,7 +921,10 @@ implementation
                         end
                        else
                         if is_ansistring(lt) then
-                         vtype:=vtAnsiString;
+                         begin
+                           vtype:=vtAnsiString;
+                           freetemp:=false;
+                         end;
                      end;
                  end;
                  if vtype=$ff then
@@ -949,7 +952,9 @@ implementation
                        emit_lea_loc_ref(hp^.left^.location,href,freetemp);
                      end
                     else
-                     emit_mov_loc_ref(hp^.left^.location,href,S_L);
+                     begin
+                       emit_mov_loc_ref(hp^.left^.location,href,S_L,freetemp);
+                     end;
                     { update href to the vtype field and write it }
                     dec(href.offset,4);
                     emit_const_ref(A_MOV,S_L,vtype,newreference(href));
@@ -962,11 +967,11 @@ implementation
                begin
                  case elesize of
                    1 :
-                     emit_mov_loc_ref(hp^.left^.location,href,S_B);
+                     emit_mov_loc_ref(hp^.left^.location,href,S_B,freetemp);
                    2 :
-                     emit_mov_loc_ref(hp^.left^.location,href,S_W);
+                     emit_mov_loc_ref(hp^.left^.location,href,S_W,freetemp);
                    4 :
-                     emit_mov_loc_ref(hp^.left^.location,href,S_L);
+                     emit_mov_loc_ref(hp^.left^.location,href,S_L,freetemp);
                    else
                      internalerror(87656781);
                  end;
@@ -982,7 +987,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.104  2000-03-19 08:14:17  peter
+  Revision 1.105  2000-03-19 11:55:08  peter
+    * fixed temp ansi handling within array constructor
+
+  Revision 1.104  2000/03/19 08:14:17  peter
     * small order change for array of const which allows better optimization
 
   Revision 1.103  2000/03/01 15:36:11  florian

+ 5 - 2
compiler/cg386mem.pas

@@ -638,7 +638,7 @@ implementation
                         hightree:=genloadnode(pvarsym(srsym),p^.left^.symtable);
                         firstpass(hightree);
                         secondpass(hightree);
-                        emit_mov_loc_ref(hightree^.location,href,S_L);
+                        emit_mov_loc_ref(hightree^.location,href,S_L,true);
                         disposetree(hightree);
                       end;
                      emitrangecheck(p^.right,p^.left^.resulttype);
@@ -942,7 +942,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.72  2000-02-18 20:53:14  pierre
+  Revision 1.73  2000-03-19 11:55:08  peter
+    * fixed temp ansi handling within array constructor
+
+  Revision 1.72  2000/02/18 20:53:14  pierre
     * fixes a stabs problem for functions
     + includes a stabs local var for with statements
       the name is with in lowercase followed by an index

+ 8 - 4
compiler/cgai386.pas

@@ -66,7 +66,7 @@ unit cgai386;
 
     procedure emitcall(const routine:string);
 
-    procedure emit_mov_loc_ref(const t:tlocation;const ref:treference;siz:topsize);
+    procedure emit_mov_loc_ref(const t:tlocation;const ref:treference;siz:topsize;freetemp:boolean);
     procedure emit_mov_loc_reg(const t:tlocation;reg:tregister);
     procedure emit_mov_ref_reg64(r : treference;rl,rh : tregister);
     procedure emit_lea_loc_ref(const t:tlocation;const ref:treference;freetemp:boolean);
@@ -416,7 +416,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
       end;
 
 
-    procedure emit_mov_loc_ref(const t:tlocation;const ref:treference;siz:topsize);
+    procedure emit_mov_loc_ref(const t:tlocation;const ref:treference;siz:topsize;freetemp:boolean);
       var
         hreg : tregister;
         pushedeax : boolean;
@@ -478,7 +478,8 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                                  (JM)}
                                del_reference(ref);
                              end;
-                           ungetiftemp(t.reference);
+                           if freetemp then
+                            ungetiftemp(t.reference);
                          end;
         else
          internalerror(330);
@@ -3833,7 +3834,10 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
 end.
 {
   $Log$
-  Revision 1.87  2000-03-19 08:17:36  peter
+  Revision 1.88  2000-03-19 11:55:08  peter
+    * fixed temp ansi handling within array constructor
+
+  Revision 1.87  2000/03/19 08:17:36  peter
     * tp7 fix
 
   Revision 1.86  2000/03/01 15:36:11  florian