@@ -359,68 +359,83 @@ getargs_K(PyObject *self, PyObject *args)
359
359
static PyObject *
360
360
test_k_code (PyObject * self , PyObject * Py_UNUSED (ignored ))
361
361
{
362
- PyObject * tuple , * num ;
363
- unsigned long value ;
364
-
365
- tuple = PyTuple_New (1 );
362
+ PyObject * tuple = PyTuple_New (1 );
366
363
if (tuple == NULL ) {
367
364
return NULL ;
368
365
}
369
366
370
367
/* a number larger than ULONG_MAX even on 64-bit platforms */
371
- num = PyLong_FromString ("FFFFFFFFFFFFFFFFFFFFFFFF" , NULL , 16 );
368
+ PyObject * num = PyLong_FromString ("FFFFFFFFFFFFFFFFFFFFFFFF" , NULL , 16 );
372
369
if (num == NULL ) {
373
- return NULL ;
370
+ goto error ;
374
371
}
375
372
376
- value = PyLong_AsUnsignedLongMask (num );
377
- if (value != ULONG_MAX ) {
373
+ unsigned long value = PyLong_AsUnsignedLongMask (num );
374
+ if (value == (unsigned long )-1 && PyErr_Occurred ()) {
375
+ Py_DECREF (num );
376
+ goto error ;
377
+ }
378
+ else if (value != ULONG_MAX ) {
379
+ Py_DECREF (num );
378
380
PyErr_SetString (PyExc_AssertionError ,
379
381
"test_k_code: "
380
382
"PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF" );
381
- return NULL ;
383
+ goto error ;
382
384
}
383
385
384
386
PyTuple_SET_ITEM (tuple , 0 , num );
385
387
386
388
value = 0 ;
387
389
if (!PyArg_ParseTuple (tuple , "k:test_k_code" , & value )) {
388
- return NULL ;
390
+ goto error ;
389
391
}
390
392
if (value != ULONG_MAX ) {
391
393
PyErr_SetString (PyExc_AssertionError ,
392
394
"test_k_code: k code returned wrong value for long 0xFFF...FFF" );
393
- return NULL ;
395
+ goto error ;
394
396
}
395
397
396
- Py_DECREF (num );
398
+ Py_DECREF (tuple ); // also clears `num`
399
+ tuple = PyTuple_New (1 );
400
+ if (tuple == NULL ) {
401
+ return NULL ;
402
+ }
397
403
num = PyLong_FromString ("-FFFFFFFF000000000000000042" , NULL , 16 );
398
404
if (num == NULL ) {
399
- return NULL ;
405
+ goto error ;
400
406
}
401
407
402
408
value = PyLong_AsUnsignedLongMask (num );
403
- if (value != (unsigned long )-0x42 ) {
409
+ if (value == (unsigned long )-1 && PyErr_Occurred ()) {
410
+ Py_DECREF (num );
411
+ goto error ;
412
+ }
413
+ else if (value != (unsigned long )-0x42 ) {
414
+ Py_DECREF (num );
404
415
PyErr_SetString (PyExc_AssertionError ,
405
416
"test_k_code: "
406
417
"PyLong_AsUnsignedLongMask() returned wrong value for long -0xFFF..000042" );
407
- return NULL ;
418
+ goto error ;
408
419
}
409
420
410
421
PyTuple_SET_ITEM (tuple , 0 , num );
411
422
412
423
value = 0 ;
413
424
if (!PyArg_ParseTuple (tuple , "k:test_k_code" , & value )) {
414
- return NULL ;
425
+ goto error ;
415
426
}
416
427
if (value != (unsigned long )-0x42 ) {
417
428
PyErr_SetString (PyExc_AssertionError ,
418
429
"test_k_code: k code returned wrong value for long -0xFFF..000042" );
419
- return NULL ;
430
+ goto error ;
420
431
}
421
432
422
433
Py_DECREF (tuple );
423
434
Py_RETURN_NONE ;
435
+
436
+ error :
437
+ Py_DECREF (tuple );
438
+ return NULL ;
424
439
}
425
440
426
441
static PyObject *
@@ -710,51 +725,56 @@ getargs_et_hash(PyObject *self, PyObject *args)
710
725
static PyObject *
711
726
test_L_code (PyObject * self , PyObject * Py_UNUSED (ignored ))
712
727
{
713
- PyObject * tuple , * num ;
714
- long long value ;
715
-
716
- tuple = PyTuple_New (1 );
728
+ PyObject * tuple = PyTuple_New (1 );
717
729
if (tuple == NULL ) {
718
730
return NULL ;
719
731
}
720
732
721
- num = PyLong_FromLong (42 );
733
+ PyObject * num = PyLong_FromLong (42 );
722
734
if (num == NULL ) {
723
- return NULL ;
735
+ goto error ;
724
736
}
725
737
726
738
PyTuple_SET_ITEM (tuple , 0 , num );
727
739
728
- value = -1 ;
740
+ long long value = -1 ;
729
741
if (!PyArg_ParseTuple (tuple , "L:test_L_code" , & value )) {
730
- return NULL ;
742
+ goto error ;
731
743
}
732
744
if (value != 42 ) {
733
745
PyErr_SetString (PyExc_AssertionError ,
734
746
"test_L_code: L code returned wrong value for long 42" );
735
- return NULL ;
747
+ goto error ;
736
748
}
737
749
738
- Py_DECREF (num );
750
+ Py_DECREF (tuple ); // also clears `num`
751
+ tuple = PyTuple_New (1 );
752
+ if (tuple == NULL ) {
753
+ return NULL ;
754
+ }
739
755
num = PyLong_FromLong (42 );
740
756
if (num == NULL ) {
741
- return NULL ;
757
+ goto error ;
742
758
}
743
759
744
760
PyTuple_SET_ITEM (tuple , 0 , num );
745
761
746
762
value = -1 ;
747
763
if (!PyArg_ParseTuple (tuple , "L:test_L_code" , & value )) {
748
- return NULL ;
764
+ goto error ;
749
765
}
750
766
if (value != 42 ) {
751
767
PyErr_SetString (PyExc_AssertionError ,
752
768
"test_L_code: L code returned wrong value for int 42" );
753
- return NULL ;
769
+ goto error ;
754
770
}
755
771
756
772
Py_DECREF (tuple );
757
773
Py_RETURN_NONE ;
774
+
775
+ error :
776
+ Py_DECREF (tuple );
777
+ return NULL ;
758
778
}
759
779
760
780
/* Test the s and z codes for PyArg_ParseTuple.
@@ -771,7 +791,7 @@ test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
771
791
PyObject * obj = PyUnicode_Decode ("t\xeate" , strlen ("t\xeate" ),
772
792
"latin-1" , NULL );
773
793
if (obj == NULL ) {
774
- return NULL ;
794
+ goto error ;
775
795
}
776
796
777
797
PyTuple_SET_ITEM (tuple , 0 , obj );
@@ -781,15 +801,19 @@ test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
781
801
*/
782
802
char * value ;
783
803
if (!PyArg_ParseTuple (tuple , "s:test_s_code1" , & value )) {
784
- return NULL ;
804
+ goto error ;
785
805
}
786
806
787
807
if (!PyArg_ParseTuple (tuple , "z:test_s_code2" , & value )) {
788
- return NULL ;
808
+ goto error ;
789
809
}
790
810
791
811
Py_DECREF (tuple );
792
812
Py_RETURN_NONE ;
813
+
814
+ error :
815
+ Py_DECREF (tuple );
816
+ return NULL ;
793
817
}
794
818
795
819
static PyObject *
0 commit comments