Skip to content

grid error: protection stack overflow

3 messages · Felix Andrews, Paul Murrell

#
I have isolated an error that can be reproduced by the following code.
The same thing happens in 2.8.0pat and 2.9.0dev. It looks like the
try() code is ending up in the display list, or something?

library(grid)
library(lattice)

xyplot(1:100 ~ 1:100)
test <- try(downViewport("pageAnnotationVp"), silent = TRUE)
downViewport(trellis.vpname("toplevel"))
pushViewport(viewport(name = "pageAnnotationVp", yscale = c(1, 0)))
upViewport(0)

## resize device to trigger a couple of redraws...

Error: protect(): protection stack overflow

Enter a frame number, or 0 to exit
1: no.children(<environment>)
2: ls(children, all.names = TRUE)
3: try(name)
4: tryCatch(expr, error = function(e) {
5: tryCatchList(expr, classes, parentenv, handlers)
6: tryCatchOne(expr, names, parentenv, handlers[[1]])
7: doTryCatch(return(expr), name, parentenv, handler)
R version 2.8.0 Patched (2008-11-10 r46884)
i386-pc-mingw32

locale:
LC_COLLATE=English_Australia.1252;LC_CTYPE=English_Australia.1252;LC_MONETARY=English_Australia.1252;LC_NUMERIC=C;LC_TIME=English_Australia.1252

attached base packages:
[1] grid      stats     graphics  grDevices utils     datasets
methods   base

other attached packages:
[1] lattice_0.17-15
#
For the record, a much better alternative to try(downViewport()) is

curVps <- grid.ls(grobs = FALSE, viewports = TRUE, print = FALSE)$name
if ("fooVp" %in% curVps) ...


2008/11/14 Felix Andrews <felix at nfrac.org>:

  
    
5 days later
#
Hi
Felix Andrews wrote:
The problem was that the *unsuccessful* downViewport() was ending up on
the display list (which lead to an infinite loop on a display list
replay, which produced the error).  I have committed a fix to r-devel.

Thanks for the report!

Paul

p.s. A side-bug that this investigation exposed is that using try() on
graphics code can have the effect (when an error occurs) of turning off
display list recording for the device.  No solution in sight for that
bug, so best to stay away from try() for now, as your follow up email
suggested.