summaryrefslogtreecommitdiffstats
path: root/Parser
diff options
context:
space:
mode:
Diffstat (limited to 'Parser')
-rwxr-xr-xParser/asdl_c.py31
1 files changed, 17 insertions, 14 deletions
diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py
index 1f0be45..11d59fa 100755
--- a/Parser/asdl_c.py
+++ b/Parser/asdl_c.py
@@ -979,14 +979,9 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
goto cleanup;
}
if (field_types == NULL) {
- if (PyErr_WarnFormat(
- PyExc_DeprecationWarning, 1,
- "%.400s provides _fields but not _field_types. "
- "This will become an error in Python 3.15.",
- Py_TYPE(self)->tp_name
- ) < 0) {
- res = -1;
- }
+ // Probably a user-defined subclass of AST that lacks _field_types.
+ // This will continue to work as it did before 3.13; i.e., attributes
+ // that are not passed in simply do not exist on the instance.
goto cleanup;
}
remaining_list = PySequence_List(remaining_fields);
@@ -997,12 +992,21 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
PyObject *name = PyList_GET_ITEM(remaining_list, i);
PyObject *type = PyDict_GetItemWithError(field_types, name);
if (!type) {
- if (!PyErr_Occurred()) {
- PyErr_SetObject(PyExc_KeyError, name);
+ if (PyErr_Occurred()) {
+ goto set_remaining_cleanup;
+ }
+ else {
+ if (PyErr_WarnFormat(
+ PyExc_DeprecationWarning, 1,
+ "Field '%U' is missing from %.400s._field_types. "
+ "This will become an error in Python 3.15.",
+ name, Py_TYPE(self)->tp_name
+ ) < 0) {
+ goto set_remaining_cleanup;
+ }
}
- goto set_remaining_cleanup;
}
- if (_PyUnion_Check(type)) {
+ else if (_PyUnion_Check(type)) {
// optional field
// do nothing, we'll have set a None default on the class
}
@@ -1026,8 +1030,7 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
"This will become an error in Python 3.15.",
Py_TYPE(self)->tp_name, name
) < 0) {
- res = -1;
- goto cleanup;
+ goto set_remaining_cleanup;
}
}
}