use crate::{
object::{AsObject, PyObject, PyPayload, PyRef, PyResult},
vm::VirtualMachine,
};
pub unsafe trait TransmuteFromObject: Sized {
fn check(vm: &VirtualMachine, obj: &PyObject) -> PyResult<()>;
}
unsafe impl<T: PyPayload> TransmuteFromObject for PyRef<T> {
fn check(vm: &VirtualMachine, obj: &PyObject) -> PyResult<()> {
let class = T::class(&vm.ctx);
if obj.fast_isinstance(class) {
if obj.payload_is::<T>() {
Ok(())
} else {
Err(vm.new_downcast_runtime_error(class, obj))
}
} else {
Err(vm.new_downcast_type_error(class, obj))
}
}
}