Przeglądaj źródła

* fixed generic exception management

carl 23 lat temu
rodzic
commit
3a70811b1a
1 zmienionych plików z 29 dodań i 9 usunięć
  1. 29 9
      compiler/ncgflw.pas

+ 29 - 9
compiler/ncgflw.pas

@@ -693,6 +693,23 @@ do_jmp:
        endexceptlabel : tasmlabel;
        
        
+    procedure try_new_exception(list : taasmoutput;var jmpbuf,envbuf, href : treference;
+      a : aword; exceptlabel : tasmlabel);
+     begin
+       tg.gettempofsizereferencepersistant(list,24,jmpbuf);
+       tg.gettempofsizereferencepersistant(list,12,envbuf);
+       tg.gettempofsizereferencepersistant(list,sizeof(aword),href);
+       new_exception(list, jmpbuf,envbuf, href, a, exceptlabel);
+     end;
+     
+     
+    procedure try_free_exception(list : taasmoutput;var jmpbuf, envbuf, href : treference;
+     a : aword ; endexceptlabel : tasmlabel; onlyfree : boolean);
+     begin
+         free_exception(list, jmpbuf, envbuf, href, a, endexceptlabel, onlyfree);
+         tg.ungetpersistanttempreference(list,jmpbuf);
+         tg.ungetpersistanttempreference(list,envbuf);
+     end;
      
      
 
@@ -763,7 +780,7 @@ do_jmp:
          getlabel(endexceptlabel);
          getlabel(lastonlabel);
 
-         cg.g_new_exception(exprasmlist,tempbuf,tempaddr,href,1,exceptlabel);
+         try_new_exception(exprasmlist,tempbuf,tempaddr,href,1,exceptlabel);
          
          { try block }
          { set control flow labels for the try block }
@@ -784,7 +801,7 @@ do_jmp:
          cg.a_label(exprasmlist,exceptlabel);
 
                  
-         cg.g_free_exception(exprasmlist,tempbuf,tempaddr,href,0,endexceptlabel,false);
+         try_free_exception(exprasmlist,tempbuf,tempaddr,href,0,endexceptlabel,false);
          
          
          cg.a_label(exprasmlist,doexceptlabel);
@@ -820,7 +837,7 @@ do_jmp:
               getlabel(doobjectdestroy);
               getlabel(doobjectdestroyandreraise);
               
-              cg.g_new_exception(exprasmlist,tempbuf,tempaddr,href,1,exceptlabel);
+              try_new_exception(exprasmlist,tempbuf,tempaddr,href,1,exceptlabel);
 
               { here we don't have to reset flowcontrol           }
               { the default and on flowcontrols are handled equal }
@@ -829,7 +846,7 @@ do_jmp:
 
               cg.a_label(exprasmlist,doobjectdestroyandreraise);
               
-              cg.g_free_exception(exprasmlist,tempbuf,tempaddr,href,0,doobjectdestroy,false);
+              try_free_exception(exprasmlist,tempbuf,tempaddr,href,0,doobjectdestroy,false);
 
               cg.a_call_name(exprasmlist,'FPC_POPSECONDOBJECTSTACK');
 
@@ -972,7 +989,7 @@ do_jmp:
          getlabel(doobjectdestroyandreraise);
          
          { call setjmp, and jump to finally label on non-zero result }
-         cg.g_new_exception(exprasmlist,tempbuf,tempaddr,href,1,doobjectdestroyandreraise);
+         try_new_exception(exprasmlist,tempbuf,tempaddr,href,1,doobjectdestroyandreraise);
          
          if assigned(right) then
            begin
@@ -998,7 +1015,7 @@ do_jmp:
          getlabel(doobjectdestroy);
          cg.a_label(exprasmlist,doobjectdestroyandreraise);
          
-         cg.g_free_exception(exprasmlist,tempbuf,tempaddr,href,0,doobjectdestroy,false);
+         try_free_exception(exprasmlist,tempbuf,tempaddr,href,0,doobjectdestroy,false);
 
          cg.a_call_name(exprasmlist,'FPC_POPSECONDOBJECTSTACK');
          cg.a_param_reg(exprasmlist, OS_ADDR, accumulator, paramanager.getintparaloc(1));
@@ -1103,7 +1120,7 @@ do_jmp:
           end;
 
          { call setjmp, and jump to finally label on non-zero result }
-         cg.g_new_exception(exprasmlist,tempbuf,tempaddr,href,1,finallylabel);
+         try_new_exception(exprasmlist,tempbuf,tempaddr,href,1,finallylabel);
 
          { try code }
          if assigned(left) then
@@ -1116,7 +1133,7 @@ do_jmp:
 
          cg.a_label(exprasmlist,finallylabel);
          { just free the frame information }
-         cg.g_free_exception(exprasmlist,tempbuf,tempaddr,href,1,finallylabel,true);
+         try_free_exception(exprasmlist,tempbuf,tempaddr,href,1,finallylabel,true);
 
          { finally code }
          flowcontrol:=[];
@@ -1209,7 +1226,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.31  2002-08-04 19:06:41  carl
+  Revision 1.32  2002-08-09 19:10:59  carl
+    * fixed generic exception management
+
+  Revision 1.31  2002/08/04 19:06:41  carl
     + added generic exception support (still does not work!)
     + more documentation