Skip to content

Commit daee336

Browse files
committed
dfrowstolist: c code, fix PROTECT errors / rhub warnings
1 parent fe3a56b commit daee336

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

src/c_dfRowsToList.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,22 +62,25 @@ SEXP c_dfRowsToList(SEXP s_df, SEXP s_pars, SEXP s_types, SEXP s_parnames, SEXP
6262
if (STRING_ELT(s_parval, k) != NA_STRING)
6363
all_missing = FALSE;
6464
}
65+
} else {
66+
error("should not happen!");
6567
}
6668

6769
/* are all entries in s_parval NA ? */
6870
if (all_missing)
69-
s_parval = ScalarLogical(NA_LOGICAL);
71+
s_parval = PROTECT(ScalarLogical(NA_LOGICAL));
7072

7173
/* convert discrete names to values */
7274
if (!all_missing && type == 3) {
7375
SEXP pkg = PROTECT(ScalarString(mkChar("ParamHelpers")));
7476
SEXP get_namespace = PROTECT(install("getNamespace"));
75-
SEXP ns = PROTECT(eval(lang2(get_namespace, pkg), R_GlobalEnv));
77+
SEXP fn = PROTECT(fn = lang2(get_namespace, pkg));
78+
SEXP ns = PROTECT(ns = eval(fn, R_GlobalEnv));
7679
SEXP s_call = PROTECT(lang3(install("discreteNameToValue"), R_NilValue, R_NilValue));
7780
SETCADR(s_call, VECTOR_ELT(s_pars, par));
7881
SETCADDR(s_call, s_parval);
7982
s_parval = PROTECT(eval(s_call, ns));
80-
UNPROTECT(5); /* ns, s_call, ? */
83+
UNPROTECT(6); /* ns, s_call, ? */
8184
}
8285

8386
/* only support for cnames for num, int, log and char vecs currently */
@@ -88,6 +91,8 @@ SEXP c_dfRowsToList(SEXP s_df, SEXP s_pars, SEXP s_types, SEXP s_parnames, SEXP
8891
SET_NAMES(s_rowlist, s_parnames);
8992
colcount += parlen;
9093
UNPROTECT(1); /* s_parval */
94+
if (all_missing)
95+
UNPROTECT(1);
9196
}
9297
SET_VECTOR_ELT(s_res, row, s_rowlist);
9398
UNPROTECT(1); /* s_rowlist */

0 commit comments

Comments
 (0)