From 25bf2e673e606c4dce61d6849e9b9937ae25e5e2 Mon Sep 17 00:00:00 2001 From: stephematician Date: Sat, 19 Oct 2019 22:41:10 +1100 Subject: [PATCH 1/2] fix #968 with a single argument XPtr constructor --- inst/include/Rcpp/XPtr.h | 13 +++++++++++-- inst/unitTests/cpp/XPtr.cpp | 11 +++++++++++ inst/unitTests/runit.XPTr.R | 3 +++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/inst/include/Rcpp/XPtr.h b/inst/include/Rcpp/XPtr.h index 1e684c80c..70f44b784 100644 --- a/inst/include/Rcpp/XPtr.h +++ b/inst/include/Rcpp/XPtr.h @@ -63,13 +63,22 @@ class XPtr : * * @param xp external pointer to wrap */ - explicit XPtr(SEXP x, SEXP tag = R_NilValue, SEXP prot = R_NilValue) { + explicit XPtr(SEXP x) { if (TYPEOF(x) != EXTPTRSXP) { const char* fmt = "Expecting an external pointer: [type=%s]."; throw ::Rcpp::not_compatible(fmt, Rf_type2char(TYPEOF(x))); } - Storage::set__(x); + }; + + /** + * constructs a XPtr wrapping the external pointer (EXTPTRSXP SEXP) + * + * @param xp external pointer to wrap + * @param tag tag to assign to external pointer + * @param prot protected data to assign to external pointer + */ + explicit XPtr(SEXP x, SEXP tag, SEXP prot) : XPtr(x) { R_SetExternalPtrTag( x, tag); R_SetExternalPtrProtected(x, prot); }; diff --git a/inst/unitTests/cpp/XPtr.cpp b/inst/unitTests/cpp/XPtr.cpp index ec4f97c3a..94b33fa12 100644 --- a/inst/unitTests/cpp/XPtr.cpp +++ b/inst/unitTests/cpp/XPtr.cpp @@ -46,6 +46,17 @@ int xptr_2( XPtr< std::vector > p){ return p->front() ; } +// [[Rcpp::export]] +void xptr_self_tag( XPtr< std::vector > p ){ + XPtr< std::vector > self_tag(wrap(p), wrap(p), R_NilValue) ; +} + +// [[Rcpp::export]] +bool xptr_has_self_tag( XPtr< std::vector > p ){ + return wrap(p) == R_ExternalPtrTag(p); +} + + // [[Rcpp::export]] bool xptr_release( XPtr< std::vector > p) { p.release(); diff --git a/inst/unitTests/runit.XPTr.R b/inst/unitTests/runit.XPTr.R index 3e9d76f0e..9c3c833bb 100644 --- a/inst/unitTests/runit.XPTr.R +++ b/inst/unitTests/runit.XPTr.R @@ -31,6 +31,9 @@ if (.runThisTest) { front <- xptr_2(xp) checkEquals( front, 1L, msg = "check usage of external pointer" ) + xptr_self_tag(xp) + checkEquals(xptr_has_self_tag(xp), T, msg = "check external pointer tag preserved") + checkTrue(xptr_release(xp), msg = "check release of external pointer") checkTrue(xptr_access_released(xp), msg = "check access of released external pointer") From 9dbbd4cbff1a59f9563ed11b919e674d7552b747 Mon Sep 17 00:00:00 2001 From: stephematician Date: Sun, 20 Oct 2019 00:41:00 +1100 Subject: [PATCH 2/2] Updated Changelog for PR #1002 --- ChangeLog | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ChangeLog b/ChangeLog index e63943d31..a59e4dfb8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2019-10-19 Stephen Wade + + * inst/include/Rcpp/XPtr.h: XPtr constructor split up, a single + argument does not modify tags and protected data of the external pointer + * inst/unitTests/cpp/Xptr.cpp: Added test + * inst/unitTests/runit.XPtr.R: Idem + 2019-10-14 Dirk Eddelbuettel * README.md: Added CRAN + BioConductor badges for reverse depends,