From e192846933655d0072aa026bab0428689ad5eeb2 Mon Sep 17 00:00:00 2001 From: Davis Vaughan Date: Wed, 22 Oct 2025 15:49:57 -0400 Subject: [PATCH 1/2] Remove usage of `DATAPTR()` --- src/melt.cpp | 48 +++++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/src/melt.cpp b/src/melt.cpp index 8401ad045..15c6a2423 100644 --- a/src/melt.cpp +++ b/src/melt.cpp @@ -134,12 +134,22 @@ cpp11::strings make_variable_column_character(cpp11::strings x, int nrow) { } // Concatenate vectors for the 'value' column -#define DO_CONCATENATE(CTYPE) \ - { \ - memcpy((char*)DATAPTR(output) + i* nrow * sizeof(CTYPE), \ - (char*)DATAPTR(tmp), \ - nrow * sizeof(CTYPE)); \ - break; \ +#define DO_CONCATENATE(CTYPE, CONST_DEREF, DEREF) \ + { \ + memcpy( \ + (char*)DEREF(output) + (i * nrow * sizeof(CTYPE)), \ + (const char*)CONST_DEREF(tmp), \ + nrow * sizeof(CTYPE) \ + ); \ + break; \ + } + +#define DO_CONCATENATE_BARRIER(GET, SET) \ + { \ + for (int j = 0; j < nrow; ++j) { \ + SET(output, i * nrow + j, GET(tmp, j)); \ + } \ + break; \ } SEXP concatenate(const cpp11::data_frame& x, cpp11::integers ind, bool factorsAsStrings) { @@ -185,27 +195,19 @@ SEXP concatenate(const cpp11::data_frame& x, cpp11::integers ind, bool factorsAs switch (max_type) { case INTSXP: - DO_CONCATENATE(int); + DO_CONCATENATE(int, INTEGER_RO, INTEGER); case REALSXP: - DO_CONCATENATE(double); + DO_CONCATENATE(double, REAL_RO, REAL); case LGLSXP: - DO_CONCATENATE(int); + DO_CONCATENATE(int, LOGICAL_RO, LOGICAL); case CPLXSXP: - DO_CONCATENATE(Rcomplex); - case STRSXP: { - for (int j = 0; j < nrow; ++j) { - SET_STRING_ELT(output, i * nrow + j, STRING_ELT(tmp, j)); - } - break; - } - case VECSXP: { - for (int j = 0; j < nrow; ++j) { - SET_VECTOR_ELT(output, i * nrow + j, VECTOR_ELT(tmp, j)); - } - break; - } + DO_CONCATENATE(Rcomplex, COMPLEX_RO, COMPLEX); + case STRSXP: + DO_CONCATENATE_BARRIER(STRING_ELT, SET_STRING_ELT); + case VECSXP: + DO_CONCATENATE_BARRIER(VECTOR_ELT, SET_VECTOR_ELT); default: - cpp11::stop("All columns be atomic vectors or lists (not %s)", Rf_type2char(max_type)); + cpp11::stop("All columns be atomic vectors or lists (not %s)", Rf_type2char(max_type)); } } From b69bf9ef5154c7f75fe667a9678559b109fc7dad Mon Sep 17 00:00:00 2001 From: Davis Vaughan Date: Wed, 22 Oct 2025 15:52:37 -0400 Subject: [PATCH 2/2] NEWS bullet --- NEWS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS.md b/NEWS.md index 49e3f28e3..fb57320d5 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,7 @@ # tidyr (development version) +* tidyr is now compliant with R's C API (#1618). + * Fixed an internal error in `pivot_wider()` (#1609, @krlmlr). * The base pipe is now used throughout the documentation (#1613).