Skip to content

Commit dc54ec0

Browse files
committed
Shrink traceback_t.nframe to uint16_t
1 parent b3cafec commit dc54ec0

File tree

1 file changed

+8
-7
lines changed

1 file changed

+8
-7
lines changed

Modules/_tracemalloc.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ __attribute__((packed))
7979
typedef struct {
8080
Py_uhash_t hash;
8181
/* Number of frames stored */
82-
int nframe;
82+
uint16_t nframe;
8383
/* Total number of frames the traceback had */
8484
uint16_t total_nframe;
8585
frame_t frames[1];
@@ -88,8 +88,10 @@ typedef struct {
8888
#define TRACEBACK_SIZE(NFRAME) \
8989
(sizeof(traceback_t) + sizeof(frame_t) * (NFRAME - 1))
9090

91-
#define MAX_NFRAME \
92-
((INT_MAX - (int)sizeof(traceback_t)) / (int)sizeof(frame_t) + 1)
91+
/* The maximum number of frames is either:
92+
- The maximum number of frames we can store in `traceback_t.nframe`
93+
- The maximum memory size_t we can allocate */
94+
static const unsigned long MAX_NFRAME = Py_MIN(UINT16_MAX, ((SIZE_MAX - sizeof(traceback_t)) / sizeof(frame_t) + 1));
9395

9496

9597
static PyObject *unknown_filename = NULL;
@@ -1057,10 +1059,10 @@ tracemalloc_start(int max_nframe)
10571059
PyMemAllocatorEx alloc;
10581060
size_t size;
10591061

1060-
if (max_nframe < 1 || max_nframe > MAX_NFRAME) {
1062+
if (max_nframe < 1 || (unsigned long) max_nframe > MAX_NFRAME) {
10611063
PyErr_Format(PyExc_ValueError,
1062-
"the number of frames must be in range [1; %i]",
1063-
(int)MAX_NFRAME);
1064+
"the number of frames must be in range [1; %lu]",
1065+
MAX_NFRAME);
10641066
return -1;
10651067
}
10661068

@@ -1073,7 +1075,6 @@ tracemalloc_start(int max_nframe)
10731075
return 0;
10741076
}
10751077

1076-
assert(1 <= max_nframe && max_nframe <= MAX_NFRAME);
10771078
_Py_tracemalloc_config.max_nframe = max_nframe;
10781079

10791080
/* allocate a buffer to store a new traceback */

0 commit comments

Comments
 (0)