Skip to content

Commit 120a6d6

Browse files
committed
maybe integrate the finalizer
1 parent f5cc835 commit 120a6d6

File tree

4 files changed

+65
-14
lines changed

4 files changed

+65
-14
lines changed

r/R/vctr.R

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,26 +41,24 @@ as_nanoarrow_vctr <- function(x, ..., schema = NULL) {
4141

4242
#' @rdname as_nanoarrow_vctr
4343
#' @export
44-
nanoarrow_vctr <- function(schema = NULL) {
44+
nanoarrow_vctr <- function(schema = NULL, subclass = character()) {
4545
if (is.null(schema)) {
46-
new_nanoarrow_vctr(list(), NULL)
46+
new_nanoarrow_vctr(list(), NULL, subclass)
4747
} else {
48-
new_nanoarrow_vctr(list(), as_nanoarrow_schema(schema))
48+
new_nanoarrow_vctr(list(), as_nanoarrow_schema(schema), subclass)
4949
}
5050
}
5151

52-
new_nanoarrow_vctr <- function(chunks, schema, indices = NULL) {
52+
new_nanoarrow_vctr <- function(chunks, schema, subclass = character()) {
5353
offsets <- .Call(nanoarrow_c_vctr_chunk_offsets, chunks)
54-
if (is.null(indices)) {
55-
indices <- seq_len(offsets[length(offsets)])
56-
}
54+
indices <- seq_len(offsets[length(offsets)])
5755

5856
structure(
5957
indices,
6058
schema = schema,
6159
chunks = chunks,
6260
offsets = offsets,
63-
class = "nanoarrow_vctr"
61+
class = union(subclass, "nanoarrow_vctr")
6462
)
6563
}
6664

@@ -248,12 +246,12 @@ as.data.frame.nanoarrow_vctr <- function(x, ..., optional = FALSE) {
248246
print.nanoarrow_vctr <- function(x, ...) {
249247
schema <- attr(x, "schema", exact = TRUE)
250248
if (is.null(schema)) {
251-
cat("<nanoarrow_vctr <any>>\n")
249+
cat(sprintf("<%s <any>>\n", class(x)[1]))
252250
return(invisible(x))
253251
}
254252

255253
formatted <- nanoarrow_schema_formatted(schema, recursive = FALSE)
256-
cat(sprintf("<nanoarrow_vctr %s[%d]>\n", formatted, length(x)))
254+
cat(sprintf("<%s %s[%d]>\n", class(x)[1], formatted, length(x)))
257255

258256
n_values <- min(length(x), 20)
259257
more_values <- length(x) - n_values
@@ -274,12 +272,12 @@ print.nanoarrow_vctr <- function(x, ...) {
274272
str.nanoarrow_vctr <- function(object, ...) {
275273
schema <- attr(object, "schema", exact = TRUE)
276274
if (is.null(schema)) {
277-
cat("<nanoarrow_vctr <any>>\n")
275+
cat(sprintf("<%s <any>>\n", class(object)[1]))
278276
return(invisible(object))
279277
}
280278

281279
formatted <- nanoarrow_schema_formatted(schema, recursive = FALSE)
282-
cat(sprintf("<nanoarrow_vctr %s[%d]>\n", formatted, length(object)))
280+
cat(sprintf("<%s %s[%d]>\n", class(object)[1], formatted, length(object)))
283281

284282
# Prints out the C data interface dump of each chunk with the chunk
285283
# index above.

r/src/convert.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -437,17 +437,25 @@ int nanoarrow_converter_finalize(SEXP converter_xptr) {
437437
SEXP nanoarrow_converter_release_result(SEXP converter_xptr) {
438438
struct RConverter* converter = (struct RConverter*)R_ExternalPtrAddr(converter_xptr);
439439
SEXP converter_shelter = R_ExternalPtrProtected(converter_xptr);
440+
440441
// PROTECT()ing here because we are about to release the object from the
441442
// shelter of the converter and return it
442443
SEXP result = PROTECT(VECTOR_ELT(converter_shelter, 4));
443444
SET_VECTOR_ELT(converter_shelter, 4, R_NilValue);
445+
446+
// Perform any finalization on the vector before it is returned to R
447+
SEXP final_result =
448+
PROTECT(nanoarrow_materialize_finalize_result(converter_xptr, result));
449+
450+
// Reset the converter state
444451
converter->dst.vec_sexp = R_NilValue;
445452
converter->dst.offset = 0;
446453
converter->dst.length = 0;
447454
converter->size = 0;
448455
converter->capacity = 0;
449-
UNPROTECT(1);
450-
return result;
456+
457+
UNPROTECT(2);
458+
return final_result;
451459
}
452460

453461
void nanoarrow_converter_stop(SEXP converter_xptr) {

r/src/materialize.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,47 @@ static void copy_vec_into(SEXP x, SEXP dst, R_xlen_t offset, R_xlen_t len) {
299299
}
300300
}
301301

302+
SEXP nanoarrow_materialize_finalize_result(SEXP converter_xptr, SEXP result) {
303+
if (Rf_inherits(result, "nanoarrow_vctr")) {
304+
// Get the schema for this converter. Technically this will overwrite
305+
// a schema that was provided explicitly; however, we currently do not
306+
// handle that case.
307+
SEXP converter_shelter = R_ExternalPtrProtected(converter_xptr);
308+
SEXP schema_xptr = VECTOR_ELT(converter_shelter, 1);
309+
310+
// We no longer need to keep track of chunks_tail
311+
SEXP chunks_tail_sym = PROTECT(Rf_install("chunks_tail"));
312+
Rf_setAttrib(result, chunks_tail_sym, R_NilValue);
313+
314+
// We also want to pass on the class of the ptype we recieved
315+
SEXP subclass_sexp = Rf_getAttrib(result, R_ClassSymbol);
316+
317+
// We no longer need the first element of the pairlist, which was
318+
// intentionally set to R_NilValue.
319+
SEXP chunks_sym = PROTECT(Rf_install("chunks"));
320+
SEXP chunks_pairlist0 = Rf_getAttrib(result, chunks_sym);
321+
322+
// If there were zero chunks, there will be no "first" node
323+
SEXP chunks_list;
324+
if (CDR(chunks_pairlist0) == R_NilValue) {
325+
chunks_list = PROTECT(Rf_allocVector(VECSXP, 0));
326+
} else {
327+
chunks_list = PROTECT(Rf_PairToVectorList(CDR(chunks_pairlist0)));
328+
}
329+
330+
// Set up the call to new_nanoarrow_vctr
331+
SEXP new_nanoarrow_vctr_sym = PROTECT(Rf_install("new_nanoarrow_vctr"));
332+
SEXP new_nanoarrow_vctr_call = PROTECT(
333+
Rf_lang4(new_nanoarrow_vctr_sym, chunks_list, schema_xptr, subclass_sexp));
334+
SEXP final_result = PROTECT(Rf_eval(new_nanoarrow_vctr_call, nanoarrow_ns_pkg));
335+
336+
UNPROTECT(8);
337+
return final_result;
338+
} else {
339+
return result;
340+
}
341+
}
342+
302343
static int nanoarrow_materialize_nanoarrow_vctr(struct RConverter* converter,
303344
SEXP converter_xptr) {
304345
// This is a case where the callee needs ownership, which we can do via a

r/src/materialize.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,8 @@ int nanoarrow_materialize(struct RConverter* converter, SEXP converter_xptr);
4242
SEXP nanoarrow_alloc_type(enum VectorType vector_type, R_xlen_t len);
4343
SEXP nanoarrow_materialize_realloc(SEXP ptype, R_xlen_t len);
4444

45+
// Finalize an object before returning to R. Currently only used for
46+
// nanoarrow_vctr conversion.
47+
SEXP nanoarrow_materialize_finalize_result(SEXP converter_xptr, SEXP result);
48+
4549
#endif

0 commit comments

Comments
 (0)