3
(setf (get 'let-control-stack 'b2) 'b2-let-control-stack)
4
(defun b2-let-control-stack (x)
5
(let ((*control-stack* *control-stack*)(*blocks* 0))
7
(wr "object *VOL SaveVs = VsTop;")
12
(defopt control-jumped-back
13
((t) boolean #.(flags set safe) control-jumped-back-aux))
15
(defun control-jumped-back-aux(x)
16
(push 'ctl-push *control-stack*)
17
(wr-inline-call1 x "@0;CtlJumpedBack(ctl_TAGGED_CATCH,$0)"))
19
(defopt push-unwind-protect
20
;; The second argument is a function to call to do unwinding
21
((t) t #.(flags safe set) push-unwind-protect-aux))
23
(defun push-unwind-protect-aux (x)
24
;; we use this function call to push something on control stack
25
(push (list 'unwind-protect (car x)) *control-stack*)
26
(or (and (eq (car *exit*) 'next)
27
(or (and (eq (cadr *control-stack*) 'avma-bind)
28
(eq (cdr *exit*) (cddr *control-stack*)))
29
(eq (cdr *exit*) (cdr *control-stack*))))
31
(setq *exit* (cons 'next *control-stack*))
32
(wr-inline-call1 x "CtlUnwindPush($0)"))