Add regression test for Bug#33014

Backport from master.
* test/src/eval-tests.el:
(eval-tests-byte-code-being-evaluated-is-protected-from-gc): New test.
(eval-tests-33014-var): New variable.
(eval-tests-33014-func, eval-tests-33014-redefine): New functions.
This commit is contained in:
Gemini Lasswell 2018-10-30 21:15:51 -07:00 committed by Paul Eggert
parent 1ad2903a48
commit c3cf85b1c1

View file

@ -99,4 +99,34 @@ crash/abort/malloc assert failure on the next test."
(signal-hook-function #'ignore))
(should-error (eval-tests--exceed-specbind-limit))))
(ert-deftest eval-tests-byte-code-being-evaluated-is-protected-from-gc ()
"Regression test for Bug#33014.
Check that byte-compiled objects being executed by exec-byte-code
are found on the stack and therefore not garbage collected."
(should (string= (eval-tests-33014-func)
"before after: ok foo: (e) bar: (a b c d e) baz: a bop: c")))
(defvar eval-tests-33014-var "ok")
(defun eval-tests-33014-func ()
"A function which has a non-trivial constants vector when byte-compiled."
(let ((result "before "))
(eval-tests-33014-redefine)
(garbage-collect)
(setq result (concat result (format "after: %s" eval-tests-33014-var)))
(let ((vals '(0 1 2 3))
(things '(a b c d e)))
(dolist (val vals)
(setq result
(concat result " "
(cond
((= val 0) (format "foo: %s" (last things)))
((= val 1) (format "bar: %s" things))
((= val 2) (format "baz: %s" (car things)))
(t (format "bop: %s" (nth 2 things))))))))
result))
(defun eval-tests-33014-redefine ()
"Remove the Lisp reference to the byte-compiled object."
(setf (symbol-function #'eval-tests-33014-func) nil))
;;; eval-tests.el ends here