branch: elpa/racket-mode
commit 35144bde141f393c051a19493abc4cbdca7aa037
Author: Greg Hendershott <[email protected]>
Commit: Greg Hendershott <[email protected]>
Validate command sexps will be readable by back end
---
racket-cmd.el | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/racket-cmd.el b/racket-cmd.el
index 4d94bd34ed..12ec0273a4 100644
--- a/racket-cmd.el
+++ b/racket-cmd.el
@@ -222,6 +222,29 @@ notifications."
(run-at-time 0.001 nil callback response)))
(_ nil)))
+(defun racket--assert-readable (sexp)
+ "Sanity check that SEXP is readable by Racket.
+
+For example if a command sexp supplies a marker -- which prints
+as unreadable #<marker ...> -- instead of an integer, we will
+error here in Emacs with a more helpful error message and
+backtrace. Besides which, a read error in the back end's command
+loop could cause the entire back end to abend."
+ (cl-labels
+ ((check
+ (v)
+ (cond
+ ((numberp v) t)
+ ((stringp v) t)
+ ((symbolp v) t)
+ ((consp v) (and (check (car v)) (check (cdr v))))
+ (t
+ (let ((print-length nil)
+ (print-level nil))
+ (error "invalid s-expression for Racket reader\n value: %S\n in:
%S"
+ v sexp))))))
+ (check sexp)))
+
(defun racket--cmd/async-raw (repl-session-id command-sexpr &optional callback)
"Send COMMAND-SEXPR and return. Later call CALLBACK with the response sexp.
@@ -242,6 +265,7 @@ CALLBACK is called, as it was when the command was sent. If
you
need to do something to do that original buffer, save the
`current-buffer' in a `let' and use it in a `with-current-buffer'
form. See `racket--restoring-current-buffer'."
+ (racket--assert-readable command-sexpr)
(unless (racket--cmd-open-p)
(racket--cmd-open))
(cl-incf racket--cmd-nonce)