racket/collects/stepper/private/debugger-vc.ss
Eli Barzilay 7d50e61c7f * Newlines at EOFs
* Another big chunk of v4-require-isms
* Allow `#lang framework/keybinding-lang' for keybinding files
* Move hierlist sources into "mrlib/hierlist", leave stub behind

svn: r10689
2008-07-09 07:18:06 +00:00

103 lines
3.8 KiB
Scheme

(module debugger-vc mzscheme
(require mzlib/unitsig
stepper/debugger-sig
mred
mzlib/class
framework
"marks.ss"
"debugger-bindings.ss")
(provide debugger-vc@)
(define debugger-vc@
(unit/sig debugger-vc^
(import debugger-model^
(drs-window))
(define debugger-eventspace
(parameterize ([current-custodian user-custodian])
(make-eventspace)))
(define (receive-result result)
(set! event-list (append event-list (list result)))
(parameterize ([current-eventspace debugger-eventspace])
(queue-callback
(lambda ()
(namespace-set-variable-value! 'current-event-num (- (length event-list) 1))
(namespace-set-variable-value! 'current-frame-num 0))))
(send-output-to-debugger-window (format-event result) debugger-output))
(define (format-event debugger-event)
(cond [(normal-breakpoint-info? debugger-event)
(when (null? (normal-breakpoint-info-mark-list debugger-event))
(error 'format-event "mark list was empty")) ; should never happen; at-brpt mark should always be there
(format "normal breakpoint\nsource:~v\n" (mark-source (car (normal-breakpoint-info-mark-list debugger-event))))]
[(error-breakpoint-info? debugger-event)
(format "error breakpoint\nmessage: ~v\n" (error-breakpoint-info-message debugger-event))]
[(breakpoint-halt? debugger-event)
(format "breakpoint halt\n")]
[(expression-finished? debugger-event)
(format "expression finished\nresults: ~v\n" (expression-finished-returned-value-list debugger-event))]))
(define event-list null)
(define (events) event-list)
(thread
(lambda ()
(graphical-read-eval-print-loop debugger-eventspace #t)))
(define (highlight-source-position posn)
(send (send drs-window get-definitions-text)
set-position
posn
(+ 1 posn)))
(define debugger-output (make-output-window drs-window user-custodian))
; set up debugger eventspace
(parameterize ([current-eventspace debugger-eventspace])
(queue-callback
(lambda ()
(namespace-set-variable-value! 'go-semaphore go-semaphore)
(namespace-set-variable-value! 'events events)
(namespace-set-variable-value! 'user-custodian user-custodian)
(namespace-set-variable-value! 'highlight-source-position highlight-source-position)
(install-debugger-bindings))))))
;; Info functions:
;; Debugger Output Window:
(define output-frame%
(class frame:basic% ()
(init-field drs-window)
(init-field user-custodian)
(define/override (on-close)
(send drs-window on-debugger-close)
(custodian-shutdown-all user-custodian))
(super-instantiate ())))
; make-output-window : (-> text:basic%)
(define (make-output-window drs-window cust)
(let* ([frame (instantiate output-frame% ()
(label "Debugger Output")
(width 400)
(height 400)
(drs-window drs-window)
(user-custodian cust))]
[canvas (instantiate canvas:basic% () (parent (send frame get-area-container)))]
[text (instantiate text:basic% ())])
(send canvas set-editor text)
(send frame show #t)
text))
; send-output-to-debugger-window : (string text:basic% -> void)
(define (send-output-to-debugger-window str text)
(send text insert str (send text last-position))))