[Rd] Protection stack overflow when calling setGeneric()/setMethod() from within .onLoad()
Hervé Pagès
hpages at fhcrc.org
Tue Jul 7 02:25:04 CEST 2009
Hi list,
Calling setGeneric()/setMethod() from within the .onLoad() hook
of MyPkg package produces the following error:
> gctorture(TRUE)
> library(MyPkg)
.onLoad(): ok1
.onLoad(): ok2
Error : protect(): protection stack overflow
Error : .onLoad failed in 'loadNamespace' for 'MyPkg'
Error: package/namespace load failed for 'MyPkg'
This is with the following code in the .onLoad() hook:
.onLoad <- function(libname, pkgname) {
cat(".onLoad(): ok1\n")
setGeneric("foo", function(x, y) standardGeneric("foo"))
cat(".onLoad(): ok2\n")
setMethod("foo", c("ANY", "ANY"),
function(x, y) cat("calling foo,ANY,ANY method\n")
)
cat(".onLoad(): ok3\n")
}
and with R-2.9.0/R-2.9.1 or recent R-devel.
Note that without the call to gctorture(TRUE), everything *seems* to work
fine:
> library(MyPkg)
.onLoad(): ok1
.onLoad(): ok2
.onLoad(): ok3
but it could be that my session is now corrupted because some users have
reported the nasty and now famous:
Error in get(name, envir = table) :
formal argument "envir" matched by multiple actual arguments
Calls: assign ... .getGeneric -> .cacheGeneric -> .cacheGenericTable -> get
after they've loaded MyPkg and started to run some other code that is not
necessarily calling foo(). Those users are running R-2.9.1 or a very recent
R-devel (less than 1 week old) so they are not triggering the reg.finalizer()
problem reported here (and fixed) a few weeks ago:
https://stat.ethz.ch/pipermail/r-devel/2009-June/053607.html
Also note that if I make foo() a function of one argument only, I don't
get the protection stack overflow anymore.
Cheers,
H.
--
Hervé Pagès
Program in Computational Biology
Division of Public Health Sciences
Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N, M2-B876
P.O. Box 19024
Seattle, WA 98109-1024
E-mail: hpages at fhcrc.org
Phone: (206) 667-5791
Fax: (206) 667-1319
More information about the R-devel
mailing list