diff options
| author | Philipp Stephani | 2020-06-10 19:01:03 +0200 |
|---|---|---|
| committer | Philipp Stephani | 2020-06-14 20:01:28 +0200 |
| commit | e96f78fca672c74b7bf1120b7683a50295418725 (patch) | |
| tree | aded2f5b0e00ca786bbd70093fce422a229ecfd4 | |
| parent | 62cf8f1649468fc2f6c4f8926ab5c4bb184bfbe8 (diff) | |
| download | emacs-e96f78fca672c74b7bf1120b7683a50295418725.tar.gz emacs-e96f78fca672c74b7bf1120b7683a50295418725.zip | |
Band-aid for edebugging generator bodies (Bug#40434).
Edebug doesn't support them well. Rather than trying to fix Edebug,
disable instrumentation for now to prevent annoying bugs.
* lisp/emacs-lisp/generator.el (iter-defun, iter-lambda, iter-make)
(iter-do): Don't attempt to instrument bodies that are mangled by the
CPS transformer.
* test/lisp/emacs-lisp/generator-tests.el
(generator-tests-edebug): New regression test.
| -rw-r--r-- | lisp/emacs-lisp/generator.el | 8 | ||||
| -rw-r--r-- | test/lisp/emacs-lisp/generator-tests.el | 9 |
2 files changed, 13 insertions, 4 deletions
diff --git a/lisp/emacs-lisp/generator.el b/lisp/emacs-lisp/generator.el index ba344eb5150..c95c758a571 100644 --- a/lisp/emacs-lisp/generator.el +++ b/lisp/emacs-lisp/generator.el | |||
| @@ -673,7 +673,7 @@ When called as a function, NAME returns an iterator value that | |||
| 673 | encapsulates the state of a computation that produces a sequence | 673 | encapsulates the state of a computation that produces a sequence |
| 674 | of values. Callers can retrieve each value using `iter-next'." | 674 | of values. Callers can retrieve each value using `iter-next'." |
| 675 | (declare (indent defun) | 675 | (declare (indent defun) |
| 676 | (debug (&define name lambda-list lambda-doc def-body)) | 676 | (debug (&define name lambda-list lambda-doc &rest sexp)) |
| 677 | (doc-string 3)) | 677 | (doc-string 3)) |
| 678 | (cl-assert lexical-binding) | 678 | (cl-assert lexical-binding) |
| 679 | (let* ((parsed-body (macroexp-parse-body body)) | 679 | (let* ((parsed-body (macroexp-parse-body body)) |
| @@ -687,14 +687,14 @@ of values. Callers can retrieve each value using `iter-next'." | |||
| 687 | "Return a lambda generator. | 687 | "Return a lambda generator. |
| 688 | `iter-lambda' is to `iter-defun' as `lambda' is to `defun'." | 688 | `iter-lambda' is to `iter-defun' as `lambda' is to `defun'." |
| 689 | (declare (indent defun) | 689 | (declare (indent defun) |
| 690 | (debug (&define lambda-list lambda-doc def-body))) | 690 | (debug (&define lambda-list lambda-doc &rest sexp))) |
| 691 | (cl-assert lexical-binding) | 691 | (cl-assert lexical-binding) |
| 692 | `(lambda ,arglist | 692 | `(lambda ,arglist |
| 693 | ,(cps-generate-evaluator body))) | 693 | ,(cps-generate-evaluator body))) |
| 694 | 694 | ||
| 695 | (defmacro iter-make (&rest body) | 695 | (defmacro iter-make (&rest body) |
| 696 | "Return a new iterator." | 696 | "Return a new iterator." |
| 697 | (declare (debug t)) | 697 | (declare (debug (&rest sexp))) |
| 698 | (cps-generate-evaluator body)) | 698 | (cps-generate-evaluator body)) |
| 699 | 699 | ||
| 700 | (defconst iter-empty (lambda (_op _val) (signal 'iter-end-of-sequence nil)) | 700 | (defconst iter-empty (lambda (_op _val) (signal 'iter-end-of-sequence nil)) |
| @@ -720,7 +720,7 @@ is blocked." | |||
| 720 | Evaluate BODY with VAR bound to each value from ITERATOR. | 720 | Evaluate BODY with VAR bound to each value from ITERATOR. |
| 721 | Return the value with which ITERATOR finished iteration." | 721 | Return the value with which ITERATOR finished iteration." |
| 722 | (declare (indent 1) | 722 | (declare (indent 1) |
| 723 | (debug ((symbolp form) body))) | 723 | (debug ((symbolp form) &rest sexp))) |
| 724 | (let ((done-symbol (cps--gensym "iter-do-iterator-done")) | 724 | (let ((done-symbol (cps--gensym "iter-do-iterator-done")) |
| 725 | (condition-symbol (cps--gensym "iter-do-condition")) | 725 | (condition-symbol (cps--gensym "iter-do-condition")) |
| 726 | (it-symbol (cps--gensym "iter-do-iterator")) | 726 | (it-symbol (cps--gensym "iter-do-iterator")) |
diff --git a/test/lisp/emacs-lisp/generator-tests.el b/test/lisp/emacs-lisp/generator-tests.el index bcfab201636..9b1a573ea6a 100644 --- a/test/lisp/emacs-lisp/generator-tests.el +++ b/test/lisp/emacs-lisp/generator-tests.el | |||
| @@ -304,4 +304,13 @@ identical output." | |||
| 304 | (1+ it))))))) | 304 | (1+ it))))))) |
| 305 | -2))) | 305 | -2))) |
| 306 | 306 | ||
| 307 | (ert-deftest generator-tests-edebug () | ||
| 308 | "Check that Bug#40434 is fixed." | ||
| 309 | (with-temp-buffer | ||
| 310 | (prin1 '(iter-defun generator-tests-edebug () | ||
| 311 | (iter-yield 123)) | ||
| 312 | (current-buffer)) | ||
| 313 | (edebug-defun)) | ||
| 314 | (should (eql (iter-next (generator-tests-edebug)) 123))) | ||
| 315 | |||
| 307 | ;;; generator-tests.el ends here | 316 | ;;; generator-tests.el ends here |