(module drscheme-ui mzscheme
(require (lib "list.ss")
(lib "string.ss")
(lib "etc.ss"))
(provide has-backtrace?
has-errortrace-backtrace?
has-primitive-backtrace?
show-errortrace-backtrace
show-primitive-backtrace
can-show-source?
show-source
initialized?
initialize)
(define USE-PRIMITIVE-STACKTRACE? #t)
(define (has-backtrace? exn)
(or (has-errortrace-backtrace? exn)
(has-primitive-backtrace? exn)))
(define (has-errortrace-backtrace? exn)
(not (null? (get-errortrace-backtrace exn))))
(define (has-primitive-backtrace? exn)
(and USE-PRIMITIVE-STACKTRACE?
(pair? (get-primitive-backtrace exn))))
(define (get-errortrace-backtrace exn)
null)
(define (get-primitive-backtrace exn)
(let* ([ctx (continuation-mark-set->context
(exn-continuation-marks exn))]
[srclocs (map cdr ctx)])
(filter (lambda (s)
(and (srcloc? s)
(let ([src (srcloc-source s)])
(and (path? src)
(not (regexp-match?
(regexp-quote
(path->string
(this-expression-source-directory)))
(path->string src)))))))
srclocs)))
(define (show-errortrace-backtrace exn)
(show-backtrace (exn-message exn)
(get-errortrace-backtrace exn)))
(define (show-primitive-backtrace exn)
(show-backtrace (exn-message exn)
(get-primitive-backtrace exn)))
(define can-show-source? #f)
(define (show-source src pos span) (void))
(define (show-backtrace msg bt) (void))
(define initialized? #f)
(define (initialize -get-errortrace-backtrace -show-backtrace -show-source)
(unless initialized?
(set! get-errortrace-backtrace -get-errortrace-backtrace)
(set! show-backtrace -show-backtrace)
(set! can-show-source? #t)
(set! show-source -show-source)
(set! initialized? #t)))
)