[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master a5dcc1abea3 09/14: (macroexp--with-extended-form-stack): Use plai
From: |
Stefan Monnier |
Subject: |
master a5dcc1abea3 09/14: (macroexp--with-extended-form-stack): Use plain `let` |
Date: |
Thu, 4 Jan 2024 18:55:33 -0500 (EST) |
branch: master
commit a5dcc1abea32abc906abfb66599c280b01d6ba27
Author: Stefan Monnier <monnier@iro.umontreal.ca>
Commit: Stefan Monnier <monnier@iro.umontreal.ca>
(macroexp--with-extended-form-stack): Use plain `let`
`macroexp--with-extended-form-stack` used manual push/pop so that upon
non-local exits the "deeper" value is kept, so the error handler gets
to know what was the deeper value, so as to be able to compute more
precise error locations.
Replace this with a `handler-bind` which catches that "deeper" value
more explicitly.
* lisp/emacs-lisp/bytecomp.el (bytecomp--displaying-warnings):
Use `handler-bind` to catch the value of `byte-compile-form-stack`
at the time of the error. Also consolidate the duplicated code.
* lisp/emacs-lisp/macroexp.el (macroexp--with-extended-form-stack):
Use a plain dynbound let-rebinding.
---
lisp/emacs-lisp/bytecomp.el | 41 +++++++++++++++++++++++------------------
lisp/emacs-lisp/macroexp.el | 10 ++--------
2 files changed, 25 insertions(+), 26 deletions(-)
diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index 1ef3f0fba6d..e36a79aaa8e 100644
--- a/lisp/emacs-lisp/bytecomp.el
+++ b/lisp/emacs-lisp/bytecomp.el
@@ -1874,39 +1874,44 @@ It is too wide if it has any lines longer than the
largest of
(setq byte-to-native-plist-environment
overriding-plist-environment)))))
-(defmacro displaying-byte-compile-warnings (&rest body)
+(defmacro displaying-byte-compile-warnings (&rest body) ;FIXME: Namespace!
(declare (debug (def-body)))
`(bytecomp--displaying-warnings (lambda () ,@body)))
(defun bytecomp--displaying-warnings (body-fn)
- (let* ((warning-series-started
+ (let* ((wrapped-body
+ (lambda ()
+ (if byte-compile-debug
+ (funcall body-fn)
+ ;; Use a `handler-bind' to remember the `byte-compile-form-stack'
+ ;; active at the time the error is signaled, so as to
+ ;; get more precise error locations.
+ (let ((form-stack nil))
+ (condition-case error-info
+ (handler-bind
+ ((error (lambda (_err)
+ (setq form-stack byte-compile-form-stack))))
+ (funcall body-fn))
+ (error (let ((byte-compile-form-stack form-stack))
+ (byte-compile-report-error error-info))))))))
+ (warning-series-started
(and (markerp warning-series)
(eq (marker-buffer warning-series)
(get-buffer byte-compile-log-buffer))))
(byte-compile-form-stack byte-compile-form-stack))
- (if (or (eq warning-series 'byte-compile-warning-series)
+ (if (or (eq warning-series #'byte-compile-warning-series)
warning-series-started)
;; warning-series does come from compilation,
;; so don't bind it, but maybe do set it.
- (let (tem)
- ;; Log the file name. Record position of that text.
- (setq tem (byte-compile-log-file))
+ (let ((tem (byte-compile-log-file))) ;; Log the file name.
(unless warning-series-started
- (setq warning-series (or tem 'byte-compile-warning-series)))
- (if byte-compile-debug
- (funcall body-fn)
- (condition-case error-info
- (funcall body-fn)
- (error (byte-compile-report-error error-info)))))
+ (setq warning-series (or tem #'byte-compile-warning-series)))
+ (funcall wrapped-body))
;; warning-series does not come from compilation, so bind it.
(let ((warning-series
;; Log the file name. Record position of that text.
- (or (byte-compile-log-file) 'byte-compile-warning-series)))
- (if byte-compile-debug
- (funcall body-fn)
- (condition-case error-info
- (funcall body-fn)
- (error (byte-compile-report-error error-info))))))))
+ (or (byte-compile-log-file) #'byte-compile-warning-series)))
+ (funcall wrapped-body)))))
;;;###autoload
(defun byte-force-recompile (directory)
diff --git a/lisp/emacs-lisp/macroexp.el b/lisp/emacs-lisp/macroexp.el
index 0e4fd3ea521..b87b749dd76 100644
--- a/lisp/emacs-lisp/macroexp.el
+++ b/lisp/emacs-lisp/macroexp.el
@@ -42,14 +42,8 @@ condition-case handling a signaled error.")
(defmacro macroexp--with-extended-form-stack (expr &rest body)
"Evaluate BODY with EXPR pushed onto `byte-compile-form-stack'."
(declare (indent 1))
- ;; FIXME: We really should just be using a simple dynamic let-binding here,
- ;; but these explicit push and pop make the extended stack value visible
- ;; to error handlers. Remove that need for that!
- `(progn
- (push ,expr byte-compile-form-stack)
- (prog1
- (progn ,@body)
- (pop byte-compile-form-stack))))
+ `(let ((byte-compile-form-stack (cons ,expr byte-compile-form-stack)))
+ ,@body))
;; Bound by the top-level `macroexpand-all', and modified to include any
;; macros defined by `defmacro'.
- 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 <=
- 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, 2024/01/04
- 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