mirror of
https://github.com/python/cpython.git
synced 2025-12-15 21:44:50 +00:00
bpo-42233: Add union type expression support for GenericAlias and fix de-duplicating of GenericAlias (GH-23077)
This commit is contained in:
parent
23831a7a90
commit
4eb41d055e
6 changed files with 51 additions and 17 deletions
|
|
@ -237,9 +237,19 @@ dedup_and_flatten_args(PyObject* args)
|
|||
PyObject* i_element = PyTuple_GET_ITEM(args, i);
|
||||
for (Py_ssize_t j = i + 1; j < arg_length; j++) {
|
||||
PyObject* j_element = PyTuple_GET_ITEM(args, j);
|
||||
if (i_element == j_element) {
|
||||
is_duplicate = 1;
|
||||
int is_ga = Py_TYPE(i_element) == &Py_GenericAliasType &&
|
||||
Py_TYPE(j_element) == &Py_GenericAliasType;
|
||||
// RichCompare to also deduplicate GenericAlias types (slower)
|
||||
is_duplicate = is_ga ? PyObject_RichCompareBool(i_element, j_element, Py_EQ)
|
||||
: i_element == j_element;
|
||||
// Should only happen if RichCompare fails
|
||||
if (is_duplicate < 0) {
|
||||
Py_DECREF(args);
|
||||
Py_DECREF(new_args);
|
||||
return NULL;
|
||||
}
|
||||
if (is_duplicate)
|
||||
break;
|
||||
}
|
||||
if (!is_duplicate) {
|
||||
Py_INCREF(i_element);
|
||||
|
|
@ -290,8 +300,8 @@ is_unionable(PyObject *obj)
|
|||
type == &_Py_UnionType);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
type_or(PyTypeObject* self, PyObject* param)
|
||||
PyObject *
|
||||
_Py_union_type_or(PyObject* self, PyObject* param)
|
||||
{
|
||||
PyObject *tuple = PyTuple_Pack(2, self, param);
|
||||
if (tuple == NULL) {
|
||||
|
|
@ -404,7 +414,7 @@ static PyMethodDef union_methods[] = {
|
|||
{0}};
|
||||
|
||||
static PyNumberMethods union_as_number = {
|
||||
.nb_or = (binaryfunc)type_or, // Add __or__ function
|
||||
.nb_or = _Py_union_type_or, // Add __or__ function
|
||||
};
|
||||
|
||||
PyTypeObject _Py_UnionType = {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue