@@ -449,77 +449,77 @@ static PyObject *empty_values[1] = { NULL };
449
449
/* Uncomment to check the dict content in _PyDict_CheckConsistency() */
450
450
/* #define DEBUG_PYDICT */
451
451
452
+ #ifdef DEBUG_PYDICT
453
+ # define ASSERT_CONSISTENT (op ) assert(_PyDict_CheckConsistency((PyObject *)(op), 1))
454
+ #else
455
+ # define ASSERT_CONSISTENT (op ) assert(_PyDict_CheckConsistency((PyObject *)(op), 0))
456
+ #endif
452
457
453
- #ifndef NDEBUG
454
- static int
455
- _PyDict_CheckConsistency (PyDictObject * mp )
458
+
459
+ int
460
+ _PyDict_CheckConsistency (PyObject * op , int check_content )
456
461
{
457
- #define ASSERT (expr ) _PyObject_ASSERT((PyObject *)mp, (expr))
462
+ _PyObject_ASSERT (op , PyDict_Check (op ));
463
+ PyDictObject * mp = (PyDictObject * )op ;
458
464
459
465
PyDictKeysObject * keys = mp -> ma_keys ;
460
466
int splitted = _PyDict_HasSplitTable (mp );
461
467
Py_ssize_t usable = USABLE_FRACTION (keys -> dk_size );
462
- #ifdef DEBUG_PYDICT
463
- PyDictKeyEntry * entries = DK_ENTRIES (keys );
464
- Py_ssize_t i ;
465
- #endif
466
468
467
- ASSERT (0 <= mp -> ma_used && mp -> ma_used <= usable );
468
- ASSERT (IS_POWER_OF_2 (keys -> dk_size ));
469
- ASSERT (0 <= keys -> dk_usable
470
- && keys -> dk_usable <= usable );
471
- ASSERT (0 <= keys -> dk_nentries
472
- && keys -> dk_nentries <= usable );
473
- ASSERT (keys -> dk_usable + keys -> dk_nentries <= usable );
469
+ _PyObject_ASSERT (op , 0 <= mp -> ma_used && mp -> ma_used <= usable );
470
+ _PyObject_ASSERT (op , IS_POWER_OF_2 (keys -> dk_size ));
471
+ _PyObject_ASSERT (op , 0 <= keys -> dk_usable && keys -> dk_usable <= usable );
472
+ _PyObject_ASSERT (op , 0 <= keys -> dk_nentries && keys -> dk_nentries <= usable );
473
+ _PyObject_ASSERT (op , keys -> dk_usable + keys -> dk_nentries <= usable );
474
474
475
475
if (!splitted ) {
476
476
/* combined table */
477
- ASSERT ( keys -> dk_refcnt == 1 );
477
+ _PyObject_ASSERT ( op , keys -> dk_refcnt == 1 );
478
478
}
479
479
480
- #ifdef DEBUG_PYDICT
481
- for (i = 0 ; i < keys -> dk_size ; i ++ ) {
482
- Py_ssize_t ix = dictkeys_get_index (keys , i );
483
- ASSERT (DKIX_DUMMY <= ix && ix <= usable );
484
- }
480
+ if (check_content ) {
481
+ PyDictKeyEntry * entries = DK_ENTRIES (keys );
482
+ Py_ssize_t i ;
483
+
484
+ for (i = 0 ; i < keys -> dk_size ; i ++ ) {
485
+ Py_ssize_t ix = dictkeys_get_index (keys , i );
486
+ _PyObject_ASSERT (op , DKIX_DUMMY <= ix && ix <= usable );
487
+ }
485
488
486
- for (i = 0 ; i < usable ; i ++ ) {
487
- PyDictKeyEntry * entry = & entries [i ];
488
- PyObject * key = entry -> me_key ;
489
+ for (i = 0 ; i < usable ; i ++ ) {
490
+ PyDictKeyEntry * entry = & entries [i ];
491
+ PyObject * key = entry -> me_key ;
489
492
490
- if (key != NULL ) {
491
- if (PyUnicode_CheckExact (key )) {
492
- Py_hash_t hash = ((PyASCIIObject * )key )-> hash ;
493
- ASSERT (hash != -1 );
494
- ASSERT (entry -> me_hash == hash );
495
- }
496
- else {
497
- /* test_dict fails if PyObject_Hash() is called again */
498
- ASSERT (entry -> me_hash != -1 );
493
+ if (key != NULL ) {
494
+ if (PyUnicode_CheckExact (key )) {
495
+ Py_hash_t hash = ((PyASCIIObject * )key )-> hash ;
496
+ _PyObject_ASSERT (op , hash != -1 );
497
+ _PyObject_ASSERT (op , entry -> me_hash == hash );
498
+ }
499
+ else {
500
+ /* test_dict fails if PyObject_Hash() is called again */
501
+ _PyObject_ASSERT (op , entry -> me_hash != -1 );
502
+ }
503
+ if (!splitted ) {
504
+ _PyObject_ASSERT (op , entry -> me_value != NULL );
505
+ }
499
506
}
500
- if (!splitted ) {
501
- ASSERT (entry -> me_value != NULL );
507
+
508
+ if (splitted ) {
509
+ _PyObject_ASSERT (op , entry -> me_value == NULL );
502
510
}
503
511
}
504
512
505
513
if (splitted ) {
506
- ASSERT (entry -> me_value == NULL );
514
+ /* splitted table */
515
+ for (i = 0 ; i < mp -> ma_used ; i ++ ) {
516
+ _PyObject_ASSERT (op , mp -> ma_values [i ] != NULL );
517
+ }
507
518
}
508
519
}
509
520
510
- if (splitted ) {
511
- /* splitted table */
512
- for (i = 0 ; i < mp -> ma_used ; i ++ ) {
513
- ASSERT (mp -> ma_values [i ] != NULL );
514
- }
515
- }
516
- #endif
517
-
518
521
return 1 ;
519
-
520
- #undef ASSERT
521
522
}
522
- #endif
523
523
524
524
525
525
static PyDictKeysObject * new_keys_object (Py_ssize_t size )
@@ -614,7 +614,7 @@ new_dict(PyDictKeysObject *keys, PyObject **values)
614
614
mp -> ma_values = values ;
615
615
mp -> ma_used = 0 ;
616
616
mp -> ma_version_tag = DICT_NEXT_VERSION ();
617
- assert ( _PyDict_CheckConsistency ( mp ) );
617
+ ASSERT_CONSISTENT ( mp );
618
618
return (PyObject * )mp ;
619
619
}
620
620
@@ -675,7 +675,7 @@ clone_combined_dict(PyDictObject *orig)
675
675
return NULL ;
676
676
}
677
677
new -> ma_used = orig -> ma_used ;
678
- assert ( _PyDict_CheckConsistency ( new ) );
678
+ ASSERT_CONSISTENT ( new );
679
679
if (_PyObject_GC_IS_TRACKED (orig )) {
680
680
/* Maintain tracking. */
681
681
_PyObject_GC_TRACK (new );
@@ -1075,7 +1075,7 @@ insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
1075
1075
mp -> ma_keys -> dk_usable -- ;
1076
1076
mp -> ma_keys -> dk_nentries ++ ;
1077
1077
assert (mp -> ma_keys -> dk_usable >= 0 );
1078
- assert ( _PyDict_CheckConsistency ( mp ) );
1078
+ ASSERT_CONSISTENT ( mp );
1079
1079
return 0 ;
1080
1080
}
1081
1081
@@ -1094,7 +1094,7 @@ insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
1094
1094
1095
1095
mp -> ma_version_tag = DICT_NEXT_VERSION ();
1096
1096
Py_XDECREF (old_value ); /* which **CAN** re-enter (see issue #22653) */
1097
- assert ( _PyDict_CheckConsistency ( mp ) );
1097
+ ASSERT_CONSISTENT ( mp );
1098
1098
Py_DECREF (key );
1099
1099
return 0 ;
1100
1100
@@ -1582,7 +1582,7 @@ delitem_common(PyDictObject *mp, Py_hash_t hash, Py_ssize_t ix,
1582
1582
Py_DECREF (old_key );
1583
1583
Py_DECREF (old_value );
1584
1584
1585
- assert ( _PyDict_CheckConsistency ( mp ) );
1585
+ ASSERT_CONSISTENT ( mp );
1586
1586
return 0 ;
1587
1587
}
1588
1588
@@ -1722,7 +1722,7 @@ PyDict_Clear(PyObject *op)
1722
1722
assert (oldkeys -> dk_refcnt == 1 );
1723
1723
dictkeys_decref (oldkeys );
1724
1724
}
1725
- assert ( _PyDict_CheckConsistency ( mp ) );
1725
+ ASSERT_CONSISTENT ( mp );
1726
1726
}
1727
1727
1728
1728
/* Internal version of PyDict_Next that returns a hash value in addition
@@ -1852,7 +1852,7 @@ _PyDict_Pop_KnownHash(PyObject *dict, PyObject *key, Py_hash_t hash, PyObject *d
1852
1852
ep -> me_value = NULL ;
1853
1853
Py_DECREF (old_key );
1854
1854
1855
- assert ( _PyDict_CheckConsistency ( mp ) );
1855
+ ASSERT_CONSISTENT ( mp );
1856
1856
return old_value ;
1857
1857
}
1858
1858
@@ -2434,7 +2434,7 @@ PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
2434
2434
}
2435
2435
2436
2436
i = 0 ;
2437
- assert ( _PyDict_CheckConsistency (( PyDictObject * ) d ) );
2437
+ ASSERT_CONSISTENT ( d );
2438
2438
goto Return ;
2439
2439
Fail :
2440
2440
Py_XDECREF (item );
@@ -2586,7 +2586,7 @@ dict_merge(PyObject *a, PyObject *b, int override)
2586
2586
/* Iterator completed, via error */
2587
2587
return -1 ;
2588
2588
}
2589
- assert ( _PyDict_CheckConsistency (( PyDictObject * ) a ) );
2589
+ ASSERT_CONSISTENT ( a );
2590
2590
return 0 ;
2591
2591
}
2592
2592
@@ -2950,7 +2950,7 @@ PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *defaultobj)
2950
2950
mp -> ma_version_tag = DICT_NEXT_VERSION ();
2951
2951
}
2952
2952
2953
- assert ( _PyDict_CheckConsistency ( mp ) );
2953
+ ASSERT_CONSISTENT ( mp );
2954
2954
return value ;
2955
2955
}
2956
2956
@@ -3069,7 +3069,7 @@ dict_popitem_impl(PyDictObject *self)
3069
3069
self -> ma_keys -> dk_nentries = i ;
3070
3070
self -> ma_used -- ;
3071
3071
self -> ma_version_tag = DICT_NEXT_VERSION ();
3072
- assert ( _PyDict_CheckConsistency ( self ) );
3072
+ ASSERT_CONSISTENT ( self );
3073
3073
return res ;
3074
3074
}
3075
3075
@@ -3275,7 +3275,7 @@ dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
3275
3275
Py_DECREF (self );
3276
3276
return NULL ;
3277
3277
}
3278
- assert ( _PyDict_CheckConsistency ( d ) );
3278
+ ASSERT_CONSISTENT ( d );
3279
3279
return self ;
3280
3280
}
3281
3281
0 commit comments