Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,3 +9,4 @@ cpp11test/src/*.so
compile_flags.txt
inst/doc
vignettes/*_cache
compile_commands.json
8 changes: 4 additions & 4 deletions cpp11test/src/protect.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,8 +18,8 @@

[[cpp11::register]] void protect_one_cpp11_(SEXP x, int n) {
for (R_xlen_t i = 0; i < n; ++i) {
SEXP p = cpp11::protect_sexp(x);
cpp11::release_protect(p);
SEXP p = cpp11::preserved.insert(x);
cpp11::preserved.release(p);
}
}

Expand DownExpand Up@@ -63,12 +63,12 @@
[[cpp11::register]] void protect_many_cpp11_(int n) {
std::vector<SEXP> res;
for (R_xlen_t i = 0; i < n; ++i) {
res.push_back(cpp11::protect_sexp(Rf_ScalarInteger(n)));
res.push_back(cpp11::preserved.insert(Rf_ScalarInteger(n)));
}

for (R_xlen_t i = n - 1; i >= 0; --i) {
SEXP x = res[i];
cpp11::release_protect(x);
cpp11::preserved.release(x);
res.pop_back();
}
}
Expand Down
1 change: 1 addition & 0 deletions cpp11test/src/test-sexp.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ context("sexp-C++") {

expect_true(Rf_inherits(out, "data.frame"));
}

test_that("scalar constructors work") {
using namespace cpp11::literals;
cpp11::writable::list out({
Expand Down
8 changes: 4 additions & 4 deletions inst/include/cpp11/doubles.hpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -79,7 +79,7 @@ template <>
inline r_vector<double>::r_vector(std::initializer_list<named_arg> il)
: cpp11::r_vector<double>(safe[Rf_allocVector](REALSXP, il.size())),
capacity_(il.size()) {
protect_ = protect_sexp(data_);
protect_ = preserved.insert(data_);
int n_protected = 0;

try {
Expand All@@ -95,7 +95,7 @@ inline r_vector<double>::r_vector(std::initializer_list<named_arg> il)
UNPROTECT(n_protected);
});
} catch (const unwind_exception& e) {
release_protect(protect_);
preserved.release(protect_);
UNPROTECT(n_protected);
throw e;
}
Expand All@@ -106,8 +106,8 @@ inline void r_vector<double>::reserve(R_xlen_t new_capacity) {
data_ = data_ == R_NilValue ? safe[Rf_allocVector](REALSXP, new_capacity)
: safe[Rf_xlengthgets](data_, new_capacity);
SEXP old_protect = protect_;
protect_ = protect_sexp(data_);
release_protect(old_protect);
protect_ = preserved.insert(data_);
preserved.release(old_protect);

data_p_ = REAL(data_);
capacity_ = new_capacity;
Expand Down
10 changes: 5 additions & 5 deletions inst/include/cpp11/integers.hpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,7 +9,7 @@
#include "cpp11/as.hpp" // for as_sexp
#include "cpp11/attribute_proxy.hpp" // for attribute_proxy
#include "cpp11/named_arg.hpp" // for named_arg
#include "cpp11/protect.hpp" // for protect_sexp, release_protect
#include "cpp11/protect.hpp" // for preserved
#include "cpp11/r_vector.hpp" // for r_vector, r_vector<>::proxy
#include "cpp11/sexp.hpp" // for sexp

Expand DownExpand Up@@ -83,10 +83,10 @@ inline void r_vector<int>::reserve(R_xlen_t new_capacity) {
SEXP old_protect = protect_;

// Protect the new data
protect_ = protect_sexp(data_);
protect_ = preserved.insert(data_);

// Release the old protection;
release_protect(old_protect);
preserved.release(old_protect);

data_p_ = INTEGER(data_);
capacity_ = new_capacity;
Expand All@@ -96,7 +96,7 @@ template <>
inline r_vector<int>::r_vector(std::initializer_list<named_arg> il)
: cpp11::r_vector<int>(safe[Rf_allocVector](INTSXP, il.size())),
capacity_(il.size()) {
protect_ = protect_sexp(data_);
protect_ = preserved.insert(data_);
int n_protected = 0;

try {
Expand All@@ -112,7 +112,7 @@ inline r_vector<int>::r_vector(std::initializer_list<named_arg> il)
UNPROTECT(n_protected);
});
} catch (const unwind_exception& e) {
release_protect(protect_);
preserved.release(protect_);
UNPROTECT(n_protected);
throw e;
}
Expand Down
12 changes: 6 additions & 6 deletions inst/include/cpp11/list.hpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@
#include "cpp11/R.hpp" // for SEXP, SEXPREC, SET_VECTOR_ELT
#include "cpp11/attribute_proxy.hpp" // for attribute_proxy
#include "cpp11/named_arg.hpp" // for named_arg
#include "cpp11/protect.hpp" // for protect_sexp, release_protect
#include "cpp11/protect.hpp" // for preserved
#include "cpp11/r_string.hpp" // for r_string
#include "cpp11/r_vector.hpp" // for r_vector, r_vector<>::proxy
#include "cpp11/sexp.hpp" // for sexp
Expand DownExpand Up@@ -75,7 +75,7 @@ template <>
inline r_vector<SEXP>::r_vector(std::initializer_list<SEXP> il)
: cpp11::r_vector<SEXP>(safe[Rf_allocVector](VECSXP, il.size())),
capacity_(il.size()) {
protect_ = protect_sexp(data_);
protect_ = preserved.insert(data_);
auto it = il.begin();
for (R_xlen_t i = 0; i < capacity_; ++i, ++it) {
SET_VECTOR_ELT(data_, i, *it);
Expand All@@ -86,7 +86,7 @@ template <>
inline r_vector<SEXP>::r_vector(std::initializer_list<named_arg> il)
: cpp11::r_vector<SEXP>(safe[Rf_allocVector](VECSXP, il.size())),
capacity_(il.size()) {
protect_ = protect_sexp(data_);
protect_ = preserved.insert(data_);
int n_protected = 0;

try {
Expand All@@ -102,7 +102,7 @@ inline r_vector<SEXP>::r_vector(std::initializer_list<named_arg> il)
UNPROTECT(n_protected);
});
} catch (const unwind_exception& e) {
release_protect(protect_);
preserved.release(protect_);
UNPROTECT(n_protected);
throw e;
}
Expand All@@ -114,8 +114,8 @@ inline void r_vector<SEXP>::reserve(R_xlen_t new_capacity) {
: safe[Rf_xlengthgets](data_, new_capacity);

SEXP old_protect = protect_;
protect_ = protect_sexp(data_);
release_protect(old_protect);
protect_ = preserved.insert(data_);
preserved.release(old_protect);

capacity_ = new_capacity;
}
Expand Down
12 changes: 6 additions & 6 deletions inst/include/cpp11/logicals.hpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,7 @@
#include "cpp11/R.hpp" // for Rboolean, SEXP, SEXPREC, Rf_all...
#include "cpp11/attribute_proxy.hpp" // for attribute_proxy
#include "cpp11/named_arg.hpp" // for named_arg
#include "cpp11/protect.hpp" // for protect_sexp, release_protect
#include "cpp11/protect.hpp" // for preserved
#include "cpp11/r_vector.hpp" // for r_vector, r_vector<>::proxy
#include "cpp11/sexp.hpp" // for sexp

Expand DownExpand Up@@ -71,7 +71,7 @@ inline r_vector<Rboolean>::proxy::operator Rboolean() const {
template <>
inline r_vector<Rboolean>::r_vector(std::initializer_list<Rboolean> il)
: cpp11::r_vector<Rboolean>(Rf_allocVector(LGLSXP, il.size())), capacity_(il.size()) {
protect_ = protect_sexp(data_);
protect_ = preserved.insert(data_);
auto it = il.begin();
for (R_xlen_t i = 0; i < capacity_; ++i, ++it) {
SET_LOGICAL_ELT(data_, i, *it);
Expand All@@ -82,7 +82,7 @@ template <>
inline r_vector<Rboolean>::r_vector(std::initializer_list<named_arg> il)
: cpp11::r_vector<Rboolean>(safe[Rf_allocVector](LGLSXP, il.size())),
capacity_(il.size()) {
protect_ = protect_sexp(data_);
protect_ = preserved.insert(data_);
int n_protected = 0;

try {
Expand All@@ -98,7 +98,7 @@ inline r_vector<Rboolean>::r_vector(std::initializer_list<named_arg> il)
UNPROTECT(n_protected);
});
} catch (const unwind_exception& e) {
release_protect(protect_);
preserved.release(protect_);
UNPROTECT(n_protected);
throw e;
}
Expand All@@ -109,9 +109,9 @@ inline void r_vector<Rboolean>::reserve(R_xlen_t new_capacity) {
data_ = data_ == R_NilValue ? safe[Rf_allocVector](LGLSXP, new_capacity)
: safe[Rf_xlengthgets](data_, new_capacity);
SEXP old_protect = protect_;
protect_ = protect_sexp(data_);
protect_ = preserved.insert(data_);

release_protect(old_protect);
preserved.release(old_protect);

data_p_ = reinterpret_cast<Rboolean*>(LOGICAL(data_));
capacity_ = new_capacity;
Expand Down
Loading