macro-debugger: internal debugging improvements

This commit is contained in:
Ryan Culpepper 2012-03-15 06:49:06 -06:00
parent 4fe8cd344c
commit 71772ba6c0
2 changed files with 57 additions and 25 deletions

View File

@ -1,30 +1,29 @@
#lang racket/base
(require racket/pretty
racket/promise
"model/trace.rkt"
"model/reductions.rkt"
"model/reductions-config.rkt"
"model/steps.rkt"
"syntax-browser/partition.rkt"
"syntax-browser/pretty-helper.rkt")
"syntax-browser/pretty-helper.rkt"
"view/debug-format.rkt")
(provide expand/step-text
stepper-text)
(define expand/step-text
(case-lambda
[(stx) (expand/step-text stx #f)]
[(stx show)
(define s (stepper-text stx (->show-function show)))
(s 'all)]))
(define (expand/step-text stx [show #f]
#:internal-error-file [error-file #f])
(let ([s (stepper-text stx (->show-function show) #:internal-error-file error-file)])
(s 'all)))
(define stepper-text
(case-lambda
[(stx) (internal-stepper stx #f)]
[(stx show) (internal-stepper stx (->show-function show))]))
(define (stepper-text stx [show #f]
#:internal-error-file [error-file #f])
(internal-stepper stx (->show-function show) error-file))
;; internal procedures
(define (internal-stepper stx show?)
(define steps (get-steps stx show?))
(define (internal-stepper stx show? error-file)
(define steps (get-steps stx show? error-file))
(define used-steps null)
(define partition (new-bound-partition))
(define dispatch
@ -50,14 +49,20 @@
(dispatch 'all))))]))
dispatch)
(define (get-steps stx show?)
(define deriv (trace stx))
(define steps
(parameterize ((macro-policy show?))
(reductions deriv)))
(define (ok? x)
(or (rewrite-step? x) (misstep? x)))
(filter ok? steps))
(define (get-steps stx show? error-file)
(let-values ([(_result events derivp) (trace* stx)])
(with-handlers ([exn:fail?
(lambda (exn)
(when error-file
(write-debug-file error-file exn events))
(raise exn))])
(define deriv (force derivp))
(define steps
(parameterize ((macro-policy show?))
(reductions deriv)))
(define (ok? x)
(or (rewrite-step? x) (misstep? x)))
(filter ok? steps))))
(define (show-step step partition)
(cond [(step? step)

View File

@ -2,16 +2,21 @@
(require racket/pretty)
(provide write-debug-file
load-debug-file
serialize-datum)
serialize-datum
approx-parse-state)
(define (write-debug-file file exn events)
(with-output-to-file file
(lambda ()
(pretty-write (serialize-datum events))
(write-string "`(\n")
(for ([event (in-list events)])
(let ([event (list (car event) (cdr event))])
(pretty-write (serialize-datum* event))))
(write-string ")\n")
(newline)
(write (exn-message exn))
(newline)
(pretty-print
(pretty-write
(map serialize-context-frame
(continuation-mark-set->context
(exn-continuation-marks exn)))))
@ -77,5 +82,27 @@
(let* ([events-expr (read)]
[exnmsg (read)]
[ctx (read)])
(let ([events (eval events-expr)])
(let* ([events (eval events-expr)]
[events
(if (andmap (lambda (e) (and (list? e) (= 2 (length e)))) events)
(map (lambda (l) (cons (car l) (cadr l))) events)
events)])
(values events exnmsg ctx)))))))
(define (approx-parse-state events N)
(for/fold ([state null]) ([event (in-list events)] [index (in-range N)])
(define (pop expect)
(let ([top (car state)])
(unless (eq? (cadr top) expect)
(error "bad state on ~e: ~e" (car event) state))
(cdr state)))
(case (car event)
((enter-macro enter-prim enter-local)
(cons (cons index event) state))
((exit-macro)
(pop 'enter-macro))
((exit-prim)
(pop 'enter-prim))
((exit-local)
(pop 'enter-local))
(else state))))