summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2023-07-11 16:15:30 (GMT)
committerGitHub <noreply@github.com>2023-07-11 16:15:30 (GMT)
commit58f9c8889d8fa79d617fddf6cb48942d3003c7fd (patch)
treee1b027f68d2fc2d3320359c366d186f827e5155b
parent60150590c74ff397ed07ef7bd752ad2f1d5cfde5 (diff)
downloadcpython-58f9c8889d8fa79d617fddf6cb48942d3003c7fd.zip
cpython-58f9c8889d8fa79d617fddf6cb48942d3003c7fd.tar.gz
cpython-58f9c8889d8fa79d617fddf6cb48942d3003c7fd.tar.bz2
[3.12] gh-106403: Restore weakref support for TypeVar and friends (GH-106418) (#106635)
gh-106403: Restore weakref support for TypeVar and friends (GH-106418) (cherry picked from commit 945d3cbf2e8e756ed16c3ec51106e6157abb2698) Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
-rw-r--r--Lib/test/test_type_params.py31
-rw-r--r--Misc/NEWS.d/next/Library/2023-07-04-07-25-30.gh-issue-106403.GmefbV.rst4
-rw-r--r--Objects/typevarobject.c12
3 files changed, 42 insertions, 5 deletions
diff --git a/Lib/test/test_type_params.py b/Lib/test/test_type_params.py
index 3026cc2..bced641 100644
--- a/Lib/test/test_type_params.py
+++ b/Lib/test/test_type_params.py
@@ -3,6 +3,7 @@ import textwrap
import types
import unittest
import pickle
+import weakref
from test.support import requires_working_socket, check_syntax_error, run_code
from typing import Generic, Sequence, TypeVar, TypeVarTuple, ParamSpec, get_args
@@ -921,3 +922,33 @@ class TypeParamsPickleTest(unittest.TestCase):
# These instances are not equal,
# but class check is good enough:
self.assertIsInstance(pickle.loads(pickled), real_class)
+
+
+class TypeParamsWeakRefTest(unittest.TestCase):
+ def test_weakrefs(self):
+ T = TypeVar('T')
+ P = ParamSpec('P')
+ class OldStyle(Generic[T]):
+ pass
+
+ class NewStyle[T]:
+ pass
+
+ cases = [
+ T,
+ TypeVar('T', bound=int),
+ P,
+ P.args,
+ P.kwargs,
+ TypeVarTuple('Ts'),
+ OldStyle,
+ OldStyle[int],
+ OldStyle(),
+ NewStyle,
+ NewStyle[int],
+ NewStyle(),
+ Generic[T],
+ ]
+ for case in cases:
+ with self.subTest(case=case):
+ weakref.ref(case)
diff --git a/Misc/NEWS.d/next/Library/2023-07-04-07-25-30.gh-issue-106403.GmefbV.rst b/Misc/NEWS.d/next/Library/2023-07-04-07-25-30.gh-issue-106403.GmefbV.rst
new file mode 100644
index 0000000..4fea45f
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-07-04-07-25-30.gh-issue-106403.GmefbV.rst
@@ -0,0 +1,4 @@
+Instances of :class:`typing.TypeVar`, :class:`typing.ParamSpec`,
+:class:`typing.ParamSpecArgs`, :class:`typing.ParamSpecKwargs`, and
+:class:`typing.TypeVarTuple` once again support weak references, fixing a
+regression introduced in Python 3.12.0 beta 1. Patch by Jelle Zijlstra.
diff --git a/Objects/typevarobject.c b/Objects/typevarobject.c
index 406a6eb..97f3913 100644
--- a/Objects/typevarobject.c
+++ b/Objects/typevarobject.c
@@ -500,7 +500,7 @@ PyType_Spec typevar_spec = {
.name = "typing.TypeVar",
.basicsize = sizeof(typevarobject),
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_IMMUTABLETYPE
- | Py_TPFLAGS_MANAGED_DICT,
+ | Py_TPFLAGS_MANAGED_DICT | Py_TPFLAGS_MANAGED_WEAKREF,
.slots = typevar_slots,
};
@@ -647,7 +647,8 @@ static PyType_Slot paramspecargs_slots[] = {
PyType_Spec paramspecargs_spec = {
.name = "typing.ParamSpecArgs",
.basicsize = sizeof(paramspecattrobject),
- .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_IMMUTABLETYPE,
+ .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_IMMUTABLETYPE
+ | Py_TPFLAGS_MANAGED_WEAKREF,
.slots = paramspecargs_slots,
};
@@ -726,7 +727,8 @@ static PyType_Slot paramspeckwargs_slots[] = {
PyType_Spec paramspeckwargs_spec = {
.name = "typing.ParamSpecKwargs",
.basicsize = sizeof(paramspecattrobject),
- .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_IMMUTABLETYPE,
+ .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_IMMUTABLETYPE
+ | Py_TPFLAGS_MANAGED_WEAKREF,
.slots = paramspeckwargs_slots,
};
@@ -1007,7 +1009,7 @@ PyType_Spec paramspec_spec = {
.name = "typing.ParamSpec",
.basicsize = sizeof(paramspecobject),
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_IMMUTABLETYPE
- | Py_TPFLAGS_MANAGED_DICT,
+ | Py_TPFLAGS_MANAGED_DICT | Py_TPFLAGS_MANAGED_WEAKREF,
.slots = paramspec_slots,
};
@@ -1228,7 +1230,7 @@ PyType_Spec typevartuple_spec = {
.name = "typing.TypeVarTuple",
.basicsize = sizeof(typevartupleobject),
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_MANAGED_DICT
- | Py_TPFLAGS_HAVE_GC,
+ | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_MANAGED_WEAKREF,
.slots = typevartuple_slots,
};