?? encaps.e
字號:
#; $Header: /cvsup/minix/src/lib/ack/libp/encaps.e,v 1.1 2005/10/10 15:27:46 beng Exp $; (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 0-_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 0-_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 *21 ; zero LB asp _EM_PSIZE cai asp _EM_WSIZE2 ; 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 ?
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -