emacs-bug-tracker
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debbugs-tracker] bug#33034: closed (`unwind-protect' cleanup form is no


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 User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 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).

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.

Attachment: 0001-Fix-lisp_eval_depth-in-unwind-protect-cleanup.patch
Description: Text Data


--- End Message ---

reply via email to

[Prev in Thread] Current Thread [Next in Thread]