From |uke-t|erney @end|ng |rom u|ow@@edu  Fri Nov  1 13:26:50 2019
From: |uke-t|erney @end|ng |rom u|ow@@edu (Tierney, Luke)
Date: Fri, 1 Nov 2019 12:26:50 +0000
Subject: [Rd] [External]  R C api for 'inherits' S3 and S4 objects
In-Reply-To: <CAOO9MKU8AbMM3KdLjxa2jPzY1h=2w50vctOjWqcv=CtqymSg5w@mail.gmail.com>
References: <CAOO9MKU8AbMM3KdLjxa2jPzY1h=2w50vctOjWqcv=CtqymSg5w@mail.gmail.com>
Message-ID: <alpine.DEB.2.21.1911010704100.3658@luke-Latitude-7480>

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
Tierney, Luke