[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
scratch/handler-bind 30aa70bcb19 2/7: (eval-expression): Fix bug#67196
From: |
Stefan Monnier |
Subject: |
scratch/handler-bind 30aa70bcb19 2/7: (eval-expression): Fix bug#67196 |
Date: |
Thu, 21 Dec 2023 09:43:41 -0500 (EST) |
branch: scratch/handler-bind
commit 30aa70bcb192e73d04b1f93b858ccdc0fa764caf
Author: Stefan Monnier <monnier@iro.umontreal.ca>
Commit: Stefan Monnier <monnier@iro.umontreal.ca>
(eval-expression): Fix bug#67196
* lisp/simple.el (eval-expression--debug): New function.
(eval-expression): Use it together with `handler-bind` instead of
let-binding `debug-on-error`.
---
lisp/simple.el | 29 +++++++++++++----------------
1 file changed, 13 insertions(+), 16 deletions(-)
diff --git a/lisp/simple.el b/lisp/simple.el
index cee1ddac52f..6a9c15f30c1 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -2087,6 +2087,9 @@ of the prefix argument for `eval-expression' and
((= num -1) most-positive-fixnum)
(t eval-expression-print-maximum-character)))))
+(defun eval-expression--debug (err)
+ (funcall debugger 'error err :backtrace-base #'eval-expression--debug))
+
;; We define this, rather than making `eval' interactive,
;; for the sake of completion of names like eval-region, eval-buffer.
(defun eval-expression (exp &optional insert-value no-truncate
char-print-limit)
@@ -2120,23 +2123,17 @@ this command arranges for all errors to enter the
debugger."
(cons (read--expression "Eval: ")
(eval-expression-get-print-arguments current-prefix-arg)))
- (let (result)
+ (let* (result
+ (runfun
+ (lambda ()
+ (setq result
+ (values--store-value
+ (eval (let ((lexical-binding t)) (macroexpand-all exp))
+ t))))))
(if (null eval-expression-debug-on-error)
- (setq result
- (values--store-value
- (eval (let ((lexical-binding t)) (macroexpand-all exp)) t)))
- (let ((old-value (make-symbol "t")) new-value)
- ;; Bind debug-on-error to something unique so that we can
- ;; detect when evalled code changes it.
- (let ((debug-on-error old-value))
- (setq result
- (values--store-value
- (eval (let ((lexical-binding t)) (macroexpand-all exp)) t)))
- (setq new-value debug-on-error))
- ;; If evalled code has changed the value of debug-on-error,
- ;; propagate that change to the global binding.
- (unless (eq old-value new-value)
- (setq debug-on-error new-value))))
+ (funcall runfun)
+ (handler-bind ((error #'eval-expression--debug))
+ (funcall runfun)))
(let ((print-length (unless no-truncate eval-expression-print-length))
(print-level (unless no-truncate eval-expression-print-level))
- branch scratch/handler-bind created (now 869192bd7ba), Stefan Monnier, 2023/12/21
- scratch/handler-bind 30aa70bcb19 2/7: (eval-expression): Fix bug#67196,
Stefan Monnier <=
- scratch/handler-bind dcc65766ab2 6/7: startup.el: Use `handler-bind` to implement `--debug-init`, Stefan Monnier, 2023/12/21
- scratch/handler-bind 57cc24291b1 3/7: edebug.el: Use `handler-bind` instead of `signal-hook-function`, Stefan Monnier, 2023/12/21
- scratch/handler-bind 7252f6b4894 5/7: tramp.el: Use `handler-bind` instead of `signal-hook-function`, Stefan Monnier, 2023/12/21
- scratch/handler-bind 034f453c176 1/7: New special form `handler-bind`, Stefan Monnier, 2023/12/21
- scratch/handler-bind 5db1edc50d4 4/7: ert.el: Use `handler-bind` to record backtraces, Stefan Monnier, 2023/12/21
- scratch/handler-bind 869192bd7ba 7/7: Move batch backtrace code to `top_level_2`, Stefan Monnier, 2023/12/21