@@ -48,6 +48,7 @@ typedef struct {
48
48
PyObject * type_params ;
49
49
PyObject * compute_value ;
50
50
PyObject * value ;
51
+ PyObject * module ;
51
52
} typealiasobject ;
52
53
53
54
#include "clinic/typevarobject.c.h"
@@ -1252,6 +1253,7 @@ typealias_dealloc(PyObject *self)
1252
1253
Py_XDECREF (ta -> type_params );
1253
1254
Py_XDECREF (ta -> compute_value );
1254
1255
Py_XDECREF (ta -> value );
1256
+ Py_XDECREF (ta -> module );
1255
1257
Py_TYPE (self )-> tp_free (self );
1256
1258
Py_DECREF (tp );
1257
1259
}
@@ -1309,26 +1311,41 @@ typealias_type_params(PyObject *self, void *unused)
1309
1311
return Py_NewRef (ta -> type_params );
1310
1312
}
1311
1313
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
+
1312
1328
static PyGetSetDef typealias_getset [] = {
1313
1329
{"__parameters__" , typealias_parameters , (setter )NULL , NULL , NULL },
1314
1330
{"__type_params__" , typealias_type_params , (setter )NULL , NULL , NULL },
1315
1331
{"__value__" , typealias_value , (setter )NULL , NULL , NULL },
1332
+ {"__module__" , typealias_module , (setter )NULL , NULL , NULL },
1316
1333
{0 }
1317
1334
};
1318
1335
1319
1336
static typealiasobject *
1320
1337
typealias_alloc (PyObject * name , PyObject * type_params , PyObject * compute_value ,
1321
- PyObject * value )
1338
+ PyObject * value , PyObject * module )
1322
1339
{
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 );
1325
1341
if (ta == NULL ) {
1326
1342
return NULL ;
1327
1343
}
1328
1344
ta -> name = Py_NewRef (name );
1329
1345
ta -> type_params = Py_IsNone (type_params ) ? NULL : Py_XNewRef (type_params );
1330
1346
ta -> compute_value = Py_XNewRef (compute_value );
1331
1347
ta -> value = Py_XNewRef (value );
1348
+ ta -> module = Py_XNewRef (module );
1332
1349
_PyObject_GC_TRACK (ta );
1333
1350
return ta ;
1334
1351
}
@@ -1339,6 +1356,7 @@ typealias_traverse(typealiasobject *self, visitproc visit, void *arg)
1339
1356
Py_VISIT (self -> type_params );
1340
1357
Py_VISIT (self -> compute_value );
1341
1358
Py_VISIT (self -> value );
1359
+ Py_VISIT (self -> module );
1342
1360
return 0 ;
1343
1361
}
1344
1362
@@ -1348,6 +1366,7 @@ typealias_clear(typealiasobject *self)
1348
1366
Py_CLEAR (self -> type_params );
1349
1367
Py_CLEAR (self -> compute_value );
1350
1368
Py_CLEAR (self -> value );
1369
+ Py_CLEAR (self -> module );
1351
1370
return 0 ;
1352
1371
}
1353
1372
@@ -1401,7 +1420,14 @@ typealias_new_impl(PyTypeObject *type, PyObject *name, PyObject *value,
1401
1420
PyErr_SetString (PyExc_TypeError , "type_params must be a tuple" );
1402
1421
return NULL ;
1403
1422
}
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 ;
1405
1431
}
1406
1432
1407
1433
PyDoc_STRVAR (typealias_doc ,
@@ -1412,28 +1438,32 @@ Type aliases are created through the type statement:\n\
1412
1438
type Alias = int\n\
1413
1439
" );
1414
1440
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 ,
1430
1447
};
1431
1448
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 ,
1437
1467
};
1438
1468
1439
1469
PyObject *
@@ -1445,7 +1475,8 @@ _Py_make_typealias(PyThreadState* unused, PyObject *args)
1445
1475
assert (PyUnicode_Check (name ));
1446
1476
PyObject * type_params = PyTuple_GET_ITEM (args , 1 );
1447
1477
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 );
1449
1480
}
1450
1481
1451
1482
PyDoc_STRVAR (generic_doc ,
@@ -1603,7 +1634,6 @@ int _Py_initialize_generic(PyInterpreterState *interp)
1603
1634
MAKE_TYPE (paramspec );
1604
1635
MAKE_TYPE (paramspecargs );
1605
1636
MAKE_TYPE (paramspeckwargs );
1606
- MAKE_TYPE (typealias );
1607
1637
#undef MAKE_TYPE
1608
1638
return 0 ;
1609
1639
}
@@ -1616,5 +1646,4 @@ void _Py_clear_generic_types(PyInterpreterState *interp)
1616
1646
Py_CLEAR (interp -> cached_objects .paramspec_type );
1617
1647
Py_CLEAR (interp -> cached_objects .paramspecargs_type );
1618
1648
Py_CLEAR (interp -> cached_objects .paramspeckwargs_type );
1619
- Py_CLEAR (interp -> cached_objects .typealias_type );
1620
1649
}
0 commit comments