diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2025-05-10 16:44:07 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-10 16:44:07 (GMT) |
commit | 856e5903babcc78dca8eba4feb2ce6aebdc60e6c (patch) | |
tree | 659dfcdc2955b9e762486a4c26e6cdc78accadae /Python/Python-ast.c | |
parent | 13c94d04010269405be44cfac217a85740587549 (diff) | |
download | cpython-856e5903babcc78dca8eba4feb2ce6aebdc60e6c.zip cpython-856e5903babcc78dca8eba4feb2ce6aebdc60e6c.tar.gz cpython-856e5903babcc78dca8eba4feb2ce6aebdc60e6c.tar.bz2 |
[3.14] gh-133783: Fix __replace__ on AST nodes for optional attributes (GH-133797) (#133842)
gh-133783: Fix __replace__ on AST nodes for optional attributes (GH-133797)
(cherry picked from commit 7dddb4e667b5eb76cbe11755051ec139b0f437a9)
Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
Diffstat (limited to 'Python/Python-ast.c')
-rw-r--r-- | Python/Python-ast.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/Python/Python-ast.c b/Python/Python-ast.c index df03556..f7625ab 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -5528,6 +5528,32 @@ ast_type_replace_check(PyObject *self, Py_DECREF(unused); } } + + // Discard fields from 'expecting' that default to None + PyObject *field_types = NULL; + if (PyObject_GetOptionalAttr((PyObject*)Py_TYPE(self), + &_Py_ID(_field_types), + &field_types) < 0) + { + Py_DECREF(expecting); + return -1; + } + if (field_types != NULL) { + Py_ssize_t pos = 0; + PyObject *field_name, *field_type; + while (PyDict_Next(field_types, &pos, &field_name, &field_type)) { + if (_PyUnion_Check(field_type)) { + // optional field + if (PySet_Discard(expecting, field_name) < 0) { + Py_DECREF(expecting); + Py_DECREF(field_types); + return -1; + } + } + } + Py_DECREF(field_types); + } + // Now 'expecting' contains the fields or attributes // that would not be filled inside ast_type_replace(). Py_ssize_t m = PySet_GET_SIZE(expecting); |