@@ -53,6 +53,7 @@ typedef struct {
5353typedef struct {
5454 PyObject_HEAD
5555 PyObject * name ;
56+ PyObject * qualname ;
5657 PyObject * type_params ;
5758 PyObject * compute_value ;
5859 PyObject * value ;
@@ -1852,6 +1853,7 @@ typealias_dealloc(PyObject *self)
18521853 _PyObject_GC_UNTRACK (self );
18531854 typealiasobject * ta = typealiasobject_CAST (self );
18541855 Py_DECREF (ta -> name );
1856+ Py_DECREF (ta -> qualname );
18551857 Py_XDECREF (ta -> type_params );
18561858 Py_XDECREF (ta -> compute_value );
18571859 Py_XDECREF (ta -> value );
@@ -1878,11 +1880,12 @@ static PyObject *
18781880typealias_repr (PyObject * self )
18791881{
18801882 typealiasobject * ta = (typealiasobject * )self ;
1881- return Py_NewRef (ta -> name );
1883+ return Py_NewRef (ta -> qualname );
18821884}
18831885
18841886static PyMemberDef typealias_members [] = {
18851887 {"__name__" , _Py_T_OBJECT , offsetof(typealiasobject , name ), Py_READONLY },
1888+ {"__qualname__" , _Py_T_OBJECT , offsetof(typealiasobject , qualname ), Py_READONLY },
18861889 {0 }
18871890};
18881891
@@ -1997,7 +2000,7 @@ typealias_check_type_params(PyObject *type_params, int *err) {
19972000}
19982001
19992002static PyObject *
2000- typelias_convert_type_params (PyObject * type_params )
2003+ typealias_convert_type_params (PyObject * type_params )
20012004{
20022005 if (
20032006 type_params == NULL
@@ -2012,14 +2015,15 @@ typelias_convert_type_params(PyObject *type_params)
20122015}
20132016
20142017static typealiasobject *
2015- typealias_alloc (PyObject * name , PyObject * type_params , PyObject * compute_value ,
2016- PyObject * value , PyObject * module )
2018+ typealias_alloc (PyObject * name , PyObject * qualname , PyObject * type_params ,
2019+ PyObject * compute_value , PyObject * value , PyObject * module )
20172020{
20182021 typealiasobject * ta = PyObject_GC_New (typealiasobject , & _PyTypeAlias_Type );
20192022 if (ta == NULL ) {
20202023 return NULL ;
20212024 }
20222025 ta -> name = Py_NewRef (name );
2026+ ta -> qualname = Py_NewRef (qualname );
20232027 ta -> type_params = Py_XNewRef (type_params );
20242028 ta -> compute_value = Py_XNewRef (compute_value );
20252029 ta -> value = Py_XNewRef (value );
@@ -2112,8 +2116,10 @@ typealias_new_impl(PyTypeObject *type, PyObject *name, PyObject *value,
21122116 if (module == NULL ) {
21132117 return NULL ;
21142118 }
2115- PyObject * ta = (PyObject * )typealias_alloc (name , checked_params , NULL , value ,
2116- module );
2119+
2120+ // It's impossible to determine qualname, so we use name insted.
2121+ PyObject * ta = (PyObject * )typealias_alloc (
2122+ name , name , checked_params , NULL , value , module );
21172123 Py_DECREF (module );
21182124 return ta ;
21192125}
@@ -2179,10 +2185,17 @@ _Py_make_typealias(PyThreadState* unused, PyObject *args)
21792185 assert (PyTuple_GET_SIZE (args ) == 3 );
21802186 PyObject * name = PyTuple_GET_ITEM (args , 0 );
21812187 assert (PyUnicode_Check (name ));
2182- PyObject * type_params = typelias_convert_type_params (PyTuple_GET_ITEM (args , 1 ));
2188+ PyObject * type_params = typealias_convert_type_params (PyTuple_GET_ITEM (args , 1 ));
21832189 PyObject * compute_value = PyTuple_GET_ITEM (args , 2 );
21842190 assert (PyFunction_Check (compute_value ));
2185- return (PyObject * )typealias_alloc (name , type_params , compute_value , NULL , NULL );
2191+
2192+ PyFunctionObject * compute_func = (PyFunctionObject * )compute_value ;
2193+ PyCodeObject * code_obj = (PyCodeObject * )compute_func -> func_code ;
2194+ PyObject * qualname = code_obj -> co_qualname ;
2195+ assert (qualname != NULL );
2196+
2197+ return (PyObject * )typealias_alloc (
2198+ name , qualname , type_params , compute_value , NULL , NULL );
21862199}
21872200
21882201PyDoc_STRVAR (generic_doc ,
0 commit comments