Преглед на файлове

improved comments; should now be understandable for anyone who knows EM

ceriel преди 36 години
родител
ревизия
a484eb4ab4
променени са 1 файла, в които са добавени 19 реда и са изтрити 12 реда
  1. 19 12
      lang/cem/libcc/gen/setjmp.e

+ 19 - 12
lang/cem/libcc/gen/setjmp.e

@@ -5,7 +5,7 @@
 ; layout of a setjmp buffer:
 ;
 ;  -----------------
-; |   signal mask   |		(only for Berkeley 4.2)
+; |   signal mask   |		(only for Berkeley 4.[2-])
 ;  -----------------
 ; |                 |
 ; |  GTO descriptor |
@@ -19,14 +19,16 @@
 ; the caller; This problem is solved by the front-end, which must pass
 ; it as an extra parameter to setjmp.
 
+; a GTO descriptor must be in the global data area
 gtobuf
  bss 3*EM_PSIZE,0,0
 
  inp $fill_ret_area
  exp $setjmp
  pro $setjmp,0
- mes 11
 #ifdef __BSD4_2
+; save mask of currently blocked signals. 
+; longjmp must restore this mask
  loc 0
  cal $sigblock
  asp EM_WSIZE
@@ -35,46 +37,51 @@ gtobuf
  loi EM_PSIZE
  stf 3*EM_PSIZE
 #endif
- ; create GTO descriptor for longjmp
+; create GTO descriptor for longjmp
  lxl 0
  dch		; Local Base of caller
  lxa 0		; Stackpointer of caller
  lal EM_PSIZE
- loi EM_PSIZE
+ loi EM_PSIZE	; Return address of caller
  lal 0
- loi EM_PSIZE
- sti 3*EM_PSIZE	; stored in jmpbuf
+ loi EM_PSIZE	; address of jmpbuf
+ sti 3*EM_PSIZE	; LB, SP, and PC stored in jmpbuf
  loc 0
- ret EM_WSIZE
+ ret EM_WSIZE	; setjmp must return 0
  end 0
 
  pro $fill_ret_area,0
+; put argument in function result area
  lol 0
  ret EM_WSIZE
  end 0
 
  exp $longjmp
  pro $longjmp,?
+#ifdef __BSD4_2
+; restore signal mask
  lal 0
  loi EM_PSIZE
-#ifdef __BSD4_2
- dup EM_PSIZE
  lof 3*EM_PSIZE
  cal $sigsetmask
  asp EM_WSIZE
  lfr EM_WSIZE
  asp EM_WSIZE
 #endif
+ lal 0
+ loi EM_PSIZE	; address of jmpbuf
  lae gtobuf
- blm 3*EM_PSIZE
- lol EM_PSIZE
+ blm 3*EM_PSIZE	; fill GTO descriptor from jmpbuf
+ lol EM_PSIZE	; second parameter of longjmp: the return value
  dup EM_WSIZE
  zne *3
-		; of course, longjmp may not return 0!
+; of course, longjmp may not return 0!
  asp EM_WSIZE
  loc 1
 3
+; put return value in function result area
  cal $fill_ret_area
  asp EM_WSIZE
  gto gtobuf	; there we go ...
+; ASP and GTO do not damage function result area
  end 0