From j@goreck| @end|ng |rom w|t@edu@p|  Fri Nov  1 14:23:56 2019
From: j@goreck| @end|ng |rom w|t@edu@p| (Jan Gorecki)
Date: Fri, 1 Nov 2019 18:53:56 +0530
Subject: [Rd] [External]  R C api for 'inherits' S3 and S4 objects
In-Reply-To: <alpine.DEB.2.21.1911010704100.3658@luke-Latitude-7480>
References: <CAOO9MKU8AbMM3KdLjxa2jPzY1h=2w50vctOjWqcv=CtqymSg5w@mail.gmail.com>
 <alpine.DEB.2.21.1911010704100.3658@luke-Latitude-7480>
Message-ID: <CAOO9MKXQTTgZ4ixySRH_myaMXtA1F6HoaPe3jGVogRn=3+NYSA@mail.gmail.com>

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 at 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 at 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 at uiowa.edu
> Iowa City, IA 52242                 WWW:  http://www.stat.uiowa.edu



[Rd] [External] R C api for 'inherits' S3 and S4 objects
Jan Gorecki