]> git.eshelyaron.com Git - emacs.git/commitdiff
Introduce element &error into edebug specification lists for macros
authorAlan Mackenzie <acm@muc.de>
Fri, 17 Jan 2020 21:53:13 +0000 (21:53 +0000)
committerAlan Mackenzie <acm@muc.de>
Fri, 17 Jan 2020 21:53:13 +0000 (21:53 +0000)
This fixes bug #37540.

* lisp/emacs-lisp/edebug.el (top level): New entry for &error in alist used to
associate elements with their handling functions.
(edebug-match-&error): New function.
(nested-backquote-form): Use the new element &error to abort instrumentation
on encountering a three deep nesting of backquotes (without intervening
commas).

* doc/lispref/edebug.texi (Specification List): Add an entry for &error.

* etc/NEWS: Add an entry for &error.

doc/lispref/edebug.texi
etc/NEWS
lisp/emacs-lisp/edebug.el

index 8be8307c75fed94d8fe6f46081873d184bf65c86..cfef5c12d1ed85e97bf7ea5c2fbe09487362509b 100644 (file)
@@ -1362,6 +1362,11 @@ while matching the remainder of the specifications at this level.  This
 is primarily used to generate more specific syntax error messages.  See
 @ref{Backtracking}, for more details.  Also see the @code{let} example.
 
+@item &error
+@code{&error} should be followed by a string, an error message, in the
+edebug-spec; it aborts the instrumentation, displaying the message in
+the minibuffer.
+
 @item @var{other-symbol}
 @cindex indirect specifications
 Any other symbol in a specification list may be a predicate or an
index f5740c8b3c3f2ae95a921559f27f81245eee8821..73ed3d739ea735fccb775f80e5cd47e7cf2d8a4a 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -48,6 +48,13 @@ It was declared obsolete in Emacs 27.1.
 ** The sb-image.el library is now marked obsolete.
 This file was a compatibility kludge which is no longer needed.
 
+** Edebug
+
++++
+*** Edebug specification lists can use the new keyword '&error', which
+unconditionally aborts the current edebug instrumentation with the
+supplied error message.
+
 \f
 * New Modes and Packages in Emacs 28.1
 
index 0aa6caa37e15508d2b3a69eb6f1ed3a7b818b9cb..85cc8c8e7adbc531dc46b371d48cda125782d86d 100644 (file)
@@ -1714,6 +1714,7 @@ contains a circular object."
                 (cl-macrolet-body . edebug-match-cl-macrolet-body)
                (&not . edebug-match-&not)
                (&key . edebug-match-&key)
+               (&error . edebug-match-&error)
                (place . edebug-match-place)
                (gate . edebug-match-gate)
                ;;   (nil . edebug-match-nil)  not this one - special case it.
@@ -1847,6 +1848,15 @@ contains a circular object."
                            (car (cdr pair))))
                 specs))))
 
+(defun edebug-match-&error (cursor specs)
+  ;; Signal an error, using the following string in the spec as argument.
+  (let ((error-string (car specs))
+        (edebug-error-point (edebug-before-offset cursor)))
+    (goto-char edebug-error-point)
+    (error "%s"
+           (if (stringp error-string)
+               error-string
+             "String expected after &error in edebug-spec"))))
 
 (defun edebug-match-gate (_cursor)
   ;; Simply set the gate to prevent backtracking at this level.
@@ -2216,6 +2226,8 @@ into `edebug--cl-macrolet-defs' which is checked in `edebug-list-form-args'."
 
 (def-edebug-spec nested-backquote-form
   (&or
+   ("`" &error "Triply nested backquotes (without commas \"between\" them) \
+are too difficult to instrument")
    ;; Allow instrumentation of any , or ,@ contained within the (\, ...) or
    ;; (\,@ ...) matched on the next line.
    ([&or "," ",@"] backquote-form)