Skip to content

Commit c539c66

Browse files
committed
patch froll
1 parent 2db2a90 commit c539c66

File tree

2 files changed

+20
-10
lines changed

2 files changed

+20
-10
lines changed

R/data.table.R

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1595,7 +1595,7 @@ replace_dot_alias = function(e) {
15951595
SDenv$.SDall = .Call(CsubsetDT, x, if (length(len__)) seq_len(max(len__)) else 0L, xcols) # must be deep copy when largest group is a subset
15961596
if (!is.data.table(SDenv$.SDall)) setattr(SDenv$.SDall, "class", c("data.table","data.frame")) # DF |> DT(,.SD[...],by=grp) needs .SD to be data.table, test 2022.012
15971597
if (xdotcols) setattr(SDenv$.SDall, 'names', ansvars[xcolsAns]) # now that we allow 'x.' prefix in 'j', #2313 bug fix - [xcolsAns]
1598-
setgrowable(SDenv$.SDall)
1598+
SDenv$.SDall = setgrowable(SDenv$.SDall)
15991599
SDenv$.SD = if (length(non_sdvars)) shallow(SDenv$.SDall, sdvars) else SDenv$.SDall
16001600
}
16011601
if (nrow(SDenv$.SDall)==0L) {

src/frollapply.c

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ SEXP memcpyVectoradaptive(SEXP dest, SEXP src, SEXP offset, SEXP size) {
5050
const size_t oi = INTEGER_RO(offset)[0];
5151
const int nrow = INTEGER_RO(size)[oi - 1];
5252
const size_t o = oi - nrow; // oi should always be bigger than nrow because we filter out incomplete window using ansMask
53-
SETLENGTH(dest, nrow); // must be before memcpy_sexp because attempt to set index 1/1 in SET_STRING_ELT test 6010.150
53+
growable_resize(dest, nrow); // must be before memcpy_sexp because attempt to set index 1/1 in SET_STRING_ELT test 6010.150
5454
if (nrow) { // support k[i]==0
5555
memcpy_sexp(dest, o, src, nrow);
5656
}
@@ -65,7 +65,7 @@ SEXP memcpyDTadaptive(SEXP dest, SEXP src, SEXP offset, SEXP size) {
6565
const int ncol = LENGTH(dest);
6666
for (int i = 0; i < ncol; i++) {
6767
SEXP d = VECTOR_ELT(dest, i);
68-
SETLENGTH(d, nrow);
68+
growable_resize(d, nrow);
6969
if (nrow) { // support k[i]==0
7070
memcpy_sexp(d, o, VECTOR_ELT(src, i), nrow);
7171
}
@@ -76,12 +76,22 @@ SEXP memcpyDTadaptive(SEXP dest, SEXP src, SEXP offset, SEXP size) {
7676

7777
// needed in adaptive=TRUE
7878
SEXP setgrowable(SEXP x) {
79-
for (R_xlen_t i = 0; i < xlength(x); ++i) {
80-
SEXP this = VECTOR_ELT(x, i);
81-
if (
82-
!is_growable(this)
83-
&& !ALTREP(this)
84-
) SET_VECTOR_ELT(x, i, make_growable(this));
79+
if (!isNewList(x)) {
80+
if (!is_growable(x)) {
81+
return make_growable(x);
82+
}
83+
return x;
84+
} else {
85+
// # nocov start ## does not seem to be reported to codecov most likely due to running in a fork, I manually debugged that it is being called when running froll.Rraw
86+
for (R_xlen_t i = 0; i < xlength(x); ++i) {
87+
//Rprintf("%d",3); // manual code coverage to confirm it is reached when marking nocov
88+
SEXP this = VECTOR_ELT(x, i);
89+
if (
90+
!is_growable(this)
91+
&& !ALTREP(this)
92+
) SET_VECTOR_ELT(x, i, make_growable(this));
93+
}
94+
// # nocov end
95+
return x;
8596
}
86-
return R_NilValue;
8797
}

0 commit comments

Comments
 (0)