From d5367d17619b129c0f1fc7bb32c065334f94eeaa Mon Sep 17 00:00:00 2001 From: Jeong YunWon Date: Thu, 16 Jan 2020 00:46:29 +0900 Subject: [PATCH] #[pymethod(magic)]: pyname as __{sig.ident}__ form --- derive/src/pyclass.rs | 26 ++++++++++++++++++++------ vm/src/obj/objfunction.rs | 2 +- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/derive/src/pyclass.rs b/derive/src/pyclass.rs index 661c3f2b5..d755fc2e0 100644 --- a/derive/src/pyclass.rs +++ b/derive/src/pyclass.rs @@ -68,14 +68,28 @@ impl Class { NestedMeta::Meta(meta) => meta, NestedMeta::Lit(_) => continue, }; - if let Meta::NameValue(name_value) = meta { - if path_eq(&name_value.path, "name") { - if let Lit::Str(s) = &name_value.lit { - py_name = Some(s.value()); - } else { - bail_span!(&sig.ident, "#[pymethod(name = ...)] must be a string"); + + match meta { + Meta::NameValue(name_value) => { + if path_eq(&name_value.path, "name") { + if let Lit::Str(s) = &name_value.lit { + py_name = Some(s.value()); + } else { + bail_span!(&sig.ident, "#[pymethod(name = ...)] must be a string"); + } } } + Meta::Path(path) => { + if path.get_ident().map_or(false, |v| v == "magic") { + py_name = Some(format!("__{}__", sig.ident.to_string())); + } else { + bail_span!( + &sig.ident, + "#[pymethod(magic)] or #[pymethod(name = ...)] is expected" + ); + } + } + _ => (), } } diff --git a/vm/src/obj/objfunction.rs b/vm/src/obj/objfunction.rs index ee251ef58..ebeb004cd 100644 --- a/vm/src/obj/objfunction.rs +++ b/vm/src/obj/objfunction.rs @@ -242,7 +242,7 @@ impl PyValue for PyFunction { #[pyimpl(with(PyBuiltinDescriptor))] impl PyFunction { - #[pymethod(name = "__call__")] + #[pymethod(magic)] fn call(zelf: PyObjectRef, args: PyFuncArgs, vm: &VirtualMachine) -> PyResult { vm.invoke(&zelf, args) }