@@ -364,9 +364,15 @@ namespace Rcpp {
364364 }
365365
366366
367+ inline SEXP get_sexp_impl () const {
368+ if (buffer.find (' \0 ' ) != std::string::npos)
369+ throw embedded_nul_in_string ();
370+ return Rf_mkCharLenCE (buffer.c_str (), buffer.size (), enc);
371+ }
372+
367373 inline SEXP get_sexp () const {
368374 RCPP_STRING_DEBUG_1 (" String::get_sexp const (valid = %d) " , valid);
369- return valid ? data : Rf_mkCharCE (buffer. c_str (), enc );
375+ return valid ? data : get_sexp_impl ( );
370376 }
371377
372378 inline SEXP get_sexp () {
@@ -395,9 +401,11 @@ namespace Rcpp {
395401 enc = encoding;
396402
397403 if (valid) {
398- data = Rcpp_ReplaceObject (data, Rf_mkCharCE (Rf_translateCharUTF8 (data), encoding));
404+ // TODO: may longjmp on failure to translate?
405+ const char * translated = Rf_translateCharUTF8 (data);
406+ data = Rcpp_ReplaceObject (data, Rf_mkCharCE (translated, encoding));
399407 } else {
400- data = Rf_mkCharCE (buffer. c_str (), encoding );
408+ data = get_sexp_impl ( );
401409 Rcpp_PreserveObject (data);
402410 valid = true ;
403411 }
@@ -469,7 +477,7 @@ namespace Rcpp {
469477 inline void setData () {
470478 RCPP_STRING_DEBUG (" setData" );
471479 if (!valid) {
472- data = Rf_mkCharCE (buffer. c_str (), enc );
480+ data = get_sexp_impl ( );
473481 Rcpp_PreserveObject (data);
474482 valid = true ;
475483 }
0 commit comments