mirror of
https://github.com/python/cpython.git
synced 2025-07-09 20:35:26 +00:00
Close #18469: Replace PyDict_GetItemString() with _PyDict_GetItemId() in structseq.c
_PyDict_GetItemId() is more efficient: it only builds the Unicode string once. Identifiers (dictionary keys) are now created at Python initialization, and if the creation failed, Python does exit with a fatal error. Before, PyDict_GetItemString() failure was not handled: structseq_new() could call PyObject_GC_NewVar() with a negative size, and structseq_dealloc() could also crash.
This commit is contained in:
parent
b8f602a60a
commit
26f91999b4
2 changed files with 23 additions and 5 deletions
|
@ -86,6 +86,7 @@ static void call_py_exitfuncs(void);
|
|||
static void wait_for_thread_shutdown(void);
|
||||
static void call_ll_exitfuncs(void);
|
||||
extern int _PyUnicode_Init(void);
|
||||
extern int _PyStructSequence_Init(void);
|
||||
extern void _PyUnicode_Fini(void);
|
||||
extern int _PyLong_Init(void);
|
||||
extern void PyLong_Fini(void);
|
||||
|
@ -336,6 +337,8 @@ _Py_InitializeEx_Private(int install_sigs, int install_importlib)
|
|||
/* Init Unicode implementation; relies on the codec registry */
|
||||
if (_PyUnicode_Init() < 0)
|
||||
Py_FatalError("Py_Initialize: can't initialize unicode");
|
||||
if (_PyStructSequence_Init() < 0)
|
||||
Py_FatalError("Py_Initialize: can't initialize structseq");
|
||||
|
||||
bimod = _PyBuiltin_Init();
|
||||
if (bimod == NULL)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue