@@ -517,7 +517,7 @@ _PyErr_Fetch(PyThreadState *tstate, PyObject **p_type, PyObject **p_value,
517
517
}
518
518
else {
519
519
* p_type = Py_NewRef (Py_TYPE (exc ));
520
- * p_traceback = Py_XNewRef ((( PyBaseExceptionObject * ) exc ) -> traceback );
520
+ * p_traceback = PyException_GetTraceback ( exc );
521
521
}
522
522
}
523
523
@@ -545,7 +545,7 @@ PyErr_Clear(void)
545
545
}
546
546
547
547
static PyObject *
548
- get_exc_type (PyObject * exc_value ) /* returns a borrowed ref */
548
+ get_exc_type (PyObject * exc_value ) /* returns a strong ref */
549
549
{
550
550
if (exc_value == NULL || exc_value == Py_None ) {
551
551
return Py_None ;
@@ -554,20 +554,19 @@ get_exc_type(PyObject *exc_value) /* returns a borrowed ref */
554
554
assert (PyExceptionInstance_Check (exc_value ));
555
555
PyObject * type = PyExceptionInstance_Class (exc_value );
556
556
assert (type != NULL );
557
- return type ;
557
+ return Py_NewRef ( type ) ;
558
558
}
559
559
}
560
560
561
561
static PyObject *
562
- get_exc_traceback (PyObject * exc_value ) /* returns a borrowed ref */
562
+ get_exc_traceback (PyObject * exc_value ) /* returns a strong ref */
563
563
{
564
564
if (exc_value == NULL || exc_value == Py_None ) {
565
565
return Py_None ;
566
566
}
567
567
else {
568
568
assert (PyExceptionInstance_Check (exc_value ));
569
569
PyObject * tb = PyException_GetTraceback (exc_value );
570
- Py_XDECREF (tb );
571
570
return tb ? tb : Py_None ;
572
571
}
573
572
}
@@ -578,9 +577,9 @@ _PyErr_GetExcInfo(PyThreadState *tstate,
578
577
{
579
578
_PyErr_StackItem * exc_info = _PyErr_GetTopmostException (tstate );
580
579
581
- * p_type = Py_XNewRef ( get_exc_type (exc_info -> exc_value ) );
580
+ * p_type = get_exc_type (exc_info -> exc_value );
582
581
* p_value = Py_XNewRef (exc_info -> exc_value );
583
- * p_traceback = Py_XNewRef ( get_exc_traceback (exc_info -> exc_value ) );
582
+ * p_traceback = get_exc_traceback (exc_info -> exc_value );
584
583
}
585
584
586
585
PyObject *
@@ -641,14 +640,19 @@ _PyErr_StackItemToExcInfoTuple(_PyErr_StackItem *err_info)
641
640
exc_value == Py_None ||
642
641
PyExceptionInstance_Check (exc_value ));
643
642
643
+ PyObject * ret = PyTuple_New (3 );
644
+ if (ret == NULL ) {
645
+ return NULL ;
646
+ }
647
+
644
648
PyObject * exc_type = get_exc_type (exc_value );
645
649
PyObject * exc_traceback = get_exc_traceback (exc_value );
646
650
647
- return PyTuple_Pack (
648
- 3 ,
649
- exc_type ? exc_type : Py_None ,
650
- exc_value ? exc_value : Py_None ,
651
- exc_traceback ? exc_traceback : Py_None ) ;
651
+ PyTuple_SET_ITEM ( ret , 0 , exc_type ? exc_type : Py_None );
652
+ PyTuple_SET_ITEM ( ret , 1 , exc_value ? Py_NewRef ( exc_value ) : Py_None );
653
+ PyTuple_SET_ITEM ( ret , 2 , exc_traceback ? exc_traceback : Py_None );
654
+
655
+ return ret ;
652
656
}
653
657
654
658
0 commit comments