On Thu, 21 Sep 2023 09:46:26 +0200 Jan Gorecki <j.gore...@wit.edu.pl> wrote:
> I would like to safely allocate R object from C. By safely I mean > that, I can test if allocation succeeded or failed, and then raise > exception myself. > R_alloc and allocVector both raises exception straightaway, so I am > not able to handle failed allocation myself. All R objects are subject to garbage collection (as potential garbage or at least as a source of information about live objects), so they have to be allocated by talking to the GC. (This also means that R_alloc() is not a good way to create new SEXPs.) It's not that it's impossible to return a failure code on allocation failures instead of performing a longjmp() away from your code, but since the rest of error handling in R works this way, extension code has to always be ready to be longjmp()'d away from at every R API call. How about catching the exception instead? struct alloc_args { SEXPTYPE type; R_xlen_t len; }; static SEXP do_allocate(void * arguments) { struct alloc_args * args = arguments; return allocVector(args->type, args->len); } static SEXP maybe_allocate(SEXPTYPE type, R_xlen_t len) { struct alloc_args args = { .type = type, .len = len }; return R_tryCatchError(do_allocate, &args, NULL, NULL); } // returns R_NilValue on failure via the default tryCatch handler Code is untested but should work according to WRE: https://cran.r-project.org/doc/manuals/R-exts.html#Condition-handling-and-cleanup-code -- Best regards, Ivan ______________________________________________ R-package-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-package-devel