This code is looking more and more wrong to me. This patch has
moved _more_ code that calls Lisp into the critical portion of
redisplay. This is right under a comment that says we should be
getting rid of such code.
Why does the gutter update code call out to Lisp? This seems
exactly backward from the way the rest of redisplay works,
which is to let Lisp make state changes and then have redisplay
compute the difference between the current display and what the
new display should look like. If you call out to Lisp inside
redisplay then more state changes can be introduced, which
might mean that redisplay never completes or never gets the
display right.