scsh-0.5/bcomp/ddata.scm

90 lines
2.5 KiB
Scheme

; Copyright (c) 1993, 1994 Richard Kelsey and Jonathan Rees. See file COPYING.
; Stuff moved from segment.scm 6/5/93
; Debug-data records are for communicating information from the
; compiler to various debugging tools.
; Entries in an environment-maps list have the form
; #(parent-uid pc-in-parent (env-map ...))
(define-record-type debug-data :debug-data
(make-debug-data uid name parent pc-in-parent env-maps source)
debug-data?
(uid debug-data-uid)
(name debug-data-name)
(parent debug-data-parent)
(pc-in-parent debug-data-pc-in-parent)
(env-maps debug-data-env-maps set-debug-data-env-maps!)
(source debug-data-source set-debug-data-source!))
(define (new-debug-data name parent pc-in-parent)
(make-debug-data (new-template-uid) name parent pc-in-parent '() '()))
(define-record-discloser :debug-data
(lambda (dd)
(list 'debug-data (debug-data-uid dd) (debug-data-name dd))))
; "Info" means either a debug data record or an integer index into a
; table of same. An "info" is stored in a reserved place in every
; template.
(define (debug-data->info debug-data)
(make-immutable! debug-data)
(if (interesting-debug-data? debug-data)
(if (tabulate-debug-data?)
(begin (note-debug-data! debug-data)
(debug-data-uid debug-data))
debug-data)
(debug-data-uid debug-data))) ;+++
(define (get-debug-data info) ;info->debug-data
(cond ((debug-data? info) info)
((integer? info)
(table-ref (debug-data-table) info))
(else #f)))
(define (note-debug-data! dd)
(table-set! (debug-data-table) (debug-data-uid dd) dd))
(define (interesting-debug-data? debug-data)
(and (debug-data? debug-data)
(or (debug-data-name debug-data)
(interesting-debug-data? (debug-data-parent debug-data))
(not (null? (debug-data-env-maps debug-data)))
(not (null? (debug-data-source debug-data))))))
; We can follow parent links to get a full description of procedure
; nesting: "foo in bar in unnamed in baz"
(define (debug-data-names info)
(let ((dd (get-debug-data info)))
(if dd
(cons (debug-data-name dd)
(debug-data-names (debug-data-parent dd)))
'())))
; Associating names with templates
(define (template-debug-data tem)
(get-debug-data (template-info tem)))
(define (template-id tem)
(let ((info (template-info tem)))
(if (debug-data? info)
(debug-data-uid info)
info)))
(define (template-name tem)
(let ((probe (template-debug-data tem)))
(if probe
(debug-data-name probe)
#f)))
(define (template-names tem)
(debug-data-names (template-info tem)))