trims the top of the stack, removing drscheme-specific frames, plus fixes to the test suites
svn: r3792
This commit is contained in:
parent
7fdf03bffd
commit
61254b02e7
|
@ -172,10 +172,11 @@ TODO
|
||||||
;; the highlight must be set after the error message, because inserting into the text resets
|
;; the highlight must be set after the error message, because inserting into the text resets
|
||||||
;; the highlighting.
|
;; the highlighting.
|
||||||
(define (drscheme-error-display-handler msg exn)
|
(define (drscheme-error-display-handler msg exn)
|
||||||
(let* ([srclocs-stack
|
(let* ([cut-stack (if (and (exn? exn)
|
||||||
(if (exn? exn)
|
(main-user-eventspace-thread?))
|
||||||
(filter values (map cdr (continuation-mark-set->context (exn-continuation-marks exn))))
|
(cut-out-top-of-stack exn)
|
||||||
'())]
|
'())]
|
||||||
|
[srclocs-stack (filter values (map cdr cut-stack))]
|
||||||
[stack
|
[stack
|
||||||
(filter
|
(filter
|
||||||
values
|
values
|
||||||
|
@ -191,6 +192,16 @@ TODO
|
||||||
(if (null? stack)
|
(if (null? stack)
|
||||||
'()
|
'()
|
||||||
(list (car srclocs-stack))))])
|
(list (car srclocs-stack))))])
|
||||||
|
|
||||||
|
;; for use in debugging the stack trace stuff
|
||||||
|
#;
|
||||||
|
(when (exn? exn)
|
||||||
|
(print-struct #t)
|
||||||
|
(for-each
|
||||||
|
(λ (frame) (printf " ~s\n" frame))
|
||||||
|
(continuation-mark-set->context (exn-continuation-marks exn)))
|
||||||
|
(printf "\n"))
|
||||||
|
|
||||||
(unless (null? stack)
|
(unless (null? stack)
|
||||||
(drscheme:debug:print-bug-to-stderr msg stack))
|
(drscheme:debug:print-bug-to-stderr msg stack))
|
||||||
(for-each drscheme:debug:display-srcloc-in-error src-locs)
|
(for-each drscheme:debug:display-srcloc-in-error src-locs)
|
||||||
|
@ -209,27 +220,79 @@ TODO
|
||||||
src-locs
|
src-locs
|
||||||
(filter (λ (x) (is-a? (car x) text%)) stack)))))))))
|
(filter (λ (x) (is-a? (car x) text%)) stack)))))))))
|
||||||
|
|
||||||
;; drscheme-error-value->string-handler : TST number -> string
|
(define (main-user-eventspace-thread?)
|
||||||
(define (drscheme-error-value->string-handler x n)
|
(let ([rep (current-rep)])
|
||||||
(let ([port (open-output-string)])
|
(and rep
|
||||||
|
(eq? (eventspace-handler-thread (send rep get-user-eventspace))
|
||||||
;; using a string port here means no snips allowed,
|
(current-thread)))))
|
||||||
;; even though this string may eventually end up
|
|
||||||
;; displayed in a place where snips are allowed.
|
(define (cut-out-top-of-stack exn)
|
||||||
(print x port)
|
(let ([initial-stack (continuation-mark-set->context (exn-continuation-marks exn))])
|
||||||
|
(let loop ([stack (reverse initial-stack)]
|
||||||
(let* ([long-string (get-output-string port)])
|
[hit-2? #f])
|
||||||
(close-output-port port)
|
(cond
|
||||||
(if (<= (string-length long-string) n)
|
[(null? stack)
|
||||||
long-string
|
(unless (exn:break? exn)
|
||||||
(let ([short-string (substring long-string 0 n)]
|
;; give break exn's a free pass on this one.
|
||||||
[trim 3])
|
;; sometimes they get raised in a funny place.
|
||||||
(unless (n . <= . trim)
|
;; (see call-with-break-parameterization below)
|
||||||
(let loop ([i trim])
|
(fprintf (current-error-port) "ACK! didn't find drscheme's stackframe when filtering\n"))
|
||||||
(unless (i . <= . 0)
|
initial-stack]
|
||||||
(string-set! short-string (- n i) #\.)
|
[else
|
||||||
(loop (sub1 i)))))
|
(let ([top (car stack)])
|
||||||
short-string)))))
|
(cond
|
||||||
|
[(is-cut? top 'cut-stacktrace-above-here1)
|
||||||
|
(if hit-2?
|
||||||
|
(reverse (cdr stack))
|
||||||
|
(begin
|
||||||
|
(fprintf (current-error-port) "ACK! found 1 without 2\n")
|
||||||
|
initial-stack))]
|
||||||
|
[(is-cut? top 'cut-stacktrace-above-here2)
|
||||||
|
(if hit-2?
|
||||||
|
(reverse (cdr stack))
|
||||||
|
(loop (cdr stack) #t))]
|
||||||
|
[else
|
||||||
|
(loop (cdr stack) hit-2?)]))]))))
|
||||||
|
|
||||||
|
;; is-cut? : any symbol -> boolean
|
||||||
|
;; determines if this stack entry is really
|
||||||
|
(define (is-cut? top sym)
|
||||||
|
(and (pair? top)
|
||||||
|
(let* ([fn-name (car top)]
|
||||||
|
[srcloc (cdr top)]
|
||||||
|
[source (and srcloc (srcloc-source srcloc))])
|
||||||
|
(and (eq? fn-name sym)
|
||||||
|
(path? source)
|
||||||
|
(let loop ([path source]
|
||||||
|
[pieces '(#"rep.ss" #"private" #"drscheme" #"collects")])
|
||||||
|
(cond
|
||||||
|
[(null? pieces) #t]
|
||||||
|
[else
|
||||||
|
(let-values ([(base name dir?) (split-path path)])
|
||||||
|
(and (equal? (path->bytes name) (car pieces))
|
||||||
|
(loop base (cdr pieces))))]))))))
|
||||||
|
|
||||||
|
;; drscheme-error-value->string-handler : TST number -> string
|
||||||
|
(define (drscheme-error-value->string-handler x n)
|
||||||
|
(let ([port (open-output-string)])
|
||||||
|
|
||||||
|
;; using a string port here means no snips allowed,
|
||||||
|
;; even though this string may eventually end up
|
||||||
|
;; displayed in a place where snips are allowed.
|
||||||
|
(print x port)
|
||||||
|
|
||||||
|
(let* ([long-string (get-output-string port)])
|
||||||
|
(close-output-port port)
|
||||||
|
(if (<= (string-length long-string) n)
|
||||||
|
long-string
|
||||||
|
(let ([short-string (substring long-string 0 n)]
|
||||||
|
[trim 3])
|
||||||
|
(unless (n . <= . trim)
|
||||||
|
(let loop ([i trim])
|
||||||
|
(unless (i . <= . 0)
|
||||||
|
(string-set! short-string (- n i) #\.)
|
||||||
|
(loop (sub1 i)))))
|
||||||
|
short-string)))))
|
||||||
|
|
||||||
(define drs-bindings-keymap (make-object keymap:aug-keymap%))
|
(define drs-bindings-keymap (make-object keymap:aug-keymap%))
|
||||||
|
|
||||||
|
@ -960,7 +1023,8 @@ TODO
|
||||||
(λ () ; =User=, =Handler=, =No-Breaks=
|
(λ () ; =User=, =Handler=, =No-Breaks=
|
||||||
(let* ([settings (current-language-settings)]
|
(let* ([settings (current-language-settings)]
|
||||||
[lang (drscheme:language-configuration:language-settings-language settings)]
|
[lang (drscheme:language-configuration:language-settings-language settings)]
|
||||||
[settings (drscheme:language-configuration:language-settings-settings settings)])
|
[settings (drscheme:language-configuration:language-settings-settings settings)]
|
||||||
|
[dummy-value (box #f)])
|
||||||
(set! get-sexp/syntax/eof
|
(set! get-sexp/syntax/eof
|
||||||
(if complete-program?
|
(if complete-program?
|
||||||
(send lang front-end/complete-program port settings user-teachpack-cache)
|
(send lang front-end/complete-program port settings user-teachpack-cache)
|
||||||
|
@ -981,19 +1045,33 @@ TODO
|
||||||
(current-error-escape-k (λ ()
|
(current-error-escape-k (λ ()
|
||||||
(set! cleanup? #t)
|
(set! cleanup? #t)
|
||||||
(k (void)))))
|
(k (void)))))
|
||||||
|
|
||||||
(λ ()
|
(λ ()
|
||||||
(let loop ()
|
(let loop ()
|
||||||
(let ([sexp/syntax/eof (get-sexp/syntax/eof)])
|
(let ([sexp/syntax/eof
|
||||||
|
;; this named thunk & application helps drscheme know to cut
|
||||||
|
;; off part of the stack trace. (too bad not all of it ...)
|
||||||
|
((rec cut-stacktrace-above-here1
|
||||||
|
(λ ()
|
||||||
|
(begin0 (get-sexp/syntax/eof)
|
||||||
|
(void)))))])
|
||||||
(unless (eof-object? sexp/syntax/eof)
|
(unless (eof-object? sexp/syntax/eof)
|
||||||
(call-with-break-parameterization
|
(call-with-break-parameterization
|
||||||
(get-user-break-parameterization)
|
(get-user-break-parameterization)
|
||||||
|
;; a break exn may be raised right at this point,
|
||||||
|
;; in which case the stack won't be in a trimmable state
|
||||||
|
;; so we don't complain (above) when we find an untrimmable
|
||||||
|
;; break exn.
|
||||||
(λ ()
|
(λ ()
|
||||||
(call-with-values
|
(call-with-values
|
||||||
(λ ()
|
(rec cut-stacktrace-above-here1
|
||||||
(eval-syntax sexp/syntax/eof))
|
(λ ()
|
||||||
|
(begin0 (eval-syntax sexp/syntax/eof)
|
||||||
|
(void))))
|
||||||
(λ x (display-results x)))))
|
(λ x (display-results x)))))
|
||||||
(loop))))
|
(loop))))
|
||||||
(set! cleanup? #t))
|
(set! cleanup? #t))
|
||||||
|
|
||||||
(λ ()
|
(λ ()
|
||||||
(current-error-escape-k saved-error-escape-k)
|
(current-error-escape-k saved-error-escape-k)
|
||||||
(when cleanup?
|
(when cleanup?
|
||||||
|
@ -1074,10 +1152,11 @@ TODO
|
||||||
(current-error-escape-k (λ ()
|
(current-error-escape-k (λ ()
|
||||||
(set! cleanup? #t)
|
(set! cleanup? #t)
|
||||||
(k (void)))))
|
(k (void)))))
|
||||||
(λ ()
|
(rec cut-stacktrace-above-here2
|
||||||
(thunk)
|
(λ ()
|
||||||
; Breaks must be off!
|
(thunk)
|
||||||
(set! cleanup? #t))
|
; Breaks must be off!
|
||||||
|
(set! cleanup? #t)))
|
||||||
(λ ()
|
(λ ()
|
||||||
(current-error-escape-k saved-error-escape-k)
|
(current-error-escape-k saved-error-escape-k)
|
||||||
(when cleanup?
|
(when cleanup?
|
||||||
|
@ -1312,12 +1391,12 @@ TODO
|
||||||
(break-enabled break-ok?)
|
(break-enabled break-ok?)
|
||||||
(unless ub?
|
(unless ub?
|
||||||
(set! user-break-enabled 'user)))
|
(set! user-break-enabled 'user)))
|
||||||
(λ ()
|
(λ ()
|
||||||
(primitive-dispatch-handler eventspace))
|
(primitive-dispatch-handler eventspace))
|
||||||
(λ ()
|
(λ ()
|
||||||
(unless ub?
|
(unless ub?
|
||||||
(set! user-break-enabled (break-enabled)))
|
(set! user-break-enabled (break-enabled)))
|
||||||
(break-enabled #f))))
|
(break-enabled #f))))
|
||||||
; Cleanup after dispatch
|
; Cleanup after dispatch
|
||||||
(λ ()
|
(λ ()
|
||||||
;; in principle, the line below might cause
|
;; in principle, the line below might cause
|
||||||
|
|
|
@ -1081,7 +1081,7 @@ the settings above should match r5rs
|
||||||
(clear-definitions drs)
|
(clear-definitions drs)
|
||||||
(for-each fw:test:keystroke
|
(for-each fw:test:keystroke
|
||||||
(string->list
|
(string->list
|
||||||
"(define (f n)\n(cond ((zero? n) null)\n(else (cons n (f (- n 1))))))\n(f 200)"))
|
"(define (f n)\n(cond ((zero? n) (list))\n(else (cons n (f (- n 1))))))\n(f 200)"))
|
||||||
(test "Constructor" #f #f
|
(test "Constructor" #f #f
|
||||||
(case-lambda
|
(case-lambda
|
||||||
[(x) (not (member #\newline (string->list x)))]
|
[(x) (not (member #\newline (string->list x)))]
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user