Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitca01cae

Browse files
authored
gh-102192: Replace PyErr_Fetch/Restore etc by more efficient alternatives (#102631)
1 parent9a8b66b commitca01cae

File tree

1 file changed

+19
-23
lines changed

1 file changed

+19
-23
lines changed

‎Python/ceval.c‎

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
#include"pycore_object.h"// _PyObject_GC_TRACK()
1414
#include"pycore_moduleobject.h"// PyModuleObject
1515
#include"pycore_opcode.h"// EXTRA_CASES
16-
#include"pycore_pyerrors.h"//_PyErr_Fetch(),_PyErr_GetRaisedException()
16+
#include"pycore_pyerrors.h"// _PyErr_GetRaisedException()
1717
#include"pycore_pymem.h"// _PyMem_IsPtrFreed()
1818
#include"pycore_pystate.h"// _PyInterpreterState_GET()
1919
#include"pycore_range.h"// _PyRangeIterObject
@@ -1783,18 +1783,15 @@ do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
17831783
if (exc==NULL) {
17841784
/* Reraise */
17851785
_PyErr_StackItem*exc_info=_PyErr_GetTopmostException(tstate);
1786-
value=exc_info->exc_value;
1787-
if (Py_IsNone(value)||value==NULL) {
1786+
exc=exc_info->exc_value;
1787+
if (Py_IsNone(exc)||exc==NULL) {
17881788
_PyErr_SetString(tstate,PyExc_RuntimeError,
17891789
"No active exception to reraise");
17901790
return0;
17911791
}
1792-
assert(PyExceptionInstance_Check(value));
1793-
type=PyExceptionInstance_Class(value);
1794-
Py_XINCREF(type);
1795-
Py_XINCREF(value);
1796-
PyObject*tb=PyException_GetTraceback(value);/* new ref */
1797-
_PyErr_Restore(tstate,type,value,tb);
1792+
Py_INCREF(exc);
1793+
assert(PyExceptionInstance_Check(exc));
1794+
_PyErr_SetRaisedException(tstate,exc);
17981795
return1;
17991796
}
18001797

@@ -2035,28 +2032,27 @@ call_exc_trace(Py_tracefunc func, PyObject *self,
20352032
PyThreadState*tstate,
20362033
_PyInterpreterFrame*f)
20372034
{
2038-
PyObject*type,*value,*traceback,*orig_traceback,*arg;
2039-
interr;
2040-
_PyErr_Fetch(tstate,&type,&value,&orig_traceback);
2041-
if (value==NULL) {
2042-
value=Py_NewRef(Py_None);
2035+
PyObject*exc=_PyErr_GetRaisedException(tstate);
2036+
assert(exc&&PyExceptionInstance_Check(exc));
2037+
PyObject*type=PyExceptionInstance_Class(exc);
2038+
PyObject*traceback=PyException_GetTraceback(exc);
2039+
if (traceback==NULL) {
2040+
traceback=Py_NewRef(Py_None);
20432041
}
2044-
_PyErr_NormalizeException(tstate,&type,&value,&orig_traceback);
2045-
traceback= (orig_traceback!=NULL) ?orig_traceback :Py_None;
2046-
arg=PyTuple_Pack(3,type,value,traceback);
2042+
PyObject*arg=PyTuple_Pack(3,type,exc,traceback);
2043+
Py_XDECREF(traceback);
2044+
20472045
if (arg==NULL) {
2048-
_PyErr_Restore(tstate,type,value,orig_traceback);
2046+
_PyErr_SetRaisedException(tstate,exc);
20492047
return;
20502048
}
2051-
err=call_trace(func,self,tstate,f,PyTrace_EXCEPTION,arg);
2049+
interr=call_trace(func,self,tstate,f,PyTrace_EXCEPTION,arg);
20522050
Py_DECREF(arg);
20532051
if (err==0) {
2054-
_PyErr_Restore(tstate,type,value,orig_traceback);
2052+
_PyErr_SetRaisedException(tstate,exc);
20552053
}
20562054
else {
2057-
Py_XDECREF(type);
2058-
Py_XDECREF(value);
2059-
Py_XDECREF(orig_traceback);
2055+
Py_XDECREF(exc);
20602056
}
20612057
}
20622058

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp