From 641449ca6073648d5722d1a552d3a5245d523e48 Mon Sep 17 00:00:00 2001 From: Jose Antonio Ortega Ruiz Date: Tue, 24 Feb 2009 02:18:28 +0100 Subject: Partial support for stack trace display. --- elisp/geiser-autodoc.el | 57 ++++++++++----------- elisp/geiser-compile.el | 34 ++----------- elisp/geiser-debug.el | 96 +++++++++++++++++++++++++++++++++++ elisp/geiser-eval.el | 1 + elisp/geiser-mode.el | 17 +------ scheme/guile/geiser/emacs.scm | 40 +++++++++++++-- scheme/guile/geiser/introspection.scm | 15 +++--- 7 files changed, 175 insertions(+), 85 deletions(-) create mode 100644 elisp/geiser-debug.el diff --git a/elisp/geiser-autodoc.el b/elisp/geiser-autodoc.el index 3c23b32..7460aa1 100644 --- a/elisp/geiser-autodoc.el +++ b/elisp/geiser-autodoc.el @@ -75,8 +75,7 @@ when `geiser-autodoc-display-module-p' is on." (cdr pr)) (setq geiser-autodoc--last-funs funs) (geiser-eval--send - `(:eval ((:ge arguments) - ,@(mapcar (lambda (f) (list 'quote (car f))) funs))) + `(:eval ((:ge arguments) ,@(mapcar (lambda (f) (list 'quote (car f))) funs))) 'geiser-autodoc--function-args-cont) "")))) @@ -84,12 +83,9 @@ when `geiser-autodoc-display-module-p' is on." (let ((result (geiser-eval--retort-result ret))) (when (and result (listp result)) (setq geiser-autodoc--last result) - (eldoc-message - (geiser-autodoc--fun-args-str (car result) - (cdr result) - (or (cdr (assoc (car result) - geiser-autodoc--last-funs)) - 0)))))) + (let* ((pos (or (cdr (assoc (car result) geiser-autodoc--last-funs)) 0)) + (msg (geiser-autodoc--fun-args-str (car result) (cdr result) pos))) + (when msg (eldoc-message msg)))))) (defun geiser-autodoc--insert (sym current pos) (let ((str (format "%s" sym))) @@ -100,34 +96,35 @@ when `geiser-autodoc-display-module-p' is on." (insert str))) (defun geiser-autodoc--fun-args-str (fun args pos) - (save-current-buffer - (set-buffer (geiser-syntax--font-lock-buffer)) - (erase-buffer) - (let* ((current 0) - (module (and geiser-autodoc-display-module-p - (cdr (assoc 'module args)))) - (fun (if module - (format geiser-autodoc-procedure-name-format module fun) - fun))) - (insert "(") - (geiser-autodoc--insert fun current pos) - (dolist (arg (cdr (assoc 'required args))) + (when fun + (save-current-buffer + (set-buffer (geiser-syntax--font-lock-buffer)) + (erase-buffer) + (let* ((current 0) + (module (and geiser-autodoc-display-module-p + (cdr (assoc 'module args)))) + (fun (if module + (format geiser-autodoc-procedure-name-format module fun) + fun))) + (insert "(") + (geiser-autodoc--insert fun current pos) + (dolist (arg (cdr (assoc 'required args))) + (setq current (1+ current)) + (insert " ") + (geiser-autodoc--insert arg current pos)) (setq current (1+ current)) - (insert " ") - (geiser-autodoc--insert arg current pos)) - (setq current (1+ current)) - (when (cdr (assoc 'optional args)) - (when (> pos current) (setq current pos)) - (insert " . ") - (geiser-autodoc--insert (cdr (assoc 'optional args)) current pos)) - (insert ")") - (buffer-string)))) + (when (cdr (assoc 'optional args)) + (when (> pos current) (setq current pos)) + (insert " . ") + (geiser-autodoc--insert (cdr (assoc 'optional args)) current pos)) + (insert ")") + (buffer-string))))) ;;; Autodoc function: (defun geiser-autodoc--eldoc-function () - (geiser-autodoc--function-args (geiser-syntax--enclosing-form-data))) + (or (geiser-autodoc--function-args (geiser-syntax--enclosing-form-data)) "")) ;;; Autodoc mode: diff --git a/elisp/geiser-compile.el b/elisp/geiser-compile.el index 82200a5..8b4a4db 100644 --- a/elisp/geiser-compile.el +++ b/elisp/geiser-compile.el @@ -24,19 +24,10 @@ ;;; Code: +(require 'geiser-debug) (require 'geiser-eval) -(require 'geiser-popup) (require 'geiser-base) - -;;; Compilation buffer: - -(define-derived-mode geiser-compile-mode compilation-mode "Geiser Compilation" - "Major mode showing the results of compiling or loading scheme files. -\{geiser-compile-mode-keymap}") - -(geiser-popup--define compile "*Geiser compilation*" geiser-compile-mode) - ;;; Auxiliary functions: @@ -49,25 +40,10 @@ (cons buffer path)))) (defun geiser-compile--display-result (title ret) - (let ((err (geiser-eval--retort-error ret)) - (output (geiser-eval--retort-output ret))) - (geiser-compile--with-buffer - (erase-buffer) - (insert title) - (newline) - (when output - (insert output) - (newline)) - (when err - (insert "\n" (geiser-eval--error-msg err) "\n")) - (goto-char (point-min))) - (if (not err) - (message "%s %s" title (if (> 0 (length output)) - (geiser--chomp output) - (or (geiser-eval--retort-result ret) - "OK!"))) - (message "") - (geiser-compile--pop-to-buffer)))) + (if (not (geiser-eval--retort-error ret)) + (message "%s %s" title (or (geiser-eval--retort-result ret) "OK!")) + (message "") + (geiser-debug--display-retort title ret))) (defun geiser-compile--file-op (path compile-p msg) (let* ((b/p (geiser-compile--buffer/path path)) diff --git a/elisp/geiser-debug.el b/elisp/geiser-debug.el new file mode 100644 index 0000000..c32c895 --- /dev/null +++ b/elisp/geiser-debug.el @@ -0,0 +1,96 @@ +;; geiser-debug.el -- displaying debug information + +;; Copyright (C) 2009 Jose Antonio Ortega Ruiz + +;; Author: Jose Antonio Ortega Ruiz +;; Start date: Mon Feb 23, 2009 22:34 + +;; This file is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. + +;; This file is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Comentary: + +;; Buffer and associated mode for displaying results of evaluations +;; and compilations. + +;;; Code: + +(require 'geiser-eval) +(require 'geiser-popup) +(require 'geiser-base) + + +;;; Debug buffer mode: + +(defvar geiser-debug-mode-map + (let ((map (make-keymap))) + (suppress-keymap map) + (define-key map "g" 'geiser-debug-goto-error) + (define-key map "\C-c\C-c" 'geiser-debug-goto-error) + (define-key map "n" 'next-line) + (define-key map "p" 'previous-line) + map)) + +(define-derived-mode geiser-debug-mode compilation-mode "Geiser Dbg" + "A major mode for displaying Scheme compilation and evaluation results. +\\{geiser-debug-mode-map}") + + +;;; Buffer for displaying evaluation results: + +(geiser-popup--define debug "*Geiser dbg*" geiser-debug-mode) + + +;;; Displaying retorts + +(defun geiser-debug--display-retort (what ret) + (let* ((err (geiser-eval--retort-error ret)) + (output (geiser-eval--retort-output ret)) + (stack (geiser-eval--retort-stack ret)) + (step 2) + (indent step)) + (when err + (geiser-debug--with-buffer + (erase-buffer) + (insert what) + (newline 2) + (insert (geiser-eval--error-str err) "\n\n") + (when output (insert output "\n\n")) + (dolist (f (reverse (cdr stack))) + (geiser-debug--display-stack-frame f indent) + (setq indent (+ step indent))) + (goto-char (point-min))) + (geiser-debug--pop-to-buffer)))) + +(defsubst geiser-debug--frame-proc (frame) (cdr (assoc 'procedure frame))) +(defsubst geiser-debug--frame-desc (frame) (cdr (assoc 'description frame))) +(defsubst geiser-debug--frame-source (frame) (cdr (assoc 'source frame))) +(defsubst geiser-debug--frame-source-file (src) (car src)) +(defsubst geiser-debug--frame-source-line (src) (or (cadr src) 1)) +(defsubst geiser-debug--frame-source-column (src) (or (caddr src) 0)) + +(defun geiser-debug--display-stack-frame (frame offset) + (let ((procedure (geiser-debug--frame-proc frame)) + (source (geiser-debug--frame-source frame)) + (description (geiser-debug--frame-desc frame))) + (if source + (insert (format "%s:%s:%s\n" + (geiser-debug--frame-source-file source) + (geiser-debug--frame-source-line source) + (geiser-debug--frame-source-column source))) + (insert "In expression:\n")) + (insert (format "%s%s\n" (make-string offset ?\ ) description)))) + + +(provide 'geiser-debug) +;;; geiser-debug.el ends here diff --git a/elisp/geiser-eval.el b/elisp/geiser-eval.el index 785f441..09f12da 100644 --- a/elisp/geiser-eval.el +++ b/elisp/geiser-eval.el @@ -125,6 +125,7 @@ (defsubst geiser-eval--retort-result (ret) (cdr (assoc 'result ret))) (defsubst geiser-eval--retort-output (ret) (cdr (assoc 'output ret))) (defsubst geiser-eval--retort-error (ret) (cdr (assoc 'error ret))) +(defsubst geiser-eval--retort-stack (ret) (cdr (assoc 'stack ret))) (defsubst geiser-eval--error-key (err) (cdr (assoc 'key err))) (defsubst geiser-eval--error-subr (err) (cdr (assoc 'subr err))) diff --git a/elisp/geiser-mode.el b/elisp/geiser-mode.el index 3c2f1a9..e308c07 100644 --- a/elisp/geiser-mode.el +++ b/elisp/geiser-mode.el @@ -30,8 +30,8 @@ (require 'geiser-completion) (require 'geiser-edit) (require 'geiser-autodoc) +(require 'geiser-debug) (require 'geiser-eval) -(require 'geiser-popup) (require 'geiser-custom) (require 'geiser-base) @@ -57,19 +57,6 @@ ;;; Auxiliary functions: -(geiser-popup--define mode "*Geiser evaluation results*" scheme-mode) - -(defun geiser-eval--display-error (err output) - (if (not output) - (message (geiser-eval--error-str err)) - (geiser-mode--with-buffer - (erase-buffer) - (insert ";; " (geiser-eval--error-str err)) - (newline 2) - (insert output) - (newline)) - (geiser-mode--pop-to-buffer))) - (defun geiser-eval--send-region (compile start end and-go) (let* ((str (buffer-substring-no-properties start end)) (code `(,(if compile :comp :eval) (:scm ,str))) @@ -81,7 +68,7 @@ (goto-char (point-max))) (if (not err) (message (format "=> %s" (geiser-eval--retort-result ret))) - (geiser-eval--display-error err (geiser-eval--retort-output ret))))) + (geiser-debug--display-retort str ret)))) ;;; Evaluation commands: diff --git a/scheme/guile/geiser/emacs.scm b/scheme/guile/geiser/emacs.scm index b9e2d67..90e03dd 100644 --- a/scheme/guile/geiser/emacs.scm +++ b/scheme/guile/geiser/emacs.scm @@ -38,6 +38,8 @@ ge:module-location) #:use-module (srfi srfi-1) #:use-module (system base compile) + #:use-module (system vm program) + #:use-module (ice-9 debugger utils) #:use-module ((geiser introspection) :renamer (symbol-prefix-proc 'ge:))) (define (make-result result output) @@ -49,11 +51,41 @@ (define (parse-stack stack) (if stack - (list - (with-output-to-string - (lambda () (display-backtrace stack (current-output-port))))) + (map (lambda (n) (parse-frame (stack-ref stack n))) + (iota (stack-length stack))) '())) +(define (parse-frame frame) + (list (cons 'frame (frame-number frame)) + (cons 'procedure (or (and (frame-procedure? frame) + (procedure-name (frame-procedure frame))) + '())) + (cons 'source (or (frame->source-position frame) '())) + (cons 'description (with-output-to-string + (lambda () + (if (frame-procedure? frame) + (write-frame-short/application frame) + (write-frame-short/expression frame))))))) + +(define (frame->source-position frame) + (let ((source (if (frame-procedure? frame) + (or (frame-source frame) + (let ((proc (frame-procedure frame))) + (and proc + (procedure? proc) + (procedure-source proc)))) + (frame-source frame)))) + (and source + (cond ((string? (source-property source 'filename)) + (list (source-property source 'filename) + (+ 1 (source-property source 'line)) + (source-property source 'column))) + ((and (pair? source) (list? (cadr source))) + (list (caadr source) + (+ 1 (caddr source)) + (cdddr source))) + (else #f))))) + (define (parse-error key . args) (let* ((len (length args)) (subr (and (> len 0) (first args))) @@ -119,6 +151,6 @@ SUBR, MSG and REST." (define (ge:load-file path) "Load file, given its full @var{path}." - (evaluate `(compile-and-load ,path) '(geiser emacs) eval)) + (evaluate `(load ,path) '(geiser emacs) eval)) ;;; emacs.scm ends here diff --git a/scheme/guile/geiser/introspection.scm b/scheme/guile/geiser/introspection.scm index 29d059b..ca6afae 100644 --- a/scheme/guile/geiser/introspection.scm +++ b/scheme/guile/geiser/introspection.scm @@ -64,13 +64,14 @@ (else #f))) (define (symbol-module sym) - (call/cc - (lambda (k) - (apropos-fold (lambda (module name var init) - (if (eq? name sym) (k (module-name module)) init)) - #f - (symbol->string sym) - (apropos-fold-accessible (current-module)))))) + (and sym + (call/cc + (lambda (k) + (apropos-fold (lambda (module name var init) + (if (eq? name sym) (k (module-name module)) init)) + #f + (symbol->string sym) + (apropos-fold-accessible (current-module))))))) (define (program-args program) (let* ((arity (program-arity program)) -- cgit v1.2.3