From @|mon@urb@nek @end|ng |rom R-project@org  Fri Nov  1 14:54:26 2019
From: @|mon@urb@nek @end|ng |rom R-project@org (Simon Urbanek)
Date: Fri, 1 Nov 2019 09:54:26 -0400
Subject: [Rd] [External]  R C api for 'inherits' S3 and S4 objects
In-Reply-To: <CAOO9MKXQTTgZ4ixySRH_myaMXtA1F6HoaPe3jGVogRn=3+NYSA@mail.gmail.com>
References: <CAOO9MKU8AbMM3KdLjxa2jPzY1h=2w50vctOjWqcv=CtqymSg5w@mail.gmail.com>
 <alpine.DEB.2.21.1911010704100.3658@luke-Latitude-7480>
 <CAOO9MKXQTTgZ4ixySRH_myaMXtA1F6HoaPe3jGVogRn=3+NYSA@mail.gmail.com>
Message-ID: <E8266268-D16F-4567-BA55-75726BAB05BB@R-project.org>

Note that your desire is by definition impossible - as your example also shows checking for S4 inheritance involves evaluation and thus allocation which cannot be avoided by the dynamic design of S4 inheritance.

Cheers,
Simon


> On Nov 1, 2019, at 9:23 AM, Jan Gorecki <j.gorecki at 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 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
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
> 



[Rd] [External] R C api for 'inherits' S3 and S4 objects
Simon Urbanek