summaryrefslogtreecommitdiff
path: root/lisp
diff options
context:
space:
mode:
Diffstat (limited to 'lisp')
-rw-r--r--lisp/simple.el19
1 files changed, 16 insertions, 3 deletions
diff --git a/lisp/simple.el b/lisp/simple.el
index b3ff6344aa0..d4e34049c2a 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -554,7 +554,8 @@ addition, the encoding is fully shown."
:version "21.1")
(defcustom eval-expression-debug-on-error t
- "*Value to use for `debug-on-error' when evaluating in `eval-expression'."
+ "*Non-nil means set `debug-on-error' when evaluating in `eval-expression'.
+If nil, don't change the value of `debug-on-error'."
:group 'lisp
:type 'boolean
:version "21.1")
@@ -570,8 +571,20 @@ Value is also consed on to front of the variable `values'."
nil read-expression-map t
'read-expression-history)
current-prefix-arg))
- (let ((debug-on-error eval-expression-debug-on-error))
- (setq values (cons (eval eval-expression-arg) values)))
+
+ (if (null eval-expression-debug-on-error)
+ (setq values (cons (eval eval-expression-arg) values))
+ (let ((old-value (make-symbol "t")) new-value)
+ ;; Bind debug-on-error to something unique so that we can
+ ;; detect when evaled code changes it.
+ (let ((debug-on-error old-value))
+ (setq values (cons (eval eval-expression-arg) values))
+ (setq new-value debug-on-error))
+ ;; If evaled 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))))
+
(let ((print-length eval-expression-print-length)
(print-level eval-expression-print-level))
(prin1 (car values)