SEXP nanoarrow_c_pointer_release()

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;
}