in r/src/pointers.c [96:123]
SEXP nanoarrow_c_pointer_release(SEXP ptr) {
if (Rf_inherits(ptr, "nanoarrow_schema")) {
struct ArrowSchema* obj = (struct ArrowSchema*)R_ExternalPtrAddr(ptr);
if (obj != NULL && obj->release != NULL) {
obj->release(obj);
obj->release = NULL;
}
} else if (Rf_inherits(ptr, "nanoarrow_array")) {
struct ArrowArray* obj = (struct ArrowArray*)R_ExternalPtrAddr(ptr);
if (obj != NULL && obj->release != NULL) {
obj->release(obj);
obj->release = NULL;
}
} else if (Rf_inherits(ptr, "nanoarrow_array_stream")) {
struct ArrowArrayStream* obj = (struct ArrowArrayStream*)R_ExternalPtrAddr(ptr);
if (obj != NULL && obj->release != NULL) {
obj->release(obj);
obj->release = NULL;
run_user_array_stream_finalizer(ptr);
}
} else {
Rf_error(
"`ptr` must inherit from 'nanoarrow_schema', 'nanoarrow_array', or "
"'nanoarrow_array_stream'");
}
return R_NilValue;
}