Skip to content

Commit 5eade3e

Browse files
order of preserve/release
1 parent dc9d601 commit 5eade3e

File tree

1 file changed

+23
-16
lines changed

1 file changed

+23
-16
lines changed

inst/include/cpp11/sexp.hpp

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,40 +23,43 @@ class sexp {
2323
// REprintf("created %x %x : %i\n", data_, preserve_token_, protect_head_size());
2424
}
2525

26-
sexp(const sexp& rhs) {
27-
data_ = rhs.data_;
28-
preserve_token_ = preserved.insert(data_);
26+
sexp(const sexp& rhs) : data_(rhs.data_), preserve_token_(preserved.insert(rhs.data_)) {
2927
// REprintf("copied %x new protect %x : %i\n", rhs.data_, preserve_token_,
3028
// protect_head_size());
3129
}
3230

33-
sexp(sexp&& rhs) {
34-
data_ = rhs.data_;
35-
preserve_token_ = rhs.preserve_token_;
36-
31+
sexp(sexp&& rhs) : data_(rhs.data_), preserve_token_(rhs.preserve_token_) {
3732
rhs.data_ = R_NilValue;
3833
rhs.preserve_token_ = R_NilValue;
3934

4035
// REprintf("moved %x : %i\n", rhs.data_, protect_head_size());
4136
}
4237

4338
sexp& operator=(const sexp& rhs) {
44-
preserved.release(preserve_token_);
39+
if (data_ != rhs.data_) {
40+
SEXP old_preserve_token = preserve_token_;
41+
42+
data_ = rhs.data_;
43+
preserve_token_ = preserved.insert(data_);
44+
45+
preserved.release(old_preserve_token);
46+
}
4547

46-
data_ = rhs.data_;
47-
preserve_token_ = preserved.insert(data_);
4848
// REprintf("assigned %x : %i\n", rhs.data_, protect_head_size());
4949
return *this;
5050
}
5151

5252
sexp& operator=(sexp&& rhs) {
53-
preserved.release(preserve_token_);
53+
if (data_ != rhs.data_) {
54+
SEXP old_preserve_token = preserve_token_;
5455

55-
data_ = rhs.data_;
56-
preserve_token_ = rhs.preserve_token_;
56+
data_ = rhs.data_;
57+
preserve_token_ = rhs.preserve_token_;
5758

58-
rhs.data_ = R_NilValue;
59-
rhs.preserve_token_ = R_NilValue;
59+
rhs.data_ = R_NilValue;
60+
rhs.preserve_token_ = R_NilValue;
61+
preserved.release(old_preserve_token);
62+
}
6063

6164
// REprintf("moved %x : %i\n", rhs.data_, protect_head_size());
6265
return *this;
@@ -68,7 +71,9 @@ class sexp {
6871
//*this = tmp;
6972
//}
7073

71-
~sexp() { preserved.release(preserve_token_); }
74+
~sexp() {
75+
preserved.release(preserve_token_);
76+
}
7277

7378
attribute_proxy<sexp> attr(const char* name) const {
7479
return attribute_proxy<sexp>(*this, name);
@@ -87,9 +92,11 @@ class sexp {
8792
}
8893

8994
operator SEXP() const { return data_; }
95+
/*
9096
operator double() const { return REAL_ELT(data_, 0); }
9197
operator size_t() const { return REAL_ELT(data_, 0); }
9298
operator bool() const { return LOGICAL_ELT(data_, 0); }
99+
*/
93100
SEXP data() const { return data_; }
94101
};
95102

0 commit comments

Comments
 (0)