On Fri, 1 Nov 2019, Jan Gorecki wrote: > Thank you Luke. > That is why I don't use Rf_inherits but INHERITS which does not > allocate, provided in the email body.
Your definition can allocate because STING_ELT can allocate. getAttrib can GC in general. Currently it would not GC or allocate in this case, but this could change. You can't assume thread-safety for calls into the R API, or any API for that matter, unless they are documented to be thread-safe. You would be better off using Rf_inherits as it does not make the assumption that you can use pointer comparisons to check for identical strings. CHARSXPs are almost always cached but they are not guaranteed to be, and the caching strategy might change in the future. Best, luke > 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 > -- 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