Function: comp--emit-handler
comp--emit-handler is a byte-compiled function defined in comp.el.gz.
Signature
(comp--emit-handler LAP-LABEL HANDLER-TYPE)
Documentation
Emit a nonlocal-exit handler to LAP-LABEL of type HANDLER-TYPE.
Source Code
;; Defined in /usr/src/emacs/lisp/emacs-lisp/comp.el.gz
(defun comp--emit-handler (lap-label handler-type)
"Emit a nonlocal-exit handler to LAP-LABEL of type HANDLER-TYPE."
(cl-destructuring-bind (label-num . label-sp) lap-label
(cl-assert (= (- label-sp 2) (comp--sp)))
(setf (comp-func-has-non-local comp-func) t)
(let* ((guarded-bb (comp--bb-maybe-add (1+ (comp-limplify-pc comp-pass))
(comp--sp)))
(handler-bb (comp--bb-maybe-add (comp--label-to-addr label-num)
(1+ (comp--sp))))
(pop-bb (make--comp-block-lap nil (comp--sp) (comp--new-block-sym))))
(comp--emit (list 'push-handler
handler-type
(comp--slot+1)
(comp-block-name pop-bb)
(comp-block-name guarded-bb)))
(comp--mark-curr-bb-closed)
;; Emit the basic block to pop the handler if we got the non local.
(puthash (comp-block-name pop-bb) pop-bb (comp-func-blocks comp-func))
(setf (comp-limplify-curr-block comp-pass) pop-bb)
(comp--emit `(fetch-handler ,(comp--slot+1)))
(comp--emit `(jump ,(comp-block-name handler-bb)))
(comp--mark-curr-bb-closed))))