mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	gh-102192: Replace PyErr_Fetch/Restore etc by more efficient alternatives (#102631)
This commit is contained in:
		
							parent
							
								
									9a8b66b58c
								
							
						
					
					
						commit
						ca01cae1e9
					
				
					 1 changed files with 19 additions and 23 deletions
				
			
		| 
						 | 
				
			
			@ -13,7 +13,7 @@
 | 
			
		|||
#include "pycore_object.h"        // _PyObject_GC_TRACK()
 | 
			
		||||
#include "pycore_moduleobject.h"  // PyModuleObject
 | 
			
		||||
#include "pycore_opcode.h"        // EXTRA_CASES
 | 
			
		||||
#include "pycore_pyerrors.h"      // _PyErr_Fetch(), _PyErr_GetRaisedException()
 | 
			
		||||
#include "pycore_pyerrors.h"      // _PyErr_GetRaisedException()
 | 
			
		||||
#include "pycore_pymem.h"         // _PyMem_IsPtrFreed()
 | 
			
		||||
#include "pycore_pystate.h"       // _PyInterpreterState_GET()
 | 
			
		||||
#include "pycore_range.h"         // _PyRangeIterObject
 | 
			
		||||
| 
						 | 
				
			
			@ -1783,18 +1783,15 @@ do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
 | 
			
		|||
    if (exc == NULL) {
 | 
			
		||||
        /* Reraise */
 | 
			
		||||
        _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
 | 
			
		||||
        value = exc_info->exc_value;
 | 
			
		||||
        if (Py_IsNone(value) || value == NULL) {
 | 
			
		||||
        exc = exc_info->exc_value;
 | 
			
		||||
        if (Py_IsNone(exc) || exc == NULL) {
 | 
			
		||||
            _PyErr_SetString(tstate, PyExc_RuntimeError,
 | 
			
		||||
                             "No active exception to reraise");
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
        assert(PyExceptionInstance_Check(value));
 | 
			
		||||
        type = PyExceptionInstance_Class(value);
 | 
			
		||||
        Py_XINCREF(type);
 | 
			
		||||
        Py_XINCREF(value);
 | 
			
		||||
        PyObject *tb = PyException_GetTraceback(value); /* new ref */
 | 
			
		||||
        _PyErr_Restore(tstate, type, value, tb);
 | 
			
		||||
        Py_INCREF(exc);
 | 
			
		||||
        assert(PyExceptionInstance_Check(exc));
 | 
			
		||||
        _PyErr_SetRaisedException(tstate, exc);
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2035,28 +2032,27 @@ call_exc_trace(Py_tracefunc func, PyObject *self,
 | 
			
		|||
               PyThreadState *tstate,
 | 
			
		||||
               _PyInterpreterFrame *f)
 | 
			
		||||
{
 | 
			
		||||
    PyObject *type, *value, *traceback, *orig_traceback, *arg;
 | 
			
		||||
    int err;
 | 
			
		||||
    _PyErr_Fetch(tstate, &type, &value, &orig_traceback);
 | 
			
		||||
    if (value == NULL) {
 | 
			
		||||
        value = Py_NewRef(Py_None);
 | 
			
		||||
    PyObject *exc = _PyErr_GetRaisedException(tstate);
 | 
			
		||||
    assert(exc && PyExceptionInstance_Check(exc));
 | 
			
		||||
    PyObject *type = PyExceptionInstance_Class(exc);
 | 
			
		||||
    PyObject *traceback = PyException_GetTraceback(exc);
 | 
			
		||||
    if (traceback == NULL) {
 | 
			
		||||
        traceback = Py_NewRef(Py_None);
 | 
			
		||||
    }
 | 
			
		||||
    _PyErr_NormalizeException(tstate, &type, &value, &orig_traceback);
 | 
			
		||||
    traceback = (orig_traceback != NULL) ? orig_traceback : Py_None;
 | 
			
		||||
    arg = PyTuple_Pack(3, type, value, traceback);
 | 
			
		||||
    PyObject *arg = PyTuple_Pack(3, type, exc, traceback);
 | 
			
		||||
    Py_XDECREF(traceback);
 | 
			
		||||
 | 
			
		||||
    if (arg == NULL) {
 | 
			
		||||
        _PyErr_Restore(tstate, type, value, orig_traceback);
 | 
			
		||||
        _PyErr_SetRaisedException(tstate, exc);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg);
 | 
			
		||||
    int err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg);
 | 
			
		||||
    Py_DECREF(arg);
 | 
			
		||||
    if (err == 0) {
 | 
			
		||||
        _PyErr_Restore(tstate, type, value, orig_traceback);
 | 
			
		||||
        _PyErr_SetRaisedException(tstate, exc);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        Py_XDECREF(type);
 | 
			
		||||
        Py_XDECREF(value);
 | 
			
		||||
        Py_XDECREF(orig_traceback);
 | 
			
		||||
        Py_XDECREF(exc);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue