Skip to content

Commit c441951

Browse files
committed
Fix crash on reshape of 0-size.
1 parent 9fa1bc2 commit c441951

1 file changed

Lines changed: 30 additions & 28 deletions

File tree

src/gpuarray_array.c

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -696,41 +696,43 @@ int GpuArray_reshape_inplace(GpuArray *a, unsigned int nd,
696696
if (newstrides == NULL)
697697
return error_sys(ctx->err, "calloc");
698698

699-
while (ni < nd && oi < a->nd) {
700-
np = newdims[ni];
701-
op = a->dimensions[oi];
699+
if (newsize != 0) {
700+
while (ni < nd && oi < a->nd) {
701+
np = newdims[ni];
702+
op = a->dimensions[oi];
703+
704+
while (np != op) {
705+
if (np < op) {
706+
np *= newdims[nj++];
707+
} else {
708+
op *= a->dimensions[oj++];
709+
}
710+
}
702711

703-
while (np != op) {
704-
if (np < op) {
705-
np *= newdims[nj++];
706-
} else {
707-
op *= a->dimensions[oj++];
712+
for (ok = oi; ok < oj - 1; ok++) {
713+
if (ord == GA_F_ORDER) {
714+
if (a->strides[ok+1] != (ssize_t)a->dimensions[ok]*a->strides[ok])
715+
goto need_copy;
716+
} else {
717+
if (a->strides[ok] != (ssize_t)a->dimensions[ok+1]*a->strides[ok+1])
718+
goto need_copy;
719+
}
708720
}
709-
}
710721

711-
for (ok = oi; ok < oj - 1; ok++) {
712722
if (ord == GA_F_ORDER) {
713-
if (a->strides[ok+1] != (ssize_t)a->dimensions[ok]*a->strides[ok])
714-
goto need_copy;
723+
newstrides[ni] = a->strides[oi];
724+
for (nk = ni + 1; nk < nj; nk++) {
725+
newstrides[nk] = newstrides[nk - 1]*newdims[nk - 1];
726+
}
715727
} else {
716-
if (a->strides[ok] != (ssize_t)a->dimensions[ok+1]*a->strides[ok+1])
717-
goto need_copy;
718-
}
719-
}
720-
721-
if (ord == GA_F_ORDER) {
722-
newstrides[ni] = a->strides[oi];
723-
for (nk = ni + 1; nk < nj; nk++) {
724-
newstrides[nk] = newstrides[nk - 1]*newdims[nk - 1];
725-
}
726-
} else {
727-
newstrides[nj-1] = a->strides[oj-1];
728-
for (nk = nj-1; nk > ni; nk--) {
729-
newstrides[nk-1] = newstrides[nk]*newdims[nk];
728+
newstrides[nj-1] = a->strides[oj-1];
729+
for (nk = nj-1; nk > ni; nk--) {
730+
newstrides[nk-1] = newstrides[nk]*newdims[nk];
731+
}
730732
}
733+
ni = nj++;
734+
oi = oj++;
731735
}
732-
ni = nj++;
733-
oi = oj++;
734736
}
735737

736738
/* Fixup trailing ones */

0 commit comments

Comments
 (0)