Function: cconv--remap-llv
cconv--remap-llv is a byte-compiled function defined in cconv.el.gz.
Signature
(cconv--remap-llv NEW-ENV VAR CLOSEDSYM)
Source Code
;; Defined in /usr/src/emacs/lisp/emacs-lisp/cconv.el.gz
(defun cconv--remap-llv (new-env var closedsym)
;; In a case such as:
;; (let* ((fun (lambda (x) (+ x y))) (y 1)) (funcall fun 1))
;; A naive lambda-lifting would return
;; (let* ((fun (lambda (y x) (+ x y))) (y 1)) (funcall fun y 1))
;; Where the external `y' is mistakenly captured by the inner one.
;; So when we detect that case, we rewrite it to:
;; (let* ((closed-y y) (fun (lambda (y x) (+ x y))) (y 1))
;; (funcall fun closed-y 1))
;; We do that even if there's no `funcall' that uses `fun' in the scope
;; where `y' is shadowed by another variable because, to treat
;; this case better, we'd need to traverse the tree one more time to
;; collect this data, and I think that it's not worth it.
(mapcar (lambda (mapping)
(if (not (eq (cadr mapping) #'apply-partially))
mapping
(cl-assert (eq (car mapping) (nth 2 mapping)))
`(,(car mapping)
apply-partially
,(car mapping)
,@(mapcar (lambda (arg)
(if (eq var arg)
closedsym arg))
(nthcdr 3 mapping)))))
new-env))