@@ -361,68 +361,83 @@ getargs_K(PyObject *self, PyObject *args)
361
361
static PyObject *
362
362
test_k_code (PyObject * self , PyObject * Py_UNUSED (ignored ))
363
363
{
364
- PyObject * tuple , * num ;
365
- unsigned long value ;
366
-
367
- tuple = PyTuple_New (1 );
364
+ PyObject * tuple = PyTuple_New (1 );
368
365
if (tuple == NULL ) {
369
366
return NULL ;
370
367
}
371
368
372
369
/* a number larger than ULONG_MAX even on 64-bit platforms */
373
- num = PyLong_FromString ("FFFFFFFFFFFFFFFFFFFFFFFF" , NULL , 16 );
370
+ PyObject * num = PyLong_FromString ("FFFFFFFFFFFFFFFFFFFFFFFF" , NULL , 16 );
374
371
if (num == NULL ) {
375
- return NULL ;
372
+ goto error ;
376
373
}
377
374
378
- value = PyLong_AsUnsignedLongMask (num );
379
- if (value != ULONG_MAX ) {
375
+ unsigned long value = PyLong_AsUnsignedLongMask (num );
376
+ if (value == (unsigned long )-1 && PyErr_Occurred ()) {
377
+ Py_DECREF (num );
378
+ goto error ;
379
+ }
380
+ else if (value != ULONG_MAX ) {
381
+ Py_DECREF (num );
380
382
PyErr_SetString (PyExc_AssertionError ,
381
383
"test_k_code: "
382
384
"PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF" );
383
- return NULL ;
385
+ goto error ;
384
386
}
385
387
386
388
PyTuple_SET_ITEM (tuple , 0 , num );
387
389
388
390
value = 0 ;
389
391
if (!PyArg_ParseTuple (tuple , "k:test_k_code" , & value )) {
390
- return NULL ;
392
+ goto error ;
391
393
}
392
394
if (value != ULONG_MAX ) {
393
395
PyErr_SetString (PyExc_AssertionError ,
394
396
"test_k_code: k code returned wrong value for long 0xFFF...FFF" );
395
- return NULL ;
397
+ goto error ;
396
398
}
397
399
398
- Py_DECREF (num );
400
+ Py_DECREF (tuple ); // also clears `num`
401
+ tuple = PyTuple_New (1 );
402
+ if (tuple == NULL ) {
403
+ return NULL ;
404
+ }
399
405
num = PyLong_FromString ("-FFFFFFFF000000000000000042" , NULL , 16 );
400
406
if (num == NULL ) {
401
- return NULL ;
407
+ goto error ;
402
408
}
403
409
404
410
value = PyLong_AsUnsignedLongMask (num );
405
- if (value != (unsigned long )-0x42 ) {
411
+ if (value == (unsigned long )-1 && PyErr_Occurred ()) {
412
+ Py_DECREF (num );
413
+ goto error ;
414
+ }
415
+ else if (value != (unsigned long )-0x42 ) {
416
+ Py_DECREF (num );
406
417
PyErr_SetString (PyExc_AssertionError ,
407
418
"test_k_code: "
408
419
"PyLong_AsUnsignedLongMask() returned wrong value for long -0xFFF..000042" );
409
- return NULL ;
420
+ goto error ;
410
421
}
411
422
412
423
PyTuple_SET_ITEM (tuple , 0 , num );
413
424
414
425
value = 0 ;
415
426
if (!PyArg_ParseTuple (tuple , "k:test_k_code" , & value )) {
416
- return NULL ;
427
+ goto error ;
417
428
}
418
429
if (value != (unsigned long )-0x42 ) {
419
430
PyErr_SetString (PyExc_AssertionError ,
420
431
"test_k_code: k code returned wrong value for long -0xFFF..000042" );
421
- return NULL ;
432
+ goto error ;
422
433
}
423
434
424
435
Py_DECREF (tuple );
425
436
Py_RETURN_NONE ;
437
+
438
+ error :
439
+ Py_DECREF (tuple );
440
+ return NULL ;
426
441
}
427
442
428
443
static PyObject *
@@ -760,51 +775,56 @@ getargs_et_hash(PyObject *self, PyObject *args)
760
775
static PyObject *
761
776
test_L_code (PyObject * self , PyObject * Py_UNUSED (ignored ))
762
777
{
763
- PyObject * tuple , * num ;
764
- long long value ;
765
-
766
- tuple = PyTuple_New (1 );
778
+ PyObject * tuple = PyTuple_New (1 );
767
779
if (tuple == NULL ) {
768
780
return NULL ;
769
781
}
770
782
771
- num = PyLong_FromLong (42 );
783
+ PyObject * num = PyLong_FromLong (42 );
772
784
if (num == NULL ) {
773
- return NULL ;
785
+ goto error ;
774
786
}
775
787
776
788
PyTuple_SET_ITEM (tuple , 0 , num );
777
789
778
- value = -1 ;
790
+ long long value = -1 ;
779
791
if (!PyArg_ParseTuple (tuple , "L:test_L_code" , & value )) {
780
- return NULL ;
792
+ goto error ;
781
793
}
782
794
if (value != 42 ) {
783
795
PyErr_SetString (PyExc_AssertionError ,
784
796
"test_L_code: L code returned wrong value for long 42" );
785
- return NULL ;
797
+ goto error ;
786
798
}
787
799
788
- Py_DECREF (num );
800
+ Py_DECREF (tuple ); // also clears `num`
801
+ tuple = PyTuple_New (1 );
802
+ if (tuple == NULL ) {
803
+ return NULL ;
804
+ }
789
805
num = PyLong_FromLong (42 );
790
806
if (num == NULL ) {
791
- return NULL ;
807
+ goto error ;
792
808
}
793
809
794
810
PyTuple_SET_ITEM (tuple , 0 , num );
795
811
796
812
value = -1 ;
797
813
if (!PyArg_ParseTuple (tuple , "L:test_L_code" , & value )) {
798
- return NULL ;
814
+ goto error ;
799
815
}
800
816
if (value != 42 ) {
801
817
PyErr_SetString (PyExc_AssertionError ,
802
818
"test_L_code: L code returned wrong value for int 42" );
803
- return NULL ;
819
+ goto error ;
804
820
}
805
821
806
822
Py_DECREF (tuple );
807
823
Py_RETURN_NONE ;
824
+
825
+ error :
826
+ Py_DECREF (tuple );
827
+ return NULL ;
808
828
}
809
829
810
830
/* Test the s and z codes for PyArg_ParseTuple.
@@ -821,7 +841,7 @@ test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
821
841
PyObject * obj = PyUnicode_Decode ("t\xeate" , strlen ("t\xeate" ),
822
842
"latin-1" , NULL );
823
843
if (obj == NULL ) {
824
- return NULL ;
844
+ goto error ;
825
845
}
826
846
827
847
PyTuple_SET_ITEM (tuple , 0 , obj );
@@ -831,15 +851,19 @@ test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
831
851
*/
832
852
char * value ;
833
853
if (!PyArg_ParseTuple (tuple , "s:test_s_code1" , & value )) {
834
- return NULL ;
854
+ goto error ;
835
855
}
836
856
837
857
if (!PyArg_ParseTuple (tuple , "z:test_s_code2" , & value )) {
838
- return NULL ;
858
+ goto error ;
839
859
}
840
860
841
861
Py_DECREF (tuple );
842
862
Py_RETURN_NONE ;
863
+
864
+ error :
865
+ Py_DECREF (tuple );
866
+ return NULL ;
843
867
}
844
868
845
869
#undef PyArg_ParseTupleAndKeywords
0 commit comments