aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Stephani2020-06-10 19:01:03 +0200
committerPhilipp Stephani2020-06-14 20:01:28 +0200
commite96f78fca672c74b7bf1120b7683a50295418725 (patch)
treeaded2f5b0e00ca786bbd70093fce422a229ecfd4
parent62cf8f1649468fc2f6c4f8926ab5c4bb184bfbe8 (diff)
downloademacs-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.el8
-rw-r--r--test/lisp/emacs-lisp/generator-tests.el9
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
673encapsulates the state of a computation that produces a sequence 673encapsulates the state of a computation that produces a sequence
674of values. Callers can retrieve each value using `iter-next'." 674of 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."
720Evaluate BODY with VAR bound to each value from ITERATOR. 720Evaluate BODY with VAR bound to each value from ITERATOR.
721Return the value with which ITERATOR finished iteration." 721Return 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