diff --git a/vm/src/obj/objgetset.rs b/vm/src/obj/objgetset.rs index ce3e73a13..c3c8d12f3 100644 --- a/vm/src/obj/objgetset.rs +++ b/vm/src/obj/objgetset.rs @@ -2,7 +2,7 @@ */ use super::objtype::PyClassRef; -use crate::function::OptionalArg; +use crate::function::{OptionalArg, OwnedParam, RefParam}; use crate::pyobject::{ IntoPyObject, PyClassImpl, PyContext, PyObjectRef, PyRef, PyResult, PyValue, TryFromObject, }; @@ -16,7 +16,7 @@ pub trait IntoPyGetterFunc { fn into_getter(self) -> PyGetterFunc; } -impl IntoPyGetterFunc for F +impl IntoPyGetterFunc, R> for F where F: Fn(T, &VirtualMachine) -> R + 'static, T: TryFromObject, @@ -30,11 +30,25 @@ where } } +impl IntoPyGetterFunc, R> for F +where + F: Fn(&S, &VirtualMachine) -> R + 'static, + S: PyValue, + R: IntoPyObject, +{ + fn into_getter(self) -> PyGetterFunc { + Box::new(move |vm, obj| { + let zelf = PyRef::::try_from_object(vm, obj)?; + (self)(&zelf, vm).into_pyobject(vm) + }) + } +} + pub trait IntoPySetterFunc { fn into_setter(self) -> PySetterFunc; } -impl IntoPySetterFunc for F +impl IntoPySetterFunc, V> for F where F: Fn(T, V, &VirtualMachine) -> PyResult<()> + 'static, T: TryFromObject, @@ -49,6 +63,21 @@ where } } +impl IntoPySetterFunc, V> for F +where + F: Fn(&S, V, &VirtualMachine) -> PyResult<()> + 'static, + S: PyValue, + V: TryFromObject, +{ + fn into_setter(self) -> PySetterFunc { + Box::new(move |vm, obj, value| { + let zelf = PyRef::::try_from_object(vm, obj)?; + let value = V::try_from_object(vm, value)?; + (self)(&zelf, value, vm) + }) + } +} + #[pyclass] pub struct PyGetSet { name: String,