@@ -517,7 +517,7 @@ _PyErr_Fetch(PyThreadState *tstate, PyObject **p_type, PyObject **p_value,
517517 }
518518 else {
519519 * p_type = Py_NewRef (Py_TYPE (exc ));
520- * p_traceback = Py_XNewRef ((( PyBaseExceptionObject * ) exc ) -> traceback );
520+ * p_traceback = PyException_GetTraceback ( exc );
521521 }
522522}
523523
@@ -545,7 +545,7 @@ PyErr_Clear(void)
545545}
546546
547547static PyObject *
548- get_exc_type (PyObject * exc_value ) /* returns a borrowed ref */
548+ get_exc_type (PyObject * exc_value ) /* returns a strong ref */
549549{
550550 if (exc_value == NULL || exc_value == Py_None ) {
551551 return Py_None ;
@@ -554,20 +554,19 @@ get_exc_type(PyObject *exc_value) /* returns a borrowed ref */
554554 assert (PyExceptionInstance_Check (exc_value ));
555555 PyObject * type = PyExceptionInstance_Class (exc_value );
556556 assert (type != NULL );
557- return type ;
557+ return Py_NewRef ( type ) ;
558558 }
559559}
560560
561561static PyObject *
562- get_exc_traceback (PyObject * exc_value ) /* returns a borrowed ref */
562+ get_exc_traceback (PyObject * exc_value ) /* returns a strong ref */
563563{
564564 if (exc_value == NULL || exc_value == Py_None ) {
565565 return Py_None ;
566566 }
567567 else {
568568 assert (PyExceptionInstance_Check (exc_value ));
569569 PyObject * tb = PyException_GetTraceback (exc_value );
570- Py_XDECREF (tb );
571570 return tb ? tb : Py_None ;
572571 }
573572}
@@ -578,9 +577,9 @@ _PyErr_GetExcInfo(PyThreadState *tstate,
578577{
579578 _PyErr_StackItem * exc_info = _PyErr_GetTopmostException (tstate );
580579
581- * p_type = Py_XNewRef ( get_exc_type (exc_info -> exc_value ) );
580+ * p_type = get_exc_type (exc_info -> exc_value );
582581 * 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 );
584583}
585584
586585PyObject *
@@ -641,14 +640,19 @@ _PyErr_StackItemToExcInfoTuple(_PyErr_StackItem *err_info)
641640 exc_value == Py_None ||
642641 PyExceptionInstance_Check (exc_value ));
643642
643+ PyObject * ret = PyTuple_New (3 );
644+ if (ret == NULL ) {
645+ return NULL ;
646+ }
647+
644648 PyObject * exc_type = get_exc_type (exc_value );
645649 PyObject * exc_traceback = get_exc_traceback (exc_value );
646650
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 ;
652656}
653657
654658
0 commit comments