|
From: | GNU bug Tracking System |
Subject: | [debbugs-tracker] bug#33034: closed (`unwind-protect' cleanup form is not executed if body dies in stack overflow) |
Date: | Sun, 14 Oct 2018 17:04:01 +0000 |
Your message dated Sun, 14 Oct 2018 10:02:59 -0700 with message-id <address@hidden> and subject line Re: `unwind-protect' cleanup form is not executed if body dies in stack overflow has caused the debbugs.gnu.org bug report #33034, regarding `unwind-protect' cleanup form is not executed if body dies in stack overflow to be marked as done. (If you believe you have received this mail in error, please contact address@hidden) -- 33034: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=33034 GNU Bug Tracking System Contact address@hidden with problems
--- Begin Message ---Subject: `unwind-protect' cleanup form is not executed if body dies in stack overflow Date: Sat, 13 Oct 2018 12:07:48 +0200 To reproduce: (defun overflow () (overflow)) (defun test () (interactive) (message "BEFORE") (unwind-protect (overflow) (message "CLEANUP"))) Invocation of `test' never issues message "CLEANUP", whether it is run interactively or non-interactively. By comparison, if you _catch_ the error with `condition-case': (defun test-2 () (interactive) (message "BEFORE") (unwind-protect (ignore-errors (overflow)) (message "CLEANUP"))) then cleanup form is executed properly. But if your error catcher is "above" the `unwind-protect' form, the cleanup is not executed again, even though the error is eaten as expected: (defun test-3 () (interactive) (message "BEFORE") (ignore-errors (unwind-protect (overflow) (message "CLEANUP")))) This is a perfect way to screw up your Emacs permanently (until full restart): when some `unwind-protect' cleanups are not run, you can be left with unexpected function advices, permanently altered global state etc., without any good way to undestand what's wrong. Paul
--- End Message ---
--- Begin Message ---Subject: Re: `unwind-protect' cleanup form is not executed if body dies in stack overflow Date: Sun, 14 Oct 2018 10:02:59 -0700 Thanks for the bug report; I installed the attached to fix it. The problem with your test case was neither C stack overflow nor failure to unwind the Lisp stack: it was failure to restore the Lisp evaluation depth (which is a separate thing from the Lisp stack size). User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 By the way, why are there two different limits? That slows the interpreter down a bit. Why don't we simply have a limit for the Lisp stack size? Every time lisp_eval_depth grows, the stack size grows, so limiting the stack limits the evaluation depth for free. If we had done things this way, the interpreter would be a bit faster and this bug would never have occurred.0001-Fix-lisp_eval_depth-in-unwind-protect-cleanup.patch
Description: Text Data
--- End Message ---
[Prev in Thread] | Current Thread | [Next in Thread] |