From febd37b5004a74e98ee090ffa2e4c614d0b1b6b6 Mon Sep 17 00:00:00 2001 From: Sebastian Krantz Date: Mon, 10 Jul 2023 21:56:31 +0200 Subject: [PATCH] Should fix #434 (unable to reproduce it on M1 mac). --- src/programming.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/programming.c b/src/programming.c index 3a2c6e59..d1194dd7 100644 --- a/src/programming.c +++ b/src/programming.c @@ -94,28 +94,28 @@ if(length(val) == n && n > 1) { const int *px = INTEGER(x); const int *pv = INTEGER(val); WHICHVLOOPLX - break; + break; } case REALSXP: { const double *px = REAL(x); const double *pv = REAL(val); WHICHVLOOPLX - break; + break; } case STRSXP: { const SEXP *px = STRING_PTR(x); const SEXP *pv = STRING_PTR(val); WHICHVLOOPLX - break; + break; } case RAWSXP : { const Rbyte *px = RAW(x); const Rbyte *pv = RAW(val); WHICHVLOOPLX - break; + break; } default: error("Unsupported type '%s' passed to whichv()", type2char(TYPEOF(x))); } @@ -132,7 +132,7 @@ if(length(val) == n && n > 1) { v = fchmatch(getAttrib(x, R_LevelsSymbol), val, 0); } else v = asInteger(val); WHICHVLOOP - break; + break; } case REALSXP: { @@ -152,16 +152,17 @@ if(length(val) == n && n > 1) { case STRSXP: { const SEXP *px = STRING_PTR(x); - const SEXP v = asChar(val); + const SEXP v = PROTECT(asChar(val)); WHICHVLOOP - break; + UNPROTECT(1); + break; } case RAWSXP : { const Rbyte *px = RAW(x); const Rbyte v = RAW(val)[0]; WHICHVLOOP - break; + break; } default: error("Unsupported type '%s' passed to whichv()", type2char(TYPEOF(x))); } @@ -198,7 +199,7 @@ case LGLSXP: v = fchmatch(getAttrib(x, R_LevelsSymbol), val, 0); } else v = asInteger(val); ALLANYVLOOP - break; + break; } case REALSXP: { @@ -206,21 +207,21 @@ case REALSXP: const double v = asReal(val); if(ISNAN(v)) error("please use allNA()"); ALLANYVLOOP - break; + break; } case STRSXP: { const SEXP *px = STRING_PTR(x); const SEXP v = asChar(val); ALLANYVLOOP - break; + break; } case RAWSXP : { const Rbyte *px = RAW(x); const Rbyte v = RAW(val)[0]; ALLANYVLOOP - break; + break; } default: error("Unsupported type '%s' passed to allv() / anyv()", type2char(TYPEOF(x))); } @@ -383,8 +384,9 @@ SEXP setcopyv(SEXP x, SEXP val, SEXP rep, SEXP Rinvert, SEXP Rset, SEXP Rind1) { if(lv == 1 && ind1 == 0) { const SEXP v = PROTECT(asChar(val)); if(lr == 1) { - const SEXP r = asChar(rep); + const SEXP r = PROTECT(asChar(rep)); setcopyvLOOP(r) + UNPROTECT(1); } else { const SEXP *restrict pr = STRING_PTR(rep); setcopyvLOOP(pr[i]) @@ -393,8 +395,9 @@ SEXP setcopyv(SEXP x, SEXP val, SEXP rep, SEXP Rinvert, SEXP Rset, SEXP Rind1) { } else { const int *restrict pv = INTEGER(val); // ALTREP(val) ? (const int *)ALTVEC_DATAPTR(val) : if(lr == 1) { - const SEXP r = asChar(rep); + const SEXP r = PROTECT(asChar(rep)); setcopyvLOOPLVEC1 + UNPROTECT(1); } else { const SEXP *restrict pr = STRING_PTR(rep); setcopyvLOOPLVEC