bpo-36389: _PyObject_CheckConsistency() available in release mode (GH… · python/cpython@6876257 (original) (raw)
`@@ -459,23 +459,26 @@ static PyObject *empty_values[1] = { NULL };
`
459
459
`int
`
460
460
`_PyDict_CheckConsistency(PyObject *op, int check_content)
`
461
461
`{
`
462
``
`-
#ifndef NDEBUG
`
463
``
`-
_PyObject_ASSERT(op, PyDict_Check(op));
`
``
462
`+
#define CHECK(expr) \
`
``
463
`+
do { if (!(expr)) { _PyObject_ASSERT_FAILED_MSG(op, Py_STRINGIFY(expr)); } } while (0)
`
``
464
+
``
465
`+
assert(op != NULL);
`
``
466
`+
CHECK(PyDict_Check(op));
`
464
467
`PyDictObject *mp = (PyDictObject *)op;
`
465
468
``
466
469
`PyDictKeysObject *keys = mp->ma_keys;
`
467
470
`int splitted = _PyDict_HasSplitTable(mp);
`
468
471
`Py_ssize_t usable = USABLE_FRACTION(keys->dk_size);
`
469
472
``
470
``
`-
_PyObject_ASSERT(op, 0 <= mp->ma_used && mp->ma_used <= usable);
`
471
``
`-
_PyObject_ASSERT(op, IS_POWER_OF_2(keys->dk_size));
`
472
``
`-
_PyObject_ASSERT(op, 0 <= keys->dk_usable && keys->dk_usable <= usable);
`
473
``
`-
_PyObject_ASSERT(op, 0 <= keys->dk_nentries && keys->dk_nentries <= usable);
`
474
``
`-
_PyObject_ASSERT(op, keys->dk_usable + keys->dk_nentries <= usable);
`
``
473
`+
CHECK(0 <= mp->ma_used && mp->ma_used <= usable);
`
``
474
`+
CHECK(IS_POWER_OF_2(keys->dk_size));
`
``
475
`+
CHECK(0 <= keys->dk_usable && keys->dk_usable <= usable);
`
``
476
`+
CHECK(0 <= keys->dk_nentries && keys->dk_nentries <= usable);
`
``
477
`+
CHECK(keys->dk_usable + keys->dk_nentries <= usable);
`
475
478
``
476
479
`if (!splitted) {
`
477
480
`/* combined table */
`
478
``
`-
_PyObject_ASSERT(op, keys->dk_refcnt == 1);
`
``
481
`+
CHECK(keys->dk_refcnt == 1);
`
479
482
` }
`
480
483
``
481
484
`if (check_content) {
`
`@@ -484,7 +487,7 @@ _PyDict_CheckConsistency(PyObject *op, int check_content)
`
484
487
``
485
488
`for (i=0; i < keys->dk_size; i++) {
`
486
489
`Py_ssize_t ix = dictkeys_get_index(keys, i);
`
487
``
`-
_PyObject_ASSERT(op, DKIX_DUMMY <= ix && ix <= usable);
`
``
490
`+
CHECK(DKIX_DUMMY <= ix && ix <= usable);
`
488
491
` }
`
489
492
``
490
493
`for (i=0; i < usable; i++) {
`
`@@ -494,32 +497,33 @@ _PyDict_CheckConsistency(PyObject *op, int check_content)
`
494
497
`if (key != NULL) {
`
495
498
`if (PyUnicode_CheckExact(key)) {
`
496
499
`Py_hash_t hash = ((PyASCIIObject *)key)->hash;
`
497
``
`-
_PyObject_ASSERT(op, hash != -1);
`
498
``
`-
_PyObject_ASSERT(op, entry->me_hash == hash);
`
``
500
`+
CHECK(hash != -1);
`
``
501
`+
CHECK(entry->me_hash == hash);
`
499
502
` }
`
500
503
`else {
`
501
504
`/* test_dict fails if PyObject_Hash() is called again */
`
502
``
`-
_PyObject_ASSERT(op, entry->me_hash != -1);
`
``
505
`+
CHECK(entry->me_hash != -1);
`
503
506
` }
`
504
507
`if (!splitted) {
`
505
``
`-
_PyObject_ASSERT(op, entry->me_value != NULL);
`
``
508
`+
CHECK(entry->me_value != NULL);
`
506
509
` }
`
507
510
` }
`
508
511
``
509
512
`if (splitted) {
`
510
``
`-
_PyObject_ASSERT(op, entry->me_value == NULL);
`
``
513
`+
CHECK(entry->me_value == NULL);
`
511
514
` }
`
512
515
` }
`
513
516
``
514
517
`if (splitted) {
`
515
518
`/* splitted table */
`
516
519
`for (i=0; i < mp->ma_used; i++) {
`
517
``
`-
_PyObject_ASSERT(op, mp->ma_values[i] != NULL);
`
``
520
`+
CHECK(mp->ma_values[i] != NULL);
`
518
521
` }
`
519
522
` }
`
520
523
` }
`
521
``
`-
#endif
`
522
524
`return 1;
`
``
525
+
``
526
`+
#undef CHECK
`
523
527
`}
`
524
528
``
525
529
``