diff --git a/vm/src/builtins/builtin_func.rs b/vm/src/builtins/builtin_func.rs index 47479fd344..bb28ce6267 100644 --- a/vm/src/builtins/builtin_func.rs +++ b/vm/src/builtins/builtin_func.rs @@ -4,7 +4,7 @@ use crate::{ class::PyClassImpl, function::{FuncArgs, IntoPyNativeFunc, PyNativeFunc}, types::{Callable, Constructor, GetDescriptor, Representable, Unconstructible}, - AsObject, Context, Py, PyObjectRef, PyPayload, PyRef, PyResult, VirtualMachine, + AsObject, Context, Py, PyObject, PyObjectRef, PyPayload, PyRef, PyResult, VirtualMachine, }; use std::fmt; @@ -189,19 +189,19 @@ impl fmt::Debug for PyBuiltinMethod { impl GetDescriptor for PyBuiltinMethod { fn descr_get( - zelf: PyObjectRef, + zelf: &PyObject, obj: Option, cls: Option, vm: &VirtualMachine, ) -> PyResult { let (_zelf, obj) = match Self::_check(&zelf, obj, vm) { Some(obj) => obj, - None => return Ok(zelf), + None => return Ok(zelf.to_owned()), }; let r = if vm.is_none(&obj) && !Self::_cls_is(&cls, obj.class()) { - zelf + zelf.to_owned().into() } else { - PyBoundMethod::new_ref(obj, zelf, &vm.ctx).into() + PyBoundMethod::new_ref(obj, zelf.to_owned().into(), &vm.ctx).into() }; Ok(r) } diff --git a/vm/src/builtins/classmethod.rs b/vm/src/builtins/classmethod.rs index 02f836199e..eb3dbbd9f4 100644 --- a/vm/src/builtins/classmethod.rs +++ b/vm/src/builtins/classmethod.rs @@ -3,7 +3,7 @@ use crate::{ class::PyClassImpl, common::lock::PyMutex, types::{Constructor, GetDescriptor, Initializer, Representable}, - AsObject, Context, Py, PyObjectRef, PyPayload, PyRef, PyResult, VirtualMachine, + AsObject, Context, Py, PyObject, PyObjectRef, PyPayload, PyRef, PyResult, VirtualMachine, }; /// classmethod(function) -> method @@ -48,7 +48,7 @@ impl PyPayload for PyClassMethod { impl GetDescriptor for PyClassMethod { fn descr_get( - zelf: PyObjectRef, + zelf: &PyObject, obj: Option, cls: Option, vm: &VirtualMachine, diff --git a/vm/src/builtins/descriptor.rs b/vm/src/builtins/descriptor.rs index a0995e1472..3839b9cc07 100644 --- a/vm/src/builtins/descriptor.rs +++ b/vm/src/builtins/descriptor.rs @@ -201,7 +201,7 @@ impl Representable for MemberDescrObject { impl GetDescriptor for MemberDescrObject { fn descr_get( - zelf: PyObjectRef, + zelf: &PyObject, obj: Option, _cls: Option, vm: &VirtualMachine, @@ -211,7 +211,7 @@ impl GetDescriptor for MemberDescrObject { let zelf = Self::_as_pyref(&zelf, vm)?; zelf.member.get(x, vm) } - None => Ok(zelf), + None => Ok(zelf.to_owned()), } } } diff --git a/vm/src/builtins/function.rs b/vm/src/builtins/function.rs index bf8fb46d29..58bc0c19f2 100644 --- a/vm/src/builtins/function.rs +++ b/vm/src/builtins/function.rs @@ -434,16 +434,16 @@ impl PyFunction { impl GetDescriptor for PyFunction { fn descr_get( - zelf: PyObjectRef, + zelf: &PyObject, obj: Option, cls: Option, vm: &VirtualMachine, ) -> PyResult { let (_zelf, obj) = Self::_unwrap(&zelf, obj, vm)?; let obj = if vm.is_none(&obj) && !Self::_cls_is(&cls, obj.class()) { - zelf + zelf.to_owned().into() } else { - PyBoundMethod::new_ref(obj, zelf, &vm.ctx).into() + PyBoundMethod::new_ref(obj, zelf.to_owned().into(), &vm.ctx).into() }; Ok(obj) } diff --git a/vm/src/builtins/getset.rs b/vm/src/builtins/getset.rs index 2516fcd566..275c397abe 100644 --- a/vm/src/builtins/getset.rs +++ b/vm/src/builtins/getset.rs @@ -46,14 +46,14 @@ impl PyPayload for PyGetSet { impl GetDescriptor for PyGetSet { fn descr_get( - zelf: PyObjectRef, + zelf: &PyObject, obj: Option, _cls: Option, vm: &VirtualMachine, ) -> PyResult { let (zelf, obj) = match Self::_check(&zelf, obj, vm) { Some(obj) => obj, - None => return Ok(zelf), + None => return Ok(zelf.to_owned()), }; if let Some(ref f) = zelf.getter { f(vm, obj) diff --git a/vm/src/builtins/property.rs b/vm/src/builtins/property.rs index 7322ba7d08..50ba77f8bb 100644 --- a/vm/src/builtins/property.rs +++ b/vm/src/builtins/property.rs @@ -40,14 +40,14 @@ pub struct PropertyArgs { impl GetDescriptor for PyProperty { fn descr_get( - zelf_obj: PyObjectRef, + zelf: &PyObject, obj: Option, _cls: Option, vm: &VirtualMachine, ) -> PyResult { - let (zelf, obj) = Self::_unwrap(&zelf_obj, obj, vm)?; + let (zelf, obj) = Self::_unwrap(zelf, obj, vm)?; if vm.is_none(&obj) { - Ok(zelf_obj) + Ok(zelf.to_owned().into()) } else if let Some(getter) = zelf.getter.read().as_ref() { getter.call((obj,), vm) } else { diff --git a/vm/src/builtins/staticmethod.rs b/vm/src/builtins/staticmethod.rs index 187648e2c0..1708bc2c9c 100644 --- a/vm/src/builtins/staticmethod.rs +++ b/vm/src/builtins/staticmethod.rs @@ -5,7 +5,7 @@ use crate::{ common::lock::PyMutex, function::{FuncArgs, IntoPyNativeFunc}, types::{Callable, Constructor, GetDescriptor, Initializer, Representable}, - Context, Py, PyObjectRef, PyPayload, PyRef, PyResult, VirtualMachine, + Context, Py, PyObject, PyObjectRef, PyPayload, PyRef, PyResult, VirtualMachine, }; #[pyclass(module = false, name = "staticmethod")] @@ -22,7 +22,7 @@ impl PyPayload for PyStaticMethod { impl GetDescriptor for PyStaticMethod { fn descr_get( - zelf: PyObjectRef, + zelf: &PyObject, obj: Option, _cls: Option, vm: &VirtualMachine, diff --git a/vm/src/builtins/super.rs b/vm/src/builtins/super.rs index be8c0ed192..b7fc692d2e 100644 --- a/vm/src/builtins/super.rs +++ b/vm/src/builtins/super.rs @@ -8,7 +8,7 @@ use crate::{ class::PyClassImpl, function::{IntoFuncArgs, OptionalArg}, types::{Callable, Constructor, GetAttr, GetDescriptor, Representable}, - AsObject, Context, Py, PyObjectRef, PyPayload, PyResult, VirtualMachine, + AsObject, Context, Py, PyObject, PyObjectRef, PyPayload, PyResult, VirtualMachine, }; #[pyclass(module = false, name = "super")] @@ -165,14 +165,14 @@ impl GetAttr for PySuper { impl GetDescriptor for PySuper { fn descr_get( - zelf_obj: PyObjectRef, + zelf: &PyObject, obj: Option, _cls: Option, vm: &VirtualMachine, ) -> PyResult { - let (zelf, obj) = Self::_unwrap(&zelf_obj, obj, vm)?; + let (zelf, obj) = Self::_unwrap(zelf, obj, vm)?; if vm.is_none(&obj) || zelf.obj.is_some() { - return Ok(zelf_obj); + return Ok(zelf.to_owned().into()); } let zelf_class = zelf.as_object().class(); if zelf_class.is(vm.ctx.types.super_type) { diff --git a/vm/src/builtins/type.rs b/vm/src/builtins/type.rs index 59e09a2d39..181ae9fe85 100644 --- a/vm/src/builtins/type.rs +++ b/vm/src/builtins/type.rs @@ -1001,7 +1001,7 @@ impl GetAttr for PyType { let descr_get = attr_class.mro_find_map(|cls| cls.slots.descr_get.load()); if let Some(descr_get) = descr_get { let mcl = mcl.to_owned().into(); - return descr_get(attr.clone(), Some(zelf.to_owned().into()), Some(mcl), vm); + return descr_get(attr, Some(zelf.to_owned().into()), Some(mcl), vm); } } } @@ -1011,7 +1011,7 @@ impl GetAttr for PyType { if let Some(attr) = zelf_attr { let descr_get = attr.class().mro_find_map(|cls| cls.slots.descr_get.load()); if let Some(descr_get) = descr_get { - descr_get(attr, None, Some(zelf.to_owned().into()), vm) + descr_get(&attr, None, Some(zelf.to_owned().into()), vm) } else { Ok(attr) } diff --git a/vm/src/protocol/object.rs b/vm/src/protocol/object.rs index a0e7221fbb..76f5686800 100644 --- a/vm/src/protocol/object.rs +++ b/vm/src/protocol/object.rs @@ -212,7 +212,7 @@ impl PyObject { .is_some() { let cls = obj_cls.to_owned().into(); - return descr_get(descr, Some(self.to_owned()), Some(cls), vm).map(Some); + return descr_get(&descr, Some(self.to_owned()), Some(cls), vm).map(Some); } } Some((descr, descr_get)) @@ -234,7 +234,7 @@ impl PyObject { match descr_get { Some(descr_get) => { let cls = obj_cls.to_owned().into(); - descr_get(attr, Some(self.to_owned()), Some(cls), vm).map(Some) + descr_get(&attr, Some(self.to_owned()), Some(cls), vm).map(Some) } None => Ok(Some(attr)), } diff --git a/vm/src/types/slot.rs b/vm/src/types/slot.rs index 8cbc758e78..2daa5b84b1 100644 --- a/vm/src/types/slot.rs +++ b/vm/src/types/slot.rs @@ -171,7 +171,7 @@ pub(crate) type RichCompareFunc = fn( pub(crate) type IterFunc = fn(PyObjectRef, &VirtualMachine) -> PyResult; pub(crate) type IterNextFunc = fn(&PyObject, &VirtualMachine) -> PyResult; pub(crate) type DescrGetFunc = - fn(PyObjectRef, Option, Option, &VirtualMachine) -> PyResult; + fn(&PyObject, Option, Option, &VirtualMachine) -> PyResult; pub(crate) type DescrSetFunc = fn(&PyObject, PyObjectRef, PySetterValue, &VirtualMachine) -> PyResult<()>; pub(crate) type NewFunc = fn(PyTypeRef, FuncArgs, &VirtualMachine) -> PyResult; @@ -328,7 +328,7 @@ fn iternext_wrapper(zelf: &PyObject, vm: &VirtualMachine) -> PyResult, cls: Option, vm: &VirtualMachine, @@ -847,7 +847,7 @@ pub trait Callable: PyPayload { pub trait GetDescriptor: PyPayload { #[pyslot] fn descr_get( - zelf: PyObjectRef, + zelf: &PyObject, obj: Option, cls: Option, vm: &VirtualMachine, @@ -861,7 +861,7 @@ pub trait GetDescriptor: PyPayload { cls: OptionalArg, vm: &VirtualMachine, ) -> PyResult { - Self::descr_get(zelf, Some(obj), cls.into_option(), vm) + Self::descr_get(&zelf, Some(obj), cls.into_option(), vm) } #[inline] diff --git a/vm/src/vm/method.rs b/vm/src/vm/method.rs index 9f55e28f86..681abe3882 100644 --- a/vm/src/vm/method.rs +++ b/vm/src/vm/method.rs @@ -44,7 +44,8 @@ impl PyMethod { .is_some() { let cls = cls.to_owned().into(); - return descr_get(descr, Some(obj), Some(cls), vm).map(Self::Attribute); + return descr_get(&descr, Some(obj), Some(cls), vm) + .map(Self::Attribute); } } descr_get @@ -68,7 +69,7 @@ impl PyMethod { }), Some(descr_get) => { let cls = cls.to_owned().into(); - descr_get(attr, Some(obj), Some(cls), vm).map(Self::Attribute) + descr_get(&attr, Some(obj), Some(cls), vm).map(Self::Attribute) } None => Ok(Self::Attribute(attr)), } diff --git a/vm/src/vm/vm_object.rs b/vm/src/vm/vm_object.rs index 056ded9bfd..a63efdd599 100644 --- a/vm/src/vm/vm_object.rs +++ b/vm/src/vm/vm_object.rs @@ -80,7 +80,7 @@ impl VirtualMachine { let descr_get = descr .class() .mro_find_map(|cls| cls.slots.descr_get.load())?; - Some(descr_get(descr.to_owned(), obj, cls, self)) + Some(descr_get(descr, obj, cls, self)) } pub fn call_get_descriptor(&self, descr: &PyObject, obj: PyObjectRef) -> Option {