@@ -35,6 +35,7 @@ pub struct PyFunction {
3535 defaults_and_kwdefaults : PyMutex < ( Option < PyTupleRef > , Option < PyDictRef > ) > ,
3636 name : PyMutex < PyStrRef > ,
3737 qualname : PyMutex < PyStrRef > ,
38+ type_params : PyMutex < PyTupleRef > ,
3839 #[ cfg( feature = "jit" ) ]
3940 jitted_code : OnceCell < CompiledCode > ,
4041}
@@ -54,7 +55,8 @@ impl PyFunction {
5455 closure : Option < PyTupleTyped < PyCellRef > > ,
5556 defaults : Option < PyTupleRef > ,
5657 kw_only_defaults : Option < PyDictRef > ,
57- qualname : PyMutex < PyStrRef > ,
58+ qualname : PyStrRef ,
59+ type_params : PyTupleRef ,
5860 ) -> Self {
5961 let name = PyMutex :: new ( code. obj_name . to_owned ( ) ) ;
6062 PyFunction {
@@ -63,7 +65,8 @@ impl PyFunction {
6365 closure,
6466 defaults_and_kwdefaults : PyMutex :: new ( ( defaults, kw_only_defaults) ) ,
6567 name,
66- qualname,
68+ qualname : PyMutex :: new ( qualname) ,
69+ type_params : PyMutex :: new ( type_params) ,
6770 #[ cfg( feature = "jit" ) ]
6871 jitted_code : OnceCell :: new ( ) ,
6972 }
@@ -428,6 +431,30 @@ impl PyFunction {
428431 Ok ( ( ) )
429432 }
430433
434+ #[ pygetset( magic) ]
435+ fn type_params ( & self ) -> PyTupleRef {
436+ self . type_params . lock ( ) . clone ( )
437+ }
438+
439+ #[ pygetset( magic, setter) ]
440+ fn set_type_params (
441+ & self ,
442+ value : PySetterValue < PyTupleRef > ,
443+ vm : & VirtualMachine ,
444+ ) -> PyResult < ( ) > {
445+ match value {
446+ PySetterValue :: Assign ( value) => {
447+ * self . type_params . lock ( ) = value;
448+ }
449+ PySetterValue :: Delete => {
450+ return Err (
451+ vm. new_type_error ( "__type_params__ must be set to a tuple object" . to_string ( ) )
452+ ) ;
453+ }
454+ }
455+ Ok ( ( ) )
456+ }
457+
431458 #[ cfg( feature = "jit" ) ]
432459 #[ pymethod( magic) ]
433460 fn jit ( zelf : PyRef < Self > , vm : & VirtualMachine ) -> PyResult < ( ) > {
0 commit comments