From f0f293ad605d97d385ee77ea3c89bc397e103cb4 Mon Sep 17 00:00:00 2001 From: shikokuchuo <53399081+shikokuchuo@users.noreply.github.com> Date: Thu, 23 Jan 2025 12:59:07 +0000 Subject: [PATCH] Move into compliance with C API --- src/backports.c | 10 ++++++++++ src/backports.h | 6 +++++- src/conditions.c | 6 ++---- src/map.c | 2 +- src/pluck.c | 2 +- 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/backports.c b/src/backports.c index 0b7adc3a8..5b690a356 100644 --- a/src/backports.c +++ b/src/backports.c @@ -8,3 +8,13 @@ SEXP Rf_installChar(SEXP x) { return Rf_install(CHAR(x)); } #endif + +#if defined(R_VERSION) && R_VERSION < R_Version(4, 5, 0) +SEXP R_mkClosure(SEXP formals, SEXP body, SEXP env) { + SEXP fun = Rf_allocSExp(CLOSXP); + SET_FORMALS(fun, formals); + SET_BODY(fun, body); + SET_CLOENV(fun, env); + return fun; +} +#endif diff --git a/src/backports.h b/src/backports.h index 0ae9abb04..1de5b8017 100644 --- a/src/backports.h +++ b/src/backports.h @@ -4,7 +4,11 @@ #include #if defined(R_VERSION) && R_VERSION < R_Version(3, 2, 0) -SEXP Rf_installChar(SEXP x); +SEXP Rf_installChar(SEXP); +#endif + +#if defined(R_VERSION) && R_VERSION < R_Version(4, 5, 0) +SEXP R_mkClosure(SEXP, SEXP, SEXP); #endif #endif diff --git a/src/conditions.c b/src/conditions.c index 5a00d0c48..7ffb43b1d 100644 --- a/src/conditions.c +++ b/src/conditions.c @@ -1,5 +1,6 @@ #define R_NO_REMAP #include +#include "backports.h" #include "utils.h" #include @@ -19,10 +20,7 @@ SEXP current_env(void) { SEXP parsed = PROTECT(R_ParseVector(code, -1, &status, R_NilValue)); SEXP body = VECTOR_ELT(parsed, 0); - SEXP fn = PROTECT(Rf_allocSExp(CLOSXP)); - SET_FORMALS(fn, R_NilValue); - SET_BODY(fn, body); - SET_CLOENV(fn, R_BaseEnv); + SEXP fn = PROTECT(R_mkClosure(R_NilValue, body, R_BaseEnv)); call = Rf_lang1(fn); R_PreserveObject(call); diff --git a/src/map.c b/src/map.c index 75f417a62..891d29a98 100644 --- a/src/map.c +++ b/src/map.c @@ -164,7 +164,7 @@ SEXP pmap_impl(SEXP env, PROTECT_WITH_INDEX(call, &call_shelter); bool has_call_names = call_names != R_NilValue; - const SEXP* v_call_names = has_call_names ? STRING_PTR(call_names) : NULL; + const SEXP* v_call_names = has_call_names ? STRING_PTR_RO(call_names) : NULL; int call_n = INTEGER_ELT(ffi_call_n, 0); for (int j = call_n - 1; j >= 0; --j) { diff --git a/src/pluck.c b/src/pluck.c index 154fe3c82..7006a40b8 100644 --- a/src/pluck.c +++ b/src/pluck.c @@ -152,7 +152,7 @@ SEXP extract_env(SEXP x, SEXP index_i, int i, bool strict) { } SEXP sym = Rf_installChar(index); - SEXP out = Rf_findVarInFrame3(x, sym, TRUE); + SEXP out = Rf_findVarInFrame(x, sym); if (check_unbound_value(out, index_i, strict)) { return R_NilValue;