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.gore...@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-tier...@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@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-tier...@uiowa.edu >> Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel