From: ceriel Date: Thu, 21 Apr 1988 10:08:56 +0000 (+0000) Subject: improved comments; should now be understandable for anyone who knows EM X-Git-Tag: release-5-5~3358 X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=5f4707b2807d91d3bebcf526eab0a77d866d25d6;p=ack.git improved comments; should now be understandable for anyone who knows EM --- diff --git a/lang/cem/libcc/gen/setjmp.e b/lang/cem/libcc/gen/setjmp.e index 9dedbc2c1..3a1e81ff4 100644 --- a/lang/cem/libcc/gen/setjmp.e +++ b/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