123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- #
- ; $Id$
- ; (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
- ;
- ; This product is part of the Amsterdam Compiler Kit.
- ;
- ; Permission to use, sell, duplicate or disclose this software must be
- ; obtained in writing. Requests for such permissions may be sent to
- ;
- ; Dr. Andrew S. Tanenbaum
- ; Wiskundig Seminarium
- ; Vrije Universiteit
- ; Postbox 7161
- ; 1007 MC Amsterdam
- ; The Netherlands
- ;
- mes 2,EM_WSIZE,EM_PSIZE
- ; procedure encaps(procedure p; procedure(q(n:integer));
- ; {call q if a trap occurs during the execution of p}
- ; {if q returns, continue execution of p}
- inp $handler
- #define PIISZ 2*EM_PSIZE
- #define PARG 0
- #define QARG PIISZ
- #define E_ELB -EM_PSIZE
- #define E_EHA -2*EM_PSIZE
- ; encaps is called with two parameters:
- ; - procedure instance identifier of q (QARG)
- ; - procedure instance identifier of p (PARG)
- ; and two local variables:
- ; - the lb of the previous encaps (E_ELB)
- ; - the procedure identifier of the previous handler (E_EHA)
- ;
- ; One static variable:
- ; - the lb of the currently active encaps (enc_lb)
- enc_lb
- bss EM_PSIZE,0,0
- exp $encaps
- pro $encaps,PIISZ
- ; save lb of previous encaps
- lae enc_lb
- loi EM_PSIZE
- lal E_ELB
- sti EM_PSIZE
- ; set new lb
- lxl 0
- lae enc_lb
- sti EM_PSIZE
- ; save old handler id while setting up the new handler
- lpi $handler
- sig
- lal E_EHA
- sti EM_PSIZE
- ; handler is ready, p can be called
- ; p doesn't expect parameters except possibly the static link
- ; always passing the link won't hurt
- lal PARG
- loi PIISZ
- cai
- asp EM_PSIZE
- ; reinstate old handler
- lal E_ELB
- loi EM_PSIZE
- lae enc_lb
- sti EM_PSIZE
- lal E_EHA
- loi EM_PSIZE
- sig
- asp EM_PSIZE
- ret 0
- end ?
- #define TRAP 0
- #define H_ELB -EM_PSIZE
- ; handler is called with one parameter:
- ; - trap number (TRAP)
- ; one local variable
- ; - the current LB of the enclosing encaps (H_ELB)
- pro $handler,EM_PSIZE
- ; save LB of nearest encaps
- lae enc_lb
- loi EM_PSIZE
- lal H_ELB
- sti EM_PSIZE
- ; fetch setting for previous encaps via LB of nearest
- lal H_ELB
- loi EM_PSIZE
- adp E_ELB
- loi EM_PSIZE ; LB of previous encaps
- lae enc_lb
- sti EM_PSIZE
- lal H_ELB
- loi EM_PSIZE
- adp E_EHA
- loi EM_PSIZE ; previous handler
- sig
- asp EM_PSIZE
- ; previous handler is re-instated, time to call Q
- lol TRAP ; the one and only real parameter
- lal H_ELB
- loi EM_PSIZE
- lpb ; argument base of enclosing encaps
- adp QARG
- loi PIISZ
- exg EM_PSIZE
- dup EM_PSIZE ; The static link is now on top
- zer EM_PSIZE
- cmp
- zeq *1
- ; non-zero LB
- exg EM_PSIZE
- cai
- asp EM_WSIZE+EM_PSIZE
- bra *2
- 1
- ; zero LB
- asp EM_PSIZE
- cai
- asp EM_WSIZE
- 2
- ; now reinstate handler for continued execution of p
- lal H_ELB
- loi EM_PSIZE
- lae enc_lb
- sti EM_PSIZE
- lpi $handler
- sig
- asp EM_PSIZE
- rtt
- end ?
|