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))))