[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 7959a63ce25 02/14: (eval-expression): Fix bug#67196
From: |
Stefan Monnier |
Subject: |
master 7959a63ce25 02/14: (eval-expression): Fix bug#67196 |
Date: |
Thu, 4 Jan 2024 18:55:32 -0500 (EST) |
branch: master
commit 7959a63ce258c90eb3c7947ab3318c5531eb37d9
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 4f6d2ee12c3..692c0dacefc 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))
- master updated (1870e2f48a7 -> 1081e975c93), Stefan Monnier, 2024/01/04
- master 80b081a0ac7 07/14: startup.el: Use `handler-bind` to implement `--debug-init`, Stefan Monnier, 2024/01/04
- master fa1063774ce 05/14: Use handler-bind to repair bytecomp-tests, Stefan Monnier, 2024/01/04
- master 142c90a6f08 06/14: emacs-module-tests.el (mod-test-non-local-exit-signal-test): Repair test, Stefan Monnier, 2024/01/04
- master a5dcc1abea3 09/14: (macroexp--with-extended-form-stack): Use plain `let`, Stefan Monnier, 2024/01/04
- master 391c208aecc 12/14: (backtrace-on-redisplay-error): Use `handler-bind`, Stefan Monnier, 2024/01/04
- master ae75333ca78 13/14: Improve `handler-bind` doc, Stefan Monnier, 2024/01/04
- master 5ba75e183c6 01/14: New special form `handler-bind`, Stefan Monnier, 2024/01/04
- master 7959a63ce25 02/14: (eval-expression): Fix bug#67196,
Stefan Monnier <=
- master 2ef6e40da88 11/14: (signal_or_quit): Preserve error object identity, Stefan Monnier, 2024/01/04
- master 02edbc88a12 10/14: eval.c: Add new var `lisp-eval-depth-reserve`, Stefan Monnier, 2024/01/04
- master 604e34338f3 08/14: Move batch backtrace code to `top_level_2`, Stefan Monnier, 2024/01/04
- master 1081e975c93 14/14: Merge branch 'handler-bind', Stefan Monnier, 2024/01/04
- master fe0f15dbc96 03/14: ert.el: Use `handler-bind` to record backtraces, Stefan Monnier, 2024/01/04
- master 25ea99c211e 04/14: Fix ert-tests.el for the new `handler-bind` code, Stefan Monnier, 2024/01/04