Skip to content

Commit c1180fc

Browse files
builtin_function_or_method
1 parent 5a74121 commit c1180fc

File tree

5 files changed

+44
-17
lines changed

5 files changed

+44
-17
lines changed

vm/src/frame.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use crate::builtins;
1111
use crate::bytecode;
1212
use crate::import::{import, import_module};
1313
use crate::obj::objbool;
14+
use crate::obj::objbuiltinfunc::PyBuiltinFunction;
1415
use crate::obj::objcode;
1516
use crate::obj::objdict;
1617
use crate::obj::objdict::PyDict;
@@ -592,8 +593,10 @@ impl Frame {
592593
}
593594
bytecode::Instruction::LoadBuildClass => {
594595
let rustfunc = PyObject::new(
595-
PyObjectPayload::RustFunction {
596-
function: Box::new(builtins::builtin_build_class_),
596+
PyObjectPayload::AnyRustValue {
597+
value: Box::new(PyBuiltinFunction::new(Box::new(
598+
builtins::builtin_build_class_,
599+
))),
597600
},
598601
vm.ctx.type_type(),
599602
);

vm/src/obj/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
//! This package contains the python basic/builtin types
22
33
pub mod objbool;
4+
pub mod objbuiltinfunc;
45
pub mod objbytearray;
56
pub mod objbytes;
67
pub mod objcode;

vm/src/obj/objbuiltinfunc.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
use std::fmt;
2+
3+
use crate::pyobject::{PyContext, PyNativeFunc, PyObjectPayload2, PyObjectRef};
4+
5+
pub struct PyBuiltinFunction {
6+
// TODO: shouldn't be public
7+
pub value: PyNativeFunc,
8+
}
9+
10+
impl PyObjectPayload2 for PyBuiltinFunction {
11+
fn required_type(ctx: &PyContext) -> PyObjectRef {
12+
ctx.builtin_function_or_method_type()
13+
}
14+
}
15+
16+
impl fmt::Debug for PyBuiltinFunction {
17+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
18+
write!(f, "builtin function")
19+
}
20+
}
21+
22+
impl PyBuiltinFunction {
23+
pub fn new(value: PyNativeFunc) -> Self {
24+
Self { value }
25+
}
26+
}

vm/src/pyobject.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use crate::bytecode;
1414
use crate::exceptions;
1515
use crate::frame::{Frame, Scope, ScopeRef};
1616
use crate::obj::objbool;
17+
use crate::obj::objbuiltinfunc::PyBuiltinFunction;
1718
use crate::obj::objbytearray;
1819
use crate::obj::objbytes;
1920
use crate::obj::objcode;
@@ -615,8 +616,8 @@ impl PyContext {
615616
F: IntoPyNativeFunc<T, R>,
616617
{
617618
PyObject::new(
618-
PyObjectPayload::RustFunction {
619-
function: f.into_func(),
619+
PyObjectPayload::AnyRustValue {
620+
value: Box::new(PyBuiltinFunction::new(f.into_func())),
620621
},
621622
self.builtin_function_or_method_type(),
622623
)
@@ -1516,9 +1517,6 @@ pub enum PyObjectPayload {
15161517
WeakRef {
15171518
referent: PyObjectWeakRef,
15181519
},
1519-
RustFunction {
1520-
function: PyNativeFunc,
1521-
},
15221520
AnyRustValue {
15231521
value: Box<dyn std::any::Any>,
15241522
},
@@ -1540,7 +1538,6 @@ impl fmt::Debug for PyObjectPayload {
15401538
PyObjectPayload::Iterator { .. } => write!(f, "iterator"),
15411539
PyObjectPayload::Slice { .. } => write!(f, "slice"),
15421540
PyObjectPayload::Generator { .. } => write!(f, "generator"),
1543-
PyObjectPayload::RustFunction { .. } => write!(f, "rust function"),
15441541
PyObjectPayload::Frame { .. } => write!(f, "frame"),
15451542
PyObjectPayload::AnyRustValue { value } => value.fmt(f),
15461543
}

vm/src/vm.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use crate::bytecode;
1616
use crate::frame::ExecutionResult;
1717
use crate::frame::{Scope, ScopeRef};
1818
use crate::obj::objbool;
19+
use crate::obj::objbuiltinfunc::PyBuiltinFunction;
1920
use crate::obj::objcode;
2021
use crate::obj::objframe;
2122
use crate::obj::objfunction::{PyFunction, PyMethod};
@@ -28,8 +29,8 @@ use crate::obj::objstr;
2829
use crate::obj::objtuple::PyTuple;
2930
use crate::obj::objtype;
3031
use crate::pyobject::{
31-
AttributeProtocol, DictProtocol, IdProtocol, PyContext, PyFuncArgs, PyObjectPayload,
32-
PyObjectRef, PyResult, TypeProtocol,
32+
AttributeProtocol, DictProtocol, IdProtocol, PyContext, PyFuncArgs, PyObjectRef, PyResult,
33+
TypeProtocol,
3334
};
3435
use crate::stdlib;
3536
use crate::sysmodule;
@@ -305,14 +306,13 @@ impl VirtualMachine {
305306
{
306307
return self.invoke(function.clone(), args.insert(object.clone()));
307308
}
308-
match func_ref.payload {
309-
PyObjectPayload::RustFunction { ref function } => function(self, args),
310-
ref payload => {
311-
// TODO: is it safe to just invoke __call__ otherwise?
312-
trace!("invoke __call__ for: {:?}", payload);
313-
self.call_method(&func_ref, "__call__", args)
314-
}
309+
if let Some(PyBuiltinFunction { ref value }) = func_ref.payload() {
310+
return value(self, args);
315311
}
312+
313+
// TODO: is it safe to just invoke __call__ otherwise?
314+
trace!("invoke __call__ for: {:?}", func_ref.payload);
315+
self.call_method(&func_ref, "__call__", args)
316316
}
317317

318318
fn invoke_python_function(

0 commit comments

Comments
 (0)