From 57deb86f7b271416e6c9e925b1957e1da4a9a983 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Fri, 7 Oct 2011 06:52:07 -0500 Subject: [PATCH] don't invalidate the error ranges for online check syntax when there is no admin I believe that this can go wrong in the case that you edit a buffer and switch tabs before drracket fully finishes responding to the edited buffer (due to a queue-callback that postpones some of the response to editing the buffer) for online expansion. At least, this is how I guess that the error below happened: send: target is not an object: #f for method: get-view === context === /Users/robby/git/exp/plt/collects/racket/private/class-internal.rkt:4602:0: obj-error /Users/robby/git/exp/plt/collects/drracket/private/module-language.rkt:1485:6: get-box method in .../module-language.rkt:1151:4 /Users/robby/git/exp/plt/collects/drracket/private/module-language.rkt:1397:6: invalidate-online-error-ranges method in .../module-language.rkt:1151:4 /Users/robby/git/exp/plt/collects/drracket/private/module-language.rkt:1387:6: clear-old-error method in .../module-language.rkt:1151:4 /Users/robby/git/exp/plt/collects/drracket/private/module-language.rkt:1177:6: buffer-modified method in .../module-language.rkt:1151:4 /Users/robby/git/exp/plt/collects/mred/private/wx/common/timer.rkt:34:38 /Users/robby/git/exp/plt/collects/mred/private/wx/common/queue.rkt:432:6 /Users/robby/git/exp/plt/collects/mred/private/wx/common/queue.rkt:472:32 /Users/robby/git/exp/plt/collects/mred/private/wx/common/queue.rkt:618:3 --- collects/drracket/private/module-language.rkt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/collects/drracket/private/module-language.rkt b/collects/drracket/private/module-language.rkt index f56501c080..70d7c70354 100644 --- a/collects/drracket/private/module-language.rkt +++ b/collects/drracket/private/module-language.rkt @@ -1395,9 +1395,14 @@ (set-online-error-ranges '())) (define/private (invalidate-online-error-ranges) - (for ([an-error-range (in-list online-error-ranges)]) - (define-values (x y w h) (get-box an-error-range)) - (invalidate-bitmap-cache x y 'display-end h))) + (when (get-admin) + ;; invalidate-online-error-ranges can be called at strange times + ;; because it is invoked via a queue-callback thunk; specifically + ;; the tab may have changed in drracket, which means that there is + ;; no admin and thus there is no reason to invalidate any drawing + (for ([an-error-range (in-list online-error-ranges)]) + (define-values (x y w h) (get-box an-error-range)) + (invalidate-bitmap-cache x y 'display-end h)))) (define byt (box 0.0)) (define byb (box 0.0)) @@ -1482,6 +1487,7 @@ [else (super on-event evt)])) + ;; pre: get-admin does not return #f (define/private (get-box an-error-range) (define start-pos (error-range-start an-error-range)) (define end-pos (error-range-end an-error-range))