@@ -262,7 +262,7 @@ _PyDict_ClearFreeList(PyInterpreterState *interp)
262
262
PyObject_GC_Del (op );
263
263
}
264
264
while (state -> keys_numfree ) {
265
- PyObject_Free (state -> keys_free_list [-- state -> keys_numfree ]);
265
+ PyMem_Free (state -> keys_free_list [-- state -> keys_numfree ]);
266
266
}
267
267
#endif
268
268
}
@@ -332,6 +332,22 @@ dictkeys_decref(PyInterpreterState *interp, PyDictKeysObject *dk)
332
332
_Py_DecRefTotal (_PyInterpreterState_GET ());
333
333
#endif
334
334
if (-- dk -> dk_refcnt == 0 ) {
335
+ if (DK_IS_UNICODE (dk )) {
336
+ PyDictUnicodeEntry * entries = DK_UNICODE_ENTRIES (dk );
337
+ Py_ssize_t i , n ;
338
+ for (i = 0 , n = dk -> dk_nentries ; i < n ; i ++ ) {
339
+ Py_XDECREF (entries [i ].me_key );
340
+ Py_XDECREF (entries [i ].me_value );
341
+ }
342
+ }
343
+ else {
344
+ PyDictKeyEntry * entries = DK_ENTRIES (dk );
345
+ Py_ssize_t i , n ;
346
+ for (i = 0 , n = dk -> dk_nentries ; i < n ; i ++ ) {
347
+ Py_XDECREF (entries [i ].me_key );
348
+ Py_XDECREF (entries [i ].me_value );
349
+ }
350
+ }
335
351
free_keys_object (interp , dk );
336
352
}
337
353
}
@@ -640,9 +656,9 @@ new_keys_object(PyInterpreterState *interp, uint8_t log2_size, bool unicode)
640
656
else
641
657
#endif
642
658
{
643
- dk = PyObject_Malloc (sizeof (PyDictKeysObject )
644
- + ((size_t )1 << log2_bytes )
645
- + entry_size * usable );
659
+ dk = PyMem_Malloc (sizeof (PyDictKeysObject )
660
+ + ((size_t )1 << log2_bytes )
661
+ + entry_size * usable );
646
662
if (dk == NULL ) {
647
663
PyErr_NoMemory ();
648
664
return NULL ;
@@ -666,23 +682,6 @@ new_keys_object(PyInterpreterState *interp, uint8_t log2_size, bool unicode)
666
682
static void
667
683
free_keys_object (PyInterpreterState * interp , PyDictKeysObject * keys )
668
684
{
669
- assert (keys != Py_EMPTY_KEYS );
670
- if (DK_IS_UNICODE (keys )) {
671
- PyDictUnicodeEntry * entries = DK_UNICODE_ENTRIES (keys );
672
- Py_ssize_t i , n ;
673
- for (i = 0 , n = keys -> dk_nentries ; i < n ; i ++ ) {
674
- Py_XDECREF (entries [i ].me_key );
675
- Py_XDECREF (entries [i ].me_value );
676
- }
677
- }
678
- else {
679
- PyDictKeyEntry * entries = DK_ENTRIES (keys );
680
- Py_ssize_t i , n ;
681
- for (i = 0 , n = keys -> dk_nentries ; i < n ; i ++ ) {
682
- Py_XDECREF (entries [i ].me_key );
683
- Py_XDECREF (entries [i ].me_value );
684
- }
685
- }
686
685
#if PyDict_MAXFREELIST > 0
687
686
struct _Py_dict_state * state = get_dict_state (interp );
688
687
#ifdef Py_DEBUG
@@ -697,7 +696,7 @@ free_keys_object(PyInterpreterState *interp, PyDictKeysObject *keys)
697
696
return ;
698
697
}
699
698
#endif
700
- PyObject_Free (keys );
699
+ PyMem_Free (keys );
701
700
}
702
701
703
702
static inline PyDictValues *
@@ -798,7 +797,7 @@ clone_combined_dict_keys(PyDictObject *orig)
798
797
assert (orig -> ma_keys -> dk_refcnt == 1 );
799
798
800
799
size_t keys_size = _PyDict_KeysSize (orig -> ma_keys );
801
- PyDictKeysObject * keys = PyObject_Malloc (keys_size );
800
+ PyDictKeysObject * keys = PyMem_Malloc (keys_size );
802
801
if (keys == NULL ) {
803
802
PyErr_NoMemory ();
804
803
return NULL ;
@@ -1544,32 +1543,13 @@ dictresize(PyInterpreterState *interp, PyDictObject *mp,
1544
1543
}
1545
1544
}
1546
1545
1547
- // We can not use free_keys_object here because key's reference
1548
- // are moved already.
1549
1546
if (oldkeys != Py_EMPTY_KEYS ) {
1550
1547
#ifdef Py_REF_DEBUG
1551
1548
_Py_DecRefTotal (_PyInterpreterState_GET ());
1552
1549
#endif
1553
1550
assert (oldkeys -> dk_kind != DICT_KEYS_SPLIT );
1554
1551
assert (oldkeys -> dk_refcnt == 1 );
1555
- #if PyDict_MAXFREELIST > 0
1556
- struct _Py_dict_state * state = get_dict_state (interp );
1557
- #ifdef Py_DEBUG
1558
- // dictresize() must not be called after _PyDict_Fini()
1559
- assert (state -> keys_numfree != -1 );
1560
- #endif
1561
- if (DK_LOG_SIZE (oldkeys ) == PyDict_LOG_MINSIZE &&
1562
- DK_IS_UNICODE (oldkeys ) &&
1563
- state -> keys_numfree < PyDict_MAXFREELIST )
1564
- {
1565
- state -> keys_free_list [state -> keys_numfree ++ ] = oldkeys ;
1566
- OBJECT_STAT_INC (to_freelist );
1567
- }
1568
- else
1569
- #endif
1570
- {
1571
- PyObject_Free (oldkeys );
1572
- }
1552
+ free_keys_object (interp , oldkeys );
1573
1553
}
1574
1554
}
1575
1555
0 commit comments