diff options
Diffstat (limited to 'lisp/emacs-lisp/cconv.el')
-rw-r--r-- | lisp/emacs-lisp/cconv.el | 31 |
1 files changed, 6 insertions, 25 deletions
diff --git a/lisp/emacs-lisp/cconv.el b/lisp/emacs-lisp/cconv.el index fb871a9267e..ccb96d169d5 100644 --- a/lisp/emacs-lisp/cconv.el +++ b/lisp/emacs-lisp/cconv.el @@ -304,25 +304,6 @@ of converted forms." `(,@(nreverse special-forms) ,@(macroexp-unprogn body)))) funcbody))) -(defun cconv--lifted-arg (var env) - "The argument to use for VAR in λ-lifted calls according to ENV. -This is used when VAR is being shadowed; we may still need its value for -such calls." - (let ((mapping (cdr (assq var env)))) - (pcase-exhaustive mapping - (`(internal-get-closed-var . ,_) - ;; The variable is captured. - mapping) - (`(car-safe (internal-get-closed-var . ,_)) - ;; The variable is mutably captured; skip - ;; the indirection step because the variable is - ;; passed "by reference" to the λ-lifted function. - (cadr mapping)) - ((or '() `(car-safe ,(pred symbolp))) - ;; The variable is not captured; use the (shadowed) variable value. - ;; (If the mapping is `(car-safe SYMBOL)', SYMBOL is always VAR. - var)))) - (defun cconv-convert (form env extend) ;; This function actually rewrites the tree. "Return FORM with all its lambdas changed so they are closed. @@ -447,11 +428,10 @@ places where they originally did not directly appear." ;; One of the lambda-lifted vars is shadowed, so add ;; a reference to the outside binding and arrange to use ;; that reference. - (let ((var-def (cconv--lifted-arg var env)) - (closedsym (make-symbol (format "closed-%s" var)))) + (let ((closedsym (make-symbol (format "closed-%s" var)))) (setq new-env (cconv--remap-llv new-env var closedsym)) (setq new-extend (cons closedsym (remq var new-extend))) - (push `(,closedsym ,var-def) binders-new))) + (push `(,closedsym ,var) binders-new))) ;; We push the element after redefined free variables are ;; processed. This is important to avoid the bug when free @@ -469,13 +449,14 @@ places where they originally did not directly appear." ;; before we know that the var will be in `new-extend' (bug#24171). (dolist (binder binders-new) (when (memq (car-safe binder) new-extend) - ;; One of the lambda-lifted vars is shadowed. + ;; One of the lambda-lifted vars is shadowed, so add + ;; a reference to the outside binding and arrange to use + ;; that reference. (let* ((var (car-safe binder)) - (var-def (cconv--lifted-arg var env)) (closedsym (make-symbol (format "closed-%s" var)))) (setq new-env (cconv--remap-llv new-env var closedsym)) (setq new-extend (cons closedsym (remq var new-extend))) - (push `(,closedsym ,var-def) binders-new))))) + (push `(,closedsym ,var) binders-new))))) `(,letsym ,(nreverse binders-new) . ,(mapcar (lambda (form) |