home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mitsch75.zip / scheme-7_5_17-src.zip / scheme-7.5.17 / src / runtime / dbgutl.scm < prev    next >
Text File  |  2001-03-21  |  6KB  |  168 lines

  1. #| -*-Scheme-*-
  2.  
  3. $Id: dbgutl.scm,v 14.19 2001/03/21 19:15:04 cph Exp $
  4.  
  5. Copyright (c) 1988-2001 Massachusetts Institute of Technology
  6.  
  7. This program is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2 of the License, or (at
  10. your option) any later version.
  11.  
  12. This program is distributed in the hope that it will be useful, but
  13. WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15. General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with this program; if not, write to the Free Software
  19. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  20. 02111-1307, USA.
  21. |#
  22.  
  23. ;;;; Debugger Utilities
  24. ;;; package: (runtime debugger-utilities)
  25.  
  26. (declare (usual-integrations))
  27.  
  28. (define (print-user-friendly-name environment port)
  29.   (let ((name (environment-procedure-name environment)))
  30.     (if name
  31.     (let ((rename (special-form-procedure-name? name)))
  32.       (if rename
  33.           (begin
  34.         (write-string "a " port)
  35.         (write-string (string-upcase rename) port)
  36.         (write-string " special form" port))
  37.           (begin
  38.         (write-string "the procedure: " port)
  39.         (write-dbg-upcase-name name port))))
  40.     (write-string "an unknown procedure" port))))
  41.  
  42. (define (show-environment-procedure environment port)
  43.   (let ((scode-lambda (environment-lambda environment)))
  44.     (if scode-lambda
  45.     (debugger-presentation port
  46.       (lambda ()
  47.         (pretty-print scode-lambda port)))
  48.     (debugger-failure port "No procedure for this environment."))))
  49.  
  50. (define (write-dbg-name name port)
  51.   (if (string? name) (write-string name port) (write name port)))
  52.  
  53. (define (write-dbg-upcase-name name port)
  54.   (cond ((string? name)
  55.      (write-string (string-upcase name)))
  56.     ((interned-symbol? name)
  57.      (write-string (string-upcase (symbol-name name)) port))
  58.     (else
  59.      (write name port))))
  60.  
  61. (define (debug/read-eval-print-1 environment port)
  62.   (let ((value
  63.      (debug/eval (prompt-for-expression "Evaluate expression" port)
  64.              environment)))
  65.     (if (undefined-value? value)
  66.     (debugger-message port "No value")
  67.     (debugger-message port "Value: " value))))
  68.  
  69. (define (output-to-string length thunk)
  70.   (let ((x (with-output-to-truncated-string length thunk)))
  71.     (if (and (car x) (> length 4))
  72.     (substring-move! " ..." 0 4 (cdr x) (- length 4)))
  73.     (cdr x)))
  74.  
  75. (define (show-frames environment depth port)
  76.   (debugger-presentation port
  77.     (lambda ()
  78.       (let loop ((environment environment) (depth depth))
  79.     (write-string "----------------------------------------" port)
  80.     (newline port)
  81.     (show-frame environment depth true port)
  82.     (if (eq? true (environment-has-parent? environment))
  83.         (begin
  84.           (newline port)
  85.           (newline port)
  86.           (loop (environment-parent environment) (1+ depth))))))))
  87.  
  88. (define (show-frame environment depth brief? port)
  89.   (show-environment-name environment port)
  90.   (if (not (negative? depth))
  91.       (begin
  92.     (newline port)
  93.     (write-string "Depth (relative to initial environment): " port)
  94.     (write depth port)))
  95.   (if (not (and (environment->package environment) brief?))
  96.       (begin
  97.     (newline port)
  98.     (show-environment-bindings environment brief? port))))
  99.  
  100. (define (show-environment-name environment port)
  101.   (write-string "Environment " port)
  102.   (let ((package (environment->package environment)))
  103.     (if package
  104.     (begin
  105.       (write-string "named: " port)
  106.       (write (package/name package) port))
  107.     (begin
  108.       (write-string "created by " port)
  109.       (print-user-friendly-name environment port)))))
  110.  
  111. (define (show-environment-bindings environment brief? port)
  112.   (let ((names (environment-bound-names environment)))
  113.     (let ((n-bindings (length names))
  114.       (finish
  115.        (lambda (names)
  116.          (newline port)
  117.          (for-each (lambda (name)
  118.              (print-binding name
  119.                     (environment-lookup environment name)
  120.                     port))
  121.                names))))
  122.       (cond ((zero? n-bindings)
  123.          (write-string " has no bindings" port))
  124.         ((and brief? (> n-bindings brief-bindings-limit))
  125.          (write-string " has " port)
  126.          (write n-bindings port)
  127.          (write-string " bindings (first " port)
  128.          (write brief-bindings-limit port)
  129.          (write-string " shown):" port)
  130.          (finish (list-head names brief-bindings-limit)))
  131.         (else
  132.          (write-string " has bindings:" port)
  133.          (finish names))))))
  134.  
  135. (define brief-bindings-limit
  136.   16)
  137.  
  138. (define (print-binding name value port)
  139.   (let ((x-size (output-port/x-size port)))
  140.     (newline port)
  141.     (write-string
  142.      (let ((name
  143.         (output-to-string (quotient x-size 2)
  144.           (lambda ()
  145.         (write-dbg-name name (current-output-port))))))
  146.        (if (unassigned-reference-trap? value)
  147.        (string-append name " is unassigned")
  148.        (let ((s (string-append name " = ")))
  149.          (string-append
  150.           s
  151.           (output-to-string (max (- x-size (string-length s)) 0)
  152.         (lambda ()
  153.           (write value)))))))
  154.      port)))
  155.  
  156. (define (debugger-failure port . objects)
  157.   (port/debugger-failure port (message-arguments->string objects)))
  158.  
  159. (define (debugger-message port . objects)
  160.   (port/debugger-message port (message-arguments->string objects)))
  161.  
  162. (define (message-arguments->string objects)
  163.   (apply string-append
  164.      (map (lambda (x) (if (string? x) x (write-to-string x)))
  165.           objects)))
  166.  
  167. (define (debugger-presentation port thunk)
  168.   (port/debugger-presentation port thunk))