diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2019-06-04 12:55:53 -0400 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2019-06-04 12:55:53 -0400 |
commit | f4d32538317c2cc6e8e9041d07d84b1e812e4e19 (patch) | |
tree | 100111c73398e000ed91af7b3aec184b05b44a28 /lisp/emacs-lisp/thunk.el | |
parent | ffb7bbdf6824054316a6f63df22eea6d8887bdbd (diff) | |
download | emacs-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.el | 19 |
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. |