@@ -454,24 +454,14 @@ static PyDictKeysObject empty_keys_struct = {
454
454
1 , /* dk_refcnt */
455
455
0 , /* dk_log2_size */
456
456
0 , /* dk_log2_index_bytes */
457
- DICT_KEYS_SPLIT , /* dk_kind */
457
+ DICT_KEYS_UNICODE , /* dk_kind */
458
458
1 , /* dk_version */
459
459
0 , /* dk_usable (immutable) */
460
460
0 , /* dk_nentries */
461
461
{DKIX_EMPTY , DKIX_EMPTY , DKIX_EMPTY , DKIX_EMPTY ,
462
462
DKIX_EMPTY , DKIX_EMPTY , DKIX_EMPTY , DKIX_EMPTY }, /* dk_indices */
463
463
};
464
464
465
-
466
- struct {
467
- uint8_t prefix [sizeof (PyObject * )];
468
- PyDictValues values ;
469
- } empty_values_struct = {
470
- { [sizeof (PyObject * )-1 ] = sizeof (PyObject * ) },
471
- {{NULL }}
472
- };
473
- #define empty_values (&empty_values_struct.values)
474
-
475
465
#define Py_EMPTY_KEYS &empty_keys_struct
476
466
477
467
/* Uncomment to check the dict content in _PyDict_CheckConsistency() */
@@ -495,7 +485,6 @@ get_index_from_order(PyDictObject *mp, Py_ssize_t i)
495
485
static void
496
486
dump_entries (PyDictKeysObject * dk )
497
487
{
498
- int kind = dk -> dk_kind ;
499
488
for (Py_ssize_t i = 0 ; i < dk -> dk_nentries ; i ++ ) {
500
489
if (DK_IS_UNICODE (dk )) {
501
490
PyDictUnicodeEntry * ep = & DK_UNICODE_ENTRIES (dk )[i ];
@@ -531,7 +520,7 @@ _PyDict_CheckConsistency(PyObject *op, int check_content)
531
520
if (!splitted ) {
532
521
/* combined table */
533
522
CHECK (keys -> dk_kind != DICT_KEYS_SPLIT );
534
- CHECK (keys -> dk_refcnt == 1 );
523
+ CHECK (keys -> dk_refcnt == 1 || keys == Py_EMPTY_KEYS );
535
524
}
536
525
else {
537
526
CHECK (keys -> dk_kind == DICT_KEYS_SPLIT );
@@ -688,7 +677,8 @@ free_keys_object(PyDictKeysObject *keys)
688
677
// free_keys_object() must not be called after _PyDict_Fini()
689
678
assert (state -> keys_numfree != -1 );
690
679
#endif
691
- if (DK_LOG_SIZE (keys ) == PyDict_LOG_MINSIZE && state -> keys_numfree < PyDict_MAXFREELIST
680
+ if (DK_LOG_SIZE (keys ) == PyDict_LOG_MINSIZE
681
+ && state -> keys_numfree < PyDict_MAXFREELIST
692
682
&& DK_IS_UNICODE (keys )) {
693
683
state -> keys_free_list [state -> keys_numfree ++ ] = keys ;
694
684
return ;
@@ -845,7 +835,7 @@ PyObject *
845
835
PyDict_New (void )
846
836
{
847
837
dictkeys_incref (Py_EMPTY_KEYS );
848
- return new_dict (Py_EMPTY_KEYS , empty_values , 0 , 0 );
838
+ return new_dict (Py_EMPTY_KEYS , NULL , 0 , 0 );
849
839
}
850
840
851
841
/* Search index of hash table from offset of entry table */
@@ -1478,9 +1468,7 @@ dictresize(PyDictObject *mp, uint8_t log2_newsize, int unicode)
1478
1468
}
1479
1469
dictkeys_decref (oldkeys );
1480
1470
mp -> ma_values = NULL ;
1481
- if (oldvalues != empty_values ) {
1482
- free_values (oldvalues );
1483
- }
1471
+ free_values (oldvalues );
1484
1472
}
1485
1473
else { // oldkeys is combined.
1486
1474
if (oldkeys -> dk_kind == DICT_KEYS_GENERAL ) {
@@ -1506,7 +1494,7 @@ dictresize(PyDictObject *mp, uint8_t log2_newsize, int unicode)
1506
1494
if (unicode ) { // combined unicode -> combined unicode
1507
1495
PyDictUnicodeEntry * newentries = DK_UNICODE_ENTRIES (mp -> ma_keys );
1508
1496
if (oldkeys -> dk_nentries == numentries && mp -> ma_keys -> dk_kind == DICT_KEYS_UNICODE ) {
1509
- memcpy (newentries , oldentries , numentries * sizeof (PyDictUnicodeEntry ));
1497
+ memcpy (newentries , oldentries , numentries * sizeof (PyDictUnicodeEntry ));
1510
1498
}
1511
1499
else {
1512
1500
PyDictUnicodeEntry * ep = oldentries ;
@@ -1533,27 +1521,31 @@ dictresize(PyDictObject *mp, uint8_t log2_newsize, int unicode)
1533
1521
}
1534
1522
}
1535
1523
1536
- assert (oldkeys -> dk_kind != DICT_KEYS_SPLIT );
1537
- assert (oldkeys -> dk_refcnt == 1 );
1524
+ // We can not use free_keys_object here because key's reference
1525
+ // are moved already.
1526
+ if (oldkeys != Py_EMPTY_KEYS ) {
1527
+ assert (oldkeys -> dk_kind != DICT_KEYS_SPLIT );
1528
+ assert (oldkeys -> dk_refcnt == 1 );
1538
1529
#ifdef Py_REF_DEBUG
1539
- _Py_RefTotal -- ;
1530
+ _Py_RefTotal -- ;
1540
1531
#endif
1541
1532
#if PyDict_MAXFREELIST > 0
1542
- struct _Py_dict_state * state = get_dict_state ();
1533
+ struct _Py_dict_state * state = get_dict_state ();
1543
1534
#ifdef Py_DEBUG
1544
- // dictresize() must not be called after _PyDict_Fini()
1545
- assert (state -> keys_numfree != -1 );
1535
+ // dictresize() must not be called after _PyDict_Fini()
1536
+ assert (state -> keys_numfree != -1 );
1546
1537
#endif
1547
- if (DK_LOG_SIZE (oldkeys ) == PyDict_LOG_MINSIZE &&
1548
- DK_IS_UNICODE (oldkeys ) &&
1549
- state -> keys_numfree < PyDict_MAXFREELIST )
1550
- {
1551
- state -> keys_free_list [state -> keys_numfree ++ ] = oldkeys ;
1552
- }
1553
- else
1538
+ if (DK_LOG_SIZE (oldkeys ) == PyDict_LOG_MINSIZE &&
1539
+ DK_IS_UNICODE (oldkeys ) &&
1540
+ state -> keys_numfree < PyDict_MAXFREELIST )
1541
+ {
1542
+ state -> keys_free_list [state -> keys_numfree ++ ] = oldkeys ;
1543
+ }
1544
+ else
1554
1545
#endif
1555
- {
1556
- PyObject_Free (oldkeys );
1546
+ {
1547
+ PyObject_Free (oldkeys );
1548
+ }
1557
1549
}
1558
1550
}
1559
1551
@@ -1844,9 +1836,7 @@ _PyDict_LoadGlobal(PyDictObject *globals, PyDictObject *builtins, PyObject *key)
1844
1836
Py_hash_t hash ;
1845
1837
PyObject * value ;
1846
1838
1847
- if (!PyUnicode_CheckExact (key ) ||
1848
- (hash = ((PyASCIIObject * ) key )-> hash ) == -1 )
1849
- {
1839
+ if (!PyUnicode_CheckExact (key ) || (hash = unicode_get_hash (key )) == -1 ) {
1850
1840
hash = PyObject_Hash (key );
1851
1841
if (hash == -1 )
1852
1842
return NULL ;
@@ -1873,9 +1863,7 @@ _PyDict_SetItem_Take2(PyDictObject *mp, PyObject *key, PyObject *value)
1873
1863
assert (value );
1874
1864
assert (PyDict_Check (mp ));
1875
1865
Py_hash_t hash ;
1876
- if (!PyUnicode_CheckExact (key ) ||
1877
- (hash = ((PyASCIIObject * ) key )-> hash ) == -1 )
1878
- {
1866
+ if (!PyUnicode_CheckExact (key ) || (hash = unicode_get_hash (key )) == -1 ) {
1879
1867
hash = PyObject_Hash (key );
1880
1868
if (hash == -1 ) {
1881
1869
Py_DECREF (key );
@@ -1998,8 +1986,7 @@ PyDict_DelItem(PyObject *op, PyObject *key)
1998
1986
{
1999
1987
Py_hash_t hash ;
2000
1988
assert (key );
2001
- if (!PyUnicode_CheckExact (key ) ||
2002
- (hash = ((PyASCIIObject * ) key )-> hash ) == -1 ) {
1989
+ if (!PyUnicode_CheckExact (key ) || (hash = unicode_get_hash (key )) == -1 ) {
2003
1990
hash = PyObject_Hash (key );
2004
1991
if (hash == -1 )
2005
1992
return -1 ;
@@ -2091,12 +2078,13 @@ PyDict_Clear(PyObject *op)
2091
2078
mp = ((PyDictObject * )op );
2092
2079
oldkeys = mp -> ma_keys ;
2093
2080
oldvalues = mp -> ma_values ;
2094
- if (oldvalues == empty_values )
2081
+ if (oldkeys == Py_EMPTY_KEYS ) {
2095
2082
return ;
2083
+ }
2096
2084
/* Empty the dict... */
2097
2085
dictkeys_incref (Py_EMPTY_KEYS );
2098
2086
mp -> ma_keys = Py_EMPTY_KEYS ;
2099
- mp -> ma_values = empty_values ;
2087
+ mp -> ma_values = NULL ;
2100
2088
mp -> ma_used = 0 ;
2101
2089
mp -> ma_version_tag = DICT_NEXT_VERSION ();
2102
2090
/* ...then clear the keys and values */
@@ -2257,8 +2245,7 @@ _PyDict_Pop(PyObject *dict, PyObject *key, PyObject *deflt)
2257
2245
_PyErr_SetKeyError (key );
2258
2246
return NULL ;
2259
2247
}
2260
- if (!PyUnicode_CheckExact (key ) ||
2261
- (hash = ((PyASCIIObject * ) key )-> hash ) == -1 ) {
2248
+ if (!PyUnicode_CheckExact (key ) || (hash = unicode_get_hash (key )) == -1 ) {
2262
2249
hash = PyObject_Hash (key );
2263
2250
if (hash == -1 )
2264
2251
return NULL ;
@@ -2372,16 +2359,14 @@ dict_dealloc(PyDictObject *mp)
2372
2359
PyObject_GC_UnTrack (mp );
2373
2360
Py_TRASHCAN_BEGIN (mp , dict_dealloc )
2374
2361
if (values != NULL ) {
2375
- if (values != empty_values ) {
2376
- for (i = 0 , n = mp -> ma_keys -> dk_nentries ; i < n ; i ++ ) {
2377
- Py_XDECREF (values -> values [i ]);
2378
- }
2379
- free_values (values );
2362
+ for (i = 0 , n = mp -> ma_keys -> dk_nentries ; i < n ; i ++ ) {
2363
+ Py_XDECREF (values -> values [i ]);
2380
2364
}
2365
+ free_values (values );
2381
2366
dictkeys_decref (keys );
2382
2367
}
2383
2368
else if (keys != NULL ) {
2384
- assert (keys -> dk_refcnt == 1 );
2369
+ assert (keys -> dk_refcnt == 1 || keys == Py_EMPTY_KEYS );
2385
2370
dictkeys_decref (keys );
2386
2371
}
2387
2372
#if PyDict_MAXFREELIST > 0
@@ -2498,8 +2483,7 @@ dict_subscript(PyDictObject *mp, PyObject *key)
2498
2483
Py_hash_t hash ;
2499
2484
PyObject * value ;
2500
2485
2501
- if (!PyUnicode_CheckExact (key ) ||
2502
- (hash = ((PyASCIIObject * ) key )-> hash ) == -1 ) {
2486
+ if (!PyUnicode_CheckExact (key ) || (hash = unicode_get_hash (key )) == -1 ) {
2503
2487
hash = PyObject_Hash (key );
2504
2488
if (hash == -1 )
2505
2489
return NULL ;
@@ -2862,9 +2846,7 @@ dict_merge(PyObject *a, PyObject *b, int override)
2862
2846
dictkeys_decref (mp -> ma_keys );
2863
2847
mp -> ma_keys = keys ;
2864
2848
if (mp -> ma_values != NULL ) {
2865
- if (mp -> ma_values != empty_values ) {
2866
- free_values (mp -> ma_values );
2867
- }
2849
+ free_values (mp -> ma_values );
2868
2850
mp -> ma_values = NULL ;
2869
2851
}
2870
2852
@@ -3257,8 +3239,7 @@ dict___contains__(PyDictObject *self, PyObject *key)
3257
3239
Py_ssize_t ix ;
3258
3240
PyObject * value ;
3259
3241
3260
- if (!PyUnicode_CheckExact (key ) ||
3261
- (hash = ((PyASCIIObject * ) key )-> hash ) == -1 ) {
3242
+ if (!PyUnicode_CheckExact (key ) || (hash = unicode_get_hash (key )) == -1 ) {
3262
3243
hash = PyObject_Hash (key );
3263
3244
if (hash == -1 )
3264
3245
return NULL ;
@@ -3289,8 +3270,7 @@ dict_get_impl(PyDictObject *self, PyObject *key, PyObject *default_value)
3289
3270
Py_hash_t hash ;
3290
3271
Py_ssize_t ix ;
3291
3272
3292
- if (!PyUnicode_CheckExact (key ) ||
3293
- (hash = ((PyASCIIObject * ) key )-> hash ) == -1 ) {
3273
+ if (!PyUnicode_CheckExact (key ) || (hash = unicode_get_hash (key )) == -1 ) {
3294
3274
hash = PyObject_Hash (key );
3295
3275
if (hash == -1 )
3296
3276
return NULL ;
@@ -3317,8 +3297,7 @@ PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *defaultobj)
3317
3297
return NULL ;
3318
3298
}
3319
3299
3320
- if (!PyUnicode_CheckExact (key ) ||
3321
- (hash = ((PyASCIIObject * ) key )-> hash ) == -1 ) {
3300
+ if (!PyUnicode_CheckExact (key ) || (hash = unicode_get_hash (key )) == -1 ) {
3322
3301
hash = PyObject_Hash (key );
3323
3302
if (hash == -1 )
3324
3303
return NULL ;
@@ -3707,8 +3686,7 @@ PyDict_Contains(PyObject *op, PyObject *key)
3707
3686
PyDictObject * mp = (PyDictObject * )op ;
3708
3687
PyObject * value ;
3709
3688
3710
- if (!PyUnicode_CheckExact (key ) ||
3711
- (hash = ((PyASCIIObject * ) key )-> hash ) == -1 ) {
3689
+ if (!PyUnicode_CheckExact (key ) || (hash = unicode_get_hash (key )) == -1 ) {
3712
3690
hash = PyObject_Hash (key );
3713
3691
if (hash == -1 )
3714
3692
return -1 ;
@@ -3780,7 +3758,7 @@ dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
3780
3758
d -> ma_version_tag = DICT_NEXT_VERSION ();
3781
3759
dictkeys_incref (Py_EMPTY_KEYS );
3782
3760
d -> ma_keys = Py_EMPTY_KEYS ;
3783
- d -> ma_values = empty_values ;
3761
+ d -> ma_values = NULL ;
3784
3762
ASSERT_CONSISTENT (d );
3785
3763
3786
3764
if (type != & PyDict_Type ) {
0 commit comments