diff --git a/src/builtins/transpose.c b/src/builtins/transpose.c index 4e1f9985..35786e71 100644 --- a/src/builtins/transpose.c +++ b/src/builtins/transpose.c @@ -144,6 +144,16 @@ B ud_c1(B,B); B tbl_c2(Md1D*,B,B); B select_c2(B,B,B); +static void shSet_alloc(Arr* ra, ur rr, usz* rsh) { + if (RARE(rr <= 1)) { + arr_shVec(ra); + } else { + ShArr* sh=m_shArr(rr); + shcpy(sh->a, rsh, rr); + arr_shSetU(ra, rr, sh); + } +} + B transp_c2(B t, B w, B x) { usz wia=1; if (isArr(w)) { @@ -199,13 +209,7 @@ B transp_c2(B t, B w, B x) { // Empty result if (IA(x) == 0) { Arr* ra = m_fillarrpEmpty(getFillQ(x)); - if (RARE(rr <= 1)) { - arr_shVec(ra); - } else { - ShArr* sh=m_shArr(rr); - shcpy(sh->a, rsh, rr); - arr_shSetU(ra, rr, sh); - } + shSet_alloc(ra, rr, rsh); decG(x); r = taga(ra); goto ret; } @@ -214,12 +218,40 @@ B transp_c2(B t, B w, B x) { ur ar = max+1+dup; if (!dup) while (ar>1 && p[ar-1]==ar-1) ar--; // Unmoved trailing if (ar <= 1) { r = x; goto ret; } + ur na = ar - dup; // Add up stride for each axis TALLOC(u64, st, rr); for (usz j=0; j= (32*8) >> elWidthLogBits(xe)) { // cell >= 32 bytes + usz ria = csz * shProd(rsh, 0, na); + MAKE_MUT_INIT(rm, ria, xe); MUTG_INIT(rm); + for (usz i=0; i