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

``