[Rd] [External] R C api for 'inherits' S3 and S4 objects
Gábor Csárdi
c@@rd|@g@bor @end|ng |rom gm@||@com
Fri Nov 1 14:54:17 CET 2019
AFAIR getAttrib() can allocate as well. Also, R API functions that do
not allocate today, may allocate in the future.
Gabor
On Fri, Nov 1, 2019 at 1:24 PM Jan Gorecki <j.gorecki using wit.edu.pl> wrote:
>
> Thank you Luke.
> That is why I don't use Rf_inherits but INHERITS which does not
> allocate, provided in the email body.
> I cannot do similarly for S4 classes, thus asking for some API for that.
>
> On Fri, Nov 1, 2019 at 5:56 PM Tierney, Luke <luke-tierney using uiowa.edu> wrote:
> >
> > On Fri, 1 Nov 2019, Jan Gorecki wrote:
> >
> > > Dear R developers,
> > >
> > > Motivated by discussion about checking inheritance of S3 and S4
> > > objects (in head matrix/array topic) I would light to shed some light
> > > on a minor gap about that matter in R C API.
> > > Currently we are able to check inheritance for S3 class objects from C
> > > in a robust way (no allocation, thread safe). This is unfortunately
> >
> > Your premise is not correct. Rf_inherits will not GC but it can
> > allocate and is not thread safe.
> >
> > Best,
> >
> > luke
> >
> > > not possible for S4 classes. I would kindly request new function in R
> > > C api so it can be achieved for S4 classes with no risk of allocation.
> > > For reference mentioned functions below. Thank you.
> > > Jan Gorecki
> > >
> > > // S3 inheritance
> > > bool INHERITS(SEXP x, SEXP char_) {
> > > SEXP klass;
> > > if (isString(klass = getAttrib(x, R_ClassSymbol))) {
> > > for (int i=0; i<LENGTH(klass); i++) {
> > > if (STRING_ELT(klass, i) == char_) return true;
> > > }
> > > }
> > > return false;
> > > }
> > > // S4 inheritance
> > > bool Rinherits(SEXP x, SEXP char_) {
> > > SEXP vec = PROTECT(ScalarString(char_));
> > > SEXP call = PROTECT(lang3(sym_inherits, x, vec));
> > > bool ans = LOGICAL(eval(call, R_GlobalEnv))[0]==1;
> > > UNPROTECT(2);
> > > return ans;
> > > }
> > >
> > > ______________________________________________
> > > R-devel using r-project.org mailing list
> > > https://stat.ethz.ch/mailman/listinfo/r-devel
> > >
> >
> > --
> > Luke Tierney
> > Ralph E. Wareham Professor of Mathematical Sciences
> > University of Iowa Phone: 319-335-3386
> > Department of Statistics and Fax: 319-335-3017
> > Actuarial Science
> > 241 Schaeffer Hall email: luke-tierney using uiowa.edu
> > Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu
>
> ______________________________________________
> R-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
More information about the R-devel
mailing list