mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
[3.12] gh-110782: Fix crash when TypeVar is constructed with keyword args (GH-110784) (#110787)
gh-110782: Fix crash when TypeVar is constructed with keyword args (GH-110784)
(cherry picked from commit d2a536b170
)
Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
This commit is contained in:
parent
80f958529b
commit
27d5ea291c
3 changed files with 28 additions and 18 deletions
|
@ -554,6 +554,12 @@ class TypeVarTests(BaseTestCase):
|
||||||
vals[x] = cls(str(x))
|
vals[x] = cls(str(x))
|
||||||
del vals
|
del vals
|
||||||
|
|
||||||
|
def test_constructor(self):
|
||||||
|
T = TypeVar(name="T")
|
||||||
|
self.assertEqual(T.__name__, "T")
|
||||||
|
self.assertEqual(T.__constraints__, ())
|
||||||
|
self.assertIs(T.__bound__, None)
|
||||||
|
|
||||||
|
|
||||||
def template_replace(templates: list[str], replacements: dict[str, list[str]]) -> list[tuple[str]]:
|
def template_replace(templates: list[str], replacements: dict[str, list[str]]) -> list[tuple[str]]:
|
||||||
"""Renders templates with possible combinations of replacements.
|
"""Renders templates with possible combinations of replacements.
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix crash when :class:`typing.TypeVar` is constructed with a keyword
|
||||||
|
argument. Patch by Jelle Zijlstra.
|
|
@ -364,6 +364,7 @@ typevar_new_impl(PyTypeObject *type, PyObject *name, PyObject *constraints,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (constraints != NULL) {
|
||||||
if (!PyTuple_CheckExact(constraints)) {
|
if (!PyTuple_CheckExact(constraints)) {
|
||||||
PyErr_SetString(PyExc_TypeError,
|
PyErr_SetString(PyExc_TypeError,
|
||||||
"constraints must be a tuple");
|
"constraints must be a tuple");
|
||||||
|
@ -383,6 +384,7 @@ typevar_new_impl(PyTypeObject *type, PyObject *name, PyObject *constraints,
|
||||||
Py_XDECREF(bound);
|
Py_XDECREF(bound);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
PyObject *module = caller();
|
PyObject *module = caller();
|
||||||
if (module == NULL) {
|
if (module == NULL) {
|
||||||
Py_XDECREF(bound);
|
Py_XDECREF(bound);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue