[Rd] Segfault: .Call and classes with logical slots
torsten at hothorn.de
torsten at hothorn.de
Tue Apr 27 08:01:51 CEST 2004
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: Torsten.Hothorn at rzmail.uni-erlangen.de |
> > | PLEASE send emails cc to torsten at hothorn.de |
> > | Web: http://www.imbe.med.uni-erlangen.de/~hothorn |
> > |_______________________________________________________________________|
> >
> > ______________________________________________
> > R-devel at stat.math.ethz.ch mailing list
> > https://www.stat.math.ethz.ch/mailman/listinfo/r-devel
>
> --
> John M. Chambers jmc at bell-labs.com
> 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
>
More information about the R-devel
mailing list