diff --git a/NEWS b/NEWS index 3684490b7..8e0046789 100644 --- a/NEWS +++ b/NEWS @@ -11,6 +11,12 @@ Changes in 1.8.6 (since 1.8.5) ** New convenience function `scm_c_symbol_length ()' +** Single stepping through code from Emacs + +When you use GDS to evaluate Scheme code from Emacs, you can now use +`C-u' to indicate that you want to single step through that code. See +`Evaluating Scheme Code' in the manual for more details. + * Bugs fixed ** Internal `scm_i_' functions now have "hidden" linkage with GCC/ELF diff --git a/doc/ref/ChangeLog b/doc/ref/ChangeLog index 95a2491bd..796298f02 100644 --- a/doc/ref/ChangeLog +++ b/doc/ref/ChangeLog @@ -1,3 +1,8 @@ +2008-07-17 Neil Jerram + + * scheme-using.texi (Evaluating Scheme Code): Document use of + `C-u' prefix with evaluation commands. + 2008-07-05 Ludovic Courtès * api-data.texi (Symbol Primitives): Add `scm_c_symbol_length ()'. diff --git a/doc/ref/scheme-using.texi b/doc/ref/scheme-using.texi index 59cc0e651..a8a2568e3 100644 --- a/doc/ref/scheme-using.texi +++ b/doc/ref/scheme-using.texi @@ -842,6 +842,14 @@ region contains a balanced expression, or try to expand the region so that it does; it uses the region exactly as it is. @end table +If you type @kbd{C-u} before one of these commands, GDS will +immediately pop up a Scheme stack buffer, showing the requested +evaluation, so that you can single step through it. (This is achieved +by setting a @code{} trap at the start of the requested +evaluation; see @ref{Source Traps} for more on how those work.) The +Scheme stack display, and the options for continuing through the code, +are described in the next two sections. + @node Displaying the Scheme Stack @subsection Displaying the Scheme Stack diff --git a/emacs/ChangeLog b/emacs/ChangeLog index f5696faf5..3c49d8ffd 100644 --- a/emacs/ChangeLog +++ b/emacs/ChangeLog @@ -1,3 +1,9 @@ +2008-07-17 Neil Jerram + + * gds-scheme.el (gds-eval-region, gds-eval-expression) + (gds-eval-defun, gds-eval-last-sexp): Support `C-u' prefix, + meaning that user wants to single step through the code. + 2008-03-12 Neil Jerram * Makefile.am, gds-scheme.el, gds-server.el, gds.el: New (merged diff --git a/emacs/gds-scheme.el b/emacs/gds-scheme.el index bc3a20b65..b8a161b37 100755 --- a/emacs/gds-scheme.el +++ b/emacs/gds-scheme.el @@ -279,9 +279,12 @@ region's code." (setq line (count-lines (point-min) (point)))) (cons line column))) -(defun gds-eval-region (start end) - "Evaluate the current region." - (interactive "r") +(defun gds-eval-region (start end &optional debugp) + "Evaluate the current region. If invoked with `C-u' prefix (or, in +a program, with optional DEBUGP arg non-nil), pause and pop up the +stack at the start of the evaluation, so that the user can single-step +through the code." + (interactive "r\nP") (or gds-client (gds-auto-associate-buffer) (call-interactively 'gds-associate-buffer)) @@ -289,24 +292,29 @@ region's code." (port-name (gds-port-name start end)) (lc (gds-line-and-column start))) (let ((code (buffer-substring-no-properties start end))) - (gds-send (format "eval (region . %S) %s %S %d %d %S" + (gds-send (format "eval (region . %S) %s %S %d %d %S %s" (gds-abbreviated code) (if module (prin1-to-string module) "#f") port-name (car lc) (cdr lc) - code) + code + (if debugp '(debug) '(none))) gds-client)))) -(defun gds-eval-expression (expr &optional correlator) - "Evaluate the supplied EXPR (a string)." - (interactive "sEvaluate expression: \nP") +(defun gds-eval-expression (expr &optional correlator debugp) + "Evaluate the supplied EXPR (a string). If invoked with `C-u' +prefix (or, in a program, with optional DEBUGP arg non-nil), pause and +pop up the stack at the start of the evaluation, so that the user can +single-step through the code." + (interactive "sEvaluate expression: \ni\nP") (or gds-client (gds-auto-associate-buffer) (call-interactively 'gds-associate-buffer)) (set-text-properties 0 (length expr) nil expr) - (gds-send (format "eval (%S . %S) #f \"Emacs expression\" 0 0 %S" + (gds-send (format "eval (%S . %S) #f \"Emacs expression\" 0 0 %S %s" (or correlator 'expression) (gds-abbreviated expr) - expr) + expr + (if debugp '(debug) '(none))) gds-client)) (defconst gds-abbreviated-length 35) @@ -325,19 +333,25 @@ region's code." (concat (substring code 0 (- gds-abbreviated-length 3)) "...") code)) -(defun gds-eval-defun () - "Evaluate the defun (top-level form) at point." - (interactive) +(defun gds-eval-defun (&optional debugp) + "Evaluate the defun (top-level form) at point. If invoked with +`C-u' prefix (or, in a program, with optional DEBUGP arg non-nil), +pause and pop up the stack at the start of the evaluation, so that the +user can single-step through the code." + (interactive "P") (save-excursion (end-of-defun) (let ((end (point))) (beginning-of-defun) - (gds-eval-region (point) end)))) + (gds-eval-region (point) end debugp)))) -(defun gds-eval-last-sexp () - "Evaluate the sexp before point." - (interactive) - (gds-eval-region (save-excursion (backward-sexp) (point)) (point))) +(defun gds-eval-last-sexp (&optional debugp) + "Evaluate the sexp before point. If invoked with `C-u' prefix (or, +in a program, with optional DEBUGP arg non-nil), pause and pop up the +stack at the start of the evaluation, so that the user can single-step +through the code." + (interactive "P") + (gds-eval-region (save-excursion (backward-sexp) (point)) (point) debugp)) ;;;; Help. diff --git a/ice-9/ChangeLog b/ice-9/ChangeLog index e4ef1207b..55fc96418 100644 --- a/ice-9/ChangeLog +++ b/ice-9/ChangeLog @@ -1,3 +1,8 @@ +2008-07-17 Neil Jerram + + * gds-client.scm (handle-nondebug-protocol): Add support for + setting a trap on code that is about to be evaluated. + 2008-04-14 Neil Jerram * gds-client.scm (gds-debug-trap): Ensure that frame index passed diff --git a/ice-9/gds-client.scm b/ice-9/gds-client.scm index 4db4f8266..960015abd 100755 --- a/ice-9/gds-client.scm +++ b/ice-9/gds-client.scm @@ -352,7 +352,7 @@ Thanks!\n\n" ((eval) (set! last-lazy-trap-context #f) - (apply (lambda (correlator module port-name line column code) + (apply (lambda (correlator module port-name line column code flags) (with-input-from-string code (lambda () (set-port-filename! (current-input-port) port-name) @@ -380,7 +380,13 @@ Thanks!\n\n" (+ n 1)))) ;; Another complete expression read; add ;; it to the list. - (loop (cons x exprs) (read))))) + (begin + (if (and (pair? x) + (memq 'debug flags)) + (install-trap (make + #:expression x + #:behaviour gds-debug-trap))) + (loop (cons x exprs) (read)))))) (lambda (key . args) (write-form `(eval-results ,correlator