1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-07 23:10:28 -08:00

Make cconv-analyse understand the need for closures.

* lisp/emacs-lisp/byte-lexbind.el (byte-compile-lforminfo-analyze):
Understand the :fun-body case for catch, save-window-excursion, and
condition-case.
(byte-compile-maybe-push-heap-environment): No need when nclosures is
zero and byte-compile-current-num-closures is -1.

* lisp/emacs-lisp/bytecomp.el (byte-compile-lambda): Fix `fun' that was not
renamed to `bytecomp-fun'.

* lisp/emacs-lisp/cconv.el (cconv-not-lexical-var-p): New function.
(cconv-freevars): Use it.
(cconv-closure-convert-rec): Avoid `position'.
(cconv-analyse-function): New function.
(cconv-analyse-form): Use it.  `inclosure' can't be nil any more.
Check lexical vars at let-binding time rather than when referenced.
For defuns to be in an empty environment and lambdas to take lexical args.
Pay attention to the need to build closures in catch, unwind-protect,
save-window-excursion, condition-case, and track-mouse.
Fix defconst/defvar handling.
This commit is contained in:
Stefan Monnier 2011-02-11 14:48:54 -05:00
parent d779e73c22
commit 43e67019df
5 changed files with 201 additions and 192 deletions

View file

@ -2745,7 +2745,7 @@ If FORM is a lambda or a macro, byte-compile it as a function."
;; containing the args and any closed-over variables.
(and lexical-binding
(byte-compile-make-lambda-lexenv
fun
bytecomp-fun
byte-compile-lexical-environment)))
(is-closure
;; This is true if we should be making a closure instead of
@ -2804,7 +2804,7 @@ If FORM is a lambda or a macro, byte-compile it as a function."
(let ((code (byte-compile-lambda form add-lambda)))
(if (byte-compile-closure-code-p code)
(byte-compile-make-closure code)
;; A simple lambda is just a constant
;; A simple lambda is just a constant.
(byte-compile-constant code))))
(defun byte-compile-constants-vector ()