@@ -48,6 +48,7 @@ typedef struct {
4848 PyObject * type_params ;
4949 PyObject * compute_value ;
5050 PyObject * value ;
51+ PyObject * module ;
5152} typealiasobject ;
5253
5354#include "clinic/typevarobject.c.h"
@@ -1252,6 +1253,7 @@ typealias_dealloc(PyObject *self)
12521253 Py_XDECREF (ta -> type_params );
12531254 Py_XDECREF (ta -> compute_value );
12541255 Py_XDECREF (ta -> value );
1256+ Py_XDECREF (ta -> module );
12551257 Py_TYPE (self )-> tp_free (self );
12561258 Py_DECREF (tp );
12571259}
@@ -1309,26 +1311,41 @@ typealias_type_params(PyObject *self, void *unused)
13091311 return Py_NewRef (ta -> type_params );
13101312}
13111313
1314+ static PyObject *
1315+ typealias_module (PyObject * self , void * unused )
1316+ {
1317+ typealiasobject * ta = (typealiasobject * )self ;
1318+ if (ta -> module != NULL ) {
1319+ return Py_NewRef (ta -> module );
1320+ }
1321+ if (ta -> compute_value != NULL ) {
1322+ // PyFunction_GetModule() returns a borrowed reference
1323+ return Py_NewRef (PyFunction_GetModule (ta -> compute_value ));
1324+ }
1325+ Py_RETURN_NONE ;
1326+ }
1327+
13121328static PyGetSetDef typealias_getset [] = {
13131329 {"__parameters__" , typealias_parameters , (setter )NULL , NULL , NULL },
13141330 {"__type_params__" , typealias_type_params , (setter )NULL , NULL , NULL },
13151331 {"__value__" , typealias_value , (setter )NULL , NULL , NULL },
1332+ {"__module__" , typealias_module , (setter )NULL , NULL , NULL },
13161333 {0 }
13171334};
13181335
13191336static typealiasobject *
13201337typealias_alloc (PyObject * name , PyObject * type_params , PyObject * compute_value ,
1321- PyObject * value )
1338+ PyObject * value , PyObject * module )
13221339{
1323- PyTypeObject * tp = PyInterpreterState_Get ()-> cached_objects .typealias_type ;
1324- typealiasobject * ta = PyObject_GC_New (typealiasobject , tp );
1340+ typealiasobject * ta = PyObject_GC_New (typealiasobject , & _PyTypeAlias_Type );
13251341 if (ta == NULL ) {
13261342 return NULL ;
13271343 }
13281344 ta -> name = Py_NewRef (name );
13291345 ta -> type_params = Py_IsNone (type_params ) ? NULL : Py_XNewRef (type_params );
13301346 ta -> compute_value = Py_XNewRef (compute_value );
13311347 ta -> value = Py_XNewRef (value );
1348+ ta -> module = Py_XNewRef (module );
13321349 _PyObject_GC_TRACK (ta );
13331350 return ta ;
13341351}
@@ -1339,6 +1356,7 @@ typealias_traverse(typealiasobject *self, visitproc visit, void *arg)
13391356 Py_VISIT (self -> type_params );
13401357 Py_VISIT (self -> compute_value );
13411358 Py_VISIT (self -> value );
1359+ Py_VISIT (self -> module );
13421360 return 0 ;
13431361}
13441362
@@ -1348,6 +1366,7 @@ typealias_clear(typealiasobject *self)
13481366 Py_CLEAR (self -> type_params );
13491367 Py_CLEAR (self -> compute_value );
13501368 Py_CLEAR (self -> value );
1369+ Py_CLEAR (self -> module );
13511370 return 0 ;
13521371}
13531372
@@ -1401,7 +1420,14 @@ typealias_new_impl(PyTypeObject *type, PyObject *name, PyObject *value,
14011420 PyErr_SetString (PyExc_TypeError , "type_params must be a tuple" );
14021421 return NULL ;
14031422 }
1404- return (PyObject * )typealias_alloc (name , type_params , NULL , value );
1423+ PyObject * module = caller ();
1424+ if (module == NULL ) {
1425+ return NULL ;
1426+ }
1427+ PyObject * ta = (PyObject * )typealias_alloc (name , type_params , NULL , value ,
1428+ module );
1429+ Py_DECREF (module );
1430+ return ta ;
14051431}
14061432
14071433PyDoc_STRVAR (typealias_doc ,
@@ -1412,28 +1438,32 @@ Type aliases are created through the type statement:\n\
14121438 type Alias = int\n\
14131439" );
14141440
1415- static PyType_Slot typealias_slots [] = {
1416- {Py_tp_doc , (void * )typealias_doc },
1417- {Py_tp_members , typealias_members },
1418- {Py_tp_methods , typealias_methods },
1419- {Py_tp_getset , typealias_getset },
1420- {Py_mp_subscript , typealias_subscript },
1421- {Py_tp_dealloc , typealias_dealloc },
1422- {Py_tp_alloc , PyType_GenericAlloc },
1423- {Py_tp_new , typealias_new },
1424- {Py_tp_free , PyObject_GC_Del },
1425- {Py_tp_traverse , (traverseproc )typealias_traverse },
1426- {Py_tp_clear , (inquiry )typealias_clear },
1427- {Py_tp_repr , typealias_repr },
1428- {Py_nb_or , _Py_union_type_or },
1429- {0 , 0 },
1441+ static PyNumberMethods typealias_as_number = {
1442+ .nb_or = _Py_union_type_or ,
1443+ };
1444+
1445+ static PyMappingMethods typealias_as_mapping = {
1446+ .mp_subscript = typealias_subscript ,
14301447};
14311448
1432- PyType_Spec typealias_spec = {
1433- .name = "typing.TypeAliasType" ,
1434- .basicsize = sizeof (typealiasobject ),
1435- .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_HAVE_GC ,
1436- .slots = typealias_slots ,
1449+ PyTypeObject _PyTypeAlias_Type = {
1450+ PyVarObject_HEAD_INIT (& PyType_Type , 0 )
1451+ .tp_name = "typing.TypeAliasType" ,
1452+ .tp_basicsize = sizeof (typealiasobject ),
1453+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_HAVE_GC ,
1454+ .tp_doc = typealias_doc ,
1455+ .tp_members = typealias_members ,
1456+ .tp_methods = typealias_methods ,
1457+ .tp_getset = typealias_getset ,
1458+ .tp_alloc = PyType_GenericAlloc ,
1459+ .tp_dealloc = typealias_dealloc ,
1460+ .tp_new = typealias_new ,
1461+ .tp_free = PyObject_GC_Del ,
1462+ .tp_traverse = (traverseproc )typealias_traverse ,
1463+ .tp_clear = (inquiry )typealias_clear ,
1464+ .tp_repr = typealias_repr ,
1465+ .tp_as_number = & typealias_as_number ,
1466+ .tp_as_mapping = & typealias_as_mapping ,
14371467};
14381468
14391469PyObject *
@@ -1445,7 +1475,8 @@ _Py_make_typealias(PyThreadState* unused, PyObject *args)
14451475 assert (PyUnicode_Check (name ));
14461476 PyObject * type_params = PyTuple_GET_ITEM (args , 1 );
14471477 PyObject * compute_value = PyTuple_GET_ITEM (args , 2 );
1448- return (PyObject * )typealias_alloc (name , type_params , compute_value , NULL );
1478+ assert (PyFunction_Check (compute_value ));
1479+ return (PyObject * )typealias_alloc (name , type_params , compute_value , NULL , NULL );
14491480}
14501481
14511482PyDoc_STRVAR (generic_doc ,
@@ -1603,7 +1634,6 @@ int _Py_initialize_generic(PyInterpreterState *interp)
16031634 MAKE_TYPE (paramspec );
16041635 MAKE_TYPE (paramspecargs );
16051636 MAKE_TYPE (paramspeckwargs );
1606- MAKE_TYPE (typealias );
16071637#undef MAKE_TYPE
16081638 return 0 ;
16091639}
@@ -1616,5 +1646,4 @@ void _Py_clear_generic_types(PyInterpreterState *interp)
16161646 Py_CLEAR (interp -> cached_objects .paramspec_type );
16171647 Py_CLEAR (interp -> cached_objects .paramspecargs_type );
16181648 Py_CLEAR (interp -> cached_objects .paramspeckwargs_type );
1619- Py_CLEAR (interp -> cached_objects .typealias_type );
16201649}
0 commit comments