Skip to content

Commit f6c5df8

Browse files
committed
ENH: core: Make the debug printf tracing macros more systematic
1 parent fb11cf1 commit f6c5df8

File tree

3 files changed

+104
-80
lines changed

3 files changed

+104
-80
lines changed

numpy/core/src/multiarray/dtype_transfer.c

+20-13
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,23 @@
1717

1818
#define NPY_LOWLEVEL_BUFFER_BLOCKSIZE 128
1919

20-
#if 0
21-
#define DTYPE_TRANSFER_REFTRACE(msg, ref) \
22-
printf("%-12s %20p (refcnt %d)%s\n", msg, ref, \
20+
/********** PRINTF DEBUG TRACING **************/
21+
#define NPY_DT_DBG_TRACING 0
22+
/* Tracing incref/decref can be very noisy */
23+
#define NPY_DT_REF_DBG_TRACING 0
24+
25+
#if NPY_DT_REF_DBG_TRACING
26+
#define NPY_DT_DBG_REFTRACE(msg, ref) \
27+
printf("%-12s %20p %s%d%s\n", msg, ref, \
28+
ref ? "(refcnt " : "", \
2329
ref ? (int)ref->ob_refcnt : 0, \
2430
ref ? ((ref->ob_refcnt <= 0) ? \
25-
" <- BIG PROBLEM!!!!" : "") : ""); \
31+
") <- BIG PROBLEM!!!!" : ")") : ""); \
2632
fflush(stdout);
2733
#else
28-
#define DTYPE_TRANSFER_REFTRACE(...)
34+
#define NPY_DT_DBG_REFTRACE(...)
2935
#endif
36+
/**********************************************/
3037

3138
/*
3239
* Returns a transfer function which DECREFs any references in src_type.
@@ -80,10 +87,10 @@ _strided_to_strided_move_references(char *dst, npy_intp dst_stride,
8087
NPY_COPY_PYOBJECT_PTR(&dst_ref, dst);
8188

8289
/* Release the reference in dst */
83-
DTYPE_TRANSFER_REFTRACE("dec dst ref", dst_ref);
90+
NPY_DT_DBG_REFTRACE("dec dst ref", dst_ref);
8491
Py_XDECREF(dst_ref);
8592
/* Move the reference */
86-
DTYPE_TRANSFER_REFTRACE("move src ref", src_ref);
93+
NPY_DT_DBG_REFTRACE("move src ref", src_ref);
8794
NPY_COPY_PYOBJECT_PTR(dst, &src_ref);
8895
/* Set the source reference to NULL */
8996
src_ref = NULL;
@@ -108,10 +115,10 @@ _strided_to_strided_copy_references(char *dst, npy_intp dst_stride,
108115
NPY_COPY_PYOBJECT_PTR(&dst_ref, dst);
109116

110117
/* Release the reference in dst */
111-
DTYPE_TRANSFER_REFTRACE("dec dst ref", dst_ref);
118+
NPY_DT_DBG_REFTRACE("dec dst ref", dst_ref);
112119
Py_XDECREF(dst_ref);
113120
/* Copy the reference */
114-
DTYPE_TRANSFER_REFTRACE("copy src ref", src_ref);
121+
NPY_DT_DBG_REFTRACE("copy src ref", src_ref);
115122
NPY_COPY_PYOBJECT_PTR(dst, &src_ref);
116123
/* Claim the reference */
117124
Py_XINCREF(src_ref);
@@ -584,7 +591,7 @@ _aligned_strided_to_strided_cast_decref_src(char *dst, npy_intp dst_stride,
584591

585592
/* After casting, decrement the source ref */
586593
NPY_COPY_PYOBJECT_PTR(&src_ref, src);
587-
DTYPE_TRANSFER_REFTRACE("dec src ref (cast object -> not object)", src_ref);
594+
NPY_DT_DBG_REFTRACE("dec src ref (cast object -> not object)", src_ref);
588595
Py_XDECREF(src_ref);
589596

590597
dst += dst_stride;
@@ -2492,7 +2499,7 @@ _null_to_strided_reference_setzero(char *dst,
24922499
NPY_COPY_PYOBJECT_PTR(&dst_ref, dst);
24932500

24942501
/* Release the reference in dst */
2495-
DTYPE_TRANSFER_REFTRACE("dec dest ref (to set zero)", dst_ref);
2502+
NPY_DT_DBG_REFTRACE("dec dest ref (to set zero)", dst_ref);
24962503
Py_XDECREF(dst_ref);
24972504

24982505
/* Set it to zero */
@@ -2622,7 +2629,7 @@ _strided_to_null_dec_src_ref_reference(char *NPY_UNUSED(dst),
26222629
NPY_COPY_PYOBJECT_PTR(&src_ref, src);
26232630

26242631
/* Release the reference in src */
2625-
DTYPE_TRANSFER_REFTRACE("dec src ref (null dst)", src_ref);
2632+
NPY_DT_DBG_REFTRACE("dec src ref (null dst)", src_ref);
26262633
Py_XDECREF(src_ref);
26272634

26282635
src += src_stride;
@@ -2725,7 +2732,7 @@ PyArray_GetDTypeTransferFunction(int aligned,
27252732
npy_intp src_itemsize, dst_itemsize;
27262733
int src_type_num, dst_type_num;
27272734

2728-
#if 0
2735+
#if NPY_DT_DBG_TRACING
27292736
printf("Calculating dtype transfer from ");
27302737
PyObject_Print((PyObject *)src_dtype, stdout, 0);
27312738
printf(" to ");

numpy/core/src/multiarray/new_iterator.c.src

+43-30
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,15 @@
88

99
#include "lowlevel_strided_loops.h"
1010

11-
#if 0
11+
/********** PRINTF DEBUG TRACING **************/
12+
#define NPY_IT_DBG_TRACING 0
13+
14+
#if NPY_IT_DBG_TRACING
1215
#define NPY_IT_DBG_PRINTF(...) printf(__VA_ARGS__)
1316
#else
1417
#define NPY_IT_DBG_PRINTF(...)
1518
#endif
19+
/**********************************************/
1620

1721
/* Rounds up a number of bytes to be divisible by sizeof intp */
1822
#if NPY_SIZEOF_INTP == 4
@@ -2702,32 +2706,33 @@ npyiter_shape_string(npy_intp n, npy_intp *vals, char *ending)
27022706
npy_intp i;
27032707
PyObject *ret, *tmp;
27042708

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;
27072717
}
27082718

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);
27222721
}
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+
}
27282727
}
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+
}
27312736
if (tmp == NULL) {
27322737
Py_DECREF(ret);
27332738
return NULL;
@@ -2738,6 +2743,7 @@ npyiter_shape_string(npy_intp n, npy_intp *vals, char *ending)
27382743
return NULL;
27392744
}
27402745
}
2746+
27412747
tmp = PyString_FromFormat(")%s", ending);
27422748
PyString_ConcatAndDel(&ret, tmp);
27432749
return ret;
@@ -3080,7 +3086,7 @@ broadcast_error: {
30803086
remdims[idim] = PyArray_DIM(op[iiter], i);
30813087
}
30823088
else {
3083-
remdims[idim] = 1;
3089+
remdims[idim] = -1;
30843090
}
30853091
}
30863092
tmp = npyiter_shape_string(ndim, remdims, " ");
@@ -4406,7 +4412,8 @@ npyiter_copy_from_buffers(NpyIter *iter)
44064412
/* Copy back only if the pointer was pointing to the buffer */
44074413
npy_intp delta = (ptrs[iiter] - buffer);
44084414
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);
44104417
PyArray_TransferStridedToNDim(ndim,
44114418
ad_ptrs[iiter], &ad_strides[iiter], axisdata_incr,
44124419
buffer, strides[iiter],
@@ -4425,7 +4432,8 @@ npyiter_copy_from_buffers(NpyIter *iter)
44254432
/* Decrement refs only if the pointer was pointing to the buffer */
44264433
npy_intp delta = (ptrs[iiter] - buffer);
44274434
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);
44294437
/* Decrement refs */
44304438
stransfer(NULL, 0, buffer, dtypes[iiter]->elsize,
44314439
transfersize, dtypes[iiter]->elsize,
@@ -4546,11 +4554,13 @@ npyiter_copy_to_buffers(NpyIter *iter)
45464554

45474555
any_buffered = 1;
45484556

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);
45504559

45514560
/* If the data type requires zero-inititialization */
45524561
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");
45544564
memset(ptrs[iiter], 0, dtypes[iiter]->elsize*transfersize);
45554565
}
45564566

@@ -4566,7 +4576,9 @@ npyiter_copy_to_buffers(NpyIter *iter)
45664576
else if (ptrs[iiter] == buffers[iiter]) {
45674577
/* If the data type requires zero-inititialization */
45684578
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);
45704582
memset(ptrs[iiter], 0, dtypes[iiter]->elsize*transfersize);
45714583
}
45724584
}
@@ -4584,7 +4596,8 @@ npyiter_copy_to_buffers(NpyIter *iter)
45844596
}
45854597
}
45864598

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));
45884601
}
45894602

45904603
/*NUMPY_API

0 commit comments

Comments
 (0)