@@ -90,35 +90,39 @@ namespace Rcpp {
9090static SEXP Rcpp_precious = R_NilValue;
9191// [[Rcpp::register]]
9292void Rcpp_precious_init () {
93- Rcpp_precious = CONS (R_NilValue,R_NilValue);// set up
94- R_PreserveObject (Rcpp_precious); // and protect
93+ Rcpp_precious = CONS (R_NilValue, R_NilValue); // set up
94+ R_PreserveObject (Rcpp_precious); // and protect
9595}
9696// [[Rcpp::register]]
9797void Rcpp_precious_teardown () {
98- R_ReleaseObject (Rcpp_precious); // release resource
99- }
100- // [[Rcpp::register]]
101- void Rcpp_precious_preserve (SEXP object) {
102- SETCDR (Rcpp_precious, CONS (object, CDR (Rcpp_precious)));
103- }
104- SEXP DeleteFromList (SEXP object, SEXP list) {
105- if (CAR (list) == object)
106- return CDR (list);
107- else {
108- SEXP last = list;
109- for (SEXP head = CDR (list); head != R_NilValue; head = CDR (head)) {
110- if (CAR (head) == object) {
111- SETCDR (last, CDR (head));
112- return list;
113- }
114- else last = head;
115- }
116- return list;
98+ R_ReleaseObject (Rcpp_precious); // release resource
99+ }
100+ // [[Rcpp::register]]
101+ SEXP Rcpp_precious_preserve (SEXP object) {
102+ if (object == R_NilValue) {
103+ return R_NilValue;
117104 }
105+ PROTECT (object);
106+ SEXP cell = PROTECT (CONS (Rcpp_precious, CDR (Rcpp_precious)));
107+ SET_TAG (cell, object);
108+ SETCDR (Rcpp_precious, cell);
109+ if (CDR (cell) != R_NilValue) {
110+ SETCAR (CDR (cell), cell);
111+ }
112+ UNPROTECT (2 );
113+ return cell;
118114}
119115// [[Rcpp::register]]
120- void Rcpp_precious_remove (SEXP object) {
121- SETCDR (Rcpp_precious, DeleteFromList (object, CDR (Rcpp_precious)));
116+ void Rcpp_precious_remove (SEXP token) {
117+ if (token == R_NilValue) {
118+ return ;
119+ }
120+ SEXP before = CAR (token);
121+ SEXP after = CDR (token);
122+ SETCDR (before, after);
123+ if (after != R_NilValue) {
124+ SETCAR (after, before);
125+ }
122126}
123127}
124128
0 commit comments