Skip to content

Commit 30fc460

Browse files
committed
PyClassImpl for PyFunction
1 parent 44a1701 commit 30fc460

File tree

1 file changed

+16
-11
lines changed

1 file changed

+16
-11
lines changed

vm/src/obj/objfunction.rs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@ use super::objtuple::PyTupleRef;
55
use super::objtype::PyClassRef;
66
use crate::descriptor::PyBuiltinDescriptor;
77
use crate::function::{OptionalArg, PyFuncArgs};
8-
use crate::pyobject::{IdProtocol, PyContext, PyObjectRef, PyRef, PyResult, PyValue, TypeProtocol};
8+
use crate::pyobject::{
9+
IdProtocol, PyClassImpl, PyContext, PyObjectRef, PyRef, PyResult, PyValue, TypeProtocol,
10+
};
911
use crate::scope::Scope;
1012
use crate::vm::VirtualMachine;
1113

1214
pub type PyFunctionRef = PyRef<PyFunction>;
1315

16+
#[pyclass]
1417
#[derive(Debug)]
1518
pub struct PyFunction {
1619
// TODO: these shouldn't be public
@@ -61,20 +64,25 @@ impl PyValue for PyFunction {
6164
}
6265
}
6366

64-
impl PyFunctionRef {
65-
fn call(func: PyObjectRef, args: PyFuncArgs, vm: &VirtualMachine) -> PyResult {
66-
vm.invoke(&func, args)
67+
#[pyimpl]
68+
impl PyFunction {
69+
#[pymethod(name = "__call__")]
70+
fn call(zelf: PyObjectRef, args: PyFuncArgs, vm: &VirtualMachine) -> PyResult {
71+
vm.invoke(&zelf, args)
6772
}
6873

69-
fn code(self, _vm: &VirtualMachine) -> PyCodeRef {
74+
#[pyproperty(name = "__code__")]
75+
fn code(&self, _vm: &VirtualMachine) -> PyCodeRef {
7076
self.code.clone()
7177
}
7278

73-
fn defaults(self, _vm: &VirtualMachine) -> Option<PyTupleRef> {
79+
#[pyproperty(name = "__defaults__")]
80+
fn defaults(&self, _vm: &VirtualMachine) -> Option<PyTupleRef> {
7481
self.defaults.clone()
7582
}
7683

77-
fn kwdefaults(self, _vm: &VirtualMachine) -> Option<PyDictRef> {
84+
#[pyproperty(name = "__kwdefaults__")]
85+
fn kwdefaults(&self, _vm: &VirtualMachine) -> Option<PyDictRef> {
7886
self.kw_only_defaults.clone()
7987
}
8088
}
@@ -104,13 +112,10 @@ impl PyValue for PyBoundMethod {
104112

105113
pub fn init(context: &PyContext) {
106114
let function_type = &context.types.function_type;
115+
PyFunction::extend_class(context, function_type);
107116
extend_class!(context, function_type, {
108117
"__get__" => context.new_method(PyFunction::get),
109118
(slot descr_get) => PyFunction::get,
110-
"__call__" => context.new_method(PyFunctionRef::call),
111-
"__code__" => context.new_property(PyFunctionRef::code),
112-
"__defaults__" => context.new_property(PyFunctionRef::defaults),
113-
"__kwdefaults__" => context.new_property(PyFunctionRef::kwdefaults),
114119
});
115120

116121
let method_type = &context.types.bound_method_type;

0 commit comments

Comments
 (0)