From e8bb03b9e92ef794167995d19d26e8bef58d2293 Mon Sep 17 00:00:00 2001 From: Matthew Rahtz Date: Sun, 30 Jan 2022 12:51:12 +0000 Subject: [PATCH 01/15] PEP 646: Implement changes to genericaliasobject.c --- Lib/test/test_genericalias.py | 79 +++++++++++++++++++++++++++++++++++ Objects/genericaliasobject.c | 60 +++++++++++++++++++++++++- 2 files changed, 138 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 706cc5ea1af2f0..414a99c83ad568 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -162,6 +162,24 @@ class MyList(list): self.assertEqual(repr(list[str]), 'list[str]') self.assertEqual(repr(list[()]), 'list[()]') self.assertEqual(repr(tuple[int, ...]), 'tuple[int, ...]') + x1 = tuple[ + tuple( # Effectively the same as starring; TODO + tuple[int] + ) + ] + self.assertEqual(repr(x1), 'tuple[*tuple[int]]') + x2 = tuple[ + tuple( # Ditto TODO + tuple[int, str] + ) + ] + self.assertEqual(repr(x2), 'tuple[*tuple[int, str]]') + x3 = tuple[ + tuple( # Ditto TODO + tuple[int, ...] + ) + ] + self.assertEqual(repr(x3), 'tuple[*tuple[int, ...]]') self.assertTrue(repr(MyList[int]).endswith('.BaseTest.test_repr..MyList[int]')) self.assertEqual(repr(list[str]()), '[]') # instances should keep their normal repr @@ -175,6 +193,7 @@ def test_exposed_type(self): def test_parameters(self): from typing import List, Dict, Callable + D0 = dict[str, int] self.assertEqual(D0.__args__, (str, int)) self.assertEqual(D0.__parameters__, ()) @@ -190,6 +209,7 @@ def test_parameters(self): D2b = dict[T, T] self.assertEqual(D2b.__args__, (T, T)) self.assertEqual(D2b.__parameters__, (T,)) + L0 = list[str] self.assertEqual(L0.__args__, (str,)) self.assertEqual(L0.__parameters__, ()) @@ -212,6 +232,52 @@ def test_parameters(self): self.assertEqual(L5.__args__, (Callable[[K, V], K],)) self.assertEqual(L5.__parameters__, (K, V)) + with self.assertRaises(TypeError): + tuple[ + tuple( # Effectively the same as starring; TODO + list[int] + ) + ] + + T1 = tuple[ + tuple( # Ditto TODO + tuple[int] + ) + ] + self.assertEqual( + T1.__args__, + tuple( # Ditto TODO + tuple[int] + ) + ) + self.assertEqual(T1.__parameters__, ()) + + T2 = tuple[ + tuple( # Ditto TODO + tuple[T] + ) + ] + self.assertEqual( + T2.__args__, + tuple( # Ditto TODO + tuple[T] + ) + ) + self.assertEqual(T2.__parameters__, (T,)) + + T4 = tuple[ + tuple( # Ditto TODO + tuple[int, str] + ) + ] + self.assertEqual( + T4.__args__, + tuple( # Ditto TODO + tuple[int, str] + ) + ) + self.assertEqual(T4.__parameters__, ()) + def test_parameter_chaining(self): from typing import List, Dict, Union, Callable self.assertEqual(list[T][int], list[int]) @@ -242,6 +308,19 @@ def test_parameter_chaining(self): def test_equality(self): self.assertEqual(list[int], list[int]) self.assertEqual(dict[str, int], dict[str, int]) + self.assertEqual((*tuple[int],)[0], (*tuple[int],)[0]) + self.assertEqual( + tuple[ + tuple( # Effectively the same as starring; TODO + tuple[int] + ) + ], + tuple[ + tuple( # Ditto TODO + tuple[int] + ) + ] + ) self.assertNotEqual(dict[str, int], dict[str, str]) self.assertNotEqual(list, list[int]) self.assertNotEqual(list[int], list) diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index dbe5d89b739629..55780d293d60e5 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -11,8 +11,16 @@ typedef struct { PyObject *args; PyObject *parameters; PyObject* weakreflist; + // Whether we're a starred type, e.g. *tuple[int]. + // Only supported for `tuple`. + int starred; } gaobject; +typedef struct { + PyObject_HEAD + PyObject *obj; /* Set to NULL when iterator is exhausted */ +} gaiterobject; + static void ga_dealloc(PyObject *self) { @@ -118,12 +126,17 @@ ga_repr_item(_PyUnicodeWriter *writer, PyObject *p) static PyObject * ga_repr(PyObject *self) { - gaobject *alias = (gaobject *)self; + gaobject *alias = (gaobject *) self; Py_ssize_t len = PyTuple_GET_SIZE(alias->args); _PyUnicodeWriter writer; _PyUnicodeWriter_Init(&writer); + if (alias->starred) { + if (_PyUnicodeWriter_WriteASCIIString(&writer, "*", 1) < 0) { + goto error; + } + } if (ga_repr_item(&writer, alias->origin) < 0) { goto error; } @@ -626,6 +639,50 @@ static PyNumberMethods ga_as_number = { .nb_or = _Py_union_type_or, // Add __or__ function }; +static PyObject * +ga_iternext(gaiterobject *gi) { + if (gi->obj == NULL) { + return NULL; + } + gaobject *alias = (gaobject *) gi->obj; + PyObject *starred_tuple = Py_GenericAlias(alias->origin, alias->args); + ((gaobject * ) starred_tuple)->starred = 1; + Py_SETREF(gi->obj, NULL); + return starred_tuple; +} + +static void +ga_iter_dealloc(gaiterobject *gi) { + _PyObject_GC_UNTRACK(gi); + PyObject_GC_Del(gi); +} + +static PyTypeObject Py_GenericAliasIterType = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + .tp_name = "generic_alias_iter", + .tp_basicsize = sizeof(gaiterobject), + .tp_iternext = (iternextfunc)ga_iternext, + .tp_dealloc = (destructor)ga_iter_dealloc, + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, +}; + +static PyObject * +ga_iter(PyObject *self) { + gaobject *alias = (gaobject *) self; + if ((PyTypeObject *) alias->origin != &PyTuple_Type) { + PyErr_SetString(PyExc_TypeError, "Only tuple types can be unpacked with *"); + return NULL; + } + + gaiterobject *gi = PyObject_GC_New(gaiterobject, &Py_GenericAliasIterType); + if (gi == NULL) + return NULL; + gi->obj = self; + Py_INCREF(self); + _PyObject_GC_TRACK(gi); + return (PyObject *) gi; +} + // TODO: // - argument clinic? // - __doc__? @@ -654,6 +711,7 @@ PyTypeObject Py_GenericAliasType = { .tp_new = ga_new, .tp_free = PyObject_GC_Del, .tp_getset = ga_properties, + .tp_iter = (getiterfunc)ga_iter, }; PyObject * From 9cb2aec0a0872669ada4169fa6044ce16956b336 Mon Sep 17 00:00:00 2001 From: "blurb-it[bot]" <43283697+blurb-it[bot]@users.noreply.github.com> Date: Sun, 30 Jan 2022 20:32:41 +0000 Subject: [PATCH 02/15] =?UTF-8?q?=F0=9F=93=9C=F0=9F=A4=96=20Added=20by=20b?= =?UTF-8?q?lurb=5Fit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../next/Library/2022-01-30-20-32-40.bpo-43224.zqrQsj.rst | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2022-01-30-20-32-40.bpo-43224.zqrQsj.rst diff --git a/Misc/NEWS.d/next/Library/2022-01-30-20-32-40.bpo-43224.zqrQsj.rst b/Misc/NEWS.d/next/Library/2022-01-30-20-32-40.bpo-43224.zqrQsj.rst new file mode 100644 index 00000000000000..b1937fa207671f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-30-20-32-40.bpo-43224.zqrQsj.rst @@ -0,0 +1,6 @@ +Allow unpacking `types.GenericAlias` objects, e.g. `*tuple[int]`. + +Part of PEP 646 - e.g: + + Ts = TypeVarTuple('Ts') + def foo(*args: *tuple[int, *Ts]): ... \ No newline at end of file From b3fa489529eb98e139beef2a9ed0d6a75c2e5c8a Mon Sep 17 00:00:00 2001 From: Matthew Rahtz Date: Sun, 30 Jan 2022 20:42:26 +0000 Subject: [PATCH 03/15] Swap an assignment and an INCREF to a NewRef Co-authored-by: Jelle Zijlstra --- Objects/genericaliasobject.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index 55780d293d60e5..eb6ecf8a689d3b 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -677,8 +677,7 @@ ga_iter(PyObject *self) { gaiterobject *gi = PyObject_GC_New(gaiterobject, &Py_GenericAliasIterType); if (gi == NULL) return NULL; - gi->obj = self; - Py_INCREF(self); + gi->obj = Py_NewRef(self); _PyObject_GC_TRACK(gi); return (PyObject *) gi; } From ec81d4484c953277f454ba76523c7a8f5eeff950 Mon Sep 17 00:00:00 2001 From: Matthew Rahtz Date: Sun, 30 Jan 2022 20:39:28 +0000 Subject: [PATCH 04/15] Fix cast whitespace --- Objects/genericaliasobject.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index eb6ecf8a689d3b..b05aa18790eefb 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -126,7 +126,7 @@ ga_repr_item(_PyUnicodeWriter *writer, PyObject *p) static PyObject * ga_repr(PyObject *self) { - gaobject *alias = (gaobject *) self; + gaobject *alias = (gaobject *)self; Py_ssize_t len = PyTuple_GET_SIZE(alias->args); _PyUnicodeWriter writer; @@ -644,9 +644,9 @@ ga_iternext(gaiterobject *gi) { if (gi->obj == NULL) { return NULL; } - gaobject *alias = (gaobject *) gi->obj; + gaobject *alias = (gaobject *)gi->obj; PyObject *starred_tuple = Py_GenericAlias(alias->origin, alias->args); - ((gaobject * ) starred_tuple)->starred = 1; + ((gaobject *)starred_tuple)->starred = 1; Py_SETREF(gi->obj, NULL); return starred_tuple; } @@ -668,8 +668,8 @@ static PyTypeObject Py_GenericAliasIterType = { static PyObject * ga_iter(PyObject *self) { - gaobject *alias = (gaobject *) self; - if ((PyTypeObject *) alias->origin != &PyTuple_Type) { + gaobject *alias = (gaobject *)self; + if ((PyTypeObject *)alias->origin != &PyTuple_Type) { PyErr_SetString(PyExc_TypeError, "Only tuple types can be unpacked with *"); return NULL; } @@ -679,7 +679,7 @@ ga_iter(PyObject *self) { return NULL; gi->obj = Py_NewRef(self); _PyObject_GC_TRACK(gi); - return (PyObject *) gi; + return (PyObject *)gi; } // TODO: From 968b3fbacbaf825f4a9ef01a405f76a9be491b51 Mon Sep 17 00:00:00 2001 From: Matthew Rahtz Date: Sun, 30 Jan 2022 20:40:50 +0000 Subject: [PATCH 05/15] Add NULL check --- Objects/genericaliasobject.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index b05aa18790eefb..07859531aba0f4 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -646,6 +646,9 @@ ga_iternext(gaiterobject *gi) { } gaobject *alias = (gaobject *)gi->obj; PyObject *starred_tuple = Py_GenericAlias(alias->origin, alias->args); + if (starred_tuple == NULL) { + return NULL; + } ((gaobject *)starred_tuple)->starred = 1; Py_SETREF(gi->obj, NULL); return starred_tuple; From 4aa94df3b0766ed971fde990edf7820539555535 Mon Sep 17 00:00:00 2001 From: Matthew Rahtz Date: Sun, 30 Jan 2022 20:41:49 +0000 Subject: [PATCH 06/15] Remove restriction that only `tuple` can be unpacked --- Objects/genericaliasobject.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index 07859531aba0f4..a8b505688614d0 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -671,12 +671,6 @@ static PyTypeObject Py_GenericAliasIterType = { static PyObject * ga_iter(PyObject *self) { - gaobject *alias = (gaobject *)self; - if ((PyTypeObject *)alias->origin != &PyTuple_Type) { - PyErr_SetString(PyExc_TypeError, "Only tuple types can be unpacked with *"); - return NULL; - } - gaiterobject *gi = PyObject_GC_New(gaiterobject, &Py_GenericAliasIterType); if (gi == NULL) return NULL; From c256bc99d9232d83f7aabc1dab4e70320a89e227 Mon Sep 17 00:00:00 2001 From: Matthew Rahtz Date: Sun, 30 Jan 2022 20:45:51 +0000 Subject: [PATCH 07/15] Remove test which is no longer necessary --- Lib/test/test_genericalias.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 414a99c83ad568..6b264877f795c4 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -232,13 +232,6 @@ def test_parameters(self): self.assertEqual(L5.__args__, (Callable[[K, V], K],)) self.assertEqual(L5.__parameters__, (K, V)) - with self.assertRaises(TypeError): - tuple[ - tuple( # Effectively the same as starring; TODO - list[int] - ) - ] - T1 = tuple[ tuple( # Ditto TODO tuple[int] From e4a72b4bc4cc419da6a6e52956b1719940286085 Mon Sep 17 00:00:00 2001 From: Matthew Rahtz Date: Tue, 1 Feb 2022 15:33:36 +0000 Subject: [PATCH 08/15] Fix news --- .../next/Library/2022-01-30-20-32-40.bpo-43224.zqrQsj.rst | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Misc/NEWS.d/next/Library/2022-01-30-20-32-40.bpo-43224.zqrQsj.rst b/Misc/NEWS.d/next/Library/2022-01-30-20-32-40.bpo-43224.zqrQsj.rst index b1937fa207671f..55e94126710586 100644 --- a/Misc/NEWS.d/next/Library/2022-01-30-20-32-40.bpo-43224.zqrQsj.rst +++ b/Misc/NEWS.d/next/Library/2022-01-30-20-32-40.bpo-43224.zqrQsj.rst @@ -1,6 +1 @@ -Allow unpacking `types.GenericAlias` objects, e.g. `*tuple[int]`. - -Part of PEP 646 - e.g: - - Ts = TypeVarTuple('Ts') - def foo(*args: *tuple[int, *Ts]): ... \ No newline at end of file +Allow unpacking types.GenericAlias objects, e.g. ``*tuple[int, str]``. From 742d283952f9ee0243f5f147b12b37ac57c67245 Mon Sep 17 00:00:00 2001 From: Matthew Rahtz Date: Tue, 1 Feb 2022 15:34:07 +0000 Subject: [PATCH 09/15] Import suggestions from kumaraditya303 from previous PR --- Objects/genericaliasobject.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index a8b505688614d0..05966e083acb01 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -5,6 +5,8 @@ #include "pycore_unionobject.h" // _Py_union_type_or, _PyGenericAlias_Check #include "structmember.h" // PyMemberDef +#include + typedef struct { PyObject_HEAD PyObject *origin; @@ -13,7 +15,7 @@ typedef struct { PyObject* weakreflist; // Whether we're a starred type, e.g. *tuple[int]. // Only supported for `tuple`. - int starred; + bool starred; } gaobject; typedef struct { @@ -649,7 +651,7 @@ ga_iternext(gaiterobject *gi) { if (starred_tuple == NULL) { return NULL; } - ((gaobject *)starred_tuple)->starred = 1; + ((gaobject *)starred_tuple)->starred = true; Py_SETREF(gi->obj, NULL); return starred_tuple; } From d4d97b3af0d8ccbf4d913ac5e677adceae3914b5 Mon Sep 17 00:00:00 2001 From: Matthew Rahtz Date: Tue, 1 Feb 2022 15:37:29 +0000 Subject: [PATCH 10/15] Use public PyObject_GC_Track Co-authored-by: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com> --- Objects/genericaliasobject.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index 05966e083acb01..e919ccbcdbe869 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -677,7 +677,7 @@ ga_iter(PyObject *self) { if (gi == NULL) return NULL; gi->obj = Py_NewRef(self); - _PyObject_GC_TRACK(gi); + PyObject_GC_Track(gi); return (PyObject *)gi; } From 7f06e2a8dded808f716e4d0d138eef939fc94d9a Mon Sep 17 00:00:00 2001 From: Matthew Rahtz Date: Tue, 1 Feb 2022 15:37:40 +0000 Subject: [PATCH 11/15] Use public PyObject_GC_UnTrack Co-authored-by: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com> --- Objects/genericaliasobject.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index e919ccbcdbe869..8ca71123286ca4 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -658,7 +658,7 @@ ga_iternext(gaiterobject *gi) { static void ga_iter_dealloc(gaiterobject *gi) { - _PyObject_GC_UNTRACK(gi); + PyObject_GC_UnTrack(gi); PyObject_GC_Del(gi); } From 6bf3caa0e7483b28f97802f02606a844c33bff57 Mon Sep 17 00:00:00 2001 From: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com> Date: Tue, 8 Feb 2022 07:20:46 +0000 Subject: [PATCH 12/15] fix gc --- Objects/genericaliasobject.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index 8ca71123286ca4..26b959f53e920a 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -659,14 +659,24 @@ ga_iternext(gaiterobject *gi) { static void ga_iter_dealloc(gaiterobject *gi) { PyObject_GC_UnTrack(gi); + Py_XDECREF(gi->obj); PyObject_GC_Del(gi); } +static int +ga_iter_traverse(gaiterobject *gi, visitproc visit, void *arg) +{ + Py_VISIT(gi->obj); + return 0; +} + static PyTypeObject Py_GenericAliasIterType = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - .tp_name = "generic_alias_iter", + .tp_name = "generic_alias_iterator", .tp_basicsize = sizeof(gaiterobject), + .tp_iter = PyObject_SelfIter, .tp_iternext = (iternextfunc)ga_iternext, + .tp_traverse = (traverseproc)ga_iter_traverse, .tp_dealloc = (destructor)ga_iter_dealloc, .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, }; From e55430911c2b952d424bb02632908c326fac52d6 Mon Sep 17 00:00:00 2001 From: Matthew Rahtz Date: Mon, 14 Feb 2022 19:25:42 +0000 Subject: [PATCH 13/15] Implement tp_clear; set StopIteration explicitly; add curly braces --- Objects/genericaliasobject.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index 26b959f53e920a..f50ba1eff33cd6 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -644,6 +644,7 @@ static PyNumberMethods ga_as_number = { static PyObject * ga_iternext(gaiterobject *gi) { if (gi->obj == NULL) { + PyErr_SetNone(PyExc_StopIteration); return NULL; } gaobject *alias = (gaobject *)gi->obj; @@ -670,6 +671,13 @@ ga_iter_traverse(gaiterobject *gi, visitproc visit, void *arg) return 0; } +static int +ga_iter_clear(PyObject *self) { + gaiterobject *gi = (gaiterobject *)self; + Py_CLEAR(gi->obj); + return 0; +} + static PyTypeObject Py_GenericAliasIterType = { PyVarObject_HEAD_INIT(&PyType_Type, 0) .tp_name = "generic_alias_iterator", @@ -678,14 +686,16 @@ static PyTypeObject Py_GenericAliasIterType = { .tp_iternext = (iternextfunc)ga_iternext, .tp_traverse = (traverseproc)ga_iter_traverse, .tp_dealloc = (destructor)ga_iter_dealloc, + .tp_clear = (inquiry)ga_iter_clear, .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, }; static PyObject * ga_iter(PyObject *self) { gaiterobject *gi = PyObject_GC_New(gaiterobject, &Py_GenericAliasIterType); - if (gi == NULL) + if (gi == NULL) { return NULL; + } gi->obj = Py_NewRef(self); PyObject_GC_Track(gi); return (PyObject *)gi; From eaf8083518c27e6d9f00802d52bfee3d524fc95e Mon Sep 17 00:00:00 2001 From: Matthew Rahtz Date: Mon, 14 Feb 2022 19:25:52 +0000 Subject: [PATCH 14/15] Add more tests --- Lib/test/test_genericalias.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 6b264877f795c4..090224d0a26935 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -411,6 +411,24 @@ def __new__(cls, *args, **kwargs): with self.assertRaises(TypeError): Bad(list, int, bad=int) + def test_iter_creates_starred_tuple(self): + t = tuple[int, str] + iter_t = iter(t) + x = next(iter_t) + self.assertEqual(repr(x), '*tuple[int, str]') + + def test_calling_next_twice_raises_stopiteration(self): + t = tuple[int, str] + iter_t = iter(t) + next(iter_t) + with self.assertRaises(StopIteration): + next(iter_t) + + def test_del_iter(self): + t = tuple[int, str] + iter_x = iter(t) + del iter_x + if __name__ == "__main__": unittest.main() From 38dca54e5a2e94237fa4691e73287b642732e9fb Mon Sep 17 00:00:00 2001 From: Matthew Rahtz Date: Tue, 15 Feb 2022 19:23:27 +0000 Subject: [PATCH 15/15] Remove references to starred *tuples* specifically (since we removed the restriction that only tuples can be starred --- Objects/genericaliasobject.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index f50ba1eff33cd6..b3cb34712aa332 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -14,7 +14,6 @@ typedef struct { PyObject *parameters; PyObject* weakreflist; // Whether we're a starred type, e.g. *tuple[int]. - // Only supported for `tuple`. bool starred; } gaobject; @@ -648,13 +647,13 @@ ga_iternext(gaiterobject *gi) { return NULL; } gaobject *alias = (gaobject *)gi->obj; - PyObject *starred_tuple = Py_GenericAlias(alias->origin, alias->args); - if (starred_tuple == NULL) { + PyObject *starred_alias = Py_GenericAlias(alias->origin, alias->args); + if (starred_alias == NULL) { return NULL; } - ((gaobject *)starred_tuple)->starred = true; + ((gaobject *)starred_alias)->starred = true; Py_SETREF(gi->obj, NULL); - return starred_tuple; + return starred_alias; } static void