8
8
9
9
#include "lowlevel_strided_loops.h"
10
10
11
- #if 0
11
+ /********** PRINTF DEBUG TRACING **************/
12
+ #define NPY_IT_DBG_TRACING 0
13
+
14
+ #if NPY_IT_DBG_TRACING
12
15
#define NPY_IT_DBG_PRINTF(...) printf(__VA_ARGS__)
13
16
#else
14
17
#define NPY_IT_DBG_PRINTF(...)
15
18
#endif
19
+ /**********************************************/
16
20
17
21
/* Rounds up a number of bytes to be divisible by sizeof intp */
18
22
#if NPY_SIZEOF_INTP == 4
@@ -2702,32 +2706,33 @@ npyiter_shape_string(npy_intp n, npy_intp *vals, char *ending)
2702
2706
npy_intp i;
2703
2707
PyObject *ret, *tmp;
2704
2708
2705
- if (n <= 0) {
2706
- return PyString_FromString("()");
2709
+ /*
2710
+ * Negative dimension indicates "newaxis", which can
2711
+ * be discarded for printing if its a leading dimension.
2712
+ * Find the first non-"newaxis" dimension.
2713
+ */
2714
+ i = 0;
2715
+ while (i < n && vals[i] < 0) {
2716
+ ++i;
2707
2717
}
2708
2718
2709
- switch (n) {
2710
- case 1:
2711
- return PyString_FromFormat("(%zd)%s",
2712
- vals[0], ending);
2713
- case 2:
2714
- return PyString_FromFormat("(%zd,%zd)%s",
2715
- vals[0], vals[1], ending);
2716
- case 3:
2717
- return PyString_FromFormat("(%zd,%zd,%zd)%s",
2718
- vals[0], vals[1], vals[2], ending);
2719
- case 4:
2720
- return PyString_FromFormat("(%zd,%zd,%zd,%zd)%s",
2721
- vals[0], vals[1], vals[2], vals[3], ending);
2719
+ if (i == n) {
2720
+ return PyString_FromFormat("()%s", ending);
2722
2721
}
2723
-
2724
- ret = PyString_FromFormat("(%zd,%zd,%zd,%zd,%zd",
2725
- vals[0], vals[1], vals[2], vals[3], vals[4]);
2726
- if (ret == NULL) {
2727
- return NULL;
2722
+ else {
2723
+ ret = PyString_FromFormat("(%zd", vals[i]);
2724
+ if (ret == NULL) {
2725
+ return NULL;
2726
+ }
2728
2727
}
2729
- for (i = 5; i < n; ++i) {
2730
- tmp = PyString_FromFormat(",%zd", vals[i]);
2728
+
2729
+ for (; i < n; ++i) {
2730
+ if (vals[i] < 0) {
2731
+ tmp = PyString_FromString("newaxis");
2732
+ }
2733
+ else {
2734
+ tmp = PyString_FromFormat(",%zd", vals[i]);
2735
+ }
2731
2736
if (tmp == NULL) {
2732
2737
Py_DECREF(ret);
2733
2738
return NULL;
@@ -2738,6 +2743,7 @@ npyiter_shape_string(npy_intp n, npy_intp *vals, char *ending)
2738
2743
return NULL;
2739
2744
}
2740
2745
}
2746
+
2741
2747
tmp = PyString_FromFormat(")%s", ending);
2742
2748
PyString_ConcatAndDel(&ret, tmp);
2743
2749
return ret;
@@ -3080,7 +3086,7 @@ broadcast_error: {
3080
3086
remdims[idim] = PyArray_DIM(op[iiter], i);
3081
3087
}
3082
3088
else {
3083
- remdims[idim] = 1;
3089
+ remdims[idim] = - 1;
3084
3090
}
3085
3091
}
3086
3092
tmp = npyiter_shape_string(ndim, remdims, " ");
@@ -4406,7 +4412,8 @@ npyiter_copy_from_buffers(NpyIter *iter)
4406
4412
/* Copy back only if the pointer was pointing to the buffer */
4407
4413
npy_intp delta = (ptrs[iiter] - buffer);
4408
4414
if (0 <= delta && delta <= transfersize*dtypes[iiter]->elsize) {
4409
- NPY_IT_DBG_PRINTF("Iterator: Copying buffer to operand %d\n", (int)iiter);
4415
+ NPY_IT_DBG_PRINTF("Iterator: Copying buffer to "
4416
+ "operand %d\n", (int)iiter);
4410
4417
PyArray_TransferStridedToNDim(ndim,
4411
4418
ad_ptrs[iiter], &ad_strides[iiter], axisdata_incr,
4412
4419
buffer, strides[iiter],
@@ -4425,7 +4432,8 @@ npyiter_copy_from_buffers(NpyIter *iter)
4425
4432
/* Decrement refs only if the pointer was pointing to the buffer */
4426
4433
npy_intp delta = (ptrs[iiter] - buffer);
4427
4434
if (0 <= delta && delta <= transfersize*dtypes[iiter]->elsize) {
4428
- NPY_IT_DBG_PRINTF("Iterator: Freeing refs for buffer of operand %d\n", (int)iiter);
4435
+ NPY_IT_DBG_PRINTF("Iterator: Freeing refs for buffer "
4436
+ "of operand %d\n", (int)iiter);
4429
4437
/* Decrement refs */
4430
4438
stransfer(NULL, 0, buffer, dtypes[iiter]->elsize,
4431
4439
transfersize, dtypes[iiter]->elsize,
@@ -4546,11 +4554,13 @@ npyiter_copy_to_buffers(NpyIter *iter)
4546
4554
4547
4555
any_buffered = 1;
4548
4556
4549
- NPY_IT_DBG_PRINTF("Iterator: Copying operand %d to buffer\n", (int)iiter);
4557
+ NPY_IT_DBG_PRINTF("Iterator: Copying operand %d to "
4558
+ "buffer\n", (int)iiter);
4550
4559
4551
4560
/* If the data type requires zero-inititialization */
4552
4561
if (PyDataType_FLAGCHK(dtypes[iiter], NPY_NEEDS_INIT)) {
4553
- NPY_IT_DBG_PRINTF("Iterator: Buffer requires init, memsetting to 0\n");
4562
+ NPY_IT_DBG_PRINTF("Iterator: Buffer requires init, "
4563
+ "memsetting to 0\n");
4554
4564
memset(ptrs[iiter], 0, dtypes[iiter]->elsize*transfersize);
4555
4565
}
4556
4566
@@ -4566,7 +4576,9 @@ npyiter_copy_to_buffers(NpyIter *iter)
4566
4576
else if (ptrs[iiter] == buffers[iiter]) {
4567
4577
/* If the data type requires zero-inititialization */
4568
4578
if (PyDataType_FLAGCHK(dtypes[iiter], NPY_NEEDS_INIT)) {
4569
- NPY_IT_DBG_PRINTF("Iterator: Write-only buffer for operand %d requires init, memsetting to 0\n", (int)iiter);
4579
+ NPY_IT_DBG_PRINTF("Iterator: Write-only buffer for "
4580
+ "operand %d requires init, "
4581
+ "memsetting to 0\n", (int)iiter);
4570
4582
memset(ptrs[iiter], 0, dtypes[iiter]->elsize*transfersize);
4571
4583
}
4572
4584
}
@@ -4584,7 +4596,8 @@ npyiter_copy_to_buffers(NpyIter *iter)
4584
4596
}
4585
4597
}
4586
4598
4587
- NPY_IT_DBG_PRINTF("Iterator: Finished copying inputs to buffers (buffer size is %d)\n", (int)NBF_SIZE(bufferdata));
4599
+ NPY_IT_DBG_PRINTF("Iterator: Finished copying inputs to buffers "
4600
+ "(buffered size is %d)\n", (int)NBF_SIZE(bufferdata));
4588
4601
}
4589
4602
4590
4603
/*NUMPY_API
0 commit comments