From d6e71ad18a8a2b960caa050bda45fedbcc423fd3 Mon Sep 17 00:00:00 2001 From: ChJR Date: Mon, 13 Jun 2022 07:11:41 +0900 Subject: [PATCH] Fix __get__ in @classmethod --- vm/src/builtins/classmethod.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/vm/src/builtins/classmethod.rs b/vm/src/builtins/classmethod.rs index 00e67d52e3..03c00d995f 100644 --- a/vm/src/builtins/classmethod.rs +++ b/vm/src/builtins/classmethod.rs @@ -53,10 +53,13 @@ impl GetDescriptor for PyClassMethod { cls: Option, vm: &VirtualMachine, ) -> PyResult { - let (zelf, obj) = Self::_unwrap(zelf, obj, vm)?; - let cls = cls.unwrap_or_else(|| obj.class().clone().into()); - let callable = zelf.callable.lock().clone(); - Ok(PyBoundMethod::new_ref(cls, callable, &vm.ctx).into()) + let (zelf, _obj) = Self::_unwrap(zelf, obj.clone(), vm)?; + let cls = cls.unwrap_or_else(|| _obj.class().clone().into()); + let _descr_get: PyResult = zelf.callable.lock().get_attr("__get__", vm); + match _descr_get { + Err(_) => Ok(PyBoundMethod::new_ref(cls, zelf.callable.lock().clone(), &vm.ctx).into()), + Ok(_descr_get) => vm.invoke(&_descr_get, (cls.clone(), cls)), + } } }