summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp/thunk.el
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2019-06-04 12:55:53 -0400
committerStefan Monnier <monnier@iro.umontreal.ca>2019-06-04 12:55:53 -0400
commitf4d32538317c2cc6e8e9041d07d84b1e812e4e19 (patch)
tree100111c73398e000ed91af7b3aec184b05b44a28 /lisp/emacs-lisp/thunk.el
parentffb7bbdf6824054316a6f63df22eea6d8887bdbd (diff)
downloademacs-f4d32538317c2cc6e8e9041d07d84b1e812e4e19.tar.gz
emacs-f4d32538317c2cc6e8e9041d07d84b1e812e4e19.tar.bz2
emacs-f4d32538317c2cc6e8e9041d07d84b1e812e4e19.zip
* lisp/emacs-lisp/thunk.el (thunk-delay): Fix memory leak
Get rid of references to the free variables of `body` once the thunk has been forced (bug#30626).
Diffstat (limited to 'lisp/emacs-lisp/thunk.el')
-rw-r--r--lisp/emacs-lisp/thunk.el19
1 files changed, 9 insertions, 10 deletions
diff --git a/lisp/emacs-lisp/thunk.el b/lisp/emacs-lisp/thunk.el
index e1370c45911..8d28570dc2a 100644
--- a/lisp/emacs-lisp/thunk.el
+++ b/lisp/emacs-lisp/thunk.el
@@ -54,16 +54,15 @@
"Delay the evaluation of BODY."
(declare (debug t))
(cl-assert lexical-binding)
- (let ((forced (make-symbol "forced"))
- (val (make-symbol "val")))
- `(let (,forced ,val)
- (lambda (&optional check)
- (if check
- ,forced
- (unless ,forced
- (setf ,val (progn ,@body))
- (setf ,forced t))
- ,val)))))
+ `(let (forced
+ (val (lambda () ,@body)))
+ (lambda (&optional check)
+ (if check
+ forced
+ (unless forced
+ (setf val (funcall val))
+ (setf forced t))
+ val))))
(defun thunk-force (delayed)
"Force the evaluation of DELAYED.