On Mon, 26 Apr 2004, John Chambers wrote:
> I think you need to PROTECT the vector you're putting in the slot as > well as the overall object. At any rate, the problem goes away for me > with the revised version of dummy.c below. yes, and it seems that PROTECT'ing the logical variable is sufficient while PROTECT'ing the class but not the logical variable causes a segfault again. I tried with numeric slots too: No problems. > (Empirically, PROTECT'ing > the class definition didn't seem to be needed, but experience suggests > that too much protection is better than too little.) I tried to save (UN)PROTECT calls because of efficiency reasons. Anyway, this helps me a lot, thanks! Torsten > > #include <Rdefines.h> > > SEXP foo() { > > SEXP ans, cl, el; > > PROTECT(cl = MAKE_CLASS("test")); > PROTECT(ans = NEW_OBJECT(cl)); > PROTECT(el = allocVector(LGLSXP, 1)); > SET_SLOT(ans, install("lgl"), el); > LOGICAL(GET_SLOT(ans, install("lgl")))[0] = TRUE; > UNPROTECT(3); > return(ans); > } > > > Torsten Hothorn wrote: > > > > Hi, > > > > the following example aiming at a class containing a logical slot > > segfaults under R-1.9.0 when `gctorture(on = TRUE)' is used: > > > > Code code (dummy.c): > > > > #include <Rdefines.h> > > > > SEXP foo() { > > > > SEXP ans; > > > > PROTECT(ans = NEW_OBJECT(MAKE_CLASS("test"))); > > SET_SLOT(ans, install("lgl"), allocVector(LGLSXP, 1)); > > LOGICAL(GET_SLOT(ans, install("lgl")))[0] = TRUE; > > UNPROTECT(1); > > return(ans); > > } > > > > R code (dummy.R): > > > > dyn.load("dummy.so") > > > > setClass("test", representation = representation(lgl = "logical")) > > > > a = .Call("foo") > > a # OK > > > > gctorture(on = TRUE) > > a = .Call("foo") > > gctorture(on = FALSE) > > a # segfault > > > > which gives > > > > R> > > R> > > R> dyn.load("dummy.so") > > R> > > R> setClass("test", representation = representation(lgl = "logical")) > > [1] "test" > > R> > > R> a = .Call("foo") > > R> a > > An object of class "test" > > Slot "lgl": > > [1] TRUE > > > > R> > > R> gctorture(on = TRUE) > > R> a = .Call("foo") > > R> gctorture(on = FALSE) > > Segmentation fault > > > > Best, > > > > Torsten > > > > R> version > > _ > > platform i686-pc-linux-gnu > > arch i686 > > os linux-gnu > > system i686, linux-gnu > > status > > major 1 > > minor 9.0 > > year 2004 > > month 04 > > day 12 > > language R > > R> > > > > _______________________________________________________________________ > > | | > > | Dr. rer. nat. Torsten Hothorn | > > | Institut fuer Medizininformatik, Biometrie und Epidemiologie | > > | Waldstrasse 6, D-91054 Erlangen, Deutschland | > > | Tel: ++49-9131-85-22707 (dienstl.) | > > | Fax: ++49-9131-85-25740 | > > | Email: [EMAIL PROTECTED] | > > | PLEASE send emails cc to [EMAIL PROTECTED] | > > | Web: http://www.imbe.med.uni-erlangen.de/~hothorn | > > |_______________________________________________________________________| > > > > ______________________________________________ > > [EMAIL PROTECTED] mailing list > > https://www.stat.math.ethz.ch/mailman/listinfo/r-devel > > -- > John M. Chambers [EMAIL PROTECTED] > Bell Labs, Lucent Technologies office: (908)582-2681 > 700 Mountain Avenue, Room 2C-282 fax: (908)582-3340 > Murray Hill, NJ 07974 web: http://www.cs.bell-labs.com/~jmc > ______________________________________________ [EMAIL PROTECTED] mailing list https://www.stat.math.ethz.ch/mailman/listinfo/r-devel