diff options
author | Jelle Zijlstra <jelle.zijlstra@gmail.com> | 2023-05-18 23:45:37 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-18 23:45:37 (GMT) |
commit | 3fadd7d5857842fc5cddd4c496b73161b0bcb421 (patch) | |
tree | a3a18ae7d7f4c9a486fd7679fa2cf9afee3b3d5f /Objects | |
parent | f7835fc7e9617cefd87e72002916e258f589c857 (diff) | |
download | cpython-3fadd7d5857842fc5cddd4c496b73161b0bcb421.zip cpython-3fadd7d5857842fc5cddd4c496b73161b0bcb421.tar.gz cpython-3fadd7d5857842fc5cddd4c496b73161b0bcb421.tar.bz2 |
gh-104600: Make function.__type_params__ writable (#104601)
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/funcobject.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/Objects/funcobject.c b/Objects/funcobject.c index 69898bf..7530386 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -665,6 +665,20 @@ func_get_type_params(PyFunctionObject *op, void *Py_UNUSED(ignored)) return Py_NewRef(op->func_typeparams); } +static int +func_set_type_params(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored)) +{ + /* Not legal to del f.__type_params__ or to set it to anything + * other than a tuple object. */ + if (value == NULL || !PyTuple_Check(value)) { + PyErr_SetString(PyExc_TypeError, + "__type_params__ must be set to a tuple"); + return -1; + } + Py_XSETREF(op->func_typeparams, Py_NewRef(value)); + return 0; +} + PyObject * _Py_set_function_type_params(PyThreadState *Py_UNUSED(ignored), PyObject *func, PyObject *type_params) @@ -687,7 +701,8 @@ static PyGetSetDef func_getsetlist[] = { {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict}, {"__name__", (getter)func_get_name, (setter)func_set_name}, {"__qualname__", (getter)func_get_qualname, (setter)func_set_qualname}, - {"__type_params__", (getter)func_get_type_params, NULL}, + {"__type_params__", (getter)func_get_type_params, + (setter)func_set_type_params}, {NULL} /* Sentinel */ }; |