diff --git a/NEWS b/NEWS index 627a8cd14..82fe29c2f 100644 --- a/NEWS +++ b/NEWS @@ -43,6 +43,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 5812d656c..e4ae0b1ae 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 092fb4e39..96273b7d0 100644 --- a/doc/ref/scheme-using.texi +++ b/doc/ref/scheme-using.texi @@ -988,6 +988,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 5a4365ff5..fb9d78999 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. + 2007-02-06 Clinton Ebadi * gds-scheme.el (gds-display-results): Use save-selected-window diff --git a/emacs/gds-scheme.el b/emacs/gds-scheme.el index a03a07ba5..db0e6cd41 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 a399dc69b..9007c0044 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 903e803e5..d3d6146e9 100755 --- a/ice-9/gds-client.scm +++ b/ice-9/gds-client.scm @@ -354,7 +354,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) @@ -384,6 +384,11 @@ Thanks!\n\n" ;; it to the list. (begin (for-each-breakpoint setup-after-read x) + (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