@@ -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