@@ -16,6 +16,9 @@ static void raw_free(void *ptr);
16
16
# define TRACE_DEBUG
17
17
#endif
18
18
19
+ #define TO_PTR (key ) ((const void *)(uintptr_t)key)
20
+ #define FROM_PTR (key ) ((uintptr_t)key)
21
+
19
22
/* Protected by the GIL */
20
23
static struct {
21
24
PyMemAllocatorEx mem ;
@@ -226,28 +229,24 @@ set_reentrant(int reentrant)
226
229
227
230
228
231
static Py_uhash_t
229
- hashtable_hash_pyobject (_Py_hashtable_t * ht , const void * pkey )
232
+ hashtable_hash_pyobject (const void * key )
230
233
{
231
- PyObject * obj ;
232
-
233
- _Py_HASHTABLE_READ_KEY (ht , pkey , obj );
234
+ PyObject * obj = (PyObject * )key ;
234
235
return PyObject_Hash (obj );
235
236
}
236
237
237
238
238
239
static int
239
- hashtable_compare_unicode (_Py_hashtable_t * ht , const void * pkey ,
240
- const _Py_hashtable_entry_t * entry )
240
+ hashtable_compare_unicode (const void * key1 , const void * key2 )
241
241
{
242
- PyObject * key1 , * key2 ;
243
-
244
- _Py_HASHTABLE_READ_KEY (ht , pkey , key1 );
245
- _Py_HASHTABLE_ENTRY_READ_KEY (ht , entry , key2 );
246
-
247
- if (key1 != NULL && key2 != NULL )
248
- return (PyUnicode_Compare (key1 , key2 ) == 0 );
249
- else
250
- return key1 == key2 ;
242
+ PyObject * obj1 = (PyObject * )key1 ;
243
+ PyObject * obj2 = (PyObject * )key2 ;
244
+ if (obj1 != NULL && obj2 != NULL ) {
245
+ return (PyUnicode_Compare (obj1 , obj2 ) == 0 );
246
+ }
247
+ else {
248
+ return obj1 == obj2 ;
249
+ }
251
250
}
252
251
253
252
@@ -266,28 +265,24 @@ hashtable_hash_pointer_t(_Py_hashtable_t *ht, const void *pkey)
266
265
267
266
268
267
static int
269
- hashtable_compare_pointer_t (_Py_hashtable_t * ht , const void * pkey ,
270
- const _Py_hashtable_entry_t * entry )
268
+ hashtable_compare_pointer_t (const void * key1 , const void * key2 )
271
269
{
272
- pointer_t ptr1 , ptr2 ;
273
-
274
- _Py_HASHTABLE_READ_KEY (ht , pkey , ptr1 );
275
- _Py_HASHTABLE_ENTRY_READ_KEY (ht , entry , ptr2 );
270
+ const pointer_t ptr1 = (pointer_t )key1 ;
271
+ const pointer_t ptr2 = (pointer_t )key2 ;
276
272
277
273
/* compare pointer before domain, because pointer is more likely to be
278
274
different */
279
275
return (ptr1 .ptr == ptr2 .ptr && ptr1 .domain == ptr2 .domain );
280
-
281
276
}
282
277
283
278
284
279
static _Py_hashtable_t *
285
- hashtable_new (size_t key_size , size_t data_size ,
280
+ hashtable_new (size_t data_size ,
286
281
_Py_hashtable_hash_func hash_func ,
287
282
_Py_hashtable_compare_func compare_func )
288
283
{
289
284
_Py_hashtable_allocator_t hashtable_alloc = {malloc , free };
290
- return _Py_hashtable_new_full (key_size , data_size , 0 ,
285
+ return _Py_hashtable_new_full (data_size , 0 ,
291
286
hash_func , compare_func ,
292
287
& hashtable_alloc );
293
288
}
@@ -307,35 +302,33 @@ raw_free(void *ptr)
307
302
308
303
309
304
static Py_uhash_t
310
- hashtable_hash_traceback (_Py_hashtable_t * ht , const void * pkey )
305
+ hashtable_hash_traceback (const void * key )
311
306
{
312
- traceback_t * traceback ;
313
-
314
- _Py_HASHTABLE_READ_KEY (ht , pkey , traceback );
307
+ const traceback_t * traceback = (const traceback_t * )key ;
315
308
return traceback -> hash ;
316
309
}
317
310
318
311
319
312
static int
320
- hashtable_compare_traceback (_Py_hashtable_t * ht , const void * pkey ,
321
- const _Py_hashtable_entry_t * entry )
313
+ hashtable_compare_traceback (const void * key1 , const void * key2 )
322
314
{
323
- traceback_t * traceback1 , * traceback2 ;
324
- const frame_t * frame1 , * frame2 ;
325
- int i ;
326
-
327
- _Py_HASHTABLE_READ_KEY (ht , pkey , traceback1 );
328
- _Py_HASHTABLE_ENTRY_READ_KEY (ht , entry , traceback2 );
315
+ const traceback_t * traceback1 = (const traceback_t * )key1 ;
316
+ const traceback_t * traceback2 = (const traceback_t * )key2 ;
329
317
330
- if (traceback1 -> nframe != traceback2 -> nframe )
318
+ if (traceback1 -> nframe != traceback2 -> nframe ) {
331
319
return 0 ;
320
+ }
321
+ if (traceback1 -> total_nframe != traceback2 -> total_nframe ) {
322
+ return 0 ;
323
+ }
332
324
333
- for (i = 0 ; i < traceback1 -> nframe ; i ++ ) {
334
- frame1 = & traceback1 -> frames [i ];
335
- frame2 = & traceback2 -> frames [i ];
325
+ for (int i = 0 ; i < traceback1 -> nframe ; i ++ ) {
326
+ const frame_t * frame1 = & traceback1 -> frames [i ];
327
+ const frame_t * frame2 = & traceback2 -> frames [i ];
336
328
337
- if (frame1 -> lineno != frame2 -> lineno )
329
+ if (frame1 -> lineno != frame2 -> lineno ) {
338
330
return 0 ;
331
+ }
339
332
340
333
if (frame1 -> filename != frame2 -> filename ) {
341
334
assert (PyUnicode_Compare (frame1 -> filename , frame2 -> filename ) != 0 );
@@ -398,7 +391,7 @@ tracemalloc_get_frame(PyFrameObject *pyframe, frame_t *frame)
398
391
/* intern the filename */
399
392
entry = _Py_HASHTABLE_GET_ENTRY (tracemalloc_filenames , filename );
400
393
if (entry != NULL ) {
401
- _Py_HASHTABLE_ENTRY_READ_KEY ( tracemalloc_filenames , entry , filename ) ;
394
+ filename = ( PyObject * ) entry -> key ;
402
395
}
403
396
else {
404
397
/* tracemalloc_filenames is responsible to keep a reference
@@ -492,7 +485,7 @@ traceback_new(void)
492
485
/* intern the traceback */
493
486
entry = _Py_HASHTABLE_GET_ENTRY (tracemalloc_tracebacks , traceback );
494
487
if (entry != NULL ) {
495
- _Py_HASHTABLE_ENTRY_READ_KEY ( tracemalloc_tracebacks , entry , traceback ) ;
488
+ traceback = ( traceback_t * ) entry -> key ;
496
489
}
497
490
else {
498
491
traceback_t * copy ;
@@ -932,9 +925,7 @@ static int
932
925
tracemalloc_clear_filename (_Py_hashtable_t * ht , _Py_hashtable_entry_t * entry ,
933
926
void * user_data )
934
927
{
935
- PyObject * filename ;
936
-
937
- _Py_HASHTABLE_ENTRY_READ_KEY (ht , entry , filename );
928
+ PyObject * filename = (PyObject * )entry -> key ;
938
929
Py_DECREF (filename );
939
930
return 0 ;
940
931
}
@@ -944,9 +935,7 @@ static int
944
935
traceback_free_traceback (_Py_hashtable_t * ht , _Py_hashtable_entry_t * entry ,
945
936
void * user_data )
946
937
{
947
- traceback_t * traceback ;
948
-
949
- _Py_HASHTABLE_ENTRY_READ_KEY (ht , entry , traceback );
938
+ traceback_t * traceback = (traceback_t * )entry -> key ;
950
939
raw_free (traceback );
951
940
return 0 ;
952
941
}
@@ -1011,11 +1000,11 @@ tracemalloc_init(void)
1011
1000
}
1012
1001
#endif
1013
1002
1014
- tracemalloc_filenames = hashtable_new (sizeof ( PyObject * ), 0 ,
1003
+ tracemalloc_filenames = hashtable_new (0 ,
1015
1004
hashtable_hash_pyobject ,
1016
1005
hashtable_compare_unicode );
1017
1006
1018
- tracemalloc_tracebacks = hashtable_new (sizeof ( traceback_t * ), 0 ,
1007
+ tracemalloc_tracebacks = hashtable_new (0 ,
1019
1008
hashtable_hash_traceback ,
1020
1009
hashtable_compare_traceback );
1021
1010
@@ -1227,7 +1216,7 @@ traceback_to_pyobject(traceback_t *traceback, _Py_hashtable_t *intern_table)
1227
1216
PyObject * frames , * frame ;
1228
1217
1229
1218
if (intern_table != NULL ) {
1230
- if (_Py_HASHTABLE_GET (intern_table , traceback , frames )) {
1219
+ if (_Py_HASHTABLE_GET (intern_table , ( const void * ) traceback , frames )) {
1231
1220
Py_INCREF (frames );
1232
1221
return frames ;
1233
1222
}
@@ -1431,7 +1420,7 @@ tracemalloc_get_traceback(_PyTraceMalloc_domain_t domain, uintptr_t ptr)
1431
1420
found = _Py_HASHTABLE_GET (tracemalloc_traces , key , trace );
1432
1421
}
1433
1422
else {
1434
- found = _Py_HASHTABLE_GET (tracemalloc_traces , ptr , trace );
1423
+ found = _Py_HASHTABLE_GET (tracemalloc_traces , TO_PTR ( ptr ) , trace );
1435
1424
}
1436
1425
TABLES_UNLOCK ();
1437
1426
0 commit comments