@@ -302,17 +302,31 @@ PyDict_Fini(void)
302
302
#define DK_ENTRIES (dk ) \
303
303
((PyDictKeyEntry*)(&((int8_t*)((dk)->dk_indices))[DK_SIZE(dk) * DK_IXSIZE(dk)]))
304
304
305
- #define DK_DEBUG_INCREF _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA
306
- #define DK_DEBUG_DECREF _Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA
307
-
308
- #define DK_INCREF (dk ) (DK_DEBUG_INCREF ++(dk)->dk_refcnt)
309
- #define DK_DECREF (dk ) if (DK_DEBUG_DECREF (--(dk)->dk_refcnt) == 0) free_keys_object(dk)
310
305
#define DK_MASK (dk ) (((dk)->dk_size)-1)
311
306
#define IS_POWER_OF_2 (x ) (((x) & (x-1)) == 0)
312
307
308
+ static void free_keys_object (PyDictKeysObject * keys );
309
+
310
+ static inline void
311
+ dictkeys_incref (PyDictKeysObject * dk )
312
+ {
313
+ _Py_INC_REFTOTAL ;
314
+ dk -> dk_refcnt ++ ;
315
+ }
316
+
317
+ static inline void
318
+ dictkeys_decref (PyDictKeysObject * dk )
319
+ {
320
+ assert (dk -> dk_refcnt > 0 );
321
+ _Py_DEC_REFTOTAL ;
322
+ if (-- dk -> dk_refcnt == 0 ) {
323
+ free_keys_object (dk );
324
+ }
325
+ }
326
+
313
327
/* lookup indices. returns DKIX_EMPTY, DKIX_DUMMY, or ix >=0 */
314
328
static inline Py_ssize_t
315
- dk_get_index (PyDictKeysObject * keys , Py_ssize_t i )
329
+ dictkeys_get_index (PyDictKeysObject * keys , Py_ssize_t i )
316
330
{
317
331
Py_ssize_t s = DK_SIZE (keys );
318
332
Py_ssize_t ix ;
@@ -341,7 +355,7 @@ dk_get_index(PyDictKeysObject *keys, Py_ssize_t i)
341
355
342
356
/* write to indices. */
343
357
static inline void
344
- dk_set_index (PyDictKeysObject * keys , Py_ssize_t i , Py_ssize_t ix )
358
+ dictkeys_set_index (PyDictKeysObject * keys , Py_ssize_t i , Py_ssize_t ix )
345
359
{
346
360
Py_ssize_t s = DK_SIZE (keys );
347
361
@@ -464,7 +478,7 @@ _PyDict_CheckConsistency(PyDictObject *mp)
464
478
465
479
#ifdef DEBUG_PYDICT
466
480
for (i = 0 ; i < keys -> dk_size ; i ++ ) {
467
- Py_ssize_t ix = dk_get_index (keys , i );
481
+ Py_ssize_t ix = dictkeys_get_index (keys , i );
468
482
ASSERT (DKIX_DUMMY <= ix && ix <= usable );
469
483
}
470
484
@@ -543,7 +557,8 @@ static PyDictKeysObject *new_keys_object(Py_ssize_t size)
543
557
return NULL ;
544
558
}
545
559
}
546
- DK_DEBUG_INCREF dk -> dk_refcnt = 1 ;
560
+ _Py_INC_REFTOTAL ;
561
+ dk -> dk_refcnt = 1 ;
547
562
dk -> dk_size = size ;
548
563
dk -> dk_usable = usable ;
549
564
dk -> dk_lookup = lookdict_unicode_nodummy ;
@@ -587,7 +602,7 @@ new_dict(PyDictKeysObject *keys, PyObject **values)
587
602
else {
588
603
mp = PyObject_GC_New (PyDictObject , & PyDict_Type );
589
604
if (mp == NULL ) {
590
- DK_DECREF (keys );
605
+ dictkeys_decref (keys );
591
606
free_values (values );
592
607
return NULL ;
593
608
}
@@ -610,7 +625,7 @@ new_dict_with_shared_keys(PyDictKeysObject *keys)
610
625
size = USABLE_FRACTION (DK_SIZE (keys ));
611
626
values = new_values (size );
612
627
if (values == NULL ) {
613
- DK_DECREF (keys );
628
+ dictkeys_decref (keys );
614
629
return PyErr_NoMemory ();
615
630
}
616
631
for (i = 0 ; i < size ; i ++ ) {
@@ -665,7 +680,7 @@ clone_combined_dict(PyDictObject *orig)
665
680
666
681
/* Since we copied the keys table we now have an extra reference
667
682
in the system. Manually call _Py_INC_REFTOTAL to signal that
668
- we have it now; calling DK_INCREF would be an error as
683
+ we have it now; calling dictkeys_incref would be an error as
669
684
keys->dk_refcnt is already set to 1 (after memcpy). */
670
685
_Py_INC_REFTOTAL ;
671
686
@@ -690,7 +705,7 @@ lookdict_index(PyDictKeysObject *k, Py_hash_t hash, Py_ssize_t index)
690
705
size_t i = (size_t )hash & mask ;
691
706
692
707
for (;;) {
693
- Py_ssize_t ix = dk_get_index (k , i );
708
+ Py_ssize_t ix = dictkeys_get_index (k , i );
694
709
if (ix == index ) {
695
710
return i ;
696
711
}
@@ -743,7 +758,7 @@ lookdict(PyDictObject *mp, PyObject *key,
743
758
i = (size_t )hash & mask ;
744
759
745
760
for (;;) {
746
- Py_ssize_t ix = dk_get_index (dk , i );
761
+ Py_ssize_t ix = dictkeys_get_index (dk , i );
747
762
if (ix == DKIX_EMPTY ) {
748
763
* value_addr = NULL ;
749
764
return ix ;
@@ -803,7 +818,7 @@ lookdict_unicode(PyDictObject *mp, PyObject *key,
803
818
size_t i = (size_t )hash & mask ;
804
819
805
820
for (;;) {
806
- Py_ssize_t ix = dk_get_index (mp -> ma_keys , i );
821
+ Py_ssize_t ix = dictkeys_get_index (mp -> ma_keys , i );
807
822
if (ix == DKIX_EMPTY ) {
808
823
* value_addr = NULL ;
809
824
return DKIX_EMPTY ;
@@ -846,7 +861,7 @@ lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
846
861
size_t i = (size_t )hash & mask ;
847
862
848
863
for (;;) {
849
- Py_ssize_t ix = dk_get_index (mp -> ma_keys , i );
864
+ Py_ssize_t ix = dictkeys_get_index (mp -> ma_keys , i );
850
865
assert (ix != DKIX_DUMMY );
851
866
if (ix == DKIX_EMPTY ) {
852
867
* value_addr = NULL ;
@@ -891,7 +906,7 @@ lookdict_split(PyDictObject *mp, PyObject *key,
891
906
size_t i = (size_t )hash & mask ;
892
907
893
908
for (;;) {
894
- Py_ssize_t ix = dk_get_index (mp -> ma_keys , i );
909
+ Py_ssize_t ix = dictkeys_get_index (mp -> ma_keys , i );
895
910
assert (ix != DKIX_DUMMY );
896
911
if (ix == DKIX_EMPTY ) {
897
912
* value_addr = NULL ;
@@ -983,11 +998,11 @@ find_empty_slot(PyDictKeysObject *keys, Py_hash_t hash)
983
998
984
999
const size_t mask = DK_MASK (keys );
985
1000
size_t i = hash & mask ;
986
- Py_ssize_t ix = dk_get_index (keys , i );
1001
+ Py_ssize_t ix = dictkeys_get_index (keys , i );
987
1002
for (size_t perturb = hash ; ix >= 0 ;) {
988
1003
perturb >>= PERTURB_SHIFT ;
989
1004
i = (i * 5 + perturb + 1 ) & mask ;
990
- ix = dk_get_index (keys , i );
1005
+ ix = dictkeys_get_index (keys , i );
991
1006
}
992
1007
return i ;
993
1008
}
@@ -1044,7 +1059,7 @@ insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
1044
1059
}
1045
1060
Py_ssize_t hashpos = find_empty_slot (mp -> ma_keys , hash );
1046
1061
ep = & DK_ENTRIES (mp -> ma_keys )[mp -> ma_keys -> dk_nentries ];
1047
- dk_set_index (mp -> ma_keys , hashpos , mp -> ma_keys -> dk_nentries );
1062
+ dictkeys_set_index (mp -> ma_keys , hashpos , mp -> ma_keys -> dk_nentries );
1048
1063
ep -> me_key = key ;
1049
1064
ep -> me_hash = hash ;
1050
1065
if (mp -> ma_values ) {
@@ -1098,11 +1113,11 @@ build_indices(PyDictKeysObject *keys, PyDictKeyEntry *ep, Py_ssize_t n)
1098
1113
for (Py_ssize_t ix = 0 ; ix != n ; ix ++ , ep ++ ) {
1099
1114
Py_hash_t hash = ep -> me_hash ;
1100
1115
size_t i = hash & mask ;
1101
- for (size_t perturb = hash ; dk_get_index (keys , i ) != DKIX_EMPTY ;) {
1116
+ for (size_t perturb = hash ; dictkeys_get_index (keys , i ) != DKIX_EMPTY ;) {
1102
1117
perturb >>= PERTURB_SHIFT ;
1103
1118
i = mask & (i * 5 + perturb + 1 );
1104
1119
}
1105
- dk_set_index (keys , i , ix );
1120
+ dictkeys_set_index (keys , i , ix );
1106
1121
}
1107
1122
}
1108
1123
@@ -1171,7 +1186,7 @@ dictresize(PyDictObject *mp, Py_ssize_t minsize)
1171
1186
newentries [i ].me_value = oldvalues [i ];
1172
1187
}
1173
1188
1174
- DK_DECREF (oldkeys );
1189
+ dictkeys_decref (oldkeys );
1175
1190
mp -> ma_values = NULL ;
1176
1191
if (oldvalues != empty_values ) {
1177
1192
free_values (oldvalues );
@@ -1194,10 +1209,12 @@ dictresize(PyDictObject *mp, Py_ssize_t minsize)
1194
1209
assert (oldkeys -> dk_refcnt == 1 );
1195
1210
if (oldkeys -> dk_size == PyDict_MINSIZE &&
1196
1211
numfreekeys < PyDict_MAXFREELIST ) {
1197
- DK_DEBUG_DECREF keys_free_list [numfreekeys ++ ] = oldkeys ;
1212
+ _Py_DEC_REFTOTAL ;
1213
+ keys_free_list [numfreekeys ++ ] = oldkeys ;
1198
1214
}
1199
1215
else {
1200
- DK_DEBUG_DECREF PyObject_FREE (oldkeys );
1216
+ _Py_DEC_REFTOTAL ;
1217
+ PyObject_FREE (oldkeys );
1201
1218
}
1202
1219
}
1203
1220
@@ -1247,7 +1264,7 @@ make_keys_shared(PyObject *op)
1247
1264
mp -> ma_keys -> dk_lookup = lookdict_split ;
1248
1265
mp -> ma_values = values ;
1249
1266
}
1250
- DK_INCREF (mp -> ma_keys );
1267
+ dictkeys_incref (mp -> ma_keys );
1251
1268
return mp -> ma_keys ;
1252
1269
}
1253
1270
@@ -1499,7 +1516,7 @@ delitem_common(PyDictObject *mp, Py_hash_t hash, Py_ssize_t ix,
1499
1516
mp -> ma_used -- ;
1500
1517
mp -> ma_version_tag = DICT_NEXT_VERSION ();
1501
1518
ep = & DK_ENTRIES (mp -> ma_keys )[ix ];
1502
- dk_set_index (mp -> ma_keys , hashpos , DKIX_DUMMY );
1519
+ dictkeys_set_index (mp -> ma_keys , hashpos , DKIX_DUMMY );
1503
1520
ENSURE_ALLOWS_DELETIONS (mp );
1504
1521
old_key = ep -> me_key ;
1505
1522
ep -> me_key = NULL ;
@@ -1630,7 +1647,7 @@ PyDict_Clear(PyObject *op)
1630
1647
if (oldvalues == empty_values )
1631
1648
return ;
1632
1649
/* Empty the dict... */
1633
- DK_INCREF (Py_EMPTY_KEYS );
1650
+ dictkeys_incref (Py_EMPTY_KEYS );
1634
1651
mp -> ma_keys = Py_EMPTY_KEYS ;
1635
1652
mp -> ma_values = empty_values ;
1636
1653
mp -> ma_used = 0 ;
@@ -1641,11 +1658,11 @@ PyDict_Clear(PyObject *op)
1641
1658
for (i = 0 ; i < n ; i ++ )
1642
1659
Py_CLEAR (oldvalues [i ]);
1643
1660
free_values (oldvalues );
1644
- DK_DECREF (oldkeys );
1661
+ dictkeys_decref (oldkeys );
1645
1662
}
1646
1663
else {
1647
1664
assert (oldkeys -> dk_refcnt == 1 );
1648
- DK_DECREF (oldkeys );
1665
+ dictkeys_decref (oldkeys );
1649
1666
}
1650
1667
assert (_PyDict_CheckConsistency (mp ));
1651
1668
}
@@ -1769,7 +1786,7 @@ _PyDict_Pop_KnownHash(PyObject *dict, PyObject *key, Py_hash_t hash, PyObject *d
1769
1786
assert (old_value != NULL );
1770
1787
mp -> ma_used -- ;
1771
1788
mp -> ma_version_tag = DICT_NEXT_VERSION ();
1772
- dk_set_index (mp -> ma_keys , hashpos , DKIX_DUMMY );
1789
+ dictkeys_set_index (mp -> ma_keys , hashpos , DKIX_DUMMY );
1773
1790
ep = & DK_ENTRIES (mp -> ma_keys )[ix ];
1774
1791
ENSURE_ALLOWS_DELETIONS (mp );
1775
1792
old_key = ep -> me_key ;
@@ -1910,11 +1927,11 @@ dict_dealloc(PyDictObject *mp)
1910
1927
}
1911
1928
free_values (values );
1912
1929
}
1913
- DK_DECREF (keys );
1930
+ dictkeys_decref (keys );
1914
1931
}
1915
1932
else if (keys != NULL) {
1916
1933
assert (keys -> dk_refcnt == 1 );
1917
- DK_DECREF (keys );
1934
+ dictkeys_decref (keys );
1918
1935
}
1919
1936
if (numfree < PyDict_MAXFREELIST && Py_TYPE (mp ) == & PyDict_Type )
1920
1937
free_list [numfree ++ ] = mp ;
@@ -2563,7 +2580,7 @@ PyDict_Copy(PyObject *o)
2563
2580
split_copy -> ma_keys = mp -> ma_keys ;
2564
2581
split_copy -> ma_used = mp -> ma_used ;
2565
2582
split_copy -> ma_version_tag = DICT_NEXT_VERSION ();
2566
- DK_INCREF (mp -> ma_keys );
2583
+ dictkeys_incref (mp -> ma_keys );
2567
2584
for (i = 0 , n = size ; i < n ; i ++ ) {
2568
2585
PyObject * value = mp -> ma_values [i ];
2569
2586
Py_XINCREF (value );
@@ -2828,7 +2845,7 @@ PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *defaultobj)
2828
2845
Py_ssize_t hashpos = find_empty_slot (mp -> ma_keys , hash );
2829
2846
ep0 = DK_ENTRIES (mp -> ma_keys );
2830
2847
ep = & ep0 [mp -> ma_keys -> dk_nentries ];
2831
- dk_set_index (mp -> ma_keys , hashpos , mp -> ma_keys -> dk_nentries );
2848
+ dictkeys_set_index (mp -> ma_keys , hashpos , mp -> ma_keys -> dk_nentries );
2832
2849
Py_INCREF (key );
2833
2850
Py_INCREF (value );
2834
2851
MAINTAIN_TRACKING (mp , key , value );
@@ -2949,8 +2966,8 @@ dict_popitem(PyDictObject *mp, PyObject *Py_UNUSED(ignored))
2949
2966
ep = & ep0 [i ];
2950
2967
j = lookdict_index (mp -> ma_keys , ep -> me_hash , i );
2951
2968
assert (j >= 0 );
2952
- assert (dk_get_index (mp -> ma_keys , j ) == i );
2953
- dk_set_index (mp -> ma_keys , j , DKIX_DUMMY );
2969
+ assert (dictkeys_get_index (mp -> ma_keys , j ) == i );
2970
+ dictkeys_set_index (mp -> ma_keys , j , DKIX_DUMMY );
2954
2971
2955
2972
PyTuple_SET_ITEM (res , 0 , ep -> me_key );
2956
2973
PyTuple_SET_ITEM (res , 1 , ep -> me_value );
@@ -4460,7 +4477,7 @@ PyObject_GenericGetDict(PyObject *obj, void *context)
4460
4477
if (dict == NULL ) {
4461
4478
PyTypeObject * tp = Py_TYPE (obj );
4462
4479
if ((tp -> tp_flags & Py_TPFLAGS_HEAPTYPE ) && CACHED_KEYS (tp )) {
4463
- DK_INCREF (CACHED_KEYS (tp ));
4480
+ dictkeys_incref (CACHED_KEYS (tp ));
4464
4481
* dictptr = dict = new_dict_with_shared_keys (CACHED_KEYS (tp ));
4465
4482
}
4466
4483
else {
@@ -4484,7 +4501,7 @@ _PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr,
4484
4501
assert (dictptr != NULL );
4485
4502
dict = * dictptr ;
4486
4503
if (dict == NULL ) {
4487
- DK_INCREF (cached );
4504
+ dictkeys_incref (cached );
4488
4505
dict = new_dict_with_shared_keys (cached );
4489
4506
if (dict == NULL )
4490
4507
return -1 ;
@@ -4496,7 +4513,7 @@ _PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr,
4496
4513
// always converts dict to combined form.
4497
4514
if ((cached = CACHED_KEYS (tp )) != NULL ) {
4498
4515
CACHED_KEYS (tp ) = NULL ;
4499
- DK_DECREF (cached );
4516
+ dictkeys_decref (cached );
4500
4517
}
4501
4518
}
4502
4519
else {
@@ -4525,7 +4542,7 @@ _PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr,
4525
4542
else {
4526
4543
CACHED_KEYS (tp ) = NULL ;
4527
4544
}
4528
- DK_DECREF (cached );
4545
+ dictkeys_decref (cached );
4529
4546
if (CACHED_KEYS (tp ) == NULL && PyErr_Occurred ())
4530
4547
return -1 ;
4531
4548
}
@@ -4550,5 +4567,5 @@ _PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr,
4550
4567
void
4551
4568
_PyDictKeys_DecRef (PyDictKeysObject * keys )
4552
4569
{
4553
- DK_DECREF (keys );
4570
+ dictkeys_decref (keys );
4554
4571
}
0 commit comments