From 71772ba6c0399ed006f609dba0d2f60672d4b1dd Mon Sep 17 00:00:00 2001 From: Ryan Culpepper Date: Thu, 15 Mar 2012 06:49:06 -0600 Subject: [PATCH] macro-debugger: internal debugging improvements --- collects/macro-debugger/stepper-text.rkt | 47 ++++++++++--------- collects/macro-debugger/view/debug-format.rkt | 35 ++++++++++++-- 2 files changed, 57 insertions(+), 25 deletions(-) diff --git a/collects/macro-debugger/stepper-text.rkt b/collects/macro-debugger/stepper-text.rkt index 5004438812..08d0e9380f 100644 --- a/collects/macro-debugger/stepper-text.rkt +++ b/collects/macro-debugger/stepper-text.rkt @@ -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) diff --git a/collects/macro-debugger/view/debug-format.rkt b/collects/macro-debugger/view/debug-format.rkt index d0155b0d3b..1a5a21639f 100644 --- a/collects/macro-debugger/view/debug-format.rkt +++ b/collects/macro-debugger/view/debug-format.rkt @@ -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))))