(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