summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorJelle Zijlstra <jelle.zijlstra@gmail.com>2023-05-18 23:45:37 (GMT)
committerGitHub <noreply@github.com>2023-05-18 23:45:37 (GMT)
commit3fadd7d5857842fc5cddd4c496b73161b0bcb421 (patch)
treea3a18ae7d7f4c9a486fd7679fa2cf9afee3b3d5f /Objects
parentf7835fc7e9617cefd87e72002916e258f589c857 (diff)
downloadcpython-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.c17
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 */
};