1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-01-23 04:53:12 -08:00
emacs/etc
Stefan Monnier 1b1ffe0789 (Ffunction): Make interpreted closures safe for space
Interpreted closures currently just grab a reference to the complete
lexical environment, so (lambda (x) (+ x y)) can end up looking like

    (closure ((foo ...) (y 7) (bar ...) ...)
             (x) (+ x y))

where the foo/bar/... bindings are not only useless but can prevent
the GC from collecting that memory (i.e. it's a representation that is
not "safe for space") and it can also make that closure "unwritable"
(or more specifically, it can cause the closure's print
representation to be u`read`able).

Compiled closures don't suffer from this problem because `cconv.el`
actually looks at the code and only stores in the compiled closure
those variables which are actually used.

So, we fix this discrepancy by letting the existing code in `cconv.el` tell
`Ffunction` which variables are actually used by the body of the
function such that it can filter out the irrelevant elements and
return a closure of the form:

    (closure ((y 7)) (x) (+ x y))

* lisp/loadup.el: Preload `cconv` and set
`internal-filter-closure-env-function` once we have a usable `cconv-fv`.

* lisp/emacs-lisp/bytecomp.el (byte-compile-preprocess): Adjust to new
calling convention of `cconv-closure-convert`.
(byte-compile-not-lexical-var-p): Delete function, moved to `cconv.el`.
(byte-compile-bind): Use `cconv--not-lexical-var-p`.

* lisp/emacs-lisp/cconv.el (cconv--dynbound-variables): New var.
(cconv-closure-convert): New arg `dynbound-vars`
(cconv--warn-unused-msg): Remove special case for `ignored`,
so we don't get confused when a function uses an argument called
`ignored`, e.g. holding a list of things that it should ignore.
(cconv--not-lexical-var-p): New function, moved from `bytecomp.el`.
Don't special case keywords and `nil` and `t` since they are already
`special-variable-p`.
(cconv--analyze-function): Use `cconv--not-lexical-var-p`.
(cconv--dynbindings): New dynbound var.
(cconv-analyze-form): Use `cconv--not-lexical-var-p`.
Remember in `cconv--dynbindings` the vars for which we used
dynamic scoping.
(cconv-analyze-form): Use `cconv--dynbound-variables` rather than
`byte-compile-bound-variables`.
(cconv-fv): New function.

* src/eval.c (Fsetq, eval_sub): Remove optimization designed when
`lexical-binding == nil` was the common case.
(Ffunction): Use `internal-filter-closure-env-function` when available.
(eval_sub, Ffuncall): Improve error info for `excessive_lisp_nesting`.
(internal-filter-closure-env-function): New defvar.
2022-10-25 14:24:54 -04:00
..
charsets
e
forms
gnus
images
nxml
org
refcards
schema
srecode
themes
tutorials
AUTHORS
CALC-NEWS
ChangeLog.1
compilation.txt
COPYING
DEBUG
DEVEL.HUMOR
DISTRIB
edt-user.el
emacs-buffer.gdb
emacs-mail.desktop
emacs.desktop
emacs.icon
emacs.metainfo.xml
emacs.service
emacs_lldb.py
emacsclient-mail.desktop
emacsclient.desktop
enriched.txt
ERC-NEWS
ETAGS.EBNF
ETAGS.README
future-bug
gnus-tut.txt
grep.txt
HELLO
HISTORY
JOKES
MACHINES
MH-E-NEWS
NEWS (Ffunction): Make interpreted closures safe for space 2022-10-25 14:24:54 -04:00
NEWS.1-17
NEWS.18
NEWS.19
NEWS.20
NEWS.21
NEWS.22
NEWS.23
NEWS.24
NEWS.25
NEWS.26
NEWS.27
NEWS.28
NEXTSTEP
NXML-NEWS
ORG-NEWS
org.gnu.emacs.defaults.gschema.xml
package-keyring.gpg
PROBLEMS
ps-prin0.ps
ps-prin1.ps
publicsuffix.txt
README
rgb.txt
ses-example.ses
spook.lines
TERMS
TODO
w32-feature.el
yow.lines

This directory contains the architecture-independent files used by or
with Emacs.  This includes some text files of documentation for GNU
Emacs or of interest to Emacs users, and the file of dumped docstrings
for Emacs functions and variables.

COPYRIGHT AND LICENSE INFORMATION FOR IMAGE FILES

File: emacs.icon
  Author: Sun Microsystems, Inc
  Copyright (C) 1999, 2001-2022 Free Software Foundation, Inc.
  License: GNU General Public License version 3 or later (see COPYING)