diff options
author | Jelle Zijlstra <jelle.zijlstra@gmail.com> | 2024-07-11 15:51:32 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-11 15:51:32 (GMT) |
commit | 38c4028dd9aeeeb1fe4ba1444307e3f06fc63aa0 (patch) | |
tree | 11c6a654355b1843071221024ccd39c615b47b54 /Python/Python-ast.c | |
parent | 3b5f8d256c534e9b2baa64ec151da0d590213667 (diff) | |
download | cpython-38c4028dd9aeeeb1fe4ba1444307e3f06fc63aa0.zip cpython-38c4028dd9aeeeb1fe4ba1444307e3f06fc63aa0.tar.gz cpython-38c4028dd9aeeeb1fe4ba1444307e3f06fc63aa0.tar.bz2 |
[3.13] gh-121332: Make AST node constructor check _attributes instead of hardcoding attributes (GH-121334) (#121625)
(cherry picked from commit 58e8cf2bb61f82df9eabd1209fe5e3d146e4c8cd)
Diffstat (limited to 'Python/Python-ast.c')
-rw-r--r-- | Python/Python-ast.c | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/Python/Python-ast.c b/Python/Python-ast.c index 01ffea1..e38a145 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -5079,7 +5079,7 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw) Py_ssize_t i, numfields = 0; int res = -1; - PyObject *key, *value, *fields, *remaining_fields = NULL; + PyObject *key, *value, *fields, *attributes = NULL, *remaining_fields = NULL; if (PyObject_GetOptionalAttr((PyObject*)Py_TYPE(self), state->_fields, &fields) < 0) { goto cleanup; } @@ -5146,22 +5146,32 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw) goto cleanup; } } - else if ( - PyUnicode_CompareWithASCIIString(key, "lineno") != 0 && - PyUnicode_CompareWithASCIIString(key, "col_offset") != 0 && - PyUnicode_CompareWithASCIIString(key, "end_lineno") != 0 && - PyUnicode_CompareWithASCIIString(key, "end_col_offset") != 0 - ) { - if (PyErr_WarnFormat( - PyExc_DeprecationWarning, 1, - "%.400s.__init__ got an unexpected keyword argument '%U'. " - "Support for arbitrary keyword arguments is deprecated " - "and will be removed in Python 3.15.", - Py_TYPE(self)->tp_name, key - ) < 0) { + else { + // Lazily initialize "attributes" + if (attributes == NULL) { + attributes = PyObject_GetAttr((PyObject*)Py_TYPE(self), state->_attributes); + if (attributes == NULL) { + res = -1; + goto cleanup; + } + } + int contains = PySequence_Contains(attributes, key); + if (contains == -1) { res = -1; goto cleanup; } + else if (contains == 0) { + if (PyErr_WarnFormat( + PyExc_DeprecationWarning, 1, + "%.400s.__init__ got an unexpected keyword argument '%U'. " + "Support for arbitrary keyword arguments is deprecated " + "and will be removed in Python 3.15.", + Py_TYPE(self)->tp_name, key + ) < 0) { + res = -1; + goto cleanup; + } + } } res = PyObject_SetAttr(self, key, value); if (res < 0) { @@ -5244,6 +5254,7 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw) Py_DECREF(field_types); } cleanup: + Py_XDECREF(attributes); Py_XDECREF(fields); Py_XDECREF(remaining_fields); return res; |