Skip to content

Commit a75f26b

Browse files
authored
Fake PEP-0695 with empty __type_params__ (RustPython#5098)
1 parent d32cb7e commit a75f26b

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

vm/src/builtins/function.rs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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<()> {

vm/src/frame.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1642,7 +1642,8 @@ impl ExecutingFrame<'_> {
16421642
closure,
16431643
defaults,
16441644
kw_only_defaults,
1645-
PyMutex::new(qualified_name.clone()),
1645+
qualified_name.clone(),
1646+
vm.ctx.empty_tuple.clone(), // FIXME: fake implementation
16461647
)
16471648
.into_pyobject(vm);
16481649

0 commit comments

Comments
 (0)